ssh多段ログイン
自宅のサーバ更新で、公開しているサーバの奥にある自宅内端末にログインする機会も多い。
あるんだろーなと調べるとやっぱりあるね、ssh 多段ログイン。”-X”オプション x11-forward も動くじゃん。
x11-forward で google-chrome 開くと、最初はフォントとかいろいろやりとりがあって立ち上がりは遅いけど、普通に動くな。
((( ssh多段ログイン ))) $ slogin user@踏み台サーバ -t slogin user@自宅内別端末 ((( ssh X11 フォワード ))) $ slogin -X user@踏み台サーバ -t slogin -X user@自宅内別端末 [自宅内端末]$ xeyes
新しいサーバ用にUSB-Cポートを
7年前のWindows機に Ubuntu を入れてメインの自宅サーバに更新しようと最終段階。今後の使い方も含め、USB-C ポートもつけておこうと安い PCI の USB-C ボードを購入。ロープロファイルのブラケット付きって書いてあるのに、ノーマルブラケットしか入っていない。
送り返すのも面倒だし、金属加工で逃げた。
ロープロファイル加工を終えて、サーバにくっつけたけど、USB-C × 2port は普通に使えるけど、縦配置の USB-A 3.0 × 2port は、パソコンのブラケットを支えるフレームの幅が狭く USB-A コネクタが刺すことができない。USB-Cポートが目的なのでひとまず妥協。
接続して起動するが、どうも sytemd-udevd の負荷が発生し、1CPU の loadavg が 100% に張り付いている。相性悪いのかな。2000円ムダにした…(T_T;
USB 切り替え機を導入
自宅サーバを更新しているけど、Ubuntu Desktop も安定して使えるので、Windows 端末と 新サーバを切り替えることも多い。キーボード・マウス・USBスピーカをまとめて切り替えたいので、USB 3.0切り替えスイッチを導入。Amazon さんから届いて早々につなぐけど、USB が INPUT/OUTPUT 両方が USB-A メスコネクタになってる。だから添付ケーブルがUSB-Aオス/オスのケーブル。USB-Aオス/Aメスとか、USB-A/USB-B の組み合わせじゃないから、差し間違えてひと悩み。
自宅サーバの移行中
メインPCを Windows 10 から 新しいPCを導入し Windows 11 に切り替えたが、データの移行も終わったので、Windows 10 の PC に Linux を入れる。
現状自宅サーバの問題点
現状の自宅サーバは ほぼ 15年に使い始めたが、最近はマナーの悪いクローラで負荷が高くなったり、smartd から エラー警告が出る(root ではない)ようになっているし、これを契機にサーバ移行中。1台の PC を 15 年運用というのも我ながらすごいな。
しかし、Core i3 第5世代の CPU から Core i7 の第7世代で処理速度も約4倍になってるし、SSD なので全体的に処理速度も大幅改善。
OS は Debian 13(trixie) から Ubuntu 24 に
OSは、設定移行も考え、同じ Debian にしようと作業を始めたが、ネットワークデバイスのドライバがまずいのか、時々 切れてしまう。処理速度もまともなので、デスクトップでも使うと思うし Ubuntu 24 Desktop に変更。最新 firmware のパッケージをいれて適切なネットワークデバイスが選ばれたのか、ネットワークも安定。
デスクトップも、デフォルト設定が Debian より使いやすいし便利。
ついでに、FireWall の管理は長年 ferm を使っていたけど、メジャーじゃないし最新ディストリビューションでは対象外。今回、移行を契機に netfilter + netfilter-persistent に移行。
postfix + opendkim + clamav + saslauthd + dovecot-imapd の設定はほぼ移行が終わったと思うけどなかなか面倒。設定が色々とかみあってて面倒。設定をまるまる移行すると、処理が途中で現行サーバに飛ぶので、移行中サーバ内で処理が留まるように設定しながらの作業中。
munin + nagios4 の環境も移行したけど、まだまだ道半ば。WordPress のインストールとコンテンツ移行が最後の難関かな。
Alibaba Cloud LLC からの大量アクセス
自宅サーバで作業していたら、loadaverage 30越えの高負荷。
調べてみると、Web サーバの負荷が高い。一旦 apache を止めると負荷が落ち着く。
早々にアクセス元の IP アドレスを調べると広い範囲の端末からアクセスが集中している。ひとまず FireWall で下記サブネットをアクセス拒否。
47.79.0.0/20 47.79.96.0/19 47.79.208.0/20 47.82.8.0/21
アクセス履歴の内容を確認すると、アクセス間隔を空けないマナーの悪いクローラーのようだ。
saslauthd の起動で smtpd chroot 解除
postfix の更新が入ったようだけど、以前から postfix 更新のたびに動かなくなることが多かった saslauthd がうまく起動しないトラブルが再発。
postfix での smtpd 起動がセキュリティ対策のために chroot 起動にしていて、saslauthd が chroot のファイルを正しくアクセスできないのが原因。でも、debian の default 設定の 非chroot の設定だし、debian 推奨設定ということで chroot 起動を解除することにした。
homebridge-cmdswitch2更新とchild-bridge機能
homebridge child-bridge
homebridgeの更新の中で、child-bridge という機能が実装された様子。これによる影響なのか、Google Home でつながらない現象が発生していると思われる。homebridge-cmdswitch2 のプラグインが、child-bridge を使うように変更されている。
$ sudo ps ax | grep homebridge 22887 ? Sl 0:21 homebridge 23934 ? Sl 0:03 homebridge: homebridge-cmdswitch2 24010 pts/2 S+ 0:00 grep homebridge
{ "platform": "cmdSwitch2", "name": "cmdSwitch2", "switches": [ { "name": "テレビ", --(略)-- } ], "_bridge": { "username": "0E:7D:87:xx:xx:xx", "port": 53178 } }
これにより、child bridge が別の homebridge のように見えていると思われるので、Google Home 側で別デバイスとして child bridge を認識させないとダメということかな。
homebridge-cmdswitch2 の更新
ただ、cmdswitch2 だけど、プラグインの更新が必要みたい。homebridge-cmdswitch2(ver 0.2.10)は、homebridge-cmdswitch2-no-logs に移行されているようなので、こっちの方が先決かな。
homebridge-cmdswitch2-no-logs の status 監視のトラブル
homebridge-cmdswitch2 の後継プラグインの homebridge-cmdswitch2-no-logs に入れ替えたけど、各機器のON/OFF状態を cec-client でとるように設定し polling 設定をすると、頻繁に状態監視をすることになり、ほかのデバイスの on/off 監視と競合が発生する。このため、polling 設定は削除。
プラグインを更新したら、「child bridge の方がいいよ」といった説明も出てこないし、child bridge機能は見送り。
追記:homebridge-cmdswitch2 に戻す
cmdswitch2-no-logs に切り替えたけど、”OK google, テレビをつけて”と命令すると、テレビを消す動作はするものの “homebrigeに接続できません” と言われる。
しかたがないので、homebridge-cmdswitch2 に戻し、child-bridge ナシの設定とする。
Switchbot APIが急に動かなくなった
Switchbot のデータを、OpenWonderLabs / Switchbot API v1.1 を使って munin でグラフ化していたが、2024/12/16,16:35(JST) から急にデータが取れなくなっている。
自作の Shell Script の問題かと思ったが、Python のコードでも Forbidden が表示されるので、原因は別かな。
api.switch-bot.com のトラブルかなぁ…
t=1734352549278 nonce=83e7a2f9-7ece-4971-9157-9aac14cd229f sign=Frytn5FFDK0dUYE9XUEQF+v30V1WhAGKIo4qHAMiy7I= { "message": "Forbidden" }
(2024-12-17追記)
2024/12/17(火) 12:00 に復旧した様子。こっちで特に何かしたわけでもなく、勝手に復帰した。
やっぱりサーバの問題だろうな。
復帰状態でブラウザで https://api.switch-bot.com/ にアクセスすると、Forbidden じゃなく { “message”:”Missing Authentication Token” } が表示される。(昨日トラブル時は Forbiddenだった)
Switchbot さんには、先日 温度計の battery 項目が 100% で正しい値が取れないって報告してるし、その辺の修正が利いてないかと期待したけど、相変わらず 100% だな。
MuninでSwitchBot CO2センサーのプラグイン
Muninで、Switchbot の CO2 センサーをモニタリングするためのプラグイン
#!/bin/bash #%# family=auto #%# capabilities=autoconf available="yes" # # SwitchBot # token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" swbot_url="https://api.switch-bot.com" # for v1.1 url_list_v11="${swbot_url}/v1.1/devices" t=$(/bin/date +%s%3N) # time = Epoch time 13 digits nonce=$(/usr/bin/uuidgen) # uuid sign=$(echo -n "$token$t$nonce" | /usr/bin/openssl dgst -sha256 -hmac "$secret" -binary | /usr/bin/base64 -w 0) # SwitchBot meter CO2センサーのデバイスID deviceId="xxxxxxxxxxxx" function status() { url_list_v11_meter="${url_list_v11}/${deviceId}/status" /usr/bin/curl -s --request GET \ -H "Content-Type: application/json" -H "Authorization: ${token}" \ -H "sign: ${sign}" -H "nonce: ${nonce}" -H "t: ${t}" \ "${url_list_v11_meter}" \ | /usr/bin/jq -r '.body | "temperature.value " + (.temperature|tostring) + "\nhumidity.value " + (.humidity\ |tostring) + "\nCO2.value " + (.CO2|tostring)' } case $1 in autoconf ) if [ "$available" = "yes" ]; then echo "yes" exit 0 fi ;; config) echo "graph_title SWBOT Meter CO2 温度/湿度/CO2 (リビング)" echo "graph_category sensors" echo "graph_vlabel 温度[C]/湿度[%]/CO2[ppm]" echo "graph_args -l 0 -u 70" echo "temperature.label 温度[C]" echo "temperature.draw LINE2" echo "temperature.colour 00FF00" echo "temperature.warning 30" echo "humidity.label 湿度[%]" echo "humidity.draw LINE2" echo "humidity.colour 00E0FF" echo "CO2.label CO2[ppm]/100" echo "CO2.draw LINE2" echo "CO2.cdef CO2,0.01,*" #echo "CO2.warning 25" exit 0 ;; esac status
Muninで取得した値を、nagios4 で確認するためのプラグイン。
#!/usr/bin/perl use strict ; use warnings ; use Net::Telnet ; my $telnet = new Net::Telnet( Host => "127.0.0.1" , Port => 4949 , Timeout => 30 ) ; $telnet->open() or die( "Can't connect" ) ; $telnet->waitfor( '/#.*$/' ) ; # munin で読み込む項目を指定 $telnet->print( "fetch switchbot_meter_co2\n" ) ; my $flag = 0 ; my %value = () ; # データを読み込む while( my $line = $telnet->getline() ) { last if ( $line =~ /^\.$/ ) ; if ( $line =~ /^([0-9a-zA-Z_]+)\.value\s+([\.0-9]+)\s*$/ ) { $value{$1} = $2 ; $flag = 1 ; } } # nagios プラグインとして範囲を確認 my $st = 0 ; my $item = "-" ; my %status = ( 0 => "OK" , 1 => "Warning" , 2 => "Critical" , 3 => "Unknown" ) ; if ( exists( $value{'temperature'} ) ) { if ( $value{'temperature'} > $ARGV[1] ) { $st = 2 ; $item = "temperature" ; } elsif ( $value{'temperature'} > $ARGV[0] ) { $st = 1 ; $item = "temperature" ; } } if ( exists( $value{'CO2'} ) ) { if ( $value{'CO2'} > $ARGV[3] ) { $st = 2 ; $item = "CO2" ; } elsif ( $value{'CO2'} > $ARGV[2] ) { $st = 1 ; $item = "CO2" ; } } if ( !$flag ) { $st = 3 ; $item = "Error" ; } # 最終結果の出力 printf( "SBMT_MeterCO2 %s %s %2.1f[C] %2.0f[%%] %4.0f[ppm]\n" , $status{$st} , $item , $value{'temperature'} , $value{'humidity'} , $value{'CO2'} ) ; exit $st ;
Nagios のプラグインを Perl で書いておいたけど、少しでも軽い処理にしたいので lua(lua50) で書き直し
#!/usr/bin/lua local temp , hum , co2 ; local temp_w_max , temp_c_max = 25 , 30 local hum_w_max , hum_c_max = 11 , 22 local co2_w_max , co2_c_max = 2500 , 5000 function find_value( str , pattern ) local p_start , p_end = string.find( str , pattern ) local s_val = string.sub( str , p_end + 1 ) local p_nl = string.find( s_val , "\n" ) local val = string.sub( s_val , 1 , p_nl ) return tonumber( val ) end -- 温度条件 if table.getn(arg) >= 2 then temp_w_max = tonumber( arg[1] ) temp_c_max = tonumber( arg[2] ) end -- 湿度条件 -- if table.getn(arg) >= 2 then -- hum_w_max = tonumber( arg[1] ) -- hum_c_max = tonumber( arg[2] ) -- end -- CO2条件 if table.getn(arg) >= 4 then co2_w_max = tonumber( arg[3] ) co2_c_max = tonumber( arg[4] ) end fh = assert( io.popen( "/usr/bin/echo -e 'fetch switchbot_meter_co2\nQUIT\n' | /bin/nc 127.0.0.1 4949" , "r" ) ) lines = fh:read("*a") fh:close() temp = find_value( lines , "temperature.value" ) hum = find_value( lines , "humidity.value" ) co2 = find_value( lines , "CO2.value" ) if temp >= temp_c_max then mes = "Critical temperature" ret = 2 elseif temp >= temp_w_max then mes = "Warning temperature" ret = 1 elseif co2 >= co2_c_max then mes = "Critical CO2" ret = 2 elseif co2 >= co2_w_max then mes = "Warning CO2" ret = 1 else mes = "OK -" ret = 0 end -- 結果を返す print( string.format( "SWBT_MeterCO2 %s %3.1f[C] %2.0f[%%] %3.0f[ppm]" , mes , temp , hum , co2 ) ) os.exit( ret )
比較検証
「/usr/bin/time -v コマンド」を用いて、各プログラムのメモリ使用量などで比較してみた。lua で書いたものが一番軽量。luac でコンパイルも試したけど、luac で生成されたバイトコードを起動するために、lua コマンドを使うため、コンパイルの効果は薄かった。
Munin の Shell を使った SwitchBot 参照 -- 最大メモリ使用量 17,960 kB nagios4 の Munin 参照の Perl プログラム -- 最大メモリ使用量 10,176 kB nagios4 の Munin 参照の lua5.0 プログラム -- 最大メモリ使用量 2,604 kB