From 819c7294c62c84fbc59bbf16a7d9ce97b4957e57 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 30 Jan 2023 16:08:00 +0100 Subject: [PATCH] introduce telegram-chat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Druvis from Mikrotik produced a video "MikroTik Telegram bot - Chat with your Router?". He shows his script to chat with a Router via Telegram bot to send it commands: https://youtu.be/KLX6j3sLRIE This script is kind of limited and has several issues... 🥴 Let's make it robust, usable, multi-device capable and just fun! 😁 (Sadly Mikrotik has a policy to not allow links in Youtube comments. Thus my comment with several hints was removed immediately. If anybody is in contact with Druvis... Please tell him about this script!) --- README.md | 1 + doc/mod/notification-telegram.md | 1 + doc/telegram-chat.d/01-chat-specific.avif | Bin 0 -> 31869 bytes doc/telegram-chat.d/02-chat-all.avif | Bin 0 -> 48099 bytes doc/telegram-chat.md | 89 ++++++++++++++++ global-config | 8 ++ global-config.changes | 1 + global-functions | 3 +- telegram-chat | 120 ++++++++++++++++++++++ 9 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 doc/telegram-chat.d/01-chat-specific.avif create mode 100644 doc/telegram-chat.d/02-chat-all.avif create mode 100644 doc/telegram-chat.md create mode 100644 telegram-chat diff --git a/README.md b/README.md index a5a2894..42f897b 100644 --- a/README.md +++ b/README.md @@ -202,6 +202,7 @@ Available scripts * [Forward received SMS](doc/sms-forward.md) * [Import SSH keys](doc/ssh-keys-import.md) * [Play Super Mario theme](doc/super-mario-theme.md) +* [Chat with your router and send commands via Telegram bot](doc/telegram-chat.md) * [Install LTE firmware upgrade](doc/unattended-lte-firmware-upgrade.md) * [Update GRE configuration with dynamic addresses](doc/update-gre-address.md) * [Update tunnelbroker configuration](doc/update-tunnelbroker.md) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index b55739a..5e6c1a0 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -66,6 +66,7 @@ methods: See also -------- +* [Chat with your router and send commands via Telegram bot](../telegram-chat.md) * [Send notifications via e-mail](notification-email.md) * [Send notifications via Matrix](notification-matrix.md) diff --git a/doc/telegram-chat.d/01-chat-specific.avif b/doc/telegram-chat.d/01-chat-specific.avif new file mode 100644 index 0000000000000000000000000000000000000000..387dc3aa207d4205622e44e403dec4449f522268 GIT binary patch literal 31869 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 literal 0 HcmV?d00001 diff --git a/doc/telegram-chat.d/02-chat-all.avif b/doc/telegram-chat.d/02-chat-all.avif new file mode 100644 index 0000000000000000000000000000000000000000..32fc1812428cc9ff06611468fc4fab7f102c6cde GIT binary patch literal 48099 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 ℹ️ **Info**: This script can not be used on its own but requires the base +> installation. See [main README](../README.md) for details. + +Description +----------- + +This script makes your device poll a Telegram bot for new messages. With +these messages you can send commands to your device and make it run them. +The resulting output is send back to you. + +Requirements and installation +----------------------------- + +Just install the script and the module for notifications via Telegram: + + $ScriptInstallUpdate telegram-chat,mod/notification-telegram; + +Then create a schedule that runs the script periodically: + + /system/scheduler/add start-time=startup interval=30s name=telegram-chat on-event="/system/script/run telegram-chat;"; + +> ⚠️ **Warning**: Make sure to keep the interval in sync when installing +> on several devices. Differing polling intervals will result in missed +> messages. + +Configuration +------------- + +Make sure to configure +[notifications via telegram](mod/notification-telegram.md) first. The +additional configuration goes to `global-config-overlay`, these are the +parameters: + +* `TelegramChatIdsTrusted`: an array with trusted chat ids or user names +* `TelegramChatGroups`: define the groups a device should belong to + +Usage and invocation +-------------------- + +This script is capable of chatting with multiple devices. By default a +device is passive and not acting on messages. To activate it send a message +containing `! identity` (exclamation mark, optional space and system's +identity). To query all dynamic ip addresses form a device named "*MikroTik*" +send `! MikroTik`, followed by `/ip/address/print where dynamic;`. + +![chat to specific device](telegram-chat.d/01-chat-specific.avif) + +Devices can be grouped to chat with them simultaneously. The default group +"*all*" can be activated by sending `! @all`, which will make all devices +act on your commands. + +![chat to all devices](telegram-chat.d/02-chat-all.avif) + +Send a single exclamation mark or non-existent identity to make all +devices passive again. + +Known limitations +----------------- + +### Do not use numeric ids! + +Numeric ids are valid within a session only. Usually you can use something +like this to print all ip addresses and remove the first one: + + /ip/address/print; + /ip/address/remove 0; + +This will fail when sent in separate messages. Instead you should use basic +scripting capabilities. Try to print what you want to act on... + + /ip/address/print where interface=eth; + +... verify and finally remove it. + + /ip/address/remove [ find where interface=eth ]; + +See also +-------- + +* [Send notifications via Telegram](mod/notification-telegram.md) + +--- +[⬅️ Go back to main README](../README.md) +[⬆️ Go back to top](#top) diff --git a/global-config b/global-config index dcd7a09..4b5338a 100644 --- a/global-config +++ b/global-config @@ -35,6 +35,14 @@ :global TelegramChatId ""; #:global TelegramTokenId "123456:ABCDEF-GHI"; #:global TelegramChatId "12345678"; +# Using telegram-chat you have to define trusted chat ids (not group ids!) +# or user names. Groups allow to chat with devices simultaneously. +#:global TelegramChatIdsTrusted { +# "12345678"; +# "example_user"; +#}; +:global TelegramChatGroups "(all)"; +#:global TelegramChatGroups "(all|home|office)"; # This is whether or not to send Telegram messages with fixed-width font. :global TelegramFixedWidthFont true; diff --git a/global-config.changes b/global-config.changes index 2ae335e..94da56c 100644 --- a/global-config.changes +++ b/global-config.changes @@ -98,6 +98,7 @@ 87="Added support for extra text (or emojis \F0\9F\9A\80) in notification tags."; 88="Added support for monitoring CPU load and available free RAM in 'check-health'."; 89="Made the warning time for 'check-certificates' configurable."; + 90="Chat with your router! Introduced 'telegram-chat' to chat via Telegram bot and send commands to your router."; }; # Migration steps to be applied on script updates diff --git a/global-functions b/global-functions index 165ac9a..7fe3873 100644 --- a/global-functions +++ b/global-functions @@ -12,7 +12,7 @@ :local 0 "global-functions"; # expected configuration version -:global ExpectedConfigVersion 89; +:global ExpectedConfigVersion 90; # global variables not to be changed by user :global GlobalFunctionsReady false; @@ -1101,6 +1101,7 @@ "pushpin"="\F0\9F\93\8C"; "scissors"="\E2\9C\82"; "sparkles"="\E2\9C\A8"; + "speech-balloon"="\F0\9F\92\AC"; "up-arrow"="\E2\AC\86"; "warning-sign"="\E2\9A\A0"; "white-heavy-check-mark"="\E2\9C\85" diff --git a/telegram-chat b/telegram-chat new file mode 100644 index 0000000..9c8261e --- /dev/null +++ b/telegram-chat @@ -0,0 +1,120 @@ +#!rsc by RouterOS +# RouterOS script: telegram-chat +# Copyright (c) 2023 Christian Hesse +# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# +# use Telegram to chat with your Router and send commands +# https://git.eworm.de/cgit/routeros-scripts/about/doc/telegram-chat.md + +:local 0 "telegram-chat"; +:global GlobalFunctionsReady; +:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } + +:global Identity; +:global TelegramChatActive; +:global TelegramChatGroups; +:global TelegramChatId; +:global TelegramChatIdsTrusted; +:global TelegramChatOffset; +:global TelegramTokenId; + +:global CertificateAvailable; +:global EscapeForRegEx; +:global GetRandom20CharAlNum; +:global IfThenElse; +:global LogPrintExit2; +:global MkDir; +:global ScriptLock; +:global SendTelegram2; +:global SymbolForNotification; +:global ValidateSyntax; +:global WaitForFile; +:global WaitFullyConnected; + +$ScriptLock $0; + +$WaitFullyConnected; + +:if ([ :typeof $TelegramChatOffset ] != "num") do={ + :set TelegramChatOffset 0; +} + +:if ([ $CertificateAvailable "Go Daddy Secure Certificate Authority - G2" ] = false) do={ + $LogPrintExit2 warning $0 ("Downloading required certificate failed.") true; +} + +:local JsonGetKey do={ + :local Array [ :toarray $1 ]; + :local Key [ :tostr $2 ]; + + :for I from=0 to=([ :len $Array ] - 1) do={ + :if (($Array->$I) = $Key) do={ + :if ($Array->($I + 1) = ":") do={ + :return ($Array->($I + 2)); + } + :return [ :pick ($Array->($I + 1)) 1 [ :len ($Array->($I + 1)) ] ]; + } + } + + :return false; +} + +:local Data; +:do { + :set Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ + ("https://api.telegram.org/bot" . $TelegramTokenId . "/getUpdates?offset=" . \ + $TelegramChatOffset . "&allowed_updates=%5B%22message%22%5D") as-value ]->"data"); + :set Data [ :pick $Data ([ :find $Data "[" ] + 1) ([ :len $Data ] - 2) ]; +} on-error={ + $LogPrintExit2 info $0 ("Failed getting updates from Telegram.") true; +} + +:foreach Update in=[ :toarray $Data ] do={ + :local UpdateID [ $JsonGetKey $Update "update_id" ]; + :if ($UpdateID >= $TelegramChatOffset) do={ + :set TelegramChatOffset ($UpdateID + 1); + :local Trusted false; + :local Message [ $JsonGetKey $Update "message" ]; + :local From [ $JsonGetKey $Message "from" ]; + :local FromID [ $JsonGetKey $From "id" ]; + :local FromUserName [ $JsonGetKey $From "username" ]; + :foreach IdsTrusted in=($TelegramChatId, $TelegramChatIdsTrusted) do={ + :if ($FromID = $IdsTrusted || $FromUserName = $IdsTrusted) do={ + :set Trusted true; + } + } + + :if ($Trusted = true) do={ + :local Text [ $JsonGetKey $Message "text" ]; + :if ([ :pick $Text 0 1 ] = "!") do={ + :if ($Text ~ ("^! *(" . [ $EscapeForRegEx $Identity ] . "|@" . $TelegramChatGroups . ")\$")) do={ + :set TelegramChatActive true; + } else={ + :set TelegramChatActive false; + } + $LogPrintExit2 info $0 ("Now " . [ $IfThenElse $TelegramChatActive "active" "passive" ] . "!") false; + } else={ + :if ($TelegramChatActive = true && [ :len $Text ] > 0) do={ + :if ([ $ValidateSyntax $Text ] = true) do={ + :local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]); + $MkDir "tmpfs/telegram-chat"; + $LogPrintExit2 info $0 ("Running command: " . $Text) false; + :exec script=($Text . "; :execute script=\":put\" file=" . $File . ".done") file=$File; + :if ([ $WaitForFile ($File . ".done.txt") 200 ] = false) do={ + $LogPrintExit2 warning $0 ("Command did not finish, possibly still running.") false; + } + :local Content [ /file/get ($File . ".txt") content ]; + $SendTelegram2 ({ origin=$0; silent=false; \ + subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ + message=("Command:\n" . $Text . "\n\nOutput:\n" . $Content) }); + /file/remove "tmpfs/telegram-chat"; + } else={ + $LogPrintExit2 warning $0 ("The command failed syntax validation: " . $Text) false; + } + } + } + } else={ + $LogPrintExit2 warning $0 ("Received a message from untrusted contact '" . $FromUserName . "' (ID " . $FromID . ")!") false; + } + } +}