bookworm – matoken's blog https://matoken.org/blog Is there no plan B? Fri, 07 Mar 2025 09:53:46 +0000 ja hourly 1 https://wordpress.org/?v=6.7.2 https://matoken.org/blog/wp-content/uploads/2025/03/cropped-1865f695c4eecc844385acef2f078255036adccd42c254580ea3844543ab56d9-32x32.jpeg bookworm – matoken's blog https://matoken.org/blog 32 32 rpi-update後にRaspberry Piが起動しなくなってしまい困る https://matoken.org/blog/2025/03/06/raspberry-pi-stopped-booting/ https://matoken.org/blog/2025/03/06/raspberry-pi-stopped-booting/#respond Wed, 05 Mar 2025 22:37:18 +0000 https://matoken.org/blog/?p=4434

家で常時起動しているsingle-board computerのRaspberry Pi 3 model Bがkernel更新をした後再起動に失敗して起動しなくなりました.
長らく安定して動いていたので色々忘れていて解決まで時間がかかってしまいました.

rpi-updateコマンドでkernelを更新した後から起動しなくなりました.
LEDの状態は赤点灯,緑不点灯でした.
UARTは何も出ず.(恐らくこのときにはUART-USBアダプタが故障していた)

たまに/bootの1つ目のFATパーティションにダーティビットが立って起動に失敗することがあるのでmicroSD cardをPCに繋いでfsckをかけましたが今回はこれは外れで問題ありませんでした.

$ sudo fsck -n /dev/mmcblk0p1
fsck from util-linux 2.40.4
fsck.fat 4.2 (2021-01-31)
/dev/mmcblk0p1: 394 files, 49156/261115 clusters

kernelのファイル群の展開や書き込み失敗したのかもと/bootを上書きすることに.
rpi-updateコマンドではバックアップもとっているようですがよく理解していないのでオリジナルイメージから書き込むことに.

Raspberry Pi OS bookworm armhfイメージの入手
$ lftp -c torrent https://downloads.raspberrypi.com/raspios_lite_armhf/images/raspios_lite_armhf-2024-11-19/2024-11-19-raspios-bookworm-armhf-lite.img.xz.torrent
Name: 2024-11-19-raspios-bookworm-armhf-lite.img.xz
dn:534M up:0 complete, ratio:0.00/0.00/0.00
  peers:24 connected:0 active:0 complete:0
Seeding in background...
[215700] Moving to background to complete transfers...
$ wget https://downloads.raspberrypi.com/raspios_lite_armhf/images/raspios_lite_armhf-2024-11-19/2024-11-19-raspios-bookworm-armhf-lite.img.xz.sha256 \
  https://downloads.raspberrypi.com/raspios_lite_armhf/images/raspios_lite_armhf-2024-11-19/2024-11-19-raspios-bookworm-armhf-lite.img.xz.sig
$ sha256sum -c 2024-11-19-raspios-bookworm-armhf-lite.img.xz.sha256
$ gpg --verify 2024-11-19-raspios-bookworm-armhf-lite.img.xz.sig
Note
gpg公開鍵はここのものを使いました.わかりやすいページが欲しいところです. https://www.raspberrypi.org/raspberrypi_downloads.gpg.key
Raspberry Pi OSイメージの展開とパーティションデバイスマップ
$ unxz 2024-11-19-raspios-bookworm-armhf-lite.img.xz
$ sudo kpartx -av ./2024-11-19-raspios-bookworm-armhf-lite.img
add map loop0p1 (254:3): 0 1048576 linear 7:0 8192
add map loop0p2 (254:4): 0 3923968 linear 7:0 1056768
1つ目のパーティションをmicro SDに上書き
$ sudo dd if=/dev/mapper/loop0p1 of=/dev/mmcblk0p1 bs=4M conv=fsync status=progress ; sync
$ sync
Note

if=::入力元デバイス
of=::出力先デバイス
bs=::ブロックサイズを4MBに変更
conv=fsync::ディスクへの書き出しを保証

この状態でRaspberry Piにmicro SDと接続して起動を試すとやはり失敗します.
そういえばUUIDが違うのではということで確認します.

Raspberry Pi OS bookworm armhf lite 2024-11-19でのUUID
$ sudo blkid /dev/mapper/loop0p2
/dev/mapper/loop0p2: LABEL="rootfs" UUID="bb15c8e6-d999-4838-be67-5ff200bffa46" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="57b902f5-02"
$ sudo mount -o ro /dev/mapper/loop0p1 /mnt
$ cat /mnt/cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=57b902f5-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot
自分の環境のUUID
$ sudo blkid /dev/mmcblk0p2
/dev/mmcblk0p2: LABEL="rootfs" UUID="3a324232-335f-4617-84c3-d4889840dc93" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="71493291-02"

ずれているので1つ目のパーティションのcmdline.txtのroot=PARTUUID=の値をを利用中のrootになる2つ目のパーティションのPARTUUIDに書き換えます.

console=serial0,115200 console=tty1 root=PARTUUID=57b902f5-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot

console=serial0,115200 console=tty1 root=PARTUUID=71493291-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot

これで起動するようになりました.

ddする前にcmdline.txt, config.txtを退避しておいてdd後に戻す方が良かったですね.ddを使わずファイルコピーでも大丈夫だったと思います.

例えばこのようにcmdline.txt, config.txt以外をコピー(未検証)

rsync -avcI –exclude=cmdline.txt –exclude=config.txt $FROM $TO

若しくはmicroSDしか使っていないのでroot=/dev/mmcblk0p2のほうがいいかもしれません.

うまく行ったかと思いましたが,無線LANデバイスのwlan0が見えません.
有線LANは利用できたので,そちらからrpi-updateでkernelを更新して再起動することでデバイスが見え,接続も出来るようになりました.

ちなみにこの状態や,別のmicro SDでOSを書き込んだばかりの状態でもUARTから何も表示できませんでした.どうも断線してしまったようです.USB側はOSからserialに見えるので多分ピンソケットあたりを買って付けかえることで治りそうな感じはします.
でも手間や送料を考えると以下のようなものを買ってしまったほうがいいかもしれません.

PC環境
$ dpkg-query -W fdisk kpartx util-linux coreutils
coreutils       9.5-1+b1
fdisk   2.40.4-5
kpartx  0.11.1-1
util-linux      2.40.4-5
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
Raspberry Pi環境
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ uname -a
Linux raspberrypi 6.12.16-v7+ #1859 SMP Mon Feb 24 13:10:45 GMT 2025 armv7l GNU/Linux
$ grep "^Model" /proc/cpuinfo
Model           : Raspberry Pi 3 Model B Rev 1.2
]]>
https://matoken.org/blog/2025/03/06/raspberry-pi-stopped-booting/feed/ 0
astrotermで端末上で星図を楽しむ https://matoken.org/blog/2025/01/25/astroterm/ https://matoken.org/blog/2025/01/25/astroterm/#respond Fri, 24 Jan 2025 23:20:27 +0000 https://matoken.org/blog/?p=4415

端末で動作する星図盤アプリケーションを見つけました.端末でどのくらい使い物になるだろうかと思いつつ試してみました.

Releasesのバイナリを導入

GitHubのRelseasesからLinux x86_64版を利用しました.

$ wget2 -c -v \ (1)
https://github.com/da-luce/astroterm/releases/download/v1.0.5/astroterm-linux-x86_64 \
https://github.com/da-luce/astroterm/releases/download/v1.0.5/astroterm-linux-x86_64.sha256
$ sha256sum -c ./astroterm-linux-x86_64.sha256 (2)
sha256sum: build/astroterm: No such file or directory
build/astroterm: FAILED open or read
sha256sum: WARNING: 1 listed file could not be read
$ cat ./astroterm-linux-x86_64.sha256 (3)
ae1ce946d9da27f97e26de9ef6df8d068feb971a5aa7a76d4972b2673cddb495  build/astroterm
$ cat ./astroterm-linux-x86_64.sha256 | sed -e 's/build\/astroterm/astroterm-linux-x86_64/' | sha256sum -c (4)
astroterm-linux-x86_64: OK
$ chmod u+x ./astroterm-linux-x86_64 (5)
$ ./astroterm-linux-x86_64 -v (6)
astroterm 1.0.5
  1. 実行ファイルと,対応したhashファイルの入手

  2. ハッシュの確認に失敗

  3. ハッシュファイルの中を見るとファイル名が間違っている

  4. ファイル名部分を差し替えてハッシュの確認

  5. 実行権の付与

  6. バージョンの確認

Raspberry Pi OS bookworm armhfへのsourceからの導入

$ wget -c https://github.com/da-luce/astroterm/archive/refs/tags/v1.0.6.tar.gz (1)
$ tar tvf v1.0.6.tar.gz
$ tar xvf v1.0.6.tar.gz (2)
$ cd astroterm-1.0.6
$ meson setup build (3)
$ meson compile -C build
$ build/astroterm -v
astroterm 1.0.6
$ install build/astroterm ~/bin/ (4)
  1. sourceの入手

  2. source展開

  3. build※(mesonは1.4.0以上が必要)

  4. 好みの場所にinstall

利用例

help
$ ./astroterm-linux-x86_64 -h
View stars, planets, and more, right in your terminal! ✨🪐

Usage: astroterm [OPTION]...

  -a, --latitude=<degrees>  Observer latitude [-90°, 90°] (default: 0.0)
  -o, --longitude=<degrees> Observer longitude [-180°, 180°] (default: 0.0)
  -d, --datetime=<yyyy-mm-ddThh:mm:ss>
                            Observation datetime in UTC
  -t, --threshold=<float>   Only render stars brighter than this magnitude (def
                            ault: 5.0)
  -l, --label-thresh=<float>
                            Label stars brighter than this magnitude (default:
                            0.25)
  -f, --fps=<int>           Frames per second (default: 24)
  -s, --speed=<float>       Animation speed multiplier (default: 1.0)
  -c, --color               Enable terminal colors
  -C, --constellations      Draw constellation stick figures. Note: a constella
                            tion is only drawn if all stars in the figure are o
                            ver the threshold
  -g, --grid                Draw an azimuthal grid
  -u, --unicode             Use unicode characters
  -q, --quit-on-any         Quit on any keypress (default is to quit on 'q' or
                            'ESC' only)
  -m, --metadata            Display metadata
  -r, --aspect-ratio=<float>
                            Override the calculated terminal cell aspect ratio.
                            Use this if your projection is not 'square.' A valu
                            e around 2.0 works well for most cases
  -h, --help                Print this help message
  -i, --city=<city_name>    Use the latitude and longitude of the provided city
                            . If the name contains multiple words, enclose the
                            name in single or double quotes. For a list of avai
                            lable cities, see: https://github.com/da-luce/astro
                            term/blob/v1.0.5/data/cities.csv
  -v, --version             Display version info and exit

既定値

オプション無しの既定値で実行すると現在時刻の経度0,緯度0の所謂Null Island(実際はブイが浮かんでいるだけで存在しない島)での星図が表示されます.リアルタイムに星図は変化していきます.
解像度により情報量は変わります.以下のスクリーンショットは49×107です.

$ stty size
49 107

astroterm 01

任意の場所

任意の場所を指定したい場合は緯度経度をオプションで指定,もしくは都市を指定できます.

緯度経度の指定
  -a, --latitude=<degrees>  Observer latitude [-90°, 90°] (default: 0.0)
  -o, --longitude=<degrees> Observer longitude [-180°, 180°] (default: 0.0)
USCのKSセンター(取り壊し中)からの星図
$ ./astroterm-linux-x86_64 -a 31.252232 -o 131.078439
都市の指定
-i, --city=<city_name>    Use the latitude and longitude of the provided city
                            . If the name contains multiple words, enclose the
                            name in single or double quotes. For a list of avai
                            lable cities, see: https://github.com/da-luce/astro
                            term/blob/v1.0.5/data/cities.csv
鹿児島からの星図
$ ./astroterm-linux-x86_64 -i kagoshima

都市はsource内の data/cities.csv にあります.2733地点が登録されています.内日本は117地点のようです.

$ wc -l data/cities.csv
2733 data/cities.csv
$ grep ',JP,' data/cities.csv | wc -l
117

csvファイルだけではよくわからないのでuMapを使い地図(OpenStreetMap)にプロットしてみました.利用したい地点の近くにあれば便利です.

フルスクリーン表示

メタデータ

  -m, --metadata            Display metadata

左上にメタデータが表示されます.

astroterm 02

日時の指定

特定の年月日を指定できます.UTCで指定する必要があります.

  -d, --datetime=<yyyy-mm-ddThh:mm:ss>
                            Observation datetime in UTC
皆既日食のときの位置や時間を指定してシミュレーションしてみる
$ ./astroterm-linux-x86_64 -a -22.05 -o -4.07 -d 2006-03-29T08:38:00 -s 10 -m -cu

速度

  -s, --speed=<float>       Animation speed multiplier (default: 1.0)

-s で大きな値を指定することで星図盤のアニメーション速度が速くなります.-も指定できます.

カラー

端末カラーを有効にします.

  -c, --color               Enable terminal colors

Unicode

Unicodeを有効にします.点字フォントで星や絵文字で太陽や月,惑星などの表示がされるので解りやすくなります.

  -u, --unicode             Use unicode characters
$ ./astroterm-linux-x86_64 -i kagoshima -m -s 100 -cu

astroterm 03

Note

端末がUnicodeや絵文字に対応している必要があります.
例えば LC_ALL=C にすると文字化けしてしまいます.C.UTF-8, en_US.UTF-8, ja_JP.UTF-8 などだとOK.

星座

星座を表現します.Unicodeの有無で大分見た目が変わります.

  -C, --constellations      Draw constellation stick figures. Note: a constella
                            tion is only drawn if all stars in the figure are o
                            ver the threshold
Unicode無しの星座

astroterm 04

Unicodeありの星座

astroterm 05

等級

指定した等級よりも明るい星のみを表示します.

  -t, --threshold=<float>   Only render stars brighter than this magnitude (def
                            ault: 5.0)

グリッド

方位角グリッドを表示します.今回試した解像度だと星が大分消えてしまうので邪魔な感じがします.

  -g, --grid                Draw an azimuthal grid

demo

鹿児島での現在からの星図を10000倍の速度で.

$ ./astroterm-linux-x86_64 -i kagoshima -m -s 10000 -c -u -C -t 4

案外表現が豊かで等級の大きな星のある星座や惑星などの観測には使えそうな感じです.

とはいえGUI環境であればStellariumやKstarsなど色々なものがあり使い勝手もよいのでそちらのほうが実用的だと思います.
Debianであれば以下のblendsが天文向けで興味深いソフトウェアがたくさんあります.

GNUにもGNU Astronomy Utilitiesなんてものがあります.

環境

Debian sid amd64

$ ./astroterm-linux-x86_64 -v
astroterm 1.0.5
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64

Raspberry Pi OS bookworm armhf

$ astroterm -v
astroterm 1.0.6
$ dpkg-query -W meson gcc python libargtable2-dev libncurses-dev
gcc     4:12.2.0-3+rpi1
libargtable2-dev        13-1.1
libncurses-dev:armhf    6.4-4
meson   1.6.1-1
python  2.7.16-1
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
]]>
https://matoken.org/blog/2025/01/25/astroterm/feed/ 0
Portsproofで全TCPポートを開けて攻撃者を迷わせる https://matoken.org/blog/2025/01/03/portsproof/ https://matoken.org/blog/2025/01/03/portsproof/#respond Thu, 02 Jan 2025 22:20:51 +0000 https://matoken.org/blog/?p=4342

mastodonのTLに流れてきて気になったPortsproof


面白そうです.ローカル環境で少し試してみました.

Portsproofをbuild
$ git clone https://github.com/drk1wi/portsproof
$ cd portsproof
$ ./configure
$ make
iptableでTCP全ポートをPortsproofの4444に向ける
$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 1:65535 -j REDIRECT --to-ports 4444
Portsproofを起動
$ ./src/portspoof -1vd
-> Generating fuzzing payloads internally!
-> Verbose mode on.
-> Syslog logging disabled.
nmapでtcp 1-22をスキャン,元々は22番しか起動していないが1-22全てopenになる
$ nmap -p 1-22 192.168.0.23
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-03 06:50 JST
Nmap scan report for raspberrypi.AirPort (192.168.0.23)
Host is up (0.013s latency).

PORT   STATE SERVICE
1/tcp  open  tcpmux
2/tcp  open  compressnet
3/tcp  open  compressnet
4/tcp  open  unknown
5/tcp  open  rje
6/tcp  open  unknown
7/tcp  open  echo
8/tcp  open  unknown
9/tcp  open  discard
10/tcp open  unknown
11/tcp open  systat
12/tcp open  unknown
13/tcp open  daytime
14/tcp open  unknown
15/tcp open  netstat
16/tcp open  unknown
17/tcp open  qotd
18/tcp open  msp
19/tcp open  chargen
20/tcp open  ftp-data
21/tcp open  ftp
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 1.19 seconds
このときのPortsproofのlogの一部
 new conn - thread choosen: 0 -  nr. of connections already in queue: 0
 new conn - thread choosen: 0 -  nr. of connections already in queue: 1
 new conn - thread choosen: 0 -  nr. of connections already in queue: 2
 new conn - thread choosen: 0 -  nr. of connections already in queue: 3
OSスキャンをしてみると46分も掛かる(Portsproofを起動しない場合 0m43.604s で終わる)
$ time sudo nmap -AO 192.168.0.23
  :
real    46m1.292s
user    0m0.085s
sys     0m0.017s
このときのPortsproofのログを見ると適当なsignatureが出力されている
---
Thread nr.0 for port 17
signature sent -> \4c\d8\1a\6d\75\7b\1c\51\89\5d\4\f1\83\ec\e7\e8\3b\b5\1d\2b\36\8f\e2\ad\da\75\e1\ac\ec\96\27\b8\ee\41\a5\65\3c\42\36\c5\9f\3b\b8\a3\28\20\8c\e2\56\aa\8d\8c\3a\71\3a\15\e6\9c\42\53\33\69\c\a2\2b\b1\8\67\73\3e\ad\14\f8\e5\b7\a0\6\c3\84\5c\6e\91\68\28\3\a3\bd\69\bf\00
---

という感じで面白いです.Tarpit的にも使えそう?

環境
$ git log --pretty=oneline -1
89d5ecc6b681037865a4557ec8c374286302b840 (HEAD -> master, origin/master, origin/HEAD) Merge pull request #51 from AbelLykens/patch-1
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
$ grep ^Model /proc/cpuinfo
Model           : Raspberry Pi 3 Model B Rev 1.2
]]>
https://matoken.org/blog/2025/01/03/portsproof/feed/ 0
go install時に勝手に新しいgoがダウンロードされる?(Go Toolchains) https://matoken.org/blog/2024/12/24/go-toolchains/ https://matoken.org/blog/2024/12/24/go-toolchains/#respond Tue, 24 Dec 2024 09:39:59 +0000 https://matoken.org/blog/?p=4299

Go製のアプリをgo installで導入したところ新しいバージョンのgoが自動的にダウンロードされて使われました.これは何だろうと少し調べてみました.

go install でnostr clientのalgiaをインストールしました.途中でgo 1.23.4がダウンロードされています.

$ go install github.com/mattn/algia@latest
go: downloading github.com/mattn/algia v0.0.84
go: github.com/mattn/algia@v0.0.84 requires go >= 1.23.0; switching to go1.23.4
go: downloading go1.23.4 (linux/arm) (1)
go: downloading github.com/mdp/qrterminal/v3 v3.2.0
go: downloading github.com/nbd-wtf/go-nostr v0.38.1
go: downloading github.com/urfave/cli/v2 v2.27.4
go: downloading github.com/btcsuite/btcd/btcec/v2 v2.3.4
go: downloading github.com/btcsuite/btcd/btcutil v1.1.6
go: downloading github.com/gobwas/httphead v0.1.0
go: downloading github.com/gobwas/ws v1.4.0
go: downloading github.com/mailru/easyjson v0.7.7
go: downloading github.com/puzpuzpuz/xsync/v3 v3.4.0
go: downloading github.com/tidwall/gjson v1.18.0
go: downloading github.com/fiatjaf/eventstore v0.11.0
go: downloading golang.org/x/exp v0.0.0-20240909161429-701f63a606c0
go: downloading github.com/graph-gophers/dataloader/v7 v7.1.0
go: downloading rsc.io/qr v0.2.0
go: downloading github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0
go: downloading github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0
go: downloading github.com/cpuguy83/go-md2man/v2 v2.0.5
go: downloading github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1
go: downloading github.com/gobwas/pool v0.2.1
go: downloading github.com/josharian/intern v1.0.0
go: downloading github.com/tidwall/match v1.1.1
go: downloading github.com/tidwall/pretty v1.2.1
go: downloading github.com/fiatjaf/generic-ristretto v0.0.1
go: downloading github.com/decred/dcrd/crypto/blake256 v1.1.0
go: downloading github.com/dustin/go-humanize v1.0.1
go: downloading github.com/golang/glog v1.2.2
  1. go 1.23.4がダウンロードされている

gup checkで確認すると今回のalgiaはgo1.23.4でbuildされていて,他のはgo1.22.1です.

$ gup check
check binary under $GOPATH/bin or $GOBIN
[1/8] github.com/mattn/algia (Already up-to-date: v0.0.84 / go1.23.4) (1)
[2/8] github.com/darkhz/bluetuith (current: v0.2.2, latest: v0.2.3 / go1.22.1)
[3/8] github.com/mattn/bsky (current: v0.0.61, latest: v0.0.67 / go1.22.1)
[4/8] github.com/bloznelis/typioca (current: v0.0.0-20240403160848-1c6a0ac60a1a, latest: v0.0.0-20241028092943-0f1ec70f7d95 / go1.22.1)
[5/8] github.com/mikuta0407/misskey-cli (current: v0.0.0-20230730142608-ab80e8e6583c, latest: v0.3.1 / current: go1.19.8, installed: go1.22.1)
[6/8] github.com/nao1215/gup (Already up-to-date: v0.27.5 / go1.22.1)
[7/8] github.com/maaslalani/nap (Already up-to-date: v0.1.1 / go1.22.1)
[8/8] github.com/sqshq/sampler (Already up-to-date: v1.1.0 / go1.22.1)

If you want to update binaries, run the following command.
           $ gup update bluetuith bsky typioca misskey-cli
  1. algiaだけgo1.23.4が使われている

インストールされているgoを確認するとgo1.22.1です.

$ which go
/usr/bin/go
$ go version
go version go1.22.1 linux/arm

$GOPATHの下を見るとgo1.23.4があります.

$ ~/go/pkg/mod/golang.org/toolchain\@v0.0.1-go1.23.4.linux-arm/bin/go version
go version go1.23.4 linux/arm
$ du -Hs ~/go/pkg/mod/golang.org/toolchain\@v0.0.1-go1.23.4.linux-arm
243424  /home/matoken/go/pkg/mod/golang.org/toolchain@v0.0.1-go1.23.4.linux-arm

go.modのこの辺りが効いていそうです.

$ head go/pkg/mod/github.com/mattn/algia@v0.0.84/go.mod
module github.com/mattn/algia

go 1.23.0

toolchain go1.23.1

require (
        github.com/fatih/color v1.17.0
        github.com/mdp/qrterminal/v3 v3.2.0
        github.com/nbd-wtf/go-nostr v0.38.1

これは何だろうとgo toolchainとかで検索してみるとgo 1.21からの機能で必要なバージョンのgoを指定することで自動的に必要なgoをダウンロードして使ってくれるようです.便利ですね.

でも容量結構食うし今回の環境のようなRaspberry Pi環境ではちょっと辛い.クロスビルドとかするといいんでしょうがちょっとツールを試すだけだと面倒…….ビルド後に掃除する感じがいいんですかね.

環境
$ dpkg-query -W golang-1.19 golang-1.22 golang
golang:armhf    2:1.19~1
golang-1.19     1.19.8-2
golang-1.22     1.22.1-1~bpo12+1
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
]]>
https://matoken.org/blog/2024/12/24/go-toolchains/feed/ 0
hydroxideを使い無料アカウントのProton MailでもIMAP/SMTPを使う https://matoken.org/blog/2024/12/19/use-imap-smtp-with-hydroxide-and-proton-bridge-with-a-free-account/ https://matoken.org/blog/2024/12/19/use-imap-smtp-with-hydroxide-and-proton-bridge-with-a-free-account/#respond Wed, 18 Dec 2024 21:26:33 +0000 https://matoken.org/blog/?p=4279

Proton MailでOSSのメールブリッジを使うことで無料アカウントでもIMAP/SMTPが利用できたのでメモしておきます.

ProtonMailというスイスの会社のメールサービスがあります.コードはOSSで公開されており,自動的にPGP鍵を作成してE2EEを使えたりします.

現在はオンラインストレージ,VPN,カレンダー,パスワードマネージャーなどのサービスも開始しています.無料でも使えますし,脱gmailな向きには勧めやすいサービスです.

しかし,無料ではIMAP/SMTPが利用できないため好みのMUAが利用できずウェブインターフェイスしか利用できません.€4.99よりの有料プランにアップグレードすることでProton Mail Bridgeというプログラムを利用してIMAP/SMTPが利用できるようになり,好みのMUAが使えるようになります.

 Email client support (via IMAP/SMTP)
Proton Mail supports desktop clients such as Outlook, Apple Mail, Thunderbird, etc. via Proton Mail Bridge.

無料アカウントでProton Mail Bridgeを試すとアップグレードを勧められて使えません.

Proton Mail Bridgeの起動画面
無料アカウントでは利用できない

hydroxideを使う

hydroxideはGo製MITライセンスのProton bridgeです.IMAP/SMTPの他にCardDAVにも対応しています.
Proton Mail Bridgeと違い,GUIは提供されていません.

hydroxideのインストール

ビルドとインストール
$ git clone https://github.com/emersion/hydroxide.git (1)
$ cd hydroxide
$ go build ./cmd/hydroxide (2)
$ install ./hydroxide ~/bin/ (3)
$ which hydroxide
/home/matoken/bin/hydroxide
  1. sourceのclone

  2. build

  3. 好みの場所にインストール

help
$ hydroxide --help
usage: hydroxide [options...] <command>
Commands:
        auth <username>         Login to ProtonMail via hydroxide
        carddav                 Run hydroxide as a CardDAV server
        export-secret-keys <username> Export secret keys
        imap                    Run hydroxide as an IMAP server
        import-messages <username> [file]       Import messages
        export-messages [options...] <username> Export messages
        sendmail <username> -- <args...>        sendmail(1) interface
        serve                   Run all servers
        smtp                    Run hydroxide as an SMTP server
        status                  View hydroxide status

Global options:
        -debug
                Enable debug logs
        -api-endpoint <url>
                ProtonMail API endpoint
        -app-version <version>
                ProtonMail application version
        -smtp-host example.com
                Allowed SMTP email hostname on which hydroxide listens, defaults to 127.0.0.1
        -imap-host example.com
                Allowed IMAP email hostname on which hydroxide listens, defaults to 127.0.0.1
        -carddav-host example.com
                Allowed SMTP email hostname on which hydroxide listens, defaults to 127.0.0.1
        -smtp-port example.com
                SMTP port on which hydroxide listens, defaults to 1025
        -imap-port example.com
                IMAP port on which hydroxide listens, defaults to 1143
        -carddav-port example.com
                CardDAV port on which hydroxide listens, defaults to 8080
        -disable-imap
                Disable IMAP for hydroxide serve
        -disable-smtp
                Disable SMTP for hydroxide serve
        -disable-carddav
                Disable CardDAV for hydroxide serve
        -tls-cert /path/to/cert.pem
                Path to the certificate to use for incoming connections (Optional)
        -tls-key /path/to/key.pem
                Path to the certificate key to use for incoming connections (Optional)
        -tls-client-ca /path/to/ca.pem
                If set, clients must provide a certificate signed by the given CA (Optional)

Environment variables:
        HYDROXIDE_BRIDGE_PASS   Don't prompt for the bridge password, use this variable instead

認証

authオプションでProton Mailとhydroxideの間での認証と,hydroxideとMUAの間で使うパスワードの生成を行います.
Proton Mailとの認証後に表示されるブリッジパスワードはMUAとの認証に使います.保存しておきましょう.

$ hydroxide auth <username>

認証情報は ~/.config/hydroxide/ 以下のファイルに保存されます.

hydroxideの起動

  • SMTP

smtpオプションでSMTPのブリッジが起動します.

$ hydroxide smtp
port

1025

セキュリティ

なし

user

Proton Mailと同じ

password

authオプションで表示されたブリッジパスワード

  • CardDav

carddavオプションでCardCadのブリッジが起動します.httpsリバースプロキシを起動して利用するようですが未検証.

$ hydroxide carddav
  • IMAP

imapオプションでIMAPのブリッジが起動します.

$ hydroxide imap
port

1143

セキュリティ

なし

user

Proton Mailと同じ

password

authオプションで表示されたブリッジパスワード

Warning
IMAPのサポートは進行中らいいです.とりあえず数時間使った程度だと普通に使えていそうです.
  • serveオプションで複数のサービスの起動

hydroxideを複数起動しないようにとの注意がREADME.mdにあります.複数のサービスを起動したい場合はserveオプションで全てのサービス(SMTP, CardDav, IMAP)が起動します.

$ hydroxide serve

3つのサービスのうち2つだけを起動したい場合はserveオプションの他に-disable-サービス名のオプションを指定します.以下はCardDavを無効にしてSMTPとIMAPが起動します.

$ hydroxide -disable-carddav serve

MUAの設定

hydroxideを起動した状態で好みのMUAに設定を行います.
TLSなどには非対応なので注意.

あとは普通に利用できます.
Proton Mailに作られたたものではない自分のPGP鍵を使うこともできます :)

hydroxideの自動起動とアクセス制限

はじめRaspberry Piでhydroxideを起動してLaptopのMUAから繋ごうと思っていましたが,既定値ではTLSが利用されず通信が平文で行われるのでリモートで動かすのはやめてlocalhostで動かすことにしました.

MUAでメールを送受信するときにはhydroxideが起動している必要があります.
デスクトップ環境の自動起動機能や,crontabの@rebootなどやMUAの起動scriptに加えたりすると良さそうです.

そしてそのままだとリモートから繋ぐこともできるのでlocalhostからしか受け付けないようnftableなどで制限を掛けたほうが良さそうです.

おわりに

ということでhydroxideを利用し,無料アカウントでProton MailのIMAP/SMTPを使えるようにして自分好みのMUAを利用できるようになりました.これでウェブブラウザを起動しなくてもメールの送受信ができたり自分の作成したPGP鍵を利用できます.
ただ,hydroxideもProtonのAPIを叩いているようなのでProton BrisgeのようにProton側で無料アカウントに対してアクセス制限をするようになると使えなくなると思います.そのためいつまで利用できるかわからない方法です.それが嫌なら有料アカウントにアップグレードするか別のサービスを使うしかなさそうです.

環境

$ git log –pretty=oneline -1
c964219ad4996d90b34d730b98a8c736b9bc9921 (HEAD -> master, tag: v0.2.29, origin/master, origin/HEAD) Support BODY and TEXT in search

$ dpkg-query -W golang
golang:amd64    2:1.23~2
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
環境2(Raspberry Pi OS bookworm armhf)
$ git log --pretty=oneline -1
c964219ad4996d90b34d730b98a8c736b9bc9921 (HEAD -> master, tag: v0.2.29, origin/master, origin/HEAD) Support BODY and TEXT in search
$ dpkg-query -W golang
golang:armhf    2:1.19~1
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
]]>
https://matoken.org/blog/2024/12/19/use-imap-smtp-with-hydroxide-and-proton-bridge-with-a-free-account/feed/ 0
KSMBDでSMB共有 https://matoken.org/blog/2024/12/13/smb-share-with-ksmbd/ https://matoken.org/blog/2024/12/13/smb-share-with-ksmbd/#respond Thu, 12 Dec 2024 15:48:18 +0000 https://matoken.org/blog/?p=4274

AndroidスマートフォンからLinux Boxのファイルにアクセスしたい.AndroidからだとSMBがいいのかな?でも今回に用途にsambaは大袈裟な感じということで久々にKSMBDを設定したメモです.

ホストはRaspberry Pi bookworm armhfとDebian sid amd64で確認しました.
KSMBDはLinux KernelベースのSMBサーバー実装です.Linux kernel 5.11以降に含まれています.

sambaの停止

sambaを動かしている場合停止します.

$ sudo systemctl stop smbd nmbd winbind samba-ad-dc

ksmbd-toolsの導入

KSMBD自体はkernel moduleですが,ユーザランドのksmbd-toolsというツールが別途必要なので導入します.

Debianでは ksmbd-tools というパッケージです.

$ sudo apt install ksmbd-tools
$ dpkg -L ksmbd-tools
/.
/etc
/etc/ksmbd
/etc/ksmbd/ksmbd.conf.example
/usr
/usr/lib
/usr/lib/systemd
/usr/lib/systemd/system
/usr/lib/systemd/system/ksmbd.service
/usr/libexec
/usr/libexec/ksmbd.tools
/usr/sbin
/usr/share
/usr/share/doc
/usr/share/doc/ksmbd-tools
/usr/share/doc/ksmbd-tools/PFIF.txt
/usr/share/doc/ksmbd-tools/README.Debian
/usr/share/doc/ksmbd-tools/README.md.gz
/usr/share/doc/ksmbd-tools/changelog.Debian.gz
/usr/share/doc/ksmbd-tools/copyright
/usr/share/doc/ksmbd-tools/examples
/usr/share/doc/ksmbd-tools/examples/ksmbd.conf.example
/usr/share/man
/usr/share/man/man5
/usr/share/man/man5/ksmbd.conf.5.gz
/usr/share/man/man5/ksmbdpwd.db.5.gz
/usr/share/man/man8
/usr/share/man/man8/ksmbd.addshare.8.gz
/usr/share/man/man8/ksmbd.adduser.8.gz
/usr/share/man/man8/ksmbd.control.8.gz
/usr/share/man/man8/ksmbd.mountd.8.gz
/usr/sbin/ksmbd.addshare
/usr/sbin/ksmbd.adduser
/usr/sbin/ksmbd.control
/usr/sbin/ksmbd.mountd

設定ファイルの用意

次に設定ファイルを用意します.

最低限の設定を書いたり.
$ echo '[global]

[share]
  path=/tmp
' | sudo tee /etc/ksmbd/ksmbd.conf
既存のsmb.confを流用したり,
$ sudo cp -p /etc/samba/smbd.conf /etc/ksmbd/ksmbd.conf
ksmbd-toolsに付属のksmbd.conf.exampleをコピーして使ったり,
$ sudo cp -p /etc/ksmbd/ksmbd.conf.example /etc/ksmbd/ksmbd.conf

smb.confとだいたい同じようにかけますが,[homes]のような特殊な共有名や,path = %Hpath = /home/%u のような環境変数はうまく動かない感じです.以下のようなissueがあるので恐らく未実装かなと.

詳細はKSMBD.CONF(5)を.

$ man ksmbd.conf

SMB共有のユーザ,パスワードの設定

ksmbd-tools付属のksmbd.adduserコマンドで共有にアクセスするためのユーザ名とパスワードを設定します.

$ sudo ksmbd.adduser -a <KSMBDアクセス用ユーザ名>

パスワードファイルは /etc/ksmbd/ksmbdpwd.db で, ID:passwordhash のような形式で保存されるようです.

KSMBDモジュールの読み込み

KSMBDモジュールを読み込みます.モジュールがない場合kernel sourceからmenuconfigなどでKSMBDモジュールを有効にします.

$ modinfo ksmbd
filename:       /lib/modules/6.6.64-v7+/kernel/fs/smb/server/ksmbd.ko.xz
softdep:        pre: crc32
softdep:        pre: gcm
softdep:        pre: ccm
softdep:        pre: aead2
softdep:        pre: sha512
softdep:        pre: sha256
softdep:        pre: cmac
softdep:        pre: aes
softdep:        pre: nls
softdep:        pre: md5
softdep:        pre: hmac
softdep:        pre: ecb
license:        GPL
description:    Linux kernel CIFS/SMB SERVER
version:        3.4.2
author:         Namjae Jeon <linkinjeon@kernel.org>
srcversion:     615D8D4CE63537A48C03456
depends:        nls_ucs2_utils,cifs_arc4
intree:         Y
name:           ksmbd
vermagic:       6.6.64-v7+ SMP mod_unload modversions ARMv7 p2v8
$ sudo modprobe -v ksmbd
$ lsmod | grep ksmbd
ksmbd                 249856  1
cifs_arc4              12288  1 ksmbd
nls_ucs2_utils         12288  1 ksmbd

ksmbd.mountdの起動

ユーザー空間用のデーモンを起動します.

$ sudo ksmbd.mountd

共有にアクセス

適当なファイラーや,smbclientなどからアクセス出来るのを確認します.

$ smbclient //192.168.0.23/home
Password for [WORKGROUP\matoken]:
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Tue Nov 17 06:17:29 2020
  ..                                  D        0  Mon May 20 18:03:24 2024
  nitter                              D        0  Mon Nov 23 23:14:29 2020
  huginn                              D        0  Sat Oct 24 16:03:31 2020
  pi                                  D        0  Mon Aug 12 06:12:17 2024
  matoken                             D        0  Thu Dec 12 22:39:12 2024
  gitea                               D        0  Fri Nov 13 09:43:48 2020

                29948557 blocks of size 4096. 2499637 blocks available

設定の再読込

設定ファイルを編集した場合,設定を反映するために再読込をします.

$ sudo ksmbd.control --reload

KSMBD停止

$ sudo ksmbd.control -s
[ksmbd.control/30908]: INFO: Terminated ksmbd.mountd
[ksmbd.control/30908]: INFO: Killed ksmbd
$ sudo modprobe -r ksmbd

永続化

動いたので次回起動時以降に起動してくるよう永続化します.

sambaの無効化
$ sudo systemctl disable smbd nmbd winbind samba-ad-dc
モジュールの自動読み込み
$ echo ksmbd | sudo tee -a /etc/modules
ksmbdデーモンの自動起動
$ sudo systemctl enable ksmbd

再起動して動作確認.

Androidからのアクセス

まずSMBに対応した動画プレイヤーのVLCで動画再生を試みました.問題なく動作します.

次にPDFを読めるか試そうと思ったのですが,FilesアプリなどではSMBにアクセスできなそうです.F-DroidからCIFS Documents Providerというアプリケションを導入することでSMB内のファイルにアクセスできました.PDFファイルも読めます.しかし一旦ダウンロードしないと読めないようで少し待ち時間が必要でした.探せばストリーミングに対応したアプリはありそうです.

家庭内の個人用ファイルサーバーなんかだとKSMBDが向いているかもしれません.

環境

サーバー1
$ uname -a
Linux raspberrypi 6.6.64-v7+ #1829 SMP Tue Dec 10 20:04:50 GMT 2024 armv7l GNU/Linux
$ apt list ksmbd-tools
Listing... Done
ksmbd-tools/stable,now 3.4.7-1 armhf [installed]
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
$ grep "^Model" /proc/cpuinfo
Model           : Raspberry Pi 3 Model B Rev 1.2
サーバー2
$ uname -a
Linux tp-l13 6.11.10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.11.10-1 (2024-11-23) x86_64 GNU/Linux
$ apt list ksmbd-tools
ksmbd-tools/unstable,now 3.5.2-3 amd64 [installed]
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
クライアント(Android)
$ adb shell pm list packages --show-versioncode | grep -e vlc -e cifs
package:com.wa2c.android.cifsdocumentsprovider versionCode:29
package:org.videolan.vlc versionCode:13050749
$ adb shell getprop ro.build.version.release
14
$ adb shell getprop ro.product.model
moto g24
]]>
https://matoken.org/blog/2024/12/13/smb-share-with-ksmbd/feed/ 0
Raspberry PiでLUKS暗号化ファイルシステムが開けない https://matoken.org/blog/2024/11/16/unable-to-open-luks-encrypted-file-system-on-raspberry-pi/ https://matoken.org/blog/2024/11/16/unable-to-open-luks-encrypted-file-system-on-raspberry-pi/#respond Fri, 15 Nov 2024 22:08:34 +0000 https://matoken.org/blog/?p=4236

先日PCで暗号化FSを設定したHDDですが,

SBCのRaspberry Piに接続してマウントしようとしたところ失敗しました.

RaspberryPiでopenしようとしたら失敗
$ sudo cryptsetup open -S0 /dev/sda crypthdd
Enter passphrase for /dev/sda:
Warning: keyslot operation could fail as it requires more than available memory.
Killed

メモリ不足でRaspberry Piで開けない

メッセージではメモリが足りなそうです.

Warning: keyslot operation could fail as it requires more than available memory.

試したのはRaspberry Pi 3 model BでRAM 1GBのarm端末です.このHDDを設定した端末のRAMは16GBでした.

1GBもあって失敗するのもなのかなと思いつつswapファイルを作り,一時的にswapを4GBほど追加してみても1時間以上経っても戻ってきませんでした.諦めて途中で終了しました.

swapファイルを作りswapを追加
$ sudo install -m 0600 -o 0 -g 0 /dev/null /var/tmp/swap.img
$ sudo dd if=/dev/zero of=/var/tmp/swap.img bs=1M count=4096
$ sudo mkswap /var/tmp/swap.img
$ sudo swapon /var/tmp/swap.img

keyslotのメモリを制限したり,古いアルゴリズムを指定

Raspberry Pi側で再度cryptsetup luksFormatからやり直しかなと思ったのですが,一旦セットアップしたPCに接続し直して,新しいキースロットを --pbkdf-memory でメモリを制限したり, --pbkdf pbkdf2 のように古いアルゴリズムを指定することでRAM 1GBのRaspberry Piでもopenすることが出来ました.

PCで作ったkeyslot 0の情報
$ sudo cryptsetup luksDump /dev/sdb | grep "0: luks2" -A 15
  0: luks2
        Key:        512 bits
        Priority:   normal
        Cipher:     aes-xts-plain64
        Cipher key: 512 bits
        PBKDF:      argon2id
        Time cost:  6
        Memory:     1048576
        Threads:    4
        Salt:       60 50 4a 09 0d ed 44 1d 53 52 04 f5 71 15 58 40
                    42 8b 7d 36 8f 7c f7 b5 2f 7f af 79 1f 68 e8 29
        AF stripes: 4000
        AF hash:    sha256
        Area offset:32768 [bytes]
        Area length:258048 [bytes]
        Digest ID:  0
keyslot1のアルゴリズムに pbkdf2 を利用
$ sudo cryptsetup luksAddKey --pbkdf pbkdf2 -S 1 /dev/sda
WARNING: The --key-slot parameter is used for new keyslot number.
Enter any existing passphrase:
Enter new passphrase for key slot:
Verify passphrase:
$ sudo cryptsetup luksDump /dev/sdb | grep "1: luks2" -A 14 (1)
  1: luks2
        Key:        512 bits
        Priority:   normal
        Cipher:     aes-xts-plain64
        Cipher key: 512 bits
        PBKDF:      pbkdf2
        Hash:       sha256
        Iterations: 1669706
        Salt:       4b a5 42 b1 41 ce 0b 5f 14 f6 da 05 a8 ad f7 7f
                    23 60 d1 03 c4 18 ce ca f4 fa 63 56 04 f0 b8 a5
        AF stripes: 4000
        AF hash:    sha256
        Area offset:290816 [bytes]
        Area length:258048 [bytes]
        Digest ID:  0
keyslot 2のmemoryをPCで作成したkeyslotの半分で設定
$ echo $(sudo cryptsetup luksDump /dev/sda | grep "0: luks2" -A 14 | grep Memory: | cut -f6- -d\ )/2 | bc
524288
$ sudo cryptsetup luksAddKey -S 2 --pbkdf-memory=524288 /dev/sda
WARNING: The --key-slot parameter is used for new keyslot number.
Enter any existing passphrase:
Enter new passphrase for key slot:
Verify passphrase:
$ sudo cryptsetup luksDump /dev/sda | grep "2: luks2" -A15
  2: luks2
        Key:        512 bits
        Priority:   normal
        Cipher:     aes-xts-plain64
        Cipher key: 512 bits
        PBKDF:      argon2id
        Time cost:  10
        Memory:     524288
        Threads:    4
        Salt:       9c 04 4e e9 db 79 4e db 67 41 99 96 0d b4 a5 66
                    4f 6d 0d 7f fd 8d e5 60 5b c1 b3 12 6d f2 df ba
        AF stripes: 4000
        AF hash:    sha256
        Area offset:1064960 [bytes]
        Area length:258048 [bytes]
        Digest ID:  0
Tip
ここでのMemoryの単位はkilobytesです.
Raspberry Piでopen出来るか試す
$ sudo cryptsetup open -S1 /dev/sda chdd (1)
Enter passphrase for /dev/sda:
$ sudo cryptsetup close chdd
$ sudo cryptsetup open -S2 /dev/sda chdd (2)
Enter passphrase for /dev/sda:
Warning: keyslot operation could fail as it requires more than available memory. (3)
$ ls -l /dev/mapper/chdd
lrwxrwxrwx 1 root root 7 Nov 15 05:58 /dev/mapper/chdd -> ../dm-0
$ sudo cryptsetup close chdd
  1. pdkdf2のkeyslot1をopen

  2. argon2id/Memory 523288のkeyslot2をopen

  3. 警告が出るがopen出来た

Tip
keyslotは0からはじまりLUKS1は8slot,LUKS2では32slot利用可能です.

Raspberry Piでopenできないkeyslotを削除

Raspberry Piでopenできないkeyslotは邪魔なので消してしまいます.

PCでRaspberry Piでopenできないkeyslot 0をkill
$ sudo cryptsetup luksKillSlot /dev/sdb 0
Enter any remaining passphrase:

Raspberry Pi既定値でkeyslotを設定

オプションを指定しなかったらその端末にあった設定になると思うので既定値で設定してみます.

Raspberry Piで新しいkeyslotを規定値で設定
$ sudo cryptsetup luksAddKey -S4 /dev/sda
WARNING: The --key-slot parameter is used for new keyslot number.
Enter any existing passphrase:
Enter new passphrase for key slot:
Verify passphrase:
$ sudo cryptsetup luksDump /dev/sda | grep "4: luks2" -A15
  4: luks2
        Key:        512 bits
        Priority:   normal
        Cipher:     aes-xts-plain64
        Cipher key: 512 bits
        PBKDF:      argon2id
        Time cost:  4
        Memory:     170223 (1)
        Threads:    4
        Salt:       2d 06 67 aa 97 1f fd d5 02 72 54 ab a5 31 9b 9d
                    83 18 12 cd c1 2f 98 56 a5 4a 75 10 ea eb 7b bc
        AF stripes: 4000
        AF hash:    sha256
        Area offset:32768 [bytes]
        Area length:258048 [bytes]
        Digest ID:  0

PCで作成したkeyslot0と比べると主にTime costとMemoryが変わりました.メモリ量は大分減りました.

PC Pi

Time cost

10

4

Memory

1048576

170223

スペック差のある端末間でLUKSを利用するときは注意

今回CPU Intel第10世代,RAM 16GBのlaptopのcryptsetupで暗号化ファイルシステムを作成,SOC Broadcom BCM2837(1.2GHz 64-bit quad-core ARMv8 Cortex-A53),RAM 1GBのSBCのRaspberry Pi 3 model Bで利用しようとopenしようとしたところでメモリ不足で失敗しました.
cryptsetupはluksAddkeyを行うときにベンチマークを実行し,環境に合ったkeyslotを作ろうとするようです.そのためスペックさがある場合は一番低スペックな端末で設定するか,cryptsetup benchmarkを実行してその結果を参考に設定するようにしたほうが良さそうです.そうでないと今回のように低スペックな端末で開けないといったことが起きます.

余録1)crypttabとfstabでsystemd手動マウント設定

ここは余録です.systemdで手動マウントするようしてみました.
手動マントの場合は前設定の手間を考えると全部手動でも良いような感じもします.

$ sudo cryptsetup luksDump /dev/sda | grep "UUID" (1)
UUID:           28dee849-e142-49bc-96c2-be62adfc9309
$ sudo install -o0 -g0 -m0600 /dev/null /etc/crypttab (2)
$ echo "crypthdd UUID=28dee849-e142-49bc-96c2-be62adfc9309 none luks,discard,keyslot=1,noauto" | sudo tee /etc/crypttab (3)
crypthdd UUID=28dee849-e142-49bc-96c2-be62adfc9309 none luks,discard,keyslot=1,noauto
$ echo "/dev/mapper/crypthdd    /mnt    btrfs    nodev,noexec,noauto,compress=zstd,nofail,x-systemd.automount,x-systemd.device-timeout=30        0       0" \
  | sudo tee -a /etc/fstab (4)
/dev/mapper/crypthdd    /mnt    btrfs    nodev,noexec,noauto,compress=zstd,nofail,x-systemd.automount,x-systemd.device-timeout=30        0       0
$ sudo systemctl daemon-reload (5)
$ sudo systemctl start systemd-cryptsetup@crypthdd.service (6)
Please enter passphrase for disk 541050A9E680 (crypthdd) on /mnt: (no echo)
$ df /mnt (7)
Filesystem           1K-blocks  Used Available Use% Mounted on
/dev/mapper/crypthdd 488370200  5920 486255616   1% /mnt
$ mount | grep /mnt
systemd-1 on /mnt type autofs (rw,relatime,fd=46,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
/dev/mapper/crypthdd on /mnt type btrfs (rw,nodev,noexec,relatime,compress=zstd:3,space_cache=v2,subvolid=5,subvol=/,x-systemd.automount)
  1. LUKSデバイスのUUIDを確認

  2. crypttabを作成

  3. crypttabを設定

  4. fstabに追記

  5. systemdに反映

  6. LUKS手動アンロック

  7. マウントポイントにアクセスすると自動マウント

余録2)LUKS1の頃のDump

ThinkPad X201s(CPU:Core i7 620L/RAM:8GB)で設定したと思う古いdiskもあったのでluksDumpを見てみるとこんな感じでした.

$ sudo cryptsetup luksDump /dev/sdb
LUKS header information for /dev/sdb

Version:        1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:      sha1
Payload offset: 2056
MK bits:        256
MK digest:      55 fc 34 22 89 b0 e5 65 f1 cb fd 34 96 2f 2c 16 6a 62 e7 24
MK salt:        e3 fe 28 46 06 36 00 36 c6 e0 0c 9b e9 7a 2f ea
                6e 3b 96 ee b0 f9 33 fd 2a 60 8d 2d 87 fe de bd
MK iterations:  12500
UUID:           ac5b8484-4b26-4967-b336-f63c408bb17d

Key Slot 0: ENABLED
        Iterations:             50352
        Salt:                   08 7d 85 89 39 0e 94 6e e8 2f ab 3d ab 18 e1 17
                                37 50 a5 ce fe d4 e1 78 e1 4f a2 59 d3 4c bb 54
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

環境

PC環境
$ dpkg-query -W cryptsetup
cryptsetup      2:2.7.5-1
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
$ lscpu | grep "^Model name:"
Model name:                           Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz
$ head -1 /proc/meminfo
MemTotal:       15992644 kB
Raspberry Pi
$ dpkg-query -W cryptsetup
cryptsetup      2:2.6.1-4~deb12u2
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
$ grep "^Hardware" /proc/cpuinfo
Hardware        : BCM2835
$ grep "^Model" /proc/cpuinfo
Model           : Raspberry Pi 3 Model B Rev 1.2
]]>
https://matoken.org/blog/2024/11/16/unable-to-open-luks-encrypted-file-system-on-raspberry-pi/feed/ 0
trickleコマンドで特定のコマンドのネットワーク帯域を絞る https://matoken.org/blog/2024/11/05/throttle-the-network-bandwidth-for-a-specific-command-with-the-trickle-command/ https://matoken.org/blog/2024/11/05/throttle-the-network-bandwidth-for-a-specific-command-with-the-trickle-command/#respond Mon, 04 Nov 2024 20:50:02 +0000 https://matoken.org/blog/?p=4214

ストリーミングビデオを見ているときに他の通信を行うとビデオの画質が止まってしまいストレスです.ローカルにダウンロード出来るものはダウンロードしてから再生することでストレスなく視聴可能ですがそれができないものやライブだとできません.
アプリケーションによっては帯域を絞るオプションがありますがそれがないものは不便.今回 trickle というツールを使って特定のプログラムの帯域を絞ってみました.

今回Raspberry Pi OS bookworm armhf環境でパッケージから導入しました.

$ sudo apt install trickle
$ trickle -h
Usage: trickle [-hvVs] [-d <rate>] [-u <rate>] [-w <length>] [-t <seconds>]
               [-l <length>] [-n <path>] command ...
        -h           Help (this)
        -v           Increase verbosity level
        -V           Print trickle version
        -s           Run trickle in standalone mode independent of trickled
        -d <rate>    Set maximum cumulative download rate to <rate> KB/s
        -u <rate>    Set maximum cumulative upload rate to <rate> KB/s
        -w <length>  Set window length to <length> KB
        -t <seconds> Set default smoothing time to <seconds> s
        -l <length>  Set default smoothing length to <length> KB
        -n <path>    Use trickled socket name <path>
        -L <ms>      Set latency to <ms> milliseconds
        -P <path>    Preload the specified .so instead of the default one

wgetには帯域を絞るオプションがあります( --limit-rate )がお手軽なのでまずはこれで試します.
ここでは -s でデーモンを使わずアドホックに利用します.
-d 30 とダウンロードを 30KB/s に制限したのが効いているようでそれに近い速度になっています.

$ trickle -s -d 30 wget https://mirrors.edge.kernel.org/qubes/iso/Qubes-R4.2.3-x86_64.iso -O /dev/null
   :
/dev/null               0%[                       ]   2.63M  31.3KB/s    eta 2d 9h

次に帯域制限がなさそうなRaspberryPiのKernelを新しくするコマンドで試します.はじめsudoコマンドの前にtrickleを置くと効きませんでした.sudoの後ろにtrickleを置くことで帯域制限できました.でも今回は接続が切れてしまいました.程々にしないと駄目みたいですね.もしくはcontinueやretryを使うよう書き換える.

$ sudo trickle -s -d 30 rpi-update
   :
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
 15  144M   15 22.9M    0     0  28070      0  1:29:44  0:14:17  1:15:27 30009
curl: (56) Recv failure: Connection reset by peer

アプリケーションごとの帯域制限のオプションは覚えきれないし毎回オプションを調べるのは面倒.でもtrickleだけなら覚えられそうです.

環境
$ dpkg-query -W trickle wget curl
curl    8.5.0-2~bpo12+1
trickle 1.07-12
wget    1.21.3-1+b1
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
$ grep ^Model /proc/cpuinfo
Model           : Raspberry Pi 3 Model B Rev 1.2
]]>
https://matoken.org/blog/2024/11/05/throttle-the-network-bandwidth-for-a-specific-command-with-the-trickle-command/feed/ 0
Linux上のOpenDoasで永続機能(persist)を使う https://matoken.org/blog/2024/11/01/use-persistence-function-persist-with-opendoas-on-linux/ https://matoken.org/blog/2024/11/01/use-persistence-function-persist-with-opendoas-on-linux/#respond Thu, 31 Oct 2024 22:36:02 +0000 https://matoken.org/blog/?p=4200

OpenBSD由来のDoasコマンドというものがあります.Linux等でのsudoに似たものですが,小さくシンプルです.このDoasコマンドの移植版のOpenDoasはLinuxなどでも動作します.
sudoコマンドは1度認証に成功するとそのセッションでしばらくの間認証が必要なくsudoが実行できて便利ですが,OpenBSDのDoasでは同様の機能をOpenBSDのkernel APIを使ってタイムアウトを確認しておりこのAPIはOpenBSDだけのものなので当初OpenDoasには実装されていませんでした.
いつの間にかOpenDoasにも実装されているのに気づいたので試してみました.

GitHubを見るとこの辺で入ったようです.結構前ですね…….

Debian/Raspberry Pi OSにはパッケージがあるのでこちらを使います.

$ rmadison opendoas
opendoas   | 6.8.2-1       | stable         | source, arm64, armel, armhf, i386, mips64el, mipsel, ppc64el, s390x
opendoas   | 6.8.2-1       | testing        | source, armel, armhf, i386, mips64el, ppc64el, s390x
opendoas   | 6.8.2-1       | unstable       | source, armel, armhf, i386, mips64el, ppc64el, s390x
opendoas   | 6.8.2-1       | unstable-debug | source
opendoas   | 6.8.2-1+b1    | stable         | amd64
opendoas   | 6.8.2-1+b1    | testing        | amd64, arm64, riscv64
opendoas   | 6.8.2-1+b1    | unstable       | amd64, arm64, riscv64
$ apt show opendoas
Package: opendoas
Version: 6.8.2-1
Priority: optional
Section: admin
Maintainer: Scupake <scupake@riseup.net>
Installed-Size: 99.3 kB
Provides: doas
Depends: libc6 (>= 2.33), libpam0g (>= 0.99.7.1)
Breaks: doas (<< 6.8.2)
Replaces: doas (<< 6.8.2)
Homepage: https://github.com/Duncaen/OpenDoas
Download-Size: 20.9 kB
APT-Manual-Installed: yes
APT-Sources: http://raspbian.raspberrypi.org/raspbian bookworm/main armhf Packages
Description: minimal replacement for sudo, with persist support
 OpenDoas: a portable version of OpenBSD's doas command
 doas is a minimal replacement for the venerable sudo. It was initially written
 by Ted Unangst of the OpenBSD project to provide 95% of the features of sudo
 with a fraction of the codebase.
OpenDoasの導入
$ sudo apt install opendoas

sudoコマンドでのsodoグループのように wheel グループを作成し,このグループのユーザーがdoasを使えるようにすることにします.(sudoグループを流用しても良かったかも?)

$ sudo addgroup --system wheel (1)
$ sudo usermod -aG wheel matoken (2)
$ grep ^wheel: /etc/group (3)
wheel:x:140:matoken
  1. wheel グループの作成

  2. wheel グループにユーザー matoken を追加

  3. 確認

doasの設定
$ sudo install -m 0400 /dev/zero /etc/doas.conf
$ echo 'permit persist     :wheel' | sudo tee /etc/doas.conf (1)
permit persist  :wheel
$ ls -l /etc/doas.conf (2)
-r-------- 1 root root 22 11月  1 05:46 /etc/doas.conf
  1. /etc/doas.confwhell グループがdoasで権限変更できるように設定, persist オプションで永続化も.

  2. ファイル権限確認

Note
Example 1. DOAS.CONF(5)より
persist  After the user successfully authenticates, do not ask for a password again for some time.
doasと永続化の動作確認
$ doas -s (1)
doas: Operation not permitted
$ newgrp wheel (2)
$ doas -s (3)
doas (matoken@raspberrypi) password:
#
exit
$ doas -s (4)
#
exit
$ doas ls -lA /run/doas/
total 0
---------- 1 root wheel 0 Nov  1  2024 29125-5366-34816-25582434-1001
$ doas -s (5)
doas (matoken@raspberrypi) password:
  1. グループに追加したけど反映されていない状態なので権限がない

  2. とりあえずnewgrpコマンドで利用可能に

  3. 1度目のdoasは認証が必要

  4. すぐにdoasを叩くと認証が必要ない

  5. 時間が経ってから再度doasを実行すると認証が必要

永続化のクリア
$ doas -s (1)
doas (matoken@raspberrypi) password:
#
exit
$ doas -L (2)
$ doas -s (3)
doas (matoken@raspberrypi) password:
  1. 1度目の実行

  2. -L オプションで永続化の認証をクリア

  3. すぐにdoasを実行しても永続化の認証がクリアされているので再度認証が必要

Note
Example 2. DOAS(1)より
-L          Clear any persisted authentications from previous invocations, then immediately exit.  No command is executed.

という感じで普通に使えそうです.
ちなみにsudoコマンドでは永続化のタイムアウト時間は設定ファイルで変更可能ですが,doasではハードコードされており設定では変更できないようです.

timestamp_set(fd, 5 * 60);
環境
$ dpkg-query -W opendoas
opendoas        6.8.2-1
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
$ grep ^Model /proc/cpuinfo
Model           : Raspberry Pi 3 Model B Rev 1.2
]]>
https://matoken.org/blog/2024/11/01/use-persistence-function-persist-with-opendoas-on-linux/feed/ 0
go installで導入したパッケージをgupで最新にする https://matoken.org/blog/2024/10/30/update-the-packages-installed-with-go-install-using-gup/ https://matoken.org/blog/2024/10/30/update-the-packages-installed-with-go-install-using-gup/#respond Tue, 29 Oct 2024 22:35:18 +0000 https://matoken.org/blog/?p=4197

cargo-updateコマンドが便利なのでGo環境でも同じようなものを探してみました.gupというものを見つけて試してみました.

gupのインストール
$ go install github.com/nao1215/gup@latest
Note
releasesにはいくつかの形式のパッケージやバイナリもあります.
$GOPATH/bin のリストを取得
$ gup list
             air: github.com/cosmtrek/air@v1.44.0
           algia: github.com/mattn/algia@v0.0.83
       bluetuith: github.com/darkhz/bluetuith@v0.2.3
            bsky: github.com/mattn/bsky@v0.0.61
              : (以下省略)
バイナリが最新バージョンかチェックする
$ gup check
check binary under $GOPATH/bin or $GOBIN
[ 1/22] libdb.so/dissent (v0.0.30 / current: go1.22.6, installed: go1.23.2)
[ 2/22] github.com/thushan/smash (Already up-to-date: v0.9.3 / go1.23.2)
[ 3/22] github.com/mrmarble/termsvg/cmd/termsvg (Already up-to-date: v0.9.2 / go1.23.2)
[ 4/22] github.com/darkhz/bluetuith (Already up-to-date: v0.2.3 / go1.23.2)
[ 5/22] github.com/nao1215/gup (Already up-to-date: v0.27.5 / go1.23.2)
[ 6/22] github.com/pouriyajamshidi/tcping (Already up-to-date: v1.22.1 / go1.23.2)
[ 7/22] github.com/charmbracelet/glow (Already up-to-date: v1.5.1 / go1.23.2)
[ 8/22] github.com/schachmat/wego (Already up-to-date: v0.0.0-20241006164746-6578d5ebf3d5 / go1.23.2)
[ 9/22] github.com/mattn/bsky (Already up-to-date: v0.0.61 / go1.23.2)
[10/22] github.com/antonmedv/countdown (Already up-to-date: v1.5.0 / go1.23.2)
[11/22] github.com/BuddhiLW/lazywal/cmd/lazywal (Already up-to-date: v0.5.3 / go1.23.2)
[12/22] github.com/mattn/efm-langserver (Already up-to-date: v0.0.53 / go1.23.2)
[13/22] github.com/buildkite/terminal-to-html/v3/cmd/terminal-to-html (Already up-to-date: v3.16.3 / go1.23.2)
[14/22] github.com/diamondburned/gtkcord4 (current: v0.0.19, latest: v0.0.30 / current: go1.21.6, installed: go1.23.2)
[15/22] github.com/ariasmn/ugm (Already up-to-date: v1.6.0 / go1.23.2)
[16/22] github.com/charmbracelet/vhs (Already up-to-date: v0.8.0 / go1.23.2)
[17/22] github.com/mattn/algia (Already up-to-date: v0.0.83 / go1.23.2)
[18/22] github.com/cosmtrek/air (current: v1.44.0, latest: v1.61.1 / current: go1.19.8, installed: go1.23.2)
[19/22] github.com/sweetbbak/tget (current: v0.0.0-20240308040335-76c53b4462e7, latest: v0.1.1 / current: go1.22.1, installed: go1.23.2)
[20/22] github.com/kkdai/chatgpt (Already up-to-date: v0.4.1 / go1.23.2)
[21/22] github.com/pcarrier/vanity-keygen (Already up-to-date: v0.0.0-20220703224004-4dfc327cc534 / go1.23.2)
[22/22] github.com/eeeXun/gtt (Already up-to-date: v0.0.0-20240810151233-9986dcb52543 / go1.23.2)

If you want to update binaries, run the following command.
           $ gup update dissent gtkcord4 air tget
指定したバイナリを更新する
$ gup update tget
全てのバイナリを更新する
$ gup update
指定したバイナリを削除する
$ gup remove gtkcord4
Note
バイナリだけの削除のようでsourceは残ります.

GOバイナリ環境のエクスポート,インポート

GOバイナリ環境の情報をエクスポートして別環境にインポートできます.エクスポートファイルは $XDG_CONFIG_HOME/gup/gup.conf に書き出されます.もしくは --output オプションでSTDOUTに出力できます.

エクスポート
$ gup export
Export /home/matoken/.config/gup/gup.conf
$ tail -1 ~/.config/gup/gup.conf
wego = github.com/schachmat/wego
インポート
$ export GOPATH=$HOME/go-test (1)
$ export PATH=$PATH:$GOPATH/bin
$ go install github.com/nao1215/gup@latest (2)
$ which gup
/home/matoken/go-test/bin/gup
$ gup list (3)
gup: github.com/nao1215/gup@v0.27.5
$ rsync -avcP 192.168.0.27:~/.config/gup/gup.conf ~/.config/gup/ (4)
$ gup import (5)
start update based on /home/matoken/.config/gup/gup.conf
update binary under $GOPATH/bin or $GOBIN
[ 1/21] github.com/nao1215/gup (<from gup.conf> to v0.27.5, <from gup.conf> to )
[ 2/21] github.com/schachmat/wego (<from gup.conf> to v0.0.0-20241006164746-6578d5ebf3d5, <from gup.conf> to )
[ 3/21] github.com/mattn/algia (<from gup.conf> to v0.0.83, <from gup.conf> to )
[ 4/21] github.com/pouriyajamshidi/tcping (<from gup.conf> to v1.22.1, <from gup.conf> to )
          : (以下省略)
  1. テスト用の環境をGOPATHに設定

  2. gupを導入

  3. gupしか導入されていないのを確認

  4. リモートのgup.confをコピー

  5. インポート

Tip
Debian sid amd64環境でエクスポート,RaspberryPi OS armhf環境でインポートを試みましたがうまく行きました.

gup update で目的は達成できましたが,エクスポート,インポート機能がことのほか便利な感じです.

試した環境

メイン環境
$ gup list | grep gup
             gup: github.com/nao1215/gup@v0.27.5
$ dpkg-query -W golang
golang:amd64    2:1.23~2
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
インポート環境
$ gup list | grep gup
        gup: github.com/nao1215/gup@v0.27.5
$ dpkg-query -W golang
golang:armhf    2:1.19~1
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
]]>
https://matoken.org/blog/2024/10/30/update-the-packages-installed-with-go-install-using-gup/feed/ 0
TUI の Bluetooth マネージャの Bluetuith https://matoken.org/blog/2024/08/23/tui-bluetooth-manager-bluetuith/ https://matoken.org/blog/2024/08/23/tui-bluetooth-manager-bluetuith/#respond Thu, 22 Aug 2024 21:02:47 +0000 https://matoken.org/blog/?p=4092

Bluetuith という TUI の Bluetooth マネージャーを知ったので試してみました.

bluetuith

terminal で Bluetooth 設定を行う場合,いつもは bluez の bluetoothctl コマンドを使っています.これでそう困っていないのですが, TUI の Bluetuith を知ったので試してみました.
Go製 MIT license です.

導入は go install でさくっと入りました.GitHub の release に Linux版 i386/amd64, armv5/armv6/armv7/arm64 のバイナリがあるのでそちらもお手軽です.

go install での導入
$ go install -v github.com/darkhz/bluetuith@latest
$ which bluetuith
/home/matoken/go/bin/bluetuith
$ bluetuith
GitHub release から armv7版を入手
$ wget https://github.com/darkhz/bluetuith/releases/download/v0.2.3/bluetuith_0.2.3_Linux_armv7.tar.gz \
    https://github.com/darkhz/bluetuith/releases/download/v0.2.3/checksums.txt (1)
$ sha256sum --ignore-missing -c checksums.txt (2)
bluetuith_0.2.3_Linux_armv7.tar.gz: OK
$ tar tvf bluetuith_0.2.3_Linux_armv7.tar.gz (3)
-rw-r--r-- darkhz/darkhz  1064 2024-04-15 22:41 LICENSE
-rwxr-xr-x darkhz/darkhz 8650904 2024-08-12 20:13 bluetuith
$ tar xvf bluetuith_0.2.3_Linux_armv7.tar.gz -C ~/bin/ bluetuith (4)
bluetuith
$ bluetuith
  1. GitHub release から armv7バイナリと checksum を入手

  2. チェックサム確認

  3. archive 確認

  4. バイナリを好みの場所に展開

Bluetuith を起動すると TUI の画面で大まかな操作方法も書かれています. ? key で help を表示するとこんな感じ.

┌──────────────────────────────────────────────────────────┐
│                          Help                         [X]│
│──────────────────────────────────────────────────────────│
│Device Screen                                             │
│Open the menu                                  Alt+m      │
│Navigate between menus                         Tab        │
│Navigate between devices/options               Up/Down    │
│Toggle adapter power state                     o          │
│Toggle discoverable state                      S          │
│Toggle pairable state                          P          │
│Toggle scan (discovery state)                  s          │
│Change adapter                                 a          │
│Send files                                     f          │
│Connect to network                             n          │
│Progress view                                  v          │
│Show/Hide player                               m/M        │
│Show device information                        i          │
│Connect to selected device                     c          │
│Pair with selected device                      p          │
│Trust selected device                          t          │
│Remove device from adapter                     d          │
│Cancel operation                               Ctrl+X     │
│Show help                                      ?          │
│Quit                                           Q          │
│                                                          │
│File Picker                                               │
│Navigate between directory entries             Up/Down    │
│Enter/Go back a directory                      Right/Left │
│Select one file                                Space      │
│Invert file selection                          a          │
│Select all files                               A          │
│Refresh current directory                      Ctrl+R     │
│Toggle hidden files                            h          │
│Confirm file(s) selection                      Ctrl+S     │
│Exit                                           Esc        │
│                                                          │
│Progress View                                             │
│Navigate between transfers                     Up/Down    │
│Suspend transfer                               z          │
│Resume transfer                                g          │
│Cancel transfer                                x          │
│Exit                                           Esc        │
│                                                          │
│Media Player                                              │
│Toggle play/pause                              Up/Down    │
│Next                                           >          │
│Previous                                       <          │
│Rewind                                         Right      │
│Fast forward                                   Left       │
│Stop                                           ]          │
│                                                          │
│Device Screen                                             │
│Open the menu                                  Alt+m      │
│Navigate between menus                         Tab        │
│Navigate between devices/options               Up/Down    │
│Toggle adapter power state                     o          │
│Toggle discoverable state                      S          │
│Toggle pairable state                          P          │
│Toggle scan (discovery state)                  s          │
│Change adapter                                 a          │
│Send files                                     f          │
│Connect to network                             n          │
│Progress view                                  v          │
│Show/Hide player                               m/M        │
│Show device information                        i          │
│Connect to selected device                     c          │
│Pair with selected device                      p          │
│Trust selected device                          t          │
│Remove device from adapter                     d          │
│Cancel operation                               Ctrl+X     │
│Show help                                      ?          │
│Quit                                           Q          │
└──────────────────────────────────────────────────────────┘

alt+m で上部の Anapter のメニューを開くとこんな感じで,

[Adapter] [Device]
┌──────────────────────┐
│Power Off           o │
│Discoverable On     S │
│Pairable Off        P │
│Stop Scan           s │
│Change              a │
│View Downloads      v │
│Hide Media Player   M │
│Quit                Q │
└──────────────────────┘

更にそこから tabDevice を開くとこんな感じです.

[Device]
┌──────────────────────┐
│Connect             c │
│Pair                p │
│Untrust             t │
│Block               b │
│Send                f │
│Network Options     n │
│Audio Profiles      A │
│Show Media Player   m │
│Info                i │
│Remove              d │
└──────────────────────┘

よく使うペアリングは s でスキャンを行い,対象デバイスを選んで p でペアリング.
tTrusted
c で接続,切断.

オーディオデバイスだと A でオーディオプロファイルの選択も出来ます.

┌──────────────────────────────────────────────────┐
│  Off                                             │
│  High Fidelity Playback (A2DP Sink, codec SBC)   │
│  High Fidelity Playback (A2DP Sink, codec SBC-XQ)│
│• Headset Head Unit (HSP/HFP, codec CVSD)         │
│  Headset Head Unit (HSP/HFP, codec mSBC)         │
└──────────────────────────────────────────────────┘

ファイル送受信も出来ます.ファイル受信のときの格納ディレクトリは ~/bluetuith/ の下に置かれます.
但し,ファイル受信は Bluetuith が起動している必要があります.

Bluetuith の終了は Q (shift+q) で終了します.

bluetoothctl より使いやすいのはもちろんですが,Bluetuith の方は scan した後などに MAC アドレスではなく名前で表示されるので複数デバイスの扱いのときにとても便利です.

Rust製の同じような bluetui というものもあるようなのでこちらも試してみたいです.

環境1
$ ls ~/go/pkg/mod/github.com/darkhz/
bluetuith@v0.2.2  tview@v0.0.0-20240308094543-6078a888ff79
$ dpkg-query -W golang bluez bluetooth
bluetooth       5.77-1
bluez   5.77-1
golang:amd64    2:1.22~3
$ lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
環境2
$ bluetuith --version
Bluetuith v0.2.3 (5780d74)
$ dpkg-query -W bluez
bluez   5.66-1+rpt1+deb12u2
$ lsb_release -dr
archNo LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ arch
armv7l
$ cat /sys/firmware/devicetree/base/model ;echo
Raspberry Pi 3 Model B Rev 1.2
]]>
https://matoken.org/blog/2024/08/23/tui-bluetooth-manager-bluetuith/feed/ 0
複数のrssを結合してくれるrsscombine https://matoken.org/blog/2024/07/02/rsscombine-that-combines-multiple-rss/ https://matoken.org/blog/2024/07/02/rsscombine-that-combines-multiple-rss/#respond Mon, 01 Jul 2024 20:31:58 +0000 https://matoken.org/blog/?p=4037

複数の RSS feed を1つにまとめることのできる rsscombine というツールを見かけたので試してみました.

実行例
$ git clone git@github.com:chase-seibert/rsscombine.git
$ cd rsscombine
$ go mod download
$ go run rsscombine.go

README.md ではインタプリタ的な動きをする go run になっていますが, go build でバイナリを用意することもできます.

設定ファイルの用意

rsscombine.yml が用意されていますが,そのままでは s3 に up しようとして失敗します.
s3 関連を削りシンプルなものを用意して実行するとうまく行きました.

rsscombine.yml
title: My Technical RSS Feed
link: http://wherethisfeedishosted.com/feed
description: This is a personal collection of technical RSS feeds.
author_name: John Doe
author_email: john@example.com
port: 8080
server_timeout_seconds: 60
client_timeout_seconds: 60
cache_timeout_seconds: 3600
feeds:
  - https://news.yahoo.co.jp/rss/topics/it.xml
  - https://rss.itmedia.co.jp/rss/2.0/news_bursts.xml
  - https://www.techno-edge.net/rss20/index.rdf
$ ./rsscombine > ./rss
$ rsstail -1 -n5 -u file://`pwd`/rss
Title: 防衛省が国産クラウド導入 さくらインターネットと7.5億円規模の契約
Title: 「クボタクレジット」顧客情報約6万人分漏えい 委託先がランサム被害
Title: ネコ型配膳ロボに新モデル トレイにカメラ搭載、料理取った後のボタン操作不要に
Title: 朝日新聞デジタル、アプリ版に新機能「記者フォロー」実装
Title: 万博電子マネー決済音は「ミャークペ!」 7月1日サービス開始 機運醸成狙う
$ rsstail -t -l -d -p -a -c -1 -n5 -u file://`pwd`/rss

2024/07/01 18:37:20  Title: 防衛省が国産クラウド導入 さくらインターネットと7.5億円規模の契約
Link: https://www.itmedia.co.jp/news/articles/2407/01/news164.html
Description: 防衛省が約7億5000万円でクラウドサービス「さくらのクラウド」を導入する。防衛装備庁が実施する、防衛産業に関するサプライチェーンの調査基盤として採用が決まったとい
う。
Pub.date: Sun, 01 Jul 2024 08:13:00 +0000
Author: Unknown Author

2024/07/01 18:37:20  Title: 「クボタクレジット」顧客情報約6万人分漏えい 委託先がランサム被害
Link: https://www.itmedia.co.jp/news/articles/2407/01/news155.html
Description: クボタクレジットの顧客約6万人分の個人情報が漏えい。利用明細印刷を委託している企業のサーバがランサムウエア被害にあったことが原因。
Pub.date: Sun, 01 Jul 2024 07:13:00 +0000
Author: Unknown Author

2024/07/01 18:37:20  Title: ネコ型配膳ロボに新モデル トレイにカメラ搭載、料理取った後のボタン操作不要に
Link: https://www.itmedia.co.jp/news/articles/2407/01/news148.html
Description: ネコ型配膳ロボット「BellaBot」の新モデルは、トレイ上の物体の有無を検出し、料理を受け取った後にボタン操作不要で次のタスクに進める機能などを搭載した。
Pub.date: Sun, 01 Jul 2024 06:49:00 +0000
Author: Unknown Author

2024/07/01 18:37:20  Title: 朝日新聞デジタル、アプリ版に新機能「記者フォロー」実装
Link: https://www.itmedia.co.jp/news/articles/2407/01/news142.html
Description: 朝日新聞社は1日、スマートフォンアプリ「朝日新聞デジタル」のサブスク会員向け新機能として、「記者フォロー」を追加した。
Pub.date: Sun, 01 Jul 2024 06:27:00 +0000
Author: Unknown Author

2024/07/01 18:37:20  Title: 万博電子マネー決済音は「ミャークペ!」 7月1日サービス開始 機運醸成狙う
Link: https://www.itmedia.co.jp/news/articles/2407/01/news137.html
Description: 2025年大阪・関西万博を運営する日本国際博覧会協会が、万博に合わせて展開する独自の電子マネー「ミャクペ!」を使用した際の決済音が「ミャークペ!」であることが分か
った。
Pub.date: Sun, 01 Jul 2024 05:21:00 +0000
Author: Unknown Author

類似のものとして,以前は rna, Pipes, Plugger などを使っていましたが,これらはもうメンテされていない感じ.

最近だと RSS-Bridge なんかが近い感じがしますがちょっと大げさな感じも.

ということで今回の rsscombine はお手軽に使えて便利そうです.
しかし,設定ファイル名が一意で複数の設定を使いたい場合はディレクトリを分ける必要がありそうです.それとライセンスも設定されていないようなので取り扱いにも注意が必要そうです.

環境
$ dpkg-query -W golang rsstail
golang:armhf    2:1.19~1
rsstail 1.8-1
$ lsb_release -dr
No LSB modules are available.
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
$ cat /sys/firmware/devicetree/base/model;echo
Raspberry Pi 3 Model B Rev 1.2
]]>
https://matoken.org/blog/2024/07/02/rsscombine-that-combines-multiple-rss/feed/ 0
軽量ウェブブラウザの Raphael を試す https://matoken.org/blog/2024/06/30/try-the-lightweight-web-browser-raphael/ https://matoken.org/blog/2024/06/30/try-the-lightweight-web-browser-raphael/#respond Sun, 30 Jun 2024 13:28:41 +0000 https://matoken.org/blog/?p=4027

最近のウェブブラウザはとてもリソース食いです.特にメモリ.いくらあっても足りません><

軽量ウェブブラウザもありますが,機能が足りず動かないサイトが多いです.

  • Dillo (最近reboot)
  • NetSurf
  • Midori(WebKit版)
  • :

Midori はWebKit版の頃は軽量だけど大抵のsite は動いていた記憶があります.しかしその後 Electron(Blink)ベース(Midori 10),Firefox(Gekko)ベースの Floorp ベース(Midori 11) となり重量級に.
今回 Midori WebKit版時代からのフォークのRaphael を知ったので試してみました.

Raphael はデスクトップ向けBSD のMidnightBSD がメンテしているようです.

Debian bookworm amd64 / Raspberry Pi OS bookworm armhf で build

とりあえず,手元の Debian bookworm amd64 / Raspberry Pi OS bookworm armhf で build しました.依存パッケージを入れたらさくっと通りました.

$ sudo apt install cmake valac libwebkit2gtk-4.0-dev libgcr-3-dev libpeas-dev \
  libsqlite3-dev libjson-glib-dev libarchive-dev intltool libxml2-utils
$ wget -c https://github.com/MidnightBSD/raphael/archive/refs/tags/9.1.tar.gz
$ tar xf 9.1.tar.gz
$ cd raphael-9.1
$ mkdir _build && cd _build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..
$ make
$ sudo make install

起動

普通に起動.

raphael about

日本語も問題ありません

raphael yahoo

動画も再生できます

raphael youtube
raphael abema

SNS なんかも

raphael misskey

その他,いろいろなウェブサービスを試しましたがだいたい問題なかったです.しかし Zoom.us では「オーディオに接続中」のメッセージから進まず参加できませんでした.

raphael zoomng

メモリ消費量

Raphael くらいしか動かしてないのに RAM 減ってるなと htop 見ると WebKit* なプロセスが居ます.Raphael から 呼んでいるようです.

raphael resource

$ pstree -pTZ `pgrep raphael` | awk -F\( '{print $2}'| awk -F, '{print $1}' | xargs -I{} grep VmHWM /proc/{}/status | awk '{a+=$2} END{print a;}'
888836

WebKitは最近のウェブブラウザと違いタブ毎にプロセスが起動しないと思っていたのですが,WebKit 2.26 からタブ毎にプロセスが起動するようになったようです.
ちなみに環境変数 WEBKIT_USE_SINGLE_WEB_PROCESS=1 でプロセス増えないように出来ました.

For 2.26 you can set the env var WEBKIT_USE_SINGLE_WEB_PROCESS=1. This
is a temporary solution, only available in 2.26, to give apps more time
to adapt to the multiprocess model.

Re: [webkit-gtk Deprecation of shared-secondary-process mode]

Add WEBKIT_USE_SINGLE_WEB_PROCESS environment variable to force single process model in all WebKitWebContext. This is a temporary solution for applications still depending on the single process mode behavior. It will be only available in 2.26 series.

Webkit process limit

Since Webkit 2.26, the webkit engine used in luakit is creating a new process for each tab. This has the benefit that a webkit webview crash will only crash one tab. The downside is lower performance and increased memory use.

If you value speed over stability, you can ask webkit to use one process for all tabs by setting WEBKIT_USE_SINGLE_WEB_PROCESS before starting luakit:

$ export WEBKIT_USE_SINGLE_WEB_PROCESS=1

WEBKIT_USE_SINGLE_WEB_PROCESS=1 で昔のようにプロセス増えないようにできましたが1タブしか開いてなくても 800MB〜1GB くらいは消費してしまう感じです.思ったより消費します…….

拡張機能

Raphael にはいくつかの拡張機能が組み込まれていて,設定から確認ができます.

raphael extentions

いつも Firefox や Chromium で沢山の拡張機能を使っていると足りなく感じます.拡張機能を追加するにはちゃんと調べていませんが恐らくビルド時に組み込まないといけなさそう?
パスワードマネージャがほしいとこです.

ちなみに Raphael の拡張機能はVala で書かれているようです.

類似ウェブブラウザ

WebKitベースの類似ウェブブラウザです.

どちらもDebian packageがあるのでこれらのほうがお手軽に試せるのでいいかもしれません.

]]>
https://matoken.org/blog/2024/06/30/try-the-lightweight-web-browser-raphael/feed/ 0
SSH鍵を使った暗号化,復号化が出来る age https://matoken.org/blog/2024/04/04/age-that-can-encrypt-and-decrypt-using-ssh-keys/ https://matoken.org/blog/2024/04/04/age-that-can-encrypt-and-decrypt-using-ssh-keys/#comments Thu, 04 Apr 2024 11:36:16 +0000 https://matoken.org/blog/?p=4007

age という暗号化ツールを知りました.この age では ssh の公開鍵を使って暗号化,秘密鍵で復号化が出来るのが面白そうなので少し試してみました.

logo

install

今回は Upstream とバージョンは同じだし Raspberry Pi OS bookworm armhf のパッケージを利用しました.
go install での導入も Go が入っていれば簡単,GitHub の releases にもいくつかのバイナリがあります.
その他各種環境にもパッケージがあるようです.

Raspberry Pi OS への age パッケージ導入
$ sudo apt install age
$ age --version
1.1.1
$ dpkg-query -W age
age     1.1.1-1+b3
$ age
Usage:
    age [--encrypt] (-r RECIPIENT | -R PATH)... [--armor] [-o OUTPUT] [INPUT]
    age [--encrypt] --passphrase [--armor] [-o OUTPUT] [INPUT]
    age --decrypt [-i PATH]... [-o OUTPUT] [INPUT]

Options:
    -e, --encrypt               Encrypt the input to the output. Default if omitted.
    -d, --decrypt               Decrypt the input to the output.
    -o, --output OUTPUT         Write the result to the file at path OUTPUT.
    -a, --armor                 Encrypt to a PEM encoded format.
    -p, --passphrase            Encrypt with a passphrase.
    -r, --recipient RECIPIENT   Encrypt to the specified RECIPIENT. Can be repeated.
    -R, --recipients-file PATH  Encrypt to recipients listed at PATH. Can be repeated.
    -i, --identity PATH         Use the identity file at PATH. Can be repeated.

INPUT defaults to standard input, and OUTPUT defaults to standard output.
If OUTPUT exists, it will be overwritten.

RECIPIENT can be an age public key generated by age-keygen ("age1...")
or an SSH public key ("ssh-ed25519 AAAA...", "ssh-rsa AAAA...").

Recipient files contain one or more recipients, one per line. Empty lines
and lines starting with "#" are ignored as comments. "-" may be used to
read recipients from standard input.

Identity files contain one or more secret keys ("AGE-SECRET-KEY-1..."),
one per line, or an SSH key. Empty lines and lines starting with "#" are
ignored as comments. Passphrase encrypted age files can be used as
identity files. Multiple key files can be provided, and any unused ones
will be ignored. "-" may be used to read identities from standard input.

When --encrypt is specified explicitly, -i can also be used to encrypt to an
identity file symmetrically, instead or in addition to normal recipients.

Example:
    $ age-keygen -o key.txt
    Public key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p
    $ tar cvz ~/data | age -r age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p > data.tar.gz.age
    $ age --decrypt -i key.txt -o data.tar.gz data.tar.gz.age

age key での利用

age-keygen コマンドで age 用の鍵ペアが生成できます. public key を共有します.

鍵の生成
$ age-keygen -o key.txt
Public key: age1asle7pc9uj5n3fxamxst286ejh24yv5nut0qtedmadsxdm38egvs6ez9jr
$ cat key.txt
# created: 2024-03-30T04:44:49+09:00
# public key: age1asle7pc9uj5n3fxamxst286ejh24yv5nut0qtedmadsxdm38egvs6ez9jr
AGE-SECRET-KEY-1VZVZ0VXNSP7D3XN6X545MT7EX89S2Z7F68G6CG0RZ9WKMGN0CW4STSVM26
$ age-keygen -o key2.txt
Public key: age1vz7kedcgzvzk4n4ke50wdxthll9g3muhgwlv3vz37g926frzjvvst777qe

age public key で暗号化,age secret key で復号化します.

鍵で暗号化,復号化
$ echo 'plain' > data
$ age -o data.age -r age1asle7pc9uj5n3fxamxst286ejh24yv5nut0qtedmadsxdm38egvs6ez9jr data (1)
$ age --decrypt -i key.txt -o - data.age (2)
plain
$ age -o data.age -r age1asle7pc9uj5n3fxamxst286ejh24yv5nut0qtedmadsxdm38egvs6ez9jr \
    -r age1vz7kedcgzvzk4n4ke50wdxthll9g3muhgwlv3vz37g926frzjvvst777qe data (3)
$ age --decrypt -i key.txt -o - data.age (4)
plain
$ age --decrypt -i key2.txt -o - data.age (5)
plain

パスフレーズで暗号化,復号化

暗号化
$ age --passphrase -o data.age data (1)
Enter passphrase (leave empty to autogenerate a secure one):
Confirm passphrase:
$ age --passphrase -o data.age data (2)
Enter passphrase (leave empty to autogenerate a secure one):
age: using autogenerated passphrase "resist-host-rabbit-rapid-choose-slender-legal-ramp-forward-scare"
$ age --passphrase --armor data (3)
age: using autogenerated passphrase "what-open-rifle-junior-meadow-grass-hurdle-cigar-hybrid-slide"
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNjcnlwdCBxcGxLRjNySGliS3ZyUmUz
Tm5MMnVRIDE4ClQzVUhlUmJlSGQrSmdUcU1xaEo0ZkFUcGpLWGZpUnBEbjNPbDMy
WDk4ZHcKLS0tIFRic2twRVFOVkJ3a2Y3UWZ3WEdxcG5iSi9qWk5TU1UydWllVG1G
NlBmMkkKh1ok+t0EGZrBXEQujdb6JQLcIGyZXcnvJrAetajKdVImFUCHXu0=
-----END AGE ENCRYPTED FILE-----
  1. 自分で決めたパスフレーズで暗号化します
  2. パスフレーズを入力しないと age がパスフレーズを自動生成してくれます.
  3. -a/–armor オプションで PEM 形式で出力.
復号化
$ age --decrypt -o - ./data.age
Enter passphrase:
plain
$ echo '-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNjcnlwdCBxcGxLRjNySGliS3ZyUmUz
Tm5MMnVRIDE4ClQzVUhlUmJlSGQrSmdUcU1xaEo0ZkFUcGpLWGZpUnBEbjNPbDMy
WDk4ZHcKLS0tIFRic2twRVFOVkJ3a2Y3UWZ3WEdxcG5iSi9qWk5TU1UydWllVG1G
NlBmMkkKh1ok+t0EGZrBXEQujdb6JQLcIGyZXcnvJrAetajKdVImFUCHXu0=
-----END AGE ENCRYPTED FILE-----' | age --decrypt -o -
Enter passphrase:
plain

ssh鍵で暗号化,復号化

これを試したかったのでした.

ed25519 で暗号化,復号化
$ age --armor -R ~/.ssh/id_ed25519.pub data
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IGVSY0tCZyBZRUJD
NUZ6OWpQWDlzK2JKbmszaVp1ak9TQ0NZWkxoM0JuRlhtTm1hNVdFCjZqV0RlRldI
cjY4TDJJR1hRckxNUkw2QmoreGVoRURzRGhRYllZUjBXck0KLS0tIEJBaFVXa3J0
RHFobkVzUnRLaDZaUDVHdnpTbklHYmozQThKKzVKT3haUkEKaRkef04BHGL2sDPy
B9hl8CCpgJ57fOZtLBG8tPruAz5uASNhJss=
-----END AGE ENCRYPTED FILE-----
$ echo '-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IGVSY0tCZyBZRUJD
NUZ6OWpQWDlzK2JKbmszaVp1ak9TQ0NZWkxoM0JuRlhtTm1hNVdFCjZqV0RlRldI
cjY4TDJJR1hRckxNUkw2QmoreGVoRURzRGhRYllZUjBXck0KLS0tIEJBaFVXa3J0
RHFobkVzUnRLaDZaUDVHdnpTbklHYmozQThKKzVKT3haUkEKaRkef04BHGL2sDPy
B9hl8CCpgJ57fOZtLBG8tPruAz5uASNhJss=
-----END AGE ENCRYPTED FILE-----' | age -d -i ~/.ssh/id_ed25519
plain
RSA で暗号化
$ echo 'plain' | age --armor -R ./rsa1024.pub
age: warning: recipients file "./rsa1024.pub": ignoring unsupported SSH key of type "ssh-rsa" at line 1
age: error: failed to parse recipient file "./rsa1024.pub": "./rsa1024.pub": no recipients found
age: report unexpected or unhelpful errors at https://filippo.io/age/report
$ echo 'plain' | age --armor -R ./rsa2048.pub
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1yc2EgNXd4UUtBCmxZY2ZKczFr
MkJ1akc2Y3JkUHQyN0JaRU1RTnN4NHFydjBwZE4vUml4d0JnZ0VQYnVxRUhXRFpx
WkRCOWxpSG4KTnUzZCsvNmFGSnM0MzNkdEpSRWVyUEl1VVgxOHR3NFd6alJMMUlH
Q3VYbTZDTDdYNUxoeTdnbE8zNlI5eWpCawpPMTVRZXhoTGNVWHRhRngybkVHVmxE
QXVTRFJKOEFIVFQwWXFFZHRrdmU4UVhiV0lwbFVtQ0Vzb1ZzTnlBNXc5CjN4VW02
a21MZGxxRmhtY1pOZ1NsQjlBS0RmL1o3M0xNZ0RVQXRXS3pVSDVXS1UramQ5V3Nv
NWhSZDBaYjhlSWkKTVUzM1dEZzltcWU3SEpPMGV6eG5ucHFqUGZDRWZ0eDNQNTUy
RmZxdHdXUzBZamlrLzNFaGdWajVTeXZBREF1VwpFN2x4S0VnR0N6WmIxeXFuTjUr
bGFnCi0tLSAzaytQQktGcHA4dG9OZjhGbGNZY2g1ZktUaHRsemxoNUNxeW9YTkVD
Q2NJCnEqtAa7v2TJGtQWC2CglKZ9YeX698uiW90pBq13wqwxFxe26eUb
$ echo 'plain' | age --armor -R ./rsa3072.pub
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1yc2EgZFNIbVJ3CmxTaERheUlS
RDJ2dE8wVXZrWDRKMStQYkl4SW5RVExYUWlLTHcxVjRFRVBSWEVnQk81TThVaG5u
QWZRYS9vVlQKZHppT25RYnZKaUFSbm5sSVhMZUVMTG1Fc2FPTUl4aFQvdmVEeXBG
b1dDQ1loMEdYM0QyKzNIN2V6eStlbkQ2ZQpFeVJJeFovd3FzUzZSS3pNMG9YeEtp
Qm0rYitkeWFIR2N2T05tMHB0RW5TTWRvelBmOXdpN0tjVlhZUS8xWGxJClJBMjk3
WDV5d3BBaFdWbWtFcjIyWHhHMy93cmsrUTd3cGdwaTAzMTN4M3RaQ0o5cUN3TzRw
cklrTGpVUVBRSE4KNnA4MHhvMVJ6LzduM0JHaTNKNFZKRURuSjhZNldoV1h2N3Qw
bTRMZ0xqaVkvOVJVR004a3A1bU9JSU9pK0ErKwpKdmtVcEphWk9zbzJ1eHdOV0k0
RXpBYm9jY3RneDNJSm9mcWQ4SzY5bERxUjV0bWhCRFB5K210M29VL1ZKVGwvCmo1
eHQ4eFRIaDVFTVBaMnRlbkFGLzNZWFA4NVpWVlloVUc1YnlrdUFRSTJqRXdGR3Vl
NkFWTjlyR05DQUxlMVcKN0xaQTA2bENBY09pZHNtL0dCcU5QVmFDQVVsNUI2eHlH
dUYyTkc2QXRZN0k1WUZXTHV3UGxPWDgvdlJoNnE4NgoKLS0tICtSSUV0bnRRSjU1
TUY3cjRJM3ZYV0x6ZXpLbXFnaEttYTZhY01nZzEzd28KLJcw48jawhSaZm1BZ7a1
Qm0770UO7troZcvViUfFJzHSXQsE4n4=
-----END AGE ENCRYPTED FILE-----
$ echo 'plain' | age --armor -R ./rsa4096.pub
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1yc2Egc0tyUVpRCnluWk1qUFdI
S2w3c3hmK0ZyMmcvUmZVWUpKejF0RTlSalVzKzQ1QkpCMklHUjlCcGJIeGFKSVNv
UVdSa2pRbnkKQm5OWHlocEUyQjZYZjRJanVkN2YyMWJKaThwd0hEWkkwQURnWUVF
bkxnR2ZSTktRRDdEWHZaYTVuVSsvYUY1UQpCa3lMdURsamhWdm52RE0yaE53QUxX
WnVaRWdPRExnL2lIYSs4SE9YZUlNTldidG5QTC9XQU1IUll2NTQ0RzBjCjJnL0lC
emtTdDlaNlpQM1JEbHRDdnROWmV3VTNpMDRxcDdabVU3bU5xODg4eUJ3dWZwYnpG
QWtnbWlzc3RVV2IKZkVnSmQyZ2pOaXluYmFhMllvZ0tKNzcwS3FBWlJtS29LNGYx
Y3dxSFV4UHZpcmJleHFFNXI5ekUxQzNlYzdIWgpackFqemdMV1JjRjdnY3RBTTky
bDlXVDVrQktjZkszQk12L3hlSDhHTllIdkVIS2FERUtCbWgyaUNad0NuRjRCCjZK
SUYxYXkyNE1oKzN5VUZ0a1VVQjRnOVBLRUF4VU0yOFJUcEtUZDU2OHFDT2djekxO
Y3o4eGhQay9vNnlMRDUKVm14KzlrS1hOU1JrYTVHYjBwZWZzYXVsNHhPMEY5bTJ4
ZWZZQW5LVVQxRjVBUUQ4eDBEbDNkRTFFTGNvL21Kcgp5YkkxR3FrMTJQdnA3MFFl
ckgvZjBvT3I2WlZ6Q1ZuM3JFeGczTXFwU3FCV3FWbVIrTk1sL0RSWEZwL2Q4NC9m
CjlDZUJ2NXZnQU5BUUNrVzdPODM1WUxFTzVrT3Q1VGZISThtSzJPb2xvVnU0R2g0
TlY5RmJnbWhJbnU3TGMvTHoKVEt1OUZwR1UvNlFEVmRnWHZvay8wSGhnZWgrcnRN
ZWZsRHd5YnlCS0ovNAotLS0gYWQ4WXBodENuNDBKVVkwK3c5YnpSeG5OdndCRWph
eW5aU1QvekRLWlhkdwpjWnxdCQrEjd0NbP2ed0AFRLYH94R8EQTGEyYDMwEuzhsk
M8fb2A==
-----END AGE ENCRYPTED FILE-----

RSA1024 だとエラーとなりました.現在 RSA は 3072 が規定値だったと思うので鍵帳の短い 1024 は足切りされているのかもしれないですね.

複数の鍵で暗号化
$ echo 'plain' | age --armor -R ./rsa2048.pub -R ./rsa3072.pub -R ./rsa4096.pub -R ~/.ssh/id_ed25519.pub
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1yc2EgNXd4UUtBCjFaajdDV3hh
dXRuNkNNRVpRTUJ2ZDI0ZkRObGdCRmpydlZNUDAzSjhXbGdsWXJZa1lyWnFzSFlo
bXFJbjNpSFYKcHZrWisyek1MWjZvVlJtV3djUEY1ei82bVFISzdwYm96a2FYeXRR
amdxTEhjWllCcGJsSytQN3ZWay82clZEZwp4bG5HSmVGNEFFVW5xMEx4UXhlT3A0
eHBONUhkbU1qRnRPUUFoR3BldzVhamFrc0xBWVp4Y001bUdqNGROT0dmCkhOUCtF
TytsbXRTU1Exait5bG9DRVR4ZjRTT3owY01JTGRyOUN4eWFnd0hmTDlOenlWRE12
a0ZrM2E4NkFweTEKMEZvZ3h2TzdOZlJ5YnVpYm1yOXFIUkV2MXI0QnZtT1VMTFRT
Z2JDOGI4VGpYRVROb3J1TzAvd2xYTHozSVdhOQoyMVFQNHBxb3AzaUQwa0hqeE5C
bEF3Ci0+IHNzaC1yc2EgZFNIbVJ3Cm9KcEoyZndZK0JCakFURWl2eUt4dHNqdExy
K0dzNkRpUXF1U0dJSXFIMlFWOFhGcGtkNFRXd1BuVGJBSmZhNkgKNjZZZStZZFFi
Wko2dXFkQ2hKMHVIcWV0ekVaeUhBOTJoSnZUWnFacmVFczE4UnllZnp4cXZCQWE4
ckdFNU5nbQpNaXB4eHhaUG1vWE5HQ2xoRkF5amVPL3kvaUlPL0h6ZVNtL05lV2VK
OGdkVmpGZjVSNVNOZ1NsbEc1b0NBODFlCkNQTTFWb3orNC9WVWdadThFN3YwUTNr
YXNCaDZ5KzBSckJpeEdZWllYMml0RmFpTWNZc3FEbHhXaUM0YTU1emMKbXRvQzh2
UG1lM1FWYzRreDJINGY1MEV0cnArTzdMaklVS1VWRE5haWV0UzlFOG9CN3U0dFNu
MU0vVFpYVXRoNwp5aHRDc2ZoWWVBeGZwWTlyQ2ZIVjcxczZ1ajJoVy93dDFlVWsy
NlF0ZEFCTHlBNTk1YlhTNmtKY1RPZ2tqZU94CjJkT3REWTRTZFZuR0pneDNtZjND
UXVjMWRqeCtVODZEb2J6bkgxWm4ycGRxQWI0amVqdXNFdnJtdkFlZmZMUFYKdlVT
ekhlK1hQSFRuRFBmV09JWTUrSS9VNnQ5RTY2T0dEeG9ONVVXdFRVY0g1ZmdqTStR
NDRUc21LQXhyK0dNbQoKLT4gc3NoLXJzYSBzS3JRWlEKc2FIQ20zUmRQYmhrRTlO
bjF0V2lKZXhFWXVNcVJmdk5jNXhMaDdkdGZWcGc4WVVBbGdGZGhTM0dLSFpkbWlP
SAo4aEl6U2xRTXhTTFUzTzhsWThtbngwZUl6VGQ1Z09IKzJWK29XNzNOL2ZMaEc4
WkdxUkI0cXVHaS9IT0NTS3M0Ci8vYjJDczQrUzdaSmxrU0ZsOFU4VUk0Nzh3eHh6
elYzOWJVaUxNbjM3cGRTdkd5Vlc3YWtHUjRiWDNoYU83WGYKNklxMkZCanBMZ0N5
b2ZvN3VwZkNLcUxTM0FVNU1TMmczSFR1Nm9HMHJQdlIyemxwNWNjVktIWlRnSks2
VWlwVAoyR3VQZmJCTGJSQ2xGemRWM1lUbmFhcFpmNE5ITmdjUFZZNTFaMW9ZcCtp
Q0V6ajFwbjEyTkZvT3JRZ3NCK011Cm9EOFcyQTNBT2pOVk5mZDU1cFQ3TFE5MnNK
eEVxWE1uMUNadkhMTVZVcUdBRythZmJnVG81ZG93YlE4K2JLWkYKbTgrTmVOSTEx
RWRqTXdRRDlmRjBrNUJpenZoenU0NnNzVmlxMmZKVERqTDdoZnlUZUNVaUxZNE91
RHNsK2NmawpacUVZdU9sdUJEWE83Z1FYYnhFQU5pMlZQVVhiV2hDbzBhM0YwOFZ5
Ny9EclZLK29XTUJ3K25ldDV2dTZpVlgxCkxsN3ZMRjVJekZ2aXl6UnFaSXpoYzUr
QWRQR0VjOUZPSnpnMk1uL0k4SW11VHdheW1xN25yR3VYbGNoNW9LTUkKUXNXVGFJ
c3dXY0hxaURhSEllN1o0Rm9nQnZlck53V0R5YTdDYWltTURSbHBGc0JFTUZkL1hz
MXRqTUNVNUs5MQoxNnFxN1AxenhYUFZnb0hMRDlnaWY3VmRCd0NnZk44UVNpb2Zk
RUZ4U1Y4Ci0+IHNzaC1lZDI1NTE5IGVSY0tCZyBSNml6R2pvQnV6WWV2WmFHaFo5
L0hTSFl5Y1h4S1lBNkFSZjNod29TV1dnCnhpVGNIVW44dnNrZlJyWWZxUGhsVGY1
TlMyR0tkcjUxTnI3NStaL2UwM1kKLS0tIFg3VEg5MGNCZnJBNmU0NXUza1d1aVlM
cmk0eXVab1RmTzhVTTZid1ZWclUKe1wXH51zJI3GYYwGVPhoXDcuV8vBZIcvGPQz
5pSAkRa/YrHMrfk=
-----END AGE ENCRYPTED FILE-----

RSA, ED25519 両方を含む複数の鍵で暗号化も問題なかったです.(紙幅をとるのでここには載せませんがそれぞれの鍵で復号も大丈夫でした.)

age 作者の鍵を入手して暗号化……失敗
$ wget https://github.com/FiloSottile.keys
$ age -a -R ./FiloSottile.keys data
age: warning: recipients file "./FiloSottile.keys": ignoring unsupported SSH key of type "ecdsa-sha2-nistp256" at line 1
age: error: failed to parse recipient file "./FiloSottile.keys": "./FiloSottile.keys": no recipients found
age: report unexpected or unhelpful errors at https://filippo.io/age/report
$ dd if=FiloSottile.keys bs=20 count=1 2>/dev/null; echo
ecdsa-sha2-nistp256

GitHub から age 作者の鍵をダウンロードして暗号化しようとしましたが,公開されている鍵形式が ed25519-sk のようで age に対応していない鍵だったので暗号化出来ませんでした.

GPG を公開していない人で GitHub などで SSH鍵を公開している人は結構居る気がするので SSH鍵で暗号化,復号化ができると便利そうです.
openssl でも出来るし導入された環境も多いと思いますがコマンドが煩雑,age だと利用が簡単なので普及すれば便利そうです.

環境
$ dpkg-query -W age openssh-client openssl
age     1.1.1-1+b3
openssh-client  1:9.2p1-2+deb12u2
openssl 3.0.11-1~deb12u2+rpt1
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm
$ arch
armv7l
$ cat /proc/device-tree/model ;echo
Raspberry Pi 3 Model B Rev 1.2
]]>
https://matoken.org/blog/2024/04/04/age-that-can-encrypt-and-decrypt-using-ssh-keys/feed/ 1
misskey-cli で Misskey を読み書き https://matoken.org/blog/2024/03/27/read-and-write-misskey-with-misskey-cli/ https://matoken.org/blog/2024/03/27/read-and-write-misskey-with-misskey-cli/#respond Tue, 26 Mar 2024 22:17:40 +0000 https://matoken.org/blog/?p=4002

Misskey クライアントの sayaka ちゃんは sixel で画像が表示できとても便利ですが,投稿ができません.

Terminal から投稿もしたいので他の cli クライアントの misskey-cli を試してみました.

早速導入します.
今回 go install で導入しましたが, Releases に各種環境向けのバイナリも用意されています.自分の環境にあったバイナリをダウンロードして実行権を付与してあげれば簡単に利用できます.hash や 署名は無さそうです.

install
$ go install github.com/mikuta0407/misskey-cli@latest
$ ~/go/bin/misskey-cli
misskey-cli  Misskey CLI Client

Usage:
  misskey-cli [command]

Available Commands:
  help        Help about any command
  note        Create/Reply/Delete note
  renote      Renote note by noteId
  stream      streaming timeline
  tl          Show timelime (local/home/global)
  version     Show version and build revision.

Flags:
      --config string     config file (default "/home/matoken/.config/misskey-cli.toml")
  -h, --help              help for misskey-cli
  -i, --instance string   connect instance name(not host name)
  -t, --toggle            Help message for toggle

Use "misskey-cli [command] --help" for more information about a command.
$ misskey-cli version
misskey-cli  version:

設定ファイルを用意します.
~/.config/misskey-cli.toml を作成します.host は Misskey の url ,name は任意の名前,token は Misskey の「設定」→「API」→「アクセストークンの発行」から発行したものを使います.
複数の Misskey を登録できます.以下は2つの Misskey を登録しました.実行時に一番上の設定がデフォルトになるのでよく使う Misskey を一番上にするといいです.

$ vi ~/.config/misskey-cli.toml
$ cat ~/.config/misskey-cli.toml
[[Instance]]
  host = "https://msky.ospn.jp/"
  name = "OSPN"
  token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
[[Instance]]
  host = "https://misskey.io/"
  name = "misskey.io"
  token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

早速使ってみます.

misskey-cli をで note や 閲覧
$ misskey-cli note 'misskey-cli から note
https://github.com/mikuta0407/misskey-cli'
misskey-cli  Create Note: @ (https://msky.ospn.jp/)
===============================================================================================================================================================================================================================================
Note Success! id : 9rcgksz5uzfb00f6
"misskey-cli から note
https://github.com/mikuta0407/misskey-cli"
$ misskey-cli tl -l1
misskey-cli  Timeline: local  @ (https://msky.ospn.jp/)
===============================================================================================================================================================================================================================================
2024/03/27 06:33:58 matoken(@matoken)    misskey-cli から note
https://github.com/mikuta0407/misskey-cli (9rcgksz5uzfb00f6)

複数のインスタンスを登録している場合は -i name (name は設定の tolm の name )で任意のインスタンスを指定できます.

$ misskey-cli -i misskey.io stream
misskey-cli  Stream: local  @ (https://misskey.io/)
===============================================================================================================================================================================================================================================
2024/03/27 06:59:02 Connected to server
  :

その他詳細は README.md に日本語で書かれています.

とりあえず一通りのことはできそうです.

環境
$ misskey-cli version
misskey-cli  version:
$ ls ~/go/pkg/mod/github.com/mikuta0407/
misskey-cli@v0.0.0-20230730142608-ab80e8e6583c
$ dpkg-query -W golang
golang:armhf    2:1.19~1
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm
$ arch
aarch64
]]>
https://matoken.org/blog/2024/03/27/read-and-write-misskey-with-misskey-cli/feed/ 0