git pull 每次拉代码自动发送到钉钉群

钉钉群的关于机器人的官网开发文档,我们可以知道,核心的代码就是 curl 一句。

curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
   -H 'Content-Type: application/json' \
   -d '{"msgtype": "text", 
        "text": {
             "content": "我就是我, 是不一样的烟火"
        }
      }'

获取 token 所在的URL 的办法,就是在群设置里面有个只能群助手,添加一个自定义机器人即可,这里面的核心是关键字的设置,要求发送的文本内容里必须包含关键字才能触发机器人。我们把关键字定义为 gitpull,所以只要发送的消息里有gitpull 关键字,机器人就会自动发送,钉钉会把消息发送到群里。

我们把原生的 git 修改为 /usr/bin/git.orig 重新写一个新的 /usr/bin/git 的脚本如下:

#!/bin/bash
TOKEN="xxx"
URL="https://oapi.dingtalk.com/robot/send?access_token=$TOKEN"
TEXT="[gitpull] User: "$(id -un)" pulling code in dir: "$(pwd)
/usr/bin/git.orig $*
if [ $? == 0 -a "$1" == "pull" ]
then
        # echo "Pulling Code"
        curl $URL -H 'Content-Type: application/json' \
                -d '{"msgtype": "text","text": {"content": "'"$TEXT"'" }}'
        echo
fi

这样每次拉取代码,我们就能在钉钉群里得到消息,知道是谁在拉什么代码

BBC报道:用树莓派驱动的呼吸机将在哥伦比亚进行测试

原文链接:https://www.bbc.com/news/technology-52251286?at_custom3=%40BBCTech&at_custom2=twitter&at_campaign=64&at_medium=custom7&at_custom1=%5Bpost+type%5D&at_custom4=B69484B8-7D72-11EA-B016-60F74744363C

以下中文用 DeepL 机器翻译

哥伦比亚的一个团队要测试一种用Raspberry Pi电脑和易得的零件制作的呼吸机。

该设计和计算机代码是由加州的一名男子在3月份在网上发布的,他之前没有制造医疗设备的经验。

Marco Mascorro是一名机器人工程师,他说,他制造出这台呼吸机是因为知道治疗Covid-19的机器需求量很大。

他的帖子引起了医护人员的大量反馈。

他利用这些建议进行了改进。

“我是一个真正的信徒,我相信技术可以解决我们现在特别是这次大流行病中的很多问题,”他告诉BBC。

哥伦比亚团队表示,该设计对他们的南美国家来说很重要,因为传统模型的零件可能很难获得。

相比之下,Mascorro先生的设计只使用了容易找到的零件–例如,它所采用的阀门通常可以在汽车和管道供应商店中找到。

这台机器将在波哥大的两个机构–教皇Xavierian大学医院和Los Andes大学–进行快速测试。
显示空气压力的屏幕 图片版权为Marco Mascorro。
图片说明 该机器可以调节给病人的氧气量。

“对抗科维德-19的斗争就像一场比赛,”奥马尔-拉米雷斯说,他将领导这项工作。

“全世界都在与这种疾病竞争,但在不同的赛道上,决定这些不同赛道的是资源的获取和经验。”
计算能力

Raspberry Pi在呼吸机中扮演着重要的角色。

这个英国人的发明是一种小型、低成本的计算机板,最初是为了帮助教授计算机编码而诞生的。但在过去的8年里,它已经被发烧友和其他人拥护,形成了各种电子项目的大脑。

有一台电脑来控制通风器是至关重要的。它可以设置气压,打开和关闭阀门,并能调节病人是否需要完全呼吸或部分呼吸辅助。

Mascorro先生将所涉及的代码进行了开源,这意味着任何人都可以免费使用或修改它。

“开发一个以软件为中心的系统的好处在于,我们可以在不对硬件做太多改动的情况下,对流程进行改动。”他解释说。

测试

该设备将对一组人工肺进行五天不间断的通风换气,作为测试的一部分。

如果顺利通过,该设备将接受动物试验。

哥伦比亚集团希望随后能在5月初开始进行人体试验。

如果试验成功,目标是在今年年中开始在医院病人身上使用量产的版本。

这一时间表反映了哥伦比亚当局处理这一问题的紧迫性。测试和获得监管部门的许可来部署这种设备通常需要18个月左右的时间。

但一些医生仍然不相信这台机器能够完成任务,至少在目前的疫情爆发期间是如此。

“任何能够提供备份的设备都是有帮助的,但必须经过适当的测试,看它是否能够提供氧气和压力支持,”美国肺部协会首席医疗官Albert Rizzo博士说。

然而,Rizzo博士补充说,该项目有可能最终产生值得信赖的呼吸机,可在未来的大流行病期间使用。


最后添加项目网址:
https://github.com/Mascobot/pandemic-ventilator-2.0

MariaDB 公司的云数据库 SkySQL 介绍

本文仅仅是作为一个对 SkySQL 的简介。部分图片来自 Mariadb 官网

SkySQL 核心的平台架构于 K8s 之上,并采用 ServiceNow 作为 ITSM,实现数据库资产的管理和自治。技术上采用了 MaxScale 实现读写分离以及多 Replica 。

基础价格起步是 $0.45 每小时,起步注册赠送 $500 。

从油管介绍视频来看,负载均衡或者说高可靠的核心是 RW 端口和 RO 端口的配置,供应给上层数据库连接做配置。

在其他数据库参数配置方面,SkySQL 似乎提供的选项并不多,和 阿里的RDS比较起来少好多。譬如腾讯云可以设置参数模版:


而 AWS RDS 中 MariaDB 的参数配置居然有 30 页

好了, 这里不比较云厂商之间的性能,可靠性等,只是想说各家云厂商都有自己的 MySQL 实例和 MariaDB 实例提供。看来,在 MySQL 被 Oracle 收购后, MariaDB 正在成为关系型数据库的一匹黑马,异军突起。

启用 TCP BBR 提高 Linux 的网速

BBR 全称是 Bottleneck Bandwidth and RRT ,是谷歌开发的用于控制 TCP 阻塞的一种算法 Congestion Control Algorithm (CCA) 。

它克服了当前 Reno 和 CUBIC (默认 CCA) 中的诸多问题, 新算法不仅在带宽使用上有了重大的提升,在降低延时上也有重大改进。内核版本 4.9 以后的Linux 操作系统都支持 BBR。

检查当前的 CCA 算法:

sysctl net.ipv4.tcp_available_congestion_control

应该报告:

net.ipv4.tcp_available_congestion_control = cubic reno

如果内核没有更新的话,在 Ubuntu 上可以用下面的命令更新内核:

sudo apt update
sudo apt install --install-recommends linux-generic-hwe-16.04

设置 BBR

修改 /etc/sysctl.conf 文件,添加以下两行:

net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

运行:
sudo sysctl -p.

完工

GOLANG 的交叉编译以及 upx 压缩

交叉编译需要知道支持的 GOOS 以及 GOARCH,我们运行 go tool dist list 就可以得到支持的OS 以及硬件平台的组合,以下命令均在 x86_64 平台的 Linux 上运行。

$ go tool dist list|paste - - - - -
aix/ppc64       android/386     android/amd64   android/arm     android/arm64
darwin/386      darwin/amd64    darwin/arm      darwin/arm64    dragonfly/amd64
freebsd/386     freebsd/amd64   freebsd/arm     js/wasm linux/386
linux/amd64     linux/arm       linux/arm64     linux/mips      linux/mips64
linux/mips64le  linux/mipsle    linux/ppc64     linux/ppc64le   linux/s390x
nacl/386        nacl/amd64p32   nacl/arm        netbsd/386      netbsd/amd64
netbsd/arm      openbsd/386     openbsd/amd64   openbsd/arm     plan9/386
plan9/amd64     plan9/arm       solaris/amd64   windows/386     windows/amd64
windows/arm

检查当前的环境变量设置:

$ go env GOOS GOARCH

编译时把 -s -w 传递进 ldflags 我们就可以得到 strip 的二进制文件,以下是 aliyun-cli 项目,编译到 MediaTek MT7621 SoC 的命令,注意 GOARCH 是 mipsle, 也就是小端模式(little endian),然后要指定 softfloat,因为芯片没有硬件浮点处理器。

$ CGO_ENABLED=0 GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build -a \
  -ldflags " -s -w -X 'github.com/aliyun/aliyun-cli/cli.Version=3.0.37'" \
   -o out/aliyun-mips main/main.go
然后我们用 upx v3.93 ,请记住一定是这个 3.93 版本,不要用最新版本。 
$ upx --ultra-brute out/aliyun-mips 
得到压缩后的 aliyun-cli 命令行工具,把文件复制到 MT7621 的 OpenWrt 里面,重新命名为 /usr/bin/aliyun 即可

upx 压缩比还是蛮高的,从之前的 25229728 个字节,压缩到了 6355472 字节,压缩到了原文件的 25%,这对捉襟见肘的嵌入式设备而言非常重要。upx v3.96 版本压缩后的文件不能在 MT7621 上跑起来,运行后就一直挂在命令行,没有任何输出。看了 Issue #87 切换到 v3.93 就好了。

在嵌入式设备上有了这个 aliyun 命令行工具,我们就可以定制自己的和阿里云相关的所有脚本了。例如:阿里云 DDNS 脚本

香橙派上,只要 export GOARCH=arm64 就可以编译成功 aliyun cli 了。 然后就可以通过命令行来自动注册香橙派的 DNS 了。

阿里云 DDNS 脚本

周末写了一个脚本, 可以把当前 IP 自动更新到阿里云上的 DNS 记录里面。
Github 地址

如果没有用过 aliyun cli,需要先去阿里云官网,下载 ,解压后,放到 /usr/bin 之类的。 然后设置 profile 。当然建议是 RAM 账户设置一个不能登录的 API 使用的子账户,然后生成 Access KeyID/Secret,就可以设置到这个 profile 里。
# aliyun configure –profile=”name”

脚本需要 jq 命令,如果没有安装过, 那当然是 yum/apt install jq 就可以。

需要重新编译 aliyun cli 到 ARM CPU 的路由器上, 编译一直报告https 错误,解决办法是:
export GOPROXY=https://goproxy.io
oh, 当然编译前,还有个开关要设置为: GO111MODULE=on

编译中待解决问题:
go version go1.12.10 linux/amd64

go get -u github.com/aliyun/aliyun-openapi-meta
go: finding github.com/aliyun/aliyun-openapi-meta latest
go get -u github.com/jteeuwen/go-bindata/...
go: finding github.com/jteeuwen/go-bindata/... latest
go get github.com/jteeuwen/go-bindata/...: no matching versions for query "latest"
make: *** [Makefile:9: deps] Error 1

以上问题已经解决, 采用官方办法,而不是 github 上的 make 命令。

certbot 基于 DNS 验证的自动证书更新

我们之前写过关于通配符域名的证书申请办法,但是没有写怎样自动化更新证书。有人已经写过一个这样的脚本,可以应用于阿里云,腾讯云以及 GoDaddy 的 DNS。 我们以 阿里云为例子,讲一个大概的流程。

把脚本 git clone 到本地,进入克隆目录后:
#  /usr/local/bin/certbot renew --cert-name 证书名 --manual --preferred-challenges dns --manual-auth-hook "`pwd`/au.sh php aly add" --manual-cleanup-hook "`pwd`/au.sh php aly clean"

简单来说,就是以上这句话,如果有问题, 就检查运行目录下的 cerbot.log 文件, 一般会遇到的就是 API Key 的权限有问题。 在阿里云上设置的 RAM 子账户确保有 DNSFullAccess 的权限。

当然, 相信你首先已经创建了这个账户的 AccessKey 以及 Secret 然后更新到 dns.cfg 文件。

我在上面的命令行里, 使用了 –cert-name 通过证书的名称,你当然也可以用 -d 直接指定域名来使用。

有了这个 au.sh 脚本,就等于可以自动化通配符证书的 renew 了, 不用像以前那样,每三个月,需要手工去跑,然后手工去更新 DNS 里的 TXT 记录。

感谢 Let’s Encrypt!

OpenWrt 命令行设置 WireGuard 配置

昨天在微信上发了一个视频教程,都是基于浏览器配置的。 原先的私钥已经泄露,所以,今天要修改一下演示里面的私钥。 我们直接在命令行里修改即可。

# 生成 key
# umask 077; wg genkey|tee privatekey|wg pubkey >publickey
# uci set network.wg0.private_key=$(cat privatekey)
# uci commit network
# /etc/init.d/network restart

# 如果是纯粹修改私钥,在 OpenWrt 端就做以上修改即可,如果需要修改其他 network 参数:
network.@wireguard_wg0[0]=wireguard_wg0
network.@wireguard_wg0[0].public_key='xxxx'
network.@wireguard_wg0[0].allowed_ips='0.0.0.0/0'
network.@wireguard_wg0[0].endpoint_host='endpoint.mydomain.com'
network.@wireguard_wg0[0].endpoint_port='51820'
network.@wireguard_wg0[0].persistent_keepalive='25'
network.@wireguard_wg0[0].route_allowed_ips='1'
network.wg0=interface
network.wg0.proto='wireguard'
network.wg0.private_key='private-key'
network.wg0.addresses='10.1.1.111/24'
#