mirror of
https://github.com/eworm-de/routeros-scripts
synced 2024-05-14 08:04:19 +00:00
global-functions: sort alphabetically
This commit is contained in:
parent
3db752bc97
commit
001e7eeb39
17 changed files with 339 additions and 340 deletions
|
@ -4,17 +4,17 @@
|
||||||
#
|
#
|
||||||
# check for certificate validity
|
# check for certificate validity
|
||||||
|
|
||||||
:global Identity;
|
|
||||||
:global CertRenewUrl;
|
|
||||||
:global CertRenewPass;
|
:global CertRenewPass;
|
||||||
|
:global CertRenewUrl;
|
||||||
|
:global Identity;
|
||||||
|
|
||||||
:global CertificateNameByCN;
|
:global CertificateNameByCN;
|
||||||
|
:global LogPrintExit;
|
||||||
:global ParseKeyValueStore;
|
:global ParseKeyValueStore;
|
||||||
:global SendNotification;
|
:global SendNotification;
|
||||||
:global TimeIsSync;
|
:global TimeIsSync;
|
||||||
:global UrlEncode;
|
:global UrlEncode;
|
||||||
:global WaitForFile;
|
:global WaitForFile;
|
||||||
:global LogPrintExit;
|
|
||||||
|
|
||||||
:local FormatExpire do={
|
:local FormatExpire do={
|
||||||
:global CharacterReplace;
|
:global CharacterReplace;
|
||||||
|
|
|
@ -9,9 +9,9 @@
|
||||||
:global SentRouterosUpdateNotification;
|
:global SentRouterosUpdateNotification;
|
||||||
|
|
||||||
:global DeviceInfo;
|
:global DeviceInfo;
|
||||||
|
:global LogPrintExit;
|
||||||
:global ScriptFromTerminal;
|
:global ScriptFromTerminal;
|
||||||
:global SendNotification;
|
:global SendNotification;
|
||||||
:global LogPrintExit;
|
|
||||||
|
|
||||||
:local DoUpdate do={
|
:local DoUpdate do={
|
||||||
:if ([ / system script print count-only where name="packages-update" ] > 0) do={
|
:if ([ / system script print count-only where name="packages-update" ] > 0) do={
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
#
|
#
|
||||||
# upload backup to MikroTik cloud
|
# upload backup to MikroTik cloud
|
||||||
|
|
||||||
:global Identity;
|
|
||||||
:global BackupPassword;
|
:global BackupPassword;
|
||||||
|
:global Identity;
|
||||||
|
|
||||||
:global DeviceInfo;
|
:global DeviceInfo;
|
||||||
:global SendNotification;
|
:global SendNotification;
|
||||||
|
|
|
@ -9,8 +9,8 @@
|
||||||
:global Identity;
|
:global Identity;
|
||||||
|
|
||||||
:global GetMacVendor;
|
:global GetMacVendor;
|
||||||
:global SendNotification;
|
|
||||||
:global ScriptLock;
|
:global ScriptLock;
|
||||||
|
:global SendNotification;
|
||||||
|
|
||||||
$ScriptLock "collect-wireless-mac.capsman";
|
$ScriptLock "collect-wireless-mac.capsman";
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,8 @@
|
||||||
:global Identity;
|
:global Identity;
|
||||||
|
|
||||||
:global GetMacVendor;
|
:global GetMacVendor;
|
||||||
:global SendNotification;
|
|
||||||
:global ScriptLock;
|
:global ScriptLock;
|
||||||
|
:global SendNotification;
|
||||||
|
|
||||||
$ScriptLock "collect-wireless-mac.local";
|
$ScriptLock "collect-wireless-mac.local";
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
:global Identity;
|
:global Identity;
|
||||||
|
|
||||||
:global GetMacVendor;
|
:global GetMacVendor;
|
||||||
:global SendNotification;
|
|
||||||
:global ScriptLock;
|
:global ScriptLock;
|
||||||
|
:global SendNotification;
|
||||||
|
|
||||||
$ScriptLock "collect-wireless-mac%TEMPL%";
|
$ScriptLock "collect-wireless-mac%TEMPL%";
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,8 @@
|
||||||
# !! This is just a template! Replace '%PATH%' with 'caps-man'
|
# !! This is just a template! Replace '%PATH%' with 'caps-man'
|
||||||
# !! or 'interface wireless'!
|
# !! or 'interface wireless'!
|
||||||
|
|
||||||
:global Identity;
|
|
||||||
:global DailyPskMatchComment;
|
:global DailyPskMatchComment;
|
||||||
|
:global Identity;
|
||||||
|
|
||||||
:global SendNotification;
|
:global SendNotification;
|
||||||
:global UrlEncode;
|
:global UrlEncode;
|
||||||
|
|
|
@ -6,9 +6,9 @@
|
||||||
|
|
||||||
:global CharacterReplace;
|
:global CharacterReplace;
|
||||||
|
|
||||||
:global Identity;
|
|
||||||
:global Domain;
|
:global Domain;
|
||||||
:global HostNameInZone;
|
:global HostNameInZone;
|
||||||
|
:global Identity;
|
||||||
|
|
||||||
:local Zone;
|
:local Zone;
|
||||||
:if ($HostNameInZone = true) do={
|
:if ($HostNameInZone = true) do={
|
||||||
|
|
10
email-backup
10
email-backup
|
@ -4,13 +4,13 @@
|
||||||
#
|
#
|
||||||
# create and email backup and config file
|
# create and email backup and config file
|
||||||
|
|
||||||
:global Identity;
|
:global BackupPassword;
|
||||||
:global Domain;
|
|
||||||
:global EmailBackupTo;
|
|
||||||
:global EmailBackupCc;
|
|
||||||
:global BackupSendBinary;
|
:global BackupSendBinary;
|
||||||
:global BackupSendExport;
|
:global BackupSendExport;
|
||||||
:global BackupPassword;
|
:global Domain;
|
||||||
|
:global EmailBackupCc;
|
||||||
|
:global EmailBackupTo;
|
||||||
|
:global Identity;
|
||||||
|
|
||||||
:global CharacterReplace;
|
:global CharacterReplace;
|
||||||
:global DeviceInfo;
|
:global DeviceInfo;
|
||||||
|
|
617
global-functions
617
global-functions
|
@ -9,89 +9,64 @@
|
||||||
:global ExpectedConfigVersion 12;
|
:global ExpectedConfigVersion 12;
|
||||||
|
|
||||||
# global variables not to be changed by user
|
# global variables not to be changed by user
|
||||||
:global SentConfigChangesNotification "-";
|
|
||||||
:global SentRouterosUpdateNotification "-";
|
|
||||||
:global SentLteFirmwareUpgradeNotification "-";
|
|
||||||
:global Identity [ / system identity get name ];
|
:global Identity [ / system identity get name ];
|
||||||
|
:global SentConfigChangesNotification "-";
|
||||||
|
:global SentLteFirmwareUpgradeNotification "-";
|
||||||
|
:global SentRouterosUpdateNotification "-";
|
||||||
|
|
||||||
# global functions
|
# global functions
|
||||||
:global UrlEncode;
|
|
||||||
:global CharacterReplace;
|
|
||||||
:global CertificateNameByCN;
|
|
||||||
:global CertificateDownload;
|
|
||||||
:global CertificateAvailable;
|
:global CertificateAvailable;
|
||||||
:global SendEMail;
|
:global CertificateDownload;
|
||||||
:global SendTelegram;
|
:global CertificateNameByCN;
|
||||||
:global SendNotification;
|
:global CharacterReplace;
|
||||||
:global GetMacVendor;
|
|
||||||
:global CleanFilePath;
|
:global CleanFilePath;
|
||||||
:global DownloadPackage;
|
|
||||||
:global ScriptLock;
|
|
||||||
:global ScriptFromTerminal;
|
|
||||||
:global WaitForFile;
|
|
||||||
:global ParseKeyValueStore;
|
|
||||||
:global GetRandom;
|
|
||||||
:global RandomDelay;
|
|
||||||
:global DeviceInfo;
|
:global DeviceInfo;
|
||||||
:global ScriptInstallUpdate;
|
:global DownloadPackage;
|
||||||
:global MailServerIsUp;
|
:global GetMacVendor;
|
||||||
:global TimeIsSync;
|
:global GetRandom;
|
||||||
:global WaitTimeSync;
|
|
||||||
:global LogPrintExit;
|
:global LogPrintExit;
|
||||||
|
:global MailServerIsUp;
|
||||||
|
:global ParseKeyValueStore;
|
||||||
|
:global RandomDelay;
|
||||||
|
:global ScriptFromTerminal;
|
||||||
|
:global ScriptInstallUpdate;
|
||||||
|
:global ScriptLock;
|
||||||
|
:global SendEMail;
|
||||||
|
:global SendNotification;
|
||||||
|
:global SendTelegram;
|
||||||
|
:global TimeIsSync;
|
||||||
|
:global UrlEncode;
|
||||||
|
:global WaitForFile;
|
||||||
|
:global WaitTimeSync;
|
||||||
|
|
||||||
# url encoding
|
# check and download required certificate
|
||||||
:set UrlEncode do={
|
:set CertificateAvailable do={
|
||||||
:local Input [ :tostr $1 ];
|
|
||||||
:local Return "";
|
|
||||||
|
|
||||||
:if ([ :len $Input ] > 0) do={
|
|
||||||
:local Chars " !\"#\$%&'()*+,:;<=>\?@[\\]^`{|}~";
|
|
||||||
:local Subs { "%20"; "%21"; "%22"; "%23"; "%24"; "%25"; "%26"; "%27"; "%28"; "%29";
|
|
||||||
"%2A"; "%2B"; "%2C"; "%3A"; "%3B"; "%3C"; "%3D"; "%3E"; "%3F"; "%40";
|
|
||||||
"%5B"; "%5C"; "%5D"; "%5E"; "%60"; "%7B"; "%7C"; "%7D"; "%7E" };
|
|
||||||
|
|
||||||
:for I from=0 to=([ :len $Input ] - 1) do={
|
|
||||||
:local Char [ :pick $Input $I ];
|
|
||||||
:local Replace [ :find $Chars $Char ];
|
|
||||||
|
|
||||||
:if ([ :len $Replace ] > 0) do={
|
|
||||||
:set Char ($Subs->$Replace);
|
|
||||||
}
|
|
||||||
:set Return ($Return . $Char);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:return $Return;
|
|
||||||
}
|
|
||||||
|
|
||||||
# character replace
|
|
||||||
:set CharacterReplace do={
|
|
||||||
:local String [ :tostr $1 ];
|
|
||||||
:local ReplaceFrom [ :tostr $2 ];
|
|
||||||
:local ReplaceWith [ :tostr $3 ];
|
|
||||||
:local Return "";
|
|
||||||
|
|
||||||
:if ($ReplaceFrom = "") do={
|
|
||||||
:return $String;
|
|
||||||
}
|
|
||||||
|
|
||||||
:while ([ :typeof [ :find $String $ReplaceFrom ] ] != "nil") do={
|
|
||||||
:local Pos [ :find $String $ReplaceFrom ];
|
|
||||||
:set Return ($Return . [ :pick $String 0 $Pos ] . $ReplaceWith);
|
|
||||||
:set String [ :pick $String ($Pos + [ :len $ReplaceFrom ]) [ :len $String ] ];
|
|
||||||
}
|
|
||||||
|
|
||||||
:return ($Return . $String);
|
|
||||||
}
|
|
||||||
|
|
||||||
# name a certificate by its common-name
|
|
||||||
:set CertificateNameByCN do={
|
|
||||||
:local CommonName [ :tostr $1 ];
|
:local CommonName [ :tostr $1 ];
|
||||||
|
|
||||||
:global CharacterReplace;
|
:global CertificateDownload;
|
||||||
|
:global ParseKeyValueStore;
|
||||||
|
|
||||||
:local Cert [ / certificate find where common-name=$CommonName ];
|
:if ([ / system resource get free-hdd-space ] < 8388608 && \
|
||||||
/ certificate set $Cert name=[ $CharacterReplace [ $CharacterReplace $CommonName " " "-" ] "---" "-" ];
|
[ / certificate settings get crl-download ] = true && \
|
||||||
|
[ / certificate settings get crl-store ] = "system") do={
|
||||||
|
:log warn "This system has low free flash space but is configured to download certificate CRLs to system!";
|
||||||
|
}
|
||||||
|
|
||||||
|
:if ([ / certificate print count-only where common-name=$CommonName ] = 0) do={
|
||||||
|
:log info ("Certificate with CommonName \"" . $CommonName . "\" not available.");
|
||||||
|
$CertificateDownload $CommonName;
|
||||||
|
}
|
||||||
|
|
||||||
|
:local CertVal;
|
||||||
|
:local Issuer $CommonName;
|
||||||
|
:do {
|
||||||
|
:if ([ / certificate print count-only where common-name=$Issuer ] = 0) do={
|
||||||
|
:log info ("Certificate chain for \"" . $CommonName . "\" is incomplete, missing \"" . $Issuer . "\".");
|
||||||
|
$CertificateDownload $CommonName;
|
||||||
|
}
|
||||||
|
:set CertVal [ / certificate get [ find where common-name=$Issuer ] ];
|
||||||
|
:set Issuer ([ $ParseKeyValueStore ($CertVal->"issuer") ]->"CN");
|
||||||
|
} while=($Issuer != $CertVal->"common-name");
|
||||||
}
|
}
|
||||||
|
|
||||||
# download and import certificate
|
# download and import certificate
|
||||||
|
@ -126,118 +101,34 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# check and download required certificate
|
# name a certificate by its common-name
|
||||||
:set CertificateAvailable do={
|
:set CertificateNameByCN do={
|
||||||
:local CommonName [ :tostr $1 ];
|
:local CommonName [ :tostr $1 ];
|
||||||
|
|
||||||
:global CertificateDownload;
|
:global CharacterReplace;
|
||||||
:global ParseKeyValueStore;
|
|
||||||
|
|
||||||
:if ([ / system resource get free-hdd-space ] < 8388608 && \
|
:local Cert [ / certificate find where common-name=$CommonName ];
|
||||||
[ / certificate settings get crl-download ] = true && \
|
/ certificate set $Cert name=[ $CharacterReplace [ $CharacterReplace $CommonName " " "-" ] "---" "-" ];
|
||||||
[ / certificate settings get crl-store ] = "system") do={
|
|
||||||
:log warn "This system has low free flash space but is configured to download certificate CRLs to system!";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
:if ([ / certificate print count-only where common-name=$CommonName ] = 0) do={
|
# character replace
|
||||||
:log info ("Certificate with CommonName \"" . $CommonName . "\" not available.");
|
:set CharacterReplace do={
|
||||||
$CertificateDownload $CommonName;
|
:local String [ :tostr $1 ];
|
||||||
|
:local ReplaceFrom [ :tostr $2 ];
|
||||||
|
:local ReplaceWith [ :tostr $3 ];
|
||||||
|
:local Return "";
|
||||||
|
|
||||||
|
:if ($ReplaceFrom = "") do={
|
||||||
|
:return $String;
|
||||||
}
|
}
|
||||||
|
|
||||||
:local CertVal;
|
:while ([ :typeof [ :find $String $ReplaceFrom ] ] != "nil") do={
|
||||||
:local Issuer $CommonName;
|
:local Pos [ :find $String $ReplaceFrom ];
|
||||||
:do {
|
:set Return ($Return . [ :pick $String 0 $Pos ] . $ReplaceWith);
|
||||||
:if ([ / certificate print count-only where common-name=$Issuer ] = 0) do={
|
:set String [ :pick $String ($Pos + [ :len $ReplaceFrom ]) [ :len $String ] ];
|
||||||
:log info ("Certificate chain for \"" . $CommonName . "\" is incomplete, missing \"" . $Issuer . "\".");
|
|
||||||
$CertificateDownload $CommonName;
|
|
||||||
}
|
|
||||||
:set CertVal [ / certificate get [ find where common-name=$Issuer ] ];
|
|
||||||
:set Issuer ([ $ParseKeyValueStore ($CertVal->"issuer") ]->"CN");
|
|
||||||
} while=($Issuer != $CertVal->"common-name");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# send notification via e-mail
|
:return ($Return . $String);
|
||||||
:set SendEMail do={
|
|
||||||
:local Subject [ :tostr $1 ];
|
|
||||||
:local Message [ :tostr $2 ];
|
|
||||||
:local Attach [ :tostr $3 ];
|
|
||||||
|
|
||||||
:global Identity;
|
|
||||||
:global EmailGeneralTo;
|
|
||||||
:global EmailGeneralCc;
|
|
||||||
|
|
||||||
:if ([ :len $EmailGeneralTo ] > 0) do={
|
|
||||||
:do {
|
|
||||||
:local Signature [ / system note get note ];
|
|
||||||
:if ([ :len $Signature ] > 0) do={
|
|
||||||
:set Signature ("\n-- \n" . $Signature);
|
|
||||||
}
|
|
||||||
/ tool e-mail send to=$EmailGeneralTo cc=$EmailGeneralCc \
|
|
||||||
subject=("[" . $Identity . "] " . $Subject) \
|
|
||||||
body=($Message . $Signature) file=$Attach;
|
|
||||||
} on-error={
|
|
||||||
:log warning "Failed sending notification mail!";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# send notification via telegram
|
|
||||||
:set SendTelegram do={
|
|
||||||
:local Subject [ :tostr $1 ];
|
|
||||||
:local Message [ :tostr $2 ];
|
|
||||||
:local Silent [ :tostr $3 ];
|
|
||||||
|
|
||||||
:global Identity;
|
|
||||||
:global TelegramTokenId;
|
|
||||||
:global TelegramChatId;
|
|
||||||
|
|
||||||
:global UrlEncode;
|
|
||||||
:global CertificateAvailable;
|
|
||||||
|
|
||||||
:if ([ :len $TelegramTokenId ] > 0 && [ :len $TelegramChatId ] > 0) do={
|
|
||||||
$CertificateAvailable "Go Daddy Secure Certificate Authority - G2";
|
|
||||||
:do {
|
|
||||||
/ tool fetch check-certificate=yes-without-crl output=none http-method=post \
|
|
||||||
("https://api.telegram.org/bot" . $TelegramTokenId . "/sendMessage") \
|
|
||||||
http-data=("chat_id=" . $TelegramChatId . "&disable_notification=" . $Silent . \
|
|
||||||
"&text=" . [ $UrlEncode ("[" . $Identity . "] " . $Subject . "\n\n" . $Message) ]);
|
|
||||||
} on-error={
|
|
||||||
:log warning "Failed sending telegram notification!";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# send notification via e-mail and telegram
|
|
||||||
# Note that attachment is ignored for telegram, silent is ignored for e-mail!
|
|
||||||
:set SendNotification do={
|
|
||||||
:local Subject [ :tostr $1 ];
|
|
||||||
:local Message [ :tostr $2 ];
|
|
||||||
:local Attach [ :tostr $3 ];
|
|
||||||
:local Silent [ :tostr $4 ];
|
|
||||||
|
|
||||||
:global SendEMail;
|
|
||||||
:global SendTelegram;
|
|
||||||
|
|
||||||
$SendEMail $Subject $Message $Attach;
|
|
||||||
$SendTelegram $Subject $Message $Silent;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# get MAC vendor
|
|
||||||
:set GetMacVendor do={
|
|
||||||
:local Mac [ :tostr $1 ];
|
|
||||||
|
|
||||||
:global CertificateAvailable;
|
|
||||||
|
|
||||||
:do {
|
|
||||||
:local Vendor;
|
|
||||||
$CertificateAvailable "Let's Encrypt Authority X3";
|
|
||||||
:set Vendor ([ / tool fetch check-certificate=yes-without-crl \
|
|
||||||
("https://api.macvendors.com/" . [ :pick $Mac 0 8 ]) output=user as-value ]->"data");
|
|
||||||
:return $Vendor;
|
|
||||||
} on-error={
|
|
||||||
:return "unknown vendor";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# clean file path
|
# clean file path
|
||||||
|
@ -259,6 +150,49 @@
|
||||||
:return $Path;
|
:return $Path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# get readable device info
|
||||||
|
:set DeviceInfo do={
|
||||||
|
:global ExpectedConfigVersion;
|
||||||
|
:global GlobalConfigVersion;
|
||||||
|
:global Identity;
|
||||||
|
|
||||||
|
:local Resource [ / system resource get ];
|
||||||
|
:local RouterBoard [ / system routerboard get ];
|
||||||
|
:local Update [ / system package update get ];
|
||||||
|
|
||||||
|
:local Info ( \
|
||||||
|
"Hostname: " . $Identity . "\n" . \
|
||||||
|
"Board name: " . $Resource->"board-name" . "\n" . \
|
||||||
|
"Architecture: " . $Resource->"architecture-name");
|
||||||
|
:if ($RouterBoard->"routerboard" = true) do={
|
||||||
|
:local Revision "";
|
||||||
|
:if ([ :len ($RouterBoard->"revision") ] > 0) do={
|
||||||
|
:set Revision (" " . $RouterBoard->"revision");
|
||||||
|
}
|
||||||
|
:set Info ($Info . "\n" . \
|
||||||
|
"Model: " . $RouterBoard->"model" . $Revision . "\n" . \
|
||||||
|
"Serial number: " . $RouterBoard->"serial-number");
|
||||||
|
}
|
||||||
|
:set Info ($Info . "\n" . \
|
||||||
|
"RouterOS:\n" . \
|
||||||
|
" Channel: " . $Update->"channel" . "\n" . \
|
||||||
|
" Installed: " . $Update->"installed-version");
|
||||||
|
:if ([ :typeof ($Update->"latest-version") ] != "nothing" && \
|
||||||
|
$Update->"installed-version" != $Update->"latest-version") do={
|
||||||
|
:set Info ($Info . "\n" . \
|
||||||
|
" Available: " . $Update->"latest-version");
|
||||||
|
}
|
||||||
|
:set Info ($Info . "\n" . \
|
||||||
|
"RouterOS-Scripts Configuration Version:\n" . \
|
||||||
|
" Current: " . $GlobalConfigVersion);
|
||||||
|
:if ($GlobalConfigVersion != $ExpectedConfigVersion) do={
|
||||||
|
:set Info ($Info . "\n" . \
|
||||||
|
" Expected: " . $ExpectedConfigVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
:return $Info;
|
||||||
|
}
|
||||||
|
|
||||||
# download package from upgrade server
|
# download package from upgrade server
|
||||||
:set DownloadPackage do={
|
:set DownloadPackage do={
|
||||||
:local PkgName [ :tostr $1 ];
|
:local PkgName [ :tostr $1 ];
|
||||||
|
@ -304,68 +238,23 @@
|
||||||
:return false;
|
:return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
# lock script against multiple invocation
|
# get MAC vendor
|
||||||
:set ScriptLock do={
|
:set GetMacVendor do={
|
||||||
:global LogPrintExit;
|
:local Mac [ :tostr $1 ];
|
||||||
|
|
||||||
:local Script [ :tostr $1 ];
|
:global CertificateAvailable;
|
||||||
|
|
||||||
:if ([ / system script job print count-only where script=$Script ] > 1) do={
|
:do {
|
||||||
$LogPrintExit info ("Script " . $Script . " started more than once... Aborting.") true;
|
:local Vendor;
|
||||||
|
$CertificateAvailable "Let's Encrypt Authority X3";
|
||||||
|
:set Vendor ([ / tool fetch check-certificate=yes-without-crl \
|
||||||
|
("https://api.macvendors.com/" . [ :pick $Mac 0 8 ]) output=user as-value ]->"data");
|
||||||
|
:return $Vendor;
|
||||||
|
} on-error={
|
||||||
|
:return "unknown vendor";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# check if script is run from terminal
|
|
||||||
:set ScriptFromTerminal do={
|
|
||||||
:local Script [ :tostr $1 ];
|
|
||||||
|
|
||||||
:foreach Job in=[ / system script job find where script=$Script ] do={
|
|
||||||
:set Job [ / system script job get $Job ];
|
|
||||||
:while ([ :typeof ($Job->"parent") ] = "id") do={
|
|
||||||
:set Job [ / system script job get [ find where .id=($Job->"parent") ] ];
|
|
||||||
}
|
|
||||||
:if (($Job->"type") = "login") do={
|
|
||||||
:log debug ("Script " . $Script . " started from terminal.");
|
|
||||||
:return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
:return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
# wait for file to be available
|
|
||||||
:set WaitForFile do={
|
|
||||||
:global CleanFilePath;
|
|
||||||
|
|
||||||
:local FileName [ $CleanFilePath [ :tostr $1 ] ];
|
|
||||||
:local I 0;
|
|
||||||
|
|
||||||
:while ([ file print count-only where name=$FileName ] = 0) do={
|
|
||||||
:if ($I > 20) do={
|
|
||||||
:return false;
|
|
||||||
}
|
|
||||||
:delay 100ms;
|
|
||||||
:set I ($I + 1);
|
|
||||||
}
|
|
||||||
:return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
# parse key value store
|
|
||||||
:set ParseKeyValueStore do={
|
|
||||||
:global CharacterReplace;
|
|
||||||
|
|
||||||
:local Source $1;
|
|
||||||
:if ([ :typeof $Source ] != "array") do={
|
|
||||||
:set Source [ :tostr $1 ];
|
|
||||||
}
|
|
||||||
:local Result [ :toarray "" ];
|
|
||||||
:foreach KeyValue in=[ :toarray $Source ] do={
|
|
||||||
:set KeyValue [ :toarray [ $CharacterReplace $KeyValue "=" "," ] ];
|
|
||||||
:set ($Result->($KeyValue->0)) ($KeyValue->1);
|
|
||||||
}
|
|
||||||
:return $Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
# generate random number
|
# generate random number
|
||||||
# Warning: This is a *very* weak algorithm and in *no way*
|
# Warning: This is a *very* weak algorithm and in *no way*
|
||||||
# useful for cryptography or similar!
|
# useful for cryptography or similar!
|
||||||
|
@ -379,67 +268,24 @@
|
||||||
:return ($Sum % $Max);
|
:return ($Sum % $Max);
|
||||||
}
|
}
|
||||||
|
|
||||||
# delay a random amount of seconds
|
# log and print with same text, optionally exit
|
||||||
:set RandomDelay do={
|
:set LogPrintExit do={
|
||||||
:global GetRandom;
|
:local Severity [ :tostr $1 ];
|
||||||
|
:local Message [ :tostr $2 ];
|
||||||
|
:local Exit [ :tostr $3 ];
|
||||||
|
|
||||||
:delay ([ $GetRandom $1 ] . "s");
|
:if ($Severity ~ "^(error|info)\$") do={
|
||||||
|
:if ($Severity = "error" ) do={ :log error $Message; }
|
||||||
|
:if ($Severity = "info" ) do={ :log info $Message; }
|
||||||
|
} else={
|
||||||
|
:log warning $Message;
|
||||||
}
|
}
|
||||||
|
|
||||||
# get readable device info
|
:if ($Exit = "true") do={
|
||||||
:set DeviceInfo do={
|
:error ($Severity . ": " . $Message);
|
||||||
:global ExpectedConfigVersion;
|
} else={
|
||||||
:global GlobalConfigVersion;
|
:put ($Severity . ": " . $Message);
|
||||||
:global Identity;
|
|
||||||
|
|
||||||
:local Resource [ / system resource get ];
|
|
||||||
:local RouterBoard [ / system routerboard get ];
|
|
||||||
:local Update [ / system package update get ];
|
|
||||||
|
|
||||||
:local Info ( \
|
|
||||||
"Hostname: " . $Identity . "\n" . \
|
|
||||||
"Board name: " . $Resource->"board-name" . "\n" . \
|
|
||||||
"Architecture: " . $Resource->"architecture-name");
|
|
||||||
:if ($RouterBoard->"routerboard" = true) do={
|
|
||||||
:local Revision "";
|
|
||||||
:if ([ :len ($RouterBoard->"revision") ] > 0) do={
|
|
||||||
:set Revision (" " . $RouterBoard->"revision");
|
|
||||||
}
|
}
|
||||||
:set Info ($Info . "\n" . \
|
|
||||||
"Model: " . $RouterBoard->"model" . $Revision . "\n" . \
|
|
||||||
"Serial number: " . $RouterBoard->"serial-number");
|
|
||||||
}
|
|
||||||
:set Info ($Info . "\n" . \
|
|
||||||
"RouterOS:\n" . \
|
|
||||||
" Channel: " . $Update->"channel" . "\n" . \
|
|
||||||
" Installed: " . $Update->"installed-version");
|
|
||||||
:if ([ :typeof ($Update->"latest-version") ] != "nothing" && \
|
|
||||||
$Update->"installed-version" != $Update->"latest-version") do={
|
|
||||||
:set Info ($Info . "\n" . \
|
|
||||||
" Available: " . $Update->"latest-version");
|
|
||||||
}
|
|
||||||
:set Info ($Info . "\n" . \
|
|
||||||
"RouterOS-Scripts Configuration Version:\n" . \
|
|
||||||
" Current: " . $GlobalConfigVersion);
|
|
||||||
:if ($GlobalConfigVersion != $ExpectedConfigVersion) do={
|
|
||||||
:set Info ($Info . "\n" . \
|
|
||||||
" Expected: " . $ExpectedConfigVersion);
|
|
||||||
}
|
|
||||||
|
|
||||||
:return $Info;
|
|
||||||
}
|
|
||||||
|
|
||||||
# install new scripts, update existing scripts
|
|
||||||
:set ScriptInstallUpdate do={
|
|
||||||
:local Scripts [ :toarray $1 ];
|
|
||||||
|
|
||||||
:foreach Script in=$Scripts do={
|
|
||||||
:if ([ / system script print count-only where name=$Script ] = 0) do={
|
|
||||||
:log info ("Adding new script: " . $Script);
|
|
||||||
/ system script add name=$Script source="#!rsc";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/ system script run script-updates;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# check if mail server is up
|
# check if mail server is up
|
||||||
|
@ -463,6 +309,137 @@
|
||||||
:return false;
|
:return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# parse key value store
|
||||||
|
:set ParseKeyValueStore do={
|
||||||
|
:global CharacterReplace;
|
||||||
|
|
||||||
|
:local Source $1;
|
||||||
|
:if ([ :typeof $Source ] != "array") do={
|
||||||
|
:set Source [ :tostr $1 ];
|
||||||
|
}
|
||||||
|
:local Result [ :toarray "" ];
|
||||||
|
:foreach KeyValue in=[ :toarray $Source ] do={
|
||||||
|
:set KeyValue [ :toarray [ $CharacterReplace $KeyValue "=" "," ] ];
|
||||||
|
:set ($Result->($KeyValue->0)) ($KeyValue->1);
|
||||||
|
}
|
||||||
|
:return $Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
# delay a random amount of seconds
|
||||||
|
:set RandomDelay do={
|
||||||
|
:global GetRandom;
|
||||||
|
|
||||||
|
:delay ([ $GetRandom $1 ] . "s");
|
||||||
|
}
|
||||||
|
|
||||||
|
# check if script is run from terminal
|
||||||
|
:set ScriptFromTerminal do={
|
||||||
|
:local Script [ :tostr $1 ];
|
||||||
|
|
||||||
|
:foreach Job in=[ / system script job find where script=$Script ] do={
|
||||||
|
:set Job [ / system script job get $Job ];
|
||||||
|
:while ([ :typeof ($Job->"parent") ] = "id") do={
|
||||||
|
:set Job [ / system script job get [ find where .id=($Job->"parent") ] ];
|
||||||
|
}
|
||||||
|
:if (($Job->"type") = "login") do={
|
||||||
|
:log debug ("Script " . $Script . " started from terminal.");
|
||||||
|
:return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
# install new scripts, update existing scripts
|
||||||
|
:set ScriptInstallUpdate do={
|
||||||
|
:local Scripts [ :toarray $1 ];
|
||||||
|
|
||||||
|
:foreach Script in=$Scripts do={
|
||||||
|
:if ([ / system script print count-only where name=$Script ] = 0) do={
|
||||||
|
:log info ("Adding new script: " . $Script);
|
||||||
|
/ system script add name=$Script source="#!rsc";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/ system script run script-updates;
|
||||||
|
}
|
||||||
|
|
||||||
|
# lock script against multiple invocation
|
||||||
|
:set ScriptLock do={
|
||||||
|
:global LogPrintExit;
|
||||||
|
|
||||||
|
:local Script [ :tostr $1 ];
|
||||||
|
|
||||||
|
:if ([ / system script job print count-only where script=$Script ] > 1) do={
|
||||||
|
$LogPrintExit info ("Script " . $Script . " started more than once... Aborting.") true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# send notification via e-mail
|
||||||
|
:set SendEMail do={
|
||||||
|
:local Subject [ :tostr $1 ];
|
||||||
|
:local Message [ :tostr $2 ];
|
||||||
|
:local Attach [ :tostr $3 ];
|
||||||
|
|
||||||
|
:global Identity;
|
||||||
|
:global EmailGeneralTo;
|
||||||
|
:global EmailGeneralCc;
|
||||||
|
|
||||||
|
:if ([ :len $EmailGeneralTo ] > 0) do={
|
||||||
|
:do {
|
||||||
|
:local Signature [ / system note get note ];
|
||||||
|
:if ([ :len $Signature ] > 0) do={
|
||||||
|
:set Signature ("\n-- \n" . $Signature);
|
||||||
|
}
|
||||||
|
/ tool e-mail send to=$EmailGeneralTo cc=$EmailGeneralCc \
|
||||||
|
subject=("[" . $Identity . "] " . $Subject) \
|
||||||
|
body=($Message . $Signature) file=$Attach;
|
||||||
|
} on-error={
|
||||||
|
:log warning "Failed sending notification mail!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# send notification via e-mail and telegram
|
||||||
|
# Note that attachment is ignored for telegram, silent is ignored for e-mail!
|
||||||
|
:set SendNotification do={
|
||||||
|
:local Subject [ :tostr $1 ];
|
||||||
|
:local Message [ :tostr $2 ];
|
||||||
|
:local Attach [ :tostr $3 ];
|
||||||
|
:local Silent [ :tostr $4 ];
|
||||||
|
|
||||||
|
:global SendEMail;
|
||||||
|
:global SendTelegram;
|
||||||
|
|
||||||
|
$SendEMail $Subject $Message $Attach;
|
||||||
|
$SendTelegram $Subject $Message $Silent;
|
||||||
|
}
|
||||||
|
|
||||||
|
# send notification via telegram
|
||||||
|
:set SendTelegram do={
|
||||||
|
:local Subject [ :tostr $1 ];
|
||||||
|
:local Message [ :tostr $2 ];
|
||||||
|
:local Silent [ :tostr $3 ];
|
||||||
|
|
||||||
|
:global Identity;
|
||||||
|
:global TelegramTokenId;
|
||||||
|
:global TelegramChatId;
|
||||||
|
|
||||||
|
:global UrlEncode;
|
||||||
|
:global CertificateAvailable;
|
||||||
|
|
||||||
|
:if ([ :len $TelegramTokenId ] > 0 && [ :len $TelegramChatId ] > 0) do={
|
||||||
|
$CertificateAvailable "Go Daddy Secure Certificate Authority - G2";
|
||||||
|
:do {
|
||||||
|
/ tool fetch check-certificate=yes-without-crl output=none http-method=post \
|
||||||
|
("https://api.telegram.org/bot" . $TelegramTokenId . "/sendMessage") \
|
||||||
|
http-data=("chat_id=" . $TelegramChatId . "&disable_notification=" . $Silent . \
|
||||||
|
"&text=" . [ $UrlEncode ("[" . $Identity . "] " . $Subject . "\n\n" . $Message) ]);
|
||||||
|
} on-error={
|
||||||
|
:log warning "Failed sending telegram notification!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# check if system time is sync
|
# check if system time is sync
|
||||||
:set TimeIsSync do={
|
:set TimeIsSync do={
|
||||||
:if ([ / system ntp client get enabled ] = true && \
|
:if ([ / system ntp client get enabled ] = true && \
|
||||||
|
@ -478,6 +455,48 @@
|
||||||
:return false;
|
:return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# url encoding
|
||||||
|
:set UrlEncode do={
|
||||||
|
:local Input [ :tostr $1 ];
|
||||||
|
:local Return "";
|
||||||
|
|
||||||
|
:if ([ :len $Input ] > 0) do={
|
||||||
|
:local Chars " !\"#\$%&'()*+,:;<=>\?@[\\]^`{|}~";
|
||||||
|
:local Subs { "%20"; "%21"; "%22"; "%23"; "%24"; "%25"; "%26"; "%27"; "%28"; "%29";
|
||||||
|
"%2A"; "%2B"; "%2C"; "%3A"; "%3B"; "%3C"; "%3D"; "%3E"; "%3F"; "%40";
|
||||||
|
"%5B"; "%5C"; "%5D"; "%5E"; "%60"; "%7B"; "%7C"; "%7D"; "%7E" };
|
||||||
|
|
||||||
|
:for I from=0 to=([ :len $Input ] - 1) do={
|
||||||
|
:local Char [ :pick $Input $I ];
|
||||||
|
:local Replace [ :find $Chars $Char ];
|
||||||
|
|
||||||
|
:if ([ :len $Replace ] > 0) do={
|
||||||
|
:set Char ($Subs->$Replace);
|
||||||
|
}
|
||||||
|
:set Return ($Return . $Char);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:return $Return;
|
||||||
|
}
|
||||||
|
|
||||||
|
# wait for file to be available
|
||||||
|
:set WaitForFile do={
|
||||||
|
:global CleanFilePath;
|
||||||
|
|
||||||
|
:local FileName [ $CleanFilePath [ :tostr $1 ] ];
|
||||||
|
:local I 0;
|
||||||
|
|
||||||
|
:while ([ file print count-only where name=$FileName ] = 0) do={
|
||||||
|
:if ($I > 20) do={
|
||||||
|
:return false;
|
||||||
|
}
|
||||||
|
:delay 100ms;
|
||||||
|
:set I ($I + 1);
|
||||||
|
}
|
||||||
|
:return true;
|
||||||
|
}
|
||||||
|
|
||||||
# wait for time to become synced
|
# wait for time to become synced
|
||||||
:set WaitTimeSync do={
|
:set WaitTimeSync do={
|
||||||
:global TimeIsSync;
|
:global TimeIsSync;
|
||||||
|
@ -490,23 +509,3 @@
|
||||||
:delay 1s;
|
:delay 1s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# log and print with same text, optionally exit
|
|
||||||
:set LogPrintExit do={
|
|
||||||
:local Severity [ :tostr $1 ];
|
|
||||||
:local Message [ :tostr $2 ];
|
|
||||||
:local Exit [ :tostr $3 ];
|
|
||||||
|
|
||||||
:if ($Severity ~ "^(error|info)\$") do={
|
|
||||||
:if ($Severity = "error" ) do={ :log error $Message; }
|
|
||||||
:if ($Severity = "info" ) do={ :log info $Message; }
|
|
||||||
} else={
|
|
||||||
:log warning $Message;
|
|
||||||
}
|
|
||||||
|
|
||||||
:if ($Exit = "true") do={
|
|
||||||
:error ($Severity . ": " . $Message);
|
|
||||||
} else={
|
|
||||||
:put ($Severity . ": " . $Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
#
|
#
|
||||||
# track gps data by sending json data to http server
|
# track gps data by sending json data to http server
|
||||||
|
|
||||||
:global Identity;
|
|
||||||
:global GpsTrackUrl;
|
:global GpsTrackUrl;
|
||||||
|
:global Identity;
|
||||||
|
|
||||||
:local CoordinateFormat [ /system gps get coordinate-format ];
|
:local CoordinateFormat [ /system gps get coordinate-format ];
|
||||||
:local Gps [ / system gps monitor once as-value ];
|
:local Gps [ / system gps monitor once as-value ];
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
:local PdPrefix $"pd-prefix";
|
:local PdPrefix $"pd-prefix";
|
||||||
|
|
||||||
:global ParseKeyValueStore;
|
|
||||||
:global LogPrintExit;
|
:global LogPrintExit;
|
||||||
|
:global ParseKeyValueStore;
|
||||||
|
|
||||||
:if ([ :typeof $PdPrefix ] = "nothing") do={
|
:if ([ :typeof $PdPrefix ] = "nothing") do={
|
||||||
$LogPrintExit error "This script is supposed to run from ipv6 dhcp-client." true;
|
$LogPrintExit error "This script is supposed to run from ipv6 dhcp-client." true;
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
# download packages and reboot for installation
|
# download packages and reboot for installation
|
||||||
|
|
||||||
:global DownloadPackage;
|
:global DownloadPackage;
|
||||||
|
:global LogPrintExit;
|
||||||
:global ScriptFromTerminal;
|
:global ScriptFromTerminal;
|
||||||
:global ScriptLock;
|
:global ScriptLock;
|
||||||
:global LogPrintExit;
|
|
||||||
|
|
||||||
$ScriptLock "packages-update";
|
$ScriptLock "packages-update";
|
||||||
|
|
||||||
|
|
|
@ -8,14 +8,14 @@
|
||||||
:global GlobalConfigVersion;
|
:global GlobalConfigVersion;
|
||||||
:global Identity;
|
:global Identity;
|
||||||
:global IDonate;
|
:global IDonate;
|
||||||
:global SentConfigChangesNotification;
|
|
||||||
:global ScriptUpdatesFetch;
|
|
||||||
:global ScriptUpdatesBaseUrl;
|
:global ScriptUpdatesBaseUrl;
|
||||||
:global ScriptUpdatesUrlSuffix;
|
:global ScriptUpdatesFetch;
|
||||||
:global ScriptUpdatesIgnore;
|
:global ScriptUpdatesIgnore;
|
||||||
|
:global ScriptUpdatesUrlSuffix;
|
||||||
|
:global SentConfigChangesNotification;
|
||||||
|
|
||||||
:global SendNotification;
|
|
||||||
:global LogPrintExit;
|
:global LogPrintExit;
|
||||||
|
:global SendNotification;
|
||||||
|
|
||||||
:foreach Script in=[ / system script find where source~"^#!rsc" ] do={
|
:foreach Script in=[ / system script find where source~"^#!rsc" ] do={
|
||||||
:local Ignore 0;
|
:local Ignore 0;
|
||||||
|
|
|
@ -6,9 +6,9 @@
|
||||||
|
|
||||||
:global Identity;
|
:global Identity;
|
||||||
|
|
||||||
:global SendNotification;
|
|
||||||
:global MailServerIsUp;
|
|
||||||
:global LogPrintExit;
|
:global LogPrintExit;
|
||||||
|
:global MailServerIsUp;
|
||||||
|
:global SendNotification;
|
||||||
|
|
||||||
# check mail server
|
# check mail server
|
||||||
:if ($MailServerIsUp = false) do={
|
:if ($MailServerIsUp = false) do={
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
# Michael Gisbers <michael@gisbers.de>
|
# Michael Gisbers <michael@gisbers.de>
|
||||||
|
|
||||||
:global CertificateAvailable;
|
:global CertificateAvailable;
|
||||||
:global ParseKeyValueStore;
|
|
||||||
:global LogPrintExit;
|
:global LogPrintExit;
|
||||||
|
:global ParseKeyValueStore;
|
||||||
|
|
||||||
:if ([ / ip cloud get ddns-enabled ] != true) do={
|
:if ([ / ip cloud get ddns-enabled ] != true) do={
|
||||||
$LogPrintExit error "IP cloud DDNS is not enabled." true;
|
$LogPrintExit error "IP cloud DDNS is not enabled." true;
|
||||||
|
|
|
@ -4,19 +4,19 @@
|
||||||
#
|
#
|
||||||
# create and upload backup and config file
|
# create and upload backup and config file
|
||||||
|
|
||||||
:global Identity;
|
:global BackupPassword;
|
||||||
:global Domain;
|
|
||||||
:global BackupUploadUrl;
|
|
||||||
:global BackupUploadUser;
|
|
||||||
:global BackupUploadPass;
|
|
||||||
:global BackupSendBinary;
|
:global BackupSendBinary;
|
||||||
:global BackupSendExport;
|
:global BackupSendExport;
|
||||||
:global BackupPassword;
|
:global BackupUploadPass;
|
||||||
|
:global BackupUploadUrl;
|
||||||
|
:global BackupUploadUser;
|
||||||
|
:global Domain;
|
||||||
|
:global Identity;
|
||||||
|
|
||||||
:global CharacterReplace;
|
:global CharacterReplace;
|
||||||
:global DeviceInfo;
|
:global DeviceInfo;
|
||||||
:global SendNotification;
|
|
||||||
:global LogPrintExit;
|
:global LogPrintExit;
|
||||||
|
:global SendNotification;
|
||||||
|
|
||||||
:if ($BackupSendBinary != true && \
|
:if ($BackupSendBinary != true && \
|
||||||
$BackupSendExport != true) do={
|
$BackupSendExport != true) do={
|
||||||
|
|
Loading…
Reference in a new issue