IFTTTのwebhooksトリガーでLINEメッセージ送信
家に帰る時に、家族のLINEに「今から帰る」とメッセージを送りたいんだけど、iOSのショートカットだと、メッセージ文面をいちいち入力する必要がある。そこで、LINEのメッセージ送信は、IFTTT に任せることにして、スマホでショートカットなり、ショートカットのオートメーションから、LINEメッセージ送信を起動したい。
また、IFTTTの JSON形式を返すWebhook trigger だと、safari が開いたままになるので、webhook trigger を起動し、x-callback-url を返す trigger ページを作ってみた。
<?php // IFTTTのwebhookトリガを呼出す // x-callback-url の機能で呼び出し側(shortcut)に戻る // ifttt webhook url $ifttt_webhook = "https://maker.ifttt.com/trigger/%s/with/key/xxxxxxxxxxxxxxxxx_xxxxxx" ; $mykey = "yyyyyyyyyyyyyyyyyyyyyy" ; // パラメータを読み込む $key = isset( $_GET[ "K" ] ) ? $_GET[ "K" ] : "" ; $command = isset( $_GET[ "C" ] ) ? $_GET[ "C" ] : "" ; $json = file_get_contents( "php:input" ) ; // 想定外の接続は無視 if ( $_SERVER['HTTPS'] != 'on' || $key != $mykey ) exit( 1 ) ; // 時間によるwebhook呼出し制限の前処理 $localtime = localtime( time() , true ) ; $l_hour = $localtime[ "tm_hour" ] ; $l_week = $localtime[ "tm_wday" ] ; // webhookの呼出し function post_webhook( $trigger , $json ) { global $ifttt_webhook ; $url = sprintf( $ifttt_webhook , $trigger ) ; $opts = array( 'http' => array( 'method' => 'POST' , 'header' => 'Content-type: application/json; charset=UTF-8' , 'content' => $json ) ) ; $context = stream_context_create( $opts ) ; header( "Content-Type: application/json; charset=utf-8" ) ; // x-callback-urlで処理後はショートカットに戻す header( "Location: shortcuts://" ) ; // IFTTTのtriggerを呼出す print file_get_contents( $url , false , $context ) ; } // GETパラメータで呼び出しするwebhookを切り替え if ( $command == "go_home" ) { // ショートカットからの呼出し用 // go_homeリクエストを中継 post_webhook( "go_home" , $json ) ; } else if ( $command == "go_home_time" ) { // オートメーションからの呼出し用 // 平日の帰宅時間のみ中継 if ( 17 <= $l_hour && $l_hour < 21 && 1 <= $l_week && $l_week <= 5 ) post_webhook( "go_home" , $json ) ; else exit( 0 ) ; } else { exit( 1 ) ; } header( "Content-Type: application/json; charset=utf-8" ) ; ?>
amavisd-newでDKIMのエラー
数日前から、以下のようなエラーメールが届くようになった。
Argument "1.20200513.1" isn't numeric in numeric ge (>=) at /usr/share/perl5/Mail/SpamAssassin/Plugin/DKIM.pm line 686. Argument "1.20200513.1" isn't numeric in numeric ge (>=) at /usr/share/perl5/Mail/SpamAssassin/Plugin/DKIM.pm line 809.
どうも、DKIM の Perl スクリプトが amavisd-new のバージョン確認で、実数形式のバージョン番号の比較でエラーになっている様子。ge 使えって書いてあるし、そうしてみた。でも、versionが9.9超えたら、また変になるよな。まあ、両方とも 1.2とか2.1とかだし 9.9 超える頃には、更新かかるだろ。
686: -if ($version >= 0.31) { +if ($version ge "0.31") { 809: -if (Mail::DKIM::Verifier->VERSION >= 0.40) { +if (Mail::DKIM::Verifier->VERSION ge "0.40") {
サーバ原因不明のフリーズ
休みののんびりする中、自宅サーバがフリーズ。出先だったのでママが恐る恐るリセット。
普通に起動したけど、icinga, munin を見ても予兆の変な雰囲気は無かった。
自宅に帰って改めてフリーズ時間の履歴を見ると、以下のようなところで syslog が途切れていた。
Apr 29 09:49:53 perrine postfix/smtpd[1325089]: connect from unknown[185.143.xx.xx] ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
この後、このIPアドレスから以下のような接続が続いている。postfix の脆弱性でもあるのかな。侵入には失敗しているようだが、なんか不気味。あまりにも不気味だし、繰り返し login を試しているし、iptables で接続をブロックする。
Apr 29 10:27:08 perrine postfix/smtpd[1943]: connect from unknown[185.143.xx.xx] Apr 29 10:27:10 perrine postfix/smtpd[1937]: warning: unknown[185.143.xx.xx]: SASL LOGIN authentication failed: authentication failure
WRM-D2133HPのファームウェアアップデート2.85
自宅ルータ WRM-D2133HP , WEM-1266 のファームウェアアップデート(Ver 2.85)が出たみたい。
これにより、ローミングアシスト機能により、端末との電波状況が悪くなった時に、より良い電波状況の接続先に切り替えを促すことができるらしい。端末も自宅のスマホなら対応しているようだ。
また、電波強度を測定した結果を表示してくれる機能もあり、間取り情報があれば電波強度のヒートマップを作れるみたい。ただ、1Fには機器が中継器だけなので、あんまりあてになる地図ではないな。
bc.googleusercontent.com からの大量アクセス
サーバの負荷が急に上がってきた。
アクセス元を確かめると、35.210.166.102 。調べると 102.166.210.35.bc.googleusercontent.com. からのアクセスで、関連記事を調べるとこういった記事が上がってくる。Google 提供のクラウドみたいで個人からのアクセスらしい。どちらにしろ、10秒程度で次々とページを漁ってる、とてもマナーが悪いクローラー。User-Agent は、以下のようになっている。 https://velen.io をアクセスするけど、つながらない。
"Mozilla/5.0 (compatible; VelenPublicWebCrawler/1.0; +https://velen.io)"
ひとまず、FireWall の IPアドレス指定で接続拒否を行う。
((( /var/www/html/robots.txt ))) User-agent: VelenPublicWebCrawler Disallow: /
WP Fastest Cache を試す
PHP の 7.4 への切り替えを行ったけど、インストール済みのパッケージに Cache 関連のモジュールがあって、あらためて WordPress の Cache を調べてみた。
WP Fastest Cache を Install
簡単に導入できそうな、WP Fastest Cache というのがあったので、導入してみた。
WordPressの普通のプラグインの要領でインストール。WordPress の左メニューに WP Fastest Cache が追加されるので選んでから、キャッシュさせたい項目を選んで保存するだけ。
職場の WordPress にも入れてみた。でも、どこまで効果が出ているかは、よくわからない。ある程度運用してから、CPU 負荷を確認するしかないかな。
追加
数日の様子を見たけど、サーバとしては特に負荷が下がったという雰囲気は無いな。
ただ、ページの表示は早くなったような気がする。
speedtest-cliとrrdtool
インターネットとの通信速度を計測する speedtest-cli で Linux の上で測定できそうなので、毎日測定するようにしてみた。MRTG を単純に使うと5分おきになってしまうので、rrdtool を使って1日1回更新にてデータを生成させる。
#!/usr/bin/perl my $pgname = "speedtest" ; my $rrdfile = "/var/lib/munin/localdomain/localhost.localdomain-$pgname.rrd" ; my $graphfile = "/var/cache/munin/www/localdomain/localhost.localdomain/$pgname.png" ; my $rrdtool = "/usr/bin/rrdtool" ; my $speedtest = "/usr/local/sbin/speedtest-cli" ; my $time = time() ; my $debug = 0 ; sub fetchvalue { my ($upv , $dwv) = @_ ; my $upload = 0 , $download = 0 ; open( FH , "$speedtest |" ) or die( "Can't open $speedtest." ) ; while( my $line = ) { if ( $line =~ /^Upload:\s*([\d\.]+)\s*(M|K|)bit\/s/i ) { $upload = $1 ; $upload *= 1000000 if ( $2 eq "M" ) ; $upload *= 1000 if ( $2 eq "K" || $2 eq "k" ) ; } if ( $line =~ /^Download:\s*([\d\.]+)\s*(M|K|)bit\/s/i ) { $download = $1 ; $download *= 1000000 if ( $2 eq "M" ) ; $download *= 1000 if ( $2 eq "K" || $2 eq "k" ) ; } } close( FH ) ; $$upv = $upload ; $$dwv = $download ; } sub create { my $cmd = "$rrdtool create $rrdfile" ." --step 86400" ." DS:upload:GAUGE:200000:0:U" ." DS:download:GAUGE:200000:0:U" ." RRA:LAST:0.5:1:7" ." RRA:AVERAGE:0.5:3:7" ." RRA:MIN:0.5:3:7" ." RRA:MAX:0.5:3:7" ; print $cmd."\n" if ( $debug ) ; system( $cmd ) ; } sub update { # rrdファイルが無ければ作る create() unless( -f $rrdfile ) ; # 値を取得して更新 my $upv , $dwv ; fetchvalue( \$upv , \$dwv ) ; my $cmd = "$rrdtool update $rrdfile" ." N:$upv:$dwv" ; print $cmd."\n" if ( $debug ) ; system( $cmd ) ; } sub graph { my $start = $time - 3600*24*200 ; my $cmd = "$rrdtool graph $graphfile" ." --imgformat PNG" ." --start $start" ." --end $time" ." --title \"SpeedTest\"" ." --height 150" ." --font DEFAULT:7:Consolas" ." --vertical-label \"bit/sec\"" ." --color FRAME#f3f3f3" ." --color AXIS#F3F3F3" ." --color SHADEA#f3f3f3" ." --color SHADEB#f3f3f3" ." --color ARROW#f3f3f3" ." COMMENT:\" cur avg min max\\n\"" ." DEF:upload=$rrdfile:upload:LAST" ." LINE:upload#00FF00:\"Upload \"" ." GPRINT:upload:LAST:\"%6.2lf%s /\"" ." GPRINT:upload:AVERAGE:\"%6.2lf%s /\"" ." GPRINT:upload:MIN:\"%6.2lf%s /\"" ." GPRINT:upload:MAX:\"%6.2lf%s \\n\"" ." DEF:download=$rrdfile:download:LAST" ." CDEF:download_minus=download,-1,*" ." LINE:download_minus#0000FF:\"Download\"" ." GPRINT:download:LAST:\"%6.2lf%s /\"" ." GPRINT:download:AVERAGE:\"%6.2lf%s /\"" ." GPRINT:download:MIN:\"%6.2lf%s /\"" ." GPRINT:download:MAX:\"%6.2lf%s \\n\"" ." > /dev/null" ; print $cmd."\n" if ( $debug ) ; system( $cmd ) ; } if ( @ARGV > 0 && $ARGV[0] eq "config" ) { create() ; } elsif ( @ARGV > 0 && $ARGV[0] eq "update" ) { update() ; } elsif ( @ARGV > 0 && $ARGV[0] eq "graph" ) { graph() ; } else { update() ; graph() ; }