#!rsc # RouterOS script: daily-psk # Copyright (c) 2013-2019 Christian Hesse # # update daily PSK (pre shared key) :global Identity; :global DailyPskMatchComment; :global SendNotification; :local Seen [ :toarray "" ]; # return pseudo-random string for PSK :local GeneratePSK do={ :local Date [ :tostr $1 ]; :global DailyPskSecrets; :local Months { "jan"; "feb"; "mar"; "apr"; "may"; "jun"; "jul"; "aug"; "sep"; "oct"; "nov"; "dec" }; :local MonthTbl { 0; 3; 3; 6; 1; 4; 6; 2; 5; 0; 3; 5 }; :local MonthStr [ :pick $Date 0 3 ]; :local Month; :local Day [ :pick $Date 4 6 ]; :local Century [ :pick $Date 7 9 ]; :local Year [ :pick $Date 9 11 ]; # get numeric value for month :for MIndex from=0 to=[ :len $Months ] do={ :if ([ :pick $Months $MIndex ] = $MonthStr) do={ :set Month $MIndex; } } # calculate day of week :local Sum 0; :set Sum ($Sum + (2 * (3 - ($Century - (($Century / 4) * 4))))); :set Sum ($Sum + ($Year / 4)); :set Sum ($Sum + $Year + $Day); :set Sum ($Sum + $Month); :set Sum ($Sum - (($Sum / 7) * 7)); :local Return ([ :pick [ :pick $DailyPskSecrets 0 ] ($Day - 1) ] . \ [ :pick [ :pick $DailyPskSecrets 1 ] $Month ] . \ [ :pick [ :pick $DailyPskSecrets 2 ] $Sum ]); :return $Return; } :local Date [ / system clock get date ]; :local NewPsk [ $GeneratePSK $Date ]; :foreach AccList in=[ / interface wireless access-list find where comment~$DailyPskMatchComment ] do={ :local IntName [ / interface wireless access-list get $AccList interface ]; :local Interface [ / interface wireless find where name=$IntName disabled=no ]; :local Ssid [ / interface wireless get $IntName ssid ]; :local OldPsk [ / interface wireless access-list get $AccList private-pre-shared-key ]; :local Skip 0; :if ($NewPsk != $OldPsk) do={ :log info ("Updating daily PSK for " . $IntName . " to " . $NewPsk . " (was " . $OldPsk . ")"); / interface wireless access-list set $AccList private-pre-shared-key=$NewPsk; :if ([ :len $Interface ] = 1) do={ :foreach SeenSsid in=$Seen do={ :if ($SeenSsid = $Ssid) do={ :log debug ("Already sent a mail for SSID " . $Ssid . ", skipping."); :set Skip 1; } } :if ($Skip = 0) do={ :set Seen ($Seen, $Ssid); :local Url ("https://www.eworm.de/cgi-bin/cqrlogo-wifi.cgi" . \ "?scale=8&level=1&ssid=" . $Ssid . "&pass=" . $NewPsk); :local Attach "qrcode-daily.png"; :do { / tool fetch mode=https check-certificate=yes-without-crl \ $Url dst-path=$Attach; } on-error={ :set Attach ""; } $SendNotification ("daily PSK " . $Ssid) \ ("This is the daily PSK on " . $Identity . ":\n\n" . \ "SSID: " . $Ssid . "\n" . \ "PSK: " . $NewPsk . "\n" . \ "Date: " . $Date . "\n\n" . \ $Url) $Attach; } } else={ :log debug ("Missing active interface " . $IntName . " for access list entry."); } } }