何となく捨てられない

職場の棟の改修が予定されているので、不要な本の処分を始める。すでに古い技術で役に立たない技術書だけど、校費で買ったものは図書館に返還するために分類し、雑誌や私費で買ったものは次々と廃棄候補。
だけど、学生の時に読み込んでいた雑誌が、なんとなく懐かしすぎて捨てるのはやめておこうか…

DMARCレポートの修正

DMARCレポートを出力

最近、dmarc のメールが届かないと思ってたら、中で使っている munpack がインストールされていない。インストールしようにも apt で見つからない。Ubuntu/debian のパッケージから消えたようだ。Gemini に代替品を聞いたら ripmime を紹介される。

((( ripmime をインストール )))
$ sudo apt install ripmime

((( 修正 )))
  # 標準入力のメールから添付ファイルを抽出
- system( "/usr/bin/munpack -q -C $tmpdir > /dev/null 2>&1" ) ;
+ system( "/usr/bin/ripmime -q -i - -d $tmpdir > /dev/null 2>&1" ) ;

ついでに、DMARC のポリシーを p=quarantine から p=reject に変更しておいた。

spam が google などのクラウドばっかり

自宅サーバへの spam は、spamassasin などでかなり除去できるようにしてあるけど、それでも相変わらず届いている。送り元の IP アドレスを調べて 完全拒否などもしているけど、それでも届くのか。

送り元の確認

あらためて、送り元を確認したら、google クラウドサーバとか amazon クラウド。IPアドレスでは消せないなぁ。

$ cd ~/Maildir/.Junk/cur
$ grep "Received: from" * \
  | grep -v 127. \
  | awk -F [][] '{print $2}' \  [,]を区切り文字として真ん中を取り出す
  | sort | uniq -c | sort -r
      6 202.238.198.26
      1 54.169.135.62
      1 52.76.242.183
      1 35.236.54.228
      1 35.236.40.141
      1 35.226.131.57
      1 34.96.185.118
      1 34.176.225.88
      1 34.163.22.216
      1 34.155.225.82
         :

OpenDMARC fail で消せばいい

メール確認してたら、OpenDMARC が fail 返しているじゃん。こんなの Reject されてると思ってたけど、

“Authentication-Results: OpenDMARC; dmarc=fail (p=reject dis=none) header.from=monex.co.jp”

opendmarc.conf を確認したら、デフォルトのままで reject してなかった。ということで reject するように設定変更。

((( /etc/opendmarc.conf )))
# 認証に失敗したメールを拒否するように変更
RejectFailures true

$ sudo systemctl restart opendmarc

職場からのメールは、fukui-nct.ac.jp 発信のメールが、fukui.kosen-ac.jp で届くので、dmarc=fail で失敗判定なんだけど (p=none) なので、普通に届く。

んで、自宅ドメインは…. p=quarantine 「隔離」設定になってるな。そろそろ reject「拒否」にしてもいいかも。

squidからtinyproxyに移行

Squid が遅い

Poicy Routing を導入して proxy 経由のアクセスを別ポートにすることができたけど、squid で動かしている中で、speed test を実行すると、何もなしで 1Gbps 近くでるものの、Proxy 経由にすると squid の性能が低いためか、10Mbps 程度しかでない。

tinyproxy をインストール

あまりにも遅いので、Squid 以外の Proxy サーバを探す。proxy による caching 効果は最近はほとんどないので、proxy パケットを捌くだけのものを調べると HAproxy が高性能らしいけど、reverse proxy 用途で設定がややこしそう。tinyproxy も候補にあがったので、こちらを導入

((( tinyproxy をインストール )))
$ sudo apt remove squid
$ sudo apt install tinyproxy

((( /etc/tinyproxy/tinyproxy.conf )))
User tinyproxy
Group tinyproxy
Port 3128          # squid 互換の proxy ポート
Bind 192.168.1.51  # outgoing ポートを 専用ポートにする
Timeout 600
DefaultErrorFile "/usr/share/tinyproxy/default.html"
StatFile "/usr/share/tinyproxy/stats.html"
LogFile "/var/log/tinyproxy/tinyproxy.log"
LogLevel Info
PidFile "/run/tinyproxy/tinyproxy.pid"
MaxClients 100

Allow 127.0.0.1
Allow ::1
Allow 192.168.11.0/24

ViaProxyName "tinyproxy"

Switchbot オートメーション

Switchbot の NFC オートメーション、リビングの ON/OFF を設定してみた。

{CAPTION}

{CAPTION}

HTTP3+QUIC 対応で FireWall に udp/443 を追加しただけ

HTTP3+QUIC だと、QUIC 用に UDP/443 を使うらしい。

サーバの設定は後で見直すとして、ひとまず FireWall + 自宅ルータの DMZ 設定で、UDP/443 を追加してみた。

んで、apache2 で HTTP3+QUICK を探すと、標準モジュールでは対応していないとな。さすがに apache を手作業インストールで運用する気はおこらんなぁ…

NFCのオートメーション

Switchbot で遊んでみた。

写真の裏の上側と下側に2枚のNFCを貼っておき、上が帰宅用で「照明を付ける」、下はお出かけ用で「照明とエアコンを消す」ようにしてみた。

Switchbot の設定は共有して管理権限も割り当ててあるので、自分に合わせて設定してもらおう。

{CAPTION}{CAPTION}

Rust 版 switchbot-cli のインストール

Switchbot を使っていて、HomeAssistant などで活用しているけど、スイッチ動作を登録するとき、照明だと、リモコン信号でON/OFFを切り替えるため、点灯状態によっては、ON を押しても照明としては消えたりすることもでてくる。

このため、Homebridge では、電源ボタンではなく、全点灯=ON, 常夜灯=OFF で登録している。こういう細かい制御となるとサーバで管理した方が楽なので、コマンドライン側から Switchbot を使いたい。

Switchbot を扱っていて、調べてみると Rust 版があるらしい。以前 nodejs 版も入れたけど、monit からの google-home-player (nodejs版)の呼び出しで、色々トラブルで動かなかったりするので、Rust 版を試したい。

Rust 版 switchbot-cli をインストール

“cargo install switchbot-cli” でインストールができるというが、エラーでコンパイルに失敗。Rust の最新版が必要みたい。最新版の rustc-1.88, cargo-1.88 などを入れて、rustup コマンドで環境を登録。最終的に switchbot-cli を root でインストール。

((( rustc-1.88 などのインストール )))
$ sudo apt install rustc-1.88 cargo-1.88 rustup

((( rustup に 1.88 使用を明言 )))
$ sudo rustup override set 1.88

((( root 権限で switchbot-cli をインストール )))
$ sudo cargo install switchbot-cli --root /usr/lib/cargo
$ cd /usr/local/bin
$ sudo ln -sf /usr/lib/cargo/bin/switchbot .

switchbot-cli の使い方

switchbot コマンドを使ってみる。

((( switchbot-cli に TOKEN, SECRET を登録 )))
$ switchbot
Token> xxxxxx
Secret> xxxx
: 学習リモコン (remote with screen, ID:xxxxx)
2: CO2センサー (MeterPro(CO2), ID:xxxxx)
3: CO2センサー・子供部屋 (MeterPro(CO2), ID:xxxxx)
4: switchbot-hub3 (Hub 3, ID:xxxxx)
     :
18: リビングの照明 (Light, ID:xx-xxxxxxxxxxx-xxxxxxxx)

((( 使ってみる )))
$ switchbot xx-xxxxxxxxxxx-xxxxxxxx turnOff # デバイスID で操作。
$ switchbot 18 turnOn                       # 前述のデバイスの連番 18 でもいいみたい
$ switchbot 18 help
turnOn
every home appliance can be turned on by default
turnOff
every home appliance can be turned off by default
customize/{user-defined button name}
all user-defined buttons must be configured with commandType=customize
brightnessUp
brightness up
brightnessDown
brightness down
customize/{user-defined button name}
all user-defined buttons must be configured with commandType=customize

$ switchbot --alias リビングの照明=xx-xxxxxxxxxxx-xxxxxxxx
$ switchbot リビングの照明 turnOn

$ switchbot --alias switchbot-hub3=xxxxxxxx
$ switchbot switchbot-hub3 status
humidity: 49
version: "V2.0-1.6-1.6"
moveDetected: false
temperature: 19.1
onlineStatus: "online"
lightLevel: 1
$ switchbot switchbot-hub3 status.temperature
19.5

monit による外出/帰宅検出

HomeAssistant による外出/帰宅検出を試しているけど、オートメーションではなかなか面倒な雰囲気。

gemini に簡単な ping 監視を提案してもらったら、monit を紹介してくれた。

monit インストール

pre-script で install コマンドでの -Z オプションが原因でインストールに失敗してたけど、pre-install のスクリプトを強制的に直してインストール。

monit で外出/帰宅検出

((( /etc/monit/conf.d/iphone.conf )))
# count 10 = 5min # /etc/monit/monitrc set daemon 30
check host iphone with address iphone
        if failed ping count 10 then exec "/etc/monit/script.d/iphone17.sh off"
        else if succeeded then exec "/etc/monit/script.d/iphone.sh on"

((( /etc/monit/script.d/iphone.sh )))
MONIT_SUMMARY="/usr/bin/monit -B summary"
case "$1" in
    on )
        /usr/local/bin/google-home-player.sh "帰宅しました"
        /usr/bin/touch /var/lib/monit/status/iphone
        ;;
    off )
        /usr/local/bin/google-home-player.sh "外出しました"
        /usr/bin/rm -f /var/lib/monit/status/iphone
        ;;
    * )
        ;;
esac

google-home-player が動かない

目的の処理は呼び出されているが、google-home-player.sh が動かない。普通にコマンドラインであればきちんと発声してくれるのに、monit の script で動かすときだけ発声しない。

色々実験すると、google-home-player.sh の中でパイプを処理する際の標準入力の所有権のトラブルが想定される。そこで、Gemini が提案してくれた、cat を挟む方式を試す。…. 効果なし

((( google-home-player.sh の末尾 )))
  if [ $# -gt 0 ]; then
      # コマンドライン引数を google home で喋らせる。
-     echo "$@" | exec $GHP_TALKJS $GHP_ARGS
+     echo "$@" | /usr/bin/cat | exec $GHP_TALKJS $GHP_ARGS
  else
      # 標準入力を google home で喋らせる。
-     exec $GHP_TALKJS $GHP_ARGS
+     /usr/bin/cat | exec $GHP_TALKJS $GHP_ARGS
  fi

コマンド実行のプロセス環境の問題なので、最後の手段、発声処理を batch コマンドで実行させてみる。…効果なし

google-home-player.sh にて、nodejs を呼び出す際に、exec を付けているが、これが原因なのか?

AI系に色々と確認させたけど、Copilot が google-home-player を呼び出す際の js スクリプトに 発声終了の確認せずにプロセスが終わって、発生が止まっている可能性を指摘してきた。提案してくれたスクリプトの修正をして、試す。

HomeAssistant で洗濯機の監視

HomeBridge の homebridge-people-pro で色々な機器を ping で監視し、その On/Off 変化に応じて通知を飛ばすスクリプトを運用している。でも、HomeAssistant のオートメーションで同様のことが可能となる。

スマートフォン への ping での監視は短時間の切断が発生するので、自作スクリプトの処理で対応しているので homebridge を全廃とはいかないけど、ボチボチと HomeAssistant に移行したい。

洗濯機の監視

自宅洗濯機は、洗濯乾燥中に ping が通って、停止すると ping が切れるだけなので、洗濯機の停止の通知なら単純。

google-home で喋らせるスクリプトは運用できている。Ping(ICMP) で洗濯機, user_a, user_b の監視は登録済み。発声の通知は user_a, user_b のどちらかが居る場合のみにしたいので、以下のような設定となった。

((( shell_command.yaml )))
sh_google_notify_washer_stop: "/usr/bin/ssh -i .ssh/id_ed25519 user@host /usr/local/bin/google-home-player.sh '洗濯機停止"

((( automations.yaml )))
- alias: "洗濯機停止の報告"
  trigger:
    - platform: state
      entity_id: "binary_sensor.washer"
      from: "on"
      to: "off"
      for:
        minutes: 1
  condition:
    - condition: or
      conditions:
        - condition: state
          entity_id: "binary_sensor.iphone_user_a"
          state: "on"
        - condition: state
          entity_id: "binary_sensor.iphone_user_b"
          state: "on"
  action:
    - service: "shell_command.sh_google_notify_washer_stop"