Compare commits
89 commits
20987221d9
...
8a904dadf4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a904dadf4 | ||
|
|
fa64e8906b | ||
|
|
2feaaf36b2 | ||
|
|
30743c0e87 | ||
|
|
725eb834f4 | ||
|
|
b97a434a9c | ||
|
|
70675a9fee | ||
|
|
e0b12a9050 | ||
|
|
a64e9bed80 | ||
|
|
e10455fb18 | ||
|
|
ed9dee3c5f | ||
|
|
4f778cb1c6 | ||
|
|
a61fbfb75c | ||
|
|
903a3f44a0 | ||
|
|
638258000b | ||
|
|
b285f2c5d2 | ||
|
|
93eb218589 | ||
|
|
45e2f7b0a8 | ||
|
|
b29f3535b6 | ||
|
|
fa9c4be576 | ||
|
|
ce37544bae | ||
|
|
aeca778284 | ||
|
|
af5f01a973 | ||
|
|
0b7528db99 | ||
|
|
54612e333f | ||
|
|
05f0838119 | ||
|
|
c6451c87f1 | ||
|
|
4935c81bd9 | ||
|
|
d12be8f1ac | ||
|
|
c4a060c3d4 | ||
|
|
f3afee3e4b | ||
|
|
82587ec589 | ||
|
|
edd51ca719 | ||
|
|
d1fa3facfd | ||
|
|
b4e6cc5b59 | ||
|
|
9287996b74 | ||
|
|
75692abf47 | ||
|
|
7b45bb5b46 | ||
|
|
165d7c60d4 | ||
|
|
b16c2f5b90 | ||
|
|
cbb0aba1b1 | ||
|
|
1ce3160933 | ||
|
|
607a608502 | ||
|
|
148d40e18d | ||
|
|
036c6ef682 | ||
|
|
5986894749 | ||
|
|
8d68f24095 | ||
|
|
eb89f8359b | ||
|
|
8faf4ab7cf | ||
|
|
ceb6f2353e | ||
|
|
719b662b76 | ||
|
|
cbb282746f | ||
|
|
2e0787afd1 | ||
|
|
a0399216fc | ||
|
|
2d6fdc355e | ||
|
|
fae8dbd8ea | ||
|
|
a2d6671cf0 | ||
|
|
d610bf3582 | ||
|
|
97b4a41f23 | ||
|
|
a2250a00e6 | ||
|
|
c6cc8b9a51 | ||
|
|
5075701958 | ||
|
|
8f6a38f299 | ||
|
|
cc5aea22b3 | ||
|
|
d002d1c0c0 | ||
|
|
737a872a5f | ||
|
|
298a43a871 | ||
|
|
335bfc0a88 | ||
|
|
20885c4620 | ||
|
|
5ccb0d07b1 | ||
|
|
7d701483d3 | ||
|
|
7772fbb22d | ||
|
|
83b164d511 | ||
|
|
f0910a4472 | ||
|
|
090f25a82d | ||
|
|
8ff34a2408 | ||
|
|
affb9b3baf | ||
|
|
87787eefe3 | ||
|
|
677b5b8069 | ||
|
|
876505c36d | ||
|
|
b5a0269667 | ||
|
|
f3e6e152bc | ||
|
|
8eb397f79f | ||
|
|
db0a5bf33c | ||
|
|
fbfeea3042 | ||
|
|
1a1399d302 | ||
|
|
335266f247 | ||
|
|
d100cac9ed | ||
|
|
c88953e44d |
|
|
@ -61,7 +61,7 @@ Import a certificate by CommonName
|
||||||
Running the function `$CertificateAvailable` with that name as parameter
|
Running the function `$CertificateAvailable` with that name as parameter
|
||||||
makes sure the certificate is available in the device's store:
|
makes sure the certificate is available in the device's store:
|
||||||
|
|
||||||
$CertificateAvailable "ISRG Root X2";
|
$CertificateAvailable "ISRG Root X2" "fetch";
|
||||||
|
|
||||||
If the certificate is actually available already nothing happens, and there
|
If the certificate is actually available already nothing happens, and there
|
||||||
is no output. Otherwise the certificate is downloaded and imported.
|
is no output. Otherwise the certificate is downloaded and imported.
|
||||||
|
|
|
||||||
|
|
@ -17,13 +17,16 @@ Initial commands
|
||||||
Run the complete base installation:
|
Run the complete base installation:
|
||||||
|
|
||||||
{
|
{
|
||||||
:local BaseUrl "https://git.eworm.de/cgit/routeros-scripts/plain/";
|
:local BaseUrl "https://rsc.eworm.de/main/";
|
||||||
:local CertCommonName "ISRG Root X2";
|
:local CertCommonName "ISRG Root X2";
|
||||||
:local CertFileName "ISRG-Root-X2.pem";
|
:local CertFileName "ISRG-Root-X2.pem";
|
||||||
:local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470";
|
:local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470";
|
||||||
|
|
||||||
:if (!(([ /certificate/settings/get ]->"builtin-trust-anchors") = "trusted" && \
|
:local CertSettings [ /certificate/settings/get ];
|
||||||
[[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CertCommonName . "\" ] ]") ]] > 0)) do={
|
:if (!((($CertSettings->"builtin-trust-anchors") = "trusted" || \
|
||||||
|
($CertSettings->"builtin-trust-store") ~ "fetch" || \
|
||||||
|
($CertSettings->"builtin-trust-store") = "all") && \
|
||||||
|
[[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CertCommonName . "\" ] ]") ]] > 0)) do={
|
||||||
:put "Importing certificate...";
|
:put "Importing certificate...";
|
||||||
/tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value;
|
/tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value;
|
||||||
:delay 1s;
|
:delay 1s;
|
||||||
|
|
@ -42,9 +45,6 @@ Run the complete base installation:
|
||||||
};
|
};
|
||||||
:put "Loading configuration and functions...";
|
:put "Loading configuration and functions...";
|
||||||
/system/script { run global-config; run global-functions; };
|
/system/script { run global-config; run global-functions; };
|
||||||
:put "Scheduling to load configuration and functions...";
|
|
||||||
/system/scheduler/remove [ find where name="global-scripts" ];
|
|
||||||
/system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }";
|
|
||||||
:if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] > 0) do={
|
:if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] > 0) do={
|
||||||
:put "Renaming certificate by its common-name...";
|
:put "Renaming certificate by its common-name...";
|
||||||
:global CertificateNameByCN;
|
:global CertificateNameByCN;
|
||||||
|
|
|
||||||
55
Makefile
|
|
@ -2,38 +2,45 @@
|
||||||
# template scripts -> final scripts
|
# template scripts -> final scripts
|
||||||
# markdown files -> html files
|
# markdown files -> html files
|
||||||
|
|
||||||
CAPSMAN = $(wildcard *.capsman.rsc)
|
ALL_RSC := $(wildcard *.rsc */*.rsc)
|
||||||
LOCAL = $(wildcard *.local.rsc)
|
GEN_RSC := $(wildcard *.capsman.rsc *.local.rsc *.wifi.rsc)
|
||||||
WIFI = $(wildcard *.wifi.rsc)
|
|
||||||
|
|
||||||
MARKDOWN = $(wildcard *.md doc/*.md doc/mod/*.md)
|
MARKDOWN := $(wildcard *.md doc/*.md doc/mod/*.md)
|
||||||
HTML = $(MARKDOWN:.md=.html)
|
HTML := $(MARKDOWN:.md=.html)
|
||||||
|
|
||||||
all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json
|
DATE ?= $(shell date --rfc-email)
|
||||||
|
VERSION ?= $(shell git symbolic-ref --short HEAD 2>/dev/null)/$(shell git rev-list --count HEAD 2>/dev/null)/$(shell git rev-parse --short=8 HEAD 2>/dev/null)
|
||||||
|
export DATE VERSION
|
||||||
|
|
||||||
%.html: %.md contrib/html.sh contrib/html.sh.d/head.html
|
.PHONY: all checksums commitinfo docs rsc clean
|
||||||
|
|
||||||
|
all: checksums docs rsc
|
||||||
|
|
||||||
|
checksums: checksums.json
|
||||||
|
|
||||||
|
checksums.json: contrib/checksums.sh $(ALL_RSC)
|
||||||
|
contrib/checksums.sh > $@
|
||||||
|
|
||||||
|
commitinfo: global-functions.rsc
|
||||||
|
contrib/commitinfo.sh $< > $<~
|
||||||
|
mv $<~ $<
|
||||||
|
|
||||||
|
docs: $(HTML)
|
||||||
|
|
||||||
|
%.html: %.md general/style.css contrib/html.sh contrib/html.sh.d/head.html contrib/html.sh.d/foot.html
|
||||||
contrib/html.sh $< > $@
|
contrib/html.sh $< > $@
|
||||||
|
|
||||||
%.capsman.rsc: %.template.rsc Makefile
|
rsc: $(GEN_RSC)
|
||||||
sed -e '/\/interface\/wifi\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.capsman|' \
|
|
||||||
-e '/^# NOT \/caps-man\/ #$$/,/^# NOT \/caps-man\/ #$$/d' \
|
|
||||||
-e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \
|
|
||||||
< $< > $@
|
|
||||||
|
|
||||||
%.local.rsc: %.template.rsc Makefile
|
%.capsman.rsc: %.template.rsc contrib/template-capsman.sh
|
||||||
sed -e '/\/caps-man\//d' -e '/\/interface\/wifi\//d' -e 's|%TEMPL%|.local|' \
|
contrib/template-capsman.sh $< > $@
|
||||||
-e '/^# NOT \/interface\/wireless\/ #$$/,/^# NOT \/interface\/wireless\/ #$$/d' \
|
|
||||||
-e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \
|
|
||||||
< $< > $@
|
|
||||||
|
|
||||||
%.wifi.rsc: %.template.rsc Makefile
|
%.local.rsc: %.template.rsc contrib/template-local.sh
|
||||||
sed -e '/\/caps-man\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.wifi|' \
|
contrib/template-local.sh $< > $@
|
||||||
-e '/^# NOT \/interface\/wifi\/ #$$/,/^# NOT \/interface\/wifi\/ #$$/d' \
|
|
||||||
-e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \
|
|
||||||
< $< > $@
|
|
||||||
|
|
||||||
checksums.json: contrib/checksums.sh *.rsc */*.rsc
|
%.wifi.rsc: %.template.rsc contrib/template-wifi.sh
|
||||||
contrib/checksums.sh
|
contrib/template-wifi.sh $< > $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(HTML) checksums.json
|
rm -f $(HTML) checksums.json
|
||||||
|
make -C contrib/ clean
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
BIN
README.d/05-run-scripts.avif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 5 KiB After Width: | Height: | Size: 5 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.9 KiB |
41
README.md
|
|
@ -55,15 +55,18 @@ Initial setup
|
||||||
### Get me ready!
|
### Get me ready!
|
||||||
|
|
||||||
If you know how things work just copy and paste the
|
If you know how things work just copy and paste the
|
||||||
[initial commands](INITIAL-COMMANDS.md). Remember to edit and rerun
|
[initial commands](INITIAL-COMMANDS.md). These also support fixing an
|
||||||
|
existing but broken installation. Remember to edit and rerun
|
||||||
`global-config-overlay`!
|
`global-config-overlay`!
|
||||||
First time users should take the long way below.
|
|
||||||
|
> 💡️ **Hint**: First time users should take
|
||||||
|
> [the long way in detail](#the-long-way-in-detail) below.
|
||||||
|
|
||||||
### Live presentation
|
### Live presentation
|
||||||
|
|
||||||
Want to see it in action? I've had a presentation [Repository based
|
Want to see it in action? I've had a presentation [Repository based
|
||||||
RouterOS script distribution ↗️](https://www.youtube.com/watch?v=B9neG3oAhcY)
|
RouterOS script distribution ↗️](https://www.youtube.com/watch?v=B9neG3oAhcY)
|
||||||
including demonstation recorded live at [MUM Europe
|
including demonstration recorded live at [MUM Europe
|
||||||
2019 ↗️](https://mum.mikrotik.com/2019/EU/) in Vienna.
|
2019 ↗️](https://mum.mikrotik.com/2019/EU/) in Vienna.
|
||||||
|
|
||||||
> ⚠️ **Warning**: Some details changed. So see the presentation, then follow
|
> ⚠️ **Warning**: Some details changed. So see the presentation, then follow
|
||||||
|
|
@ -77,14 +80,17 @@ download the certificates.
|
||||||
> 💡️ **Hint**: RouterOS 7.19 comes with a builtin certificate store. You
|
> 💡️ **Hint**: RouterOS 7.19 comes with a builtin certificate store. You
|
||||||
> can skip the steps regarding certificate download and import and jump
|
> can skip the steps regarding certificate download and import and jump
|
||||||
> to [installation of scripts](#installation-of-scripts) if you set the
|
> to [installation of scripts](#installation-of-scripts) if you set the
|
||||||
> trust for these builtin trust anchors:
|
> trust for these builtin trust anchors:
|
||||||
> `/certificate/settings/set builtin-trust-anchors=trusted;`
|
> `/certificate/settings/set builtin-trust-anchors=trusted;`
|
||||||
|
> With RouterOS 7.21 the functionality was changed. Set this at minimum,
|
||||||
|
> but make sure not to drop other targets:
|
||||||
|
> `/certificate/settings/set builtin-trust-store=fetch;`
|
||||||
|
|
||||||
If you intend to download the scripts from a
|
If you intend to download the scripts from a
|
||||||
different location (for example from github.com) install the corresponding
|
different location (for example from github.com) install the corresponding
|
||||||
certificate chain.
|
certificate chain.
|
||||||
|
|
||||||
/tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem";
|
/tool/fetch "https://rsc.eworm.de/main/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem";
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
@ -122,16 +128,16 @@ date and time is set correctly!
|
||||||
|
|
||||||
Now let's download the main scripts and add them in configuration on the fly.
|
Now let's download the main scripts and add them in configuration on the fly.
|
||||||
|
|
||||||
:foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://git.eworm.de/cgit/routeros-scripts/plain/" . $Script . ".rsc") output=user as-value]->"data"); };
|
:foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://rsc.eworm.de/main/" . $Script . ".rsc") output=user as-value]->"data"); };
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
And finally load configuration and functions and add the scheduler.
|
And finally run configuration and functions. This will also add the
|
||||||
|
scheduler for loading at system startup automatically.
|
||||||
|
|
||||||
/system/script { run global-config; run global-functions; };
|
/system/script { run global-config; run global-functions; };
|
||||||
/system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }";
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
> 💡️ **Hint**: You see complaints regarding syntax errors? Most likely the
|
> 💡️ **Hint**: You see complaints regarding syntax errors? Most likely the
|
||||||
> RouterOS on your device is too old. Check for updates!
|
> RouterOS on your device is too old. Check for updates!
|
||||||
|
|
@ -173,7 +179,7 @@ This last step is required when ever you make changes to your configuration.
|
||||||
|
|
||||||
> ℹ️ **Info**: It is recommended to edit the configuration using the command
|
> ℹ️ **Info**: It is recommended to edit the configuration using the command
|
||||||
> line interface. If using Winbox on Windows OS, the line endings may be
|
> line interface. If using Winbox on Windows OS, the line endings may be
|
||||||
> missing. To fix this run:
|
> missing. To fix this run:
|
||||||
> `/system/script/set source=[ :tocrlf [ get global-config-overlay source ] ] global-config-overlay;`
|
> `/system/script/set source=[ :tocrlf [ get global-config-overlay source ] ] global-config-overlay;`
|
||||||
|
|
||||||
Updating scripts
|
Updating scripts
|
||||||
|
|
@ -401,14 +407,15 @@ immediately remove the link in question.
|
||||||
Upstream
|
Upstream
|
||||||
--------
|
--------
|
||||||
|
|
||||||
[](https://rsc.eworm.de/)
|
[rsc.eworm.de](https://rsc.eworm.de/)
|
||||||
|
|
||||||
URL:
|
[](https://rsc.eworm.de/)
|
||||||
[GitHub.com](https://github.com/eworm-de/routeros-scripts#routeros-scripts)
|
|
||||||
|
|
||||||
Mirror:
|
### Code hosting
|
||||||
[eworm.de](https://git.eworm.de/cgit/routeros-scripts/about/)
|
|
||||||
[GitLab.com](https://gitlab.com/eworm-de/routeros-scripts#routeros-scripts)
|
* [git.eworm.de](https://git.eworm.de/cgit/routeros-scripts/about/)
|
||||||
|
* [GitHub.com](https://github.com/eworm-de/routeros-scripts#routeros-scripts)
|
||||||
|
* [GitLab.com](https://gitlab.com/eworm-de/routeros-scripts#routeros-scripts)
|
||||||
|
|
||||||
---
|
---
|
||||||
[⬆️ Go back to top](#top)
|
[⬆️ Go back to top](#top)
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
:global CertWarnTime;
|
:global CertWarnTime;
|
||||||
:global Identity;
|
:global Identity;
|
||||||
|
|
||||||
:global CertificateAvailable
|
:global CertificateAvailable;
|
||||||
:global EscapeForRegEx;
|
:global EscapeForRegEx;
|
||||||
:global IfThenElse;
|
:global IfThenElse;
|
||||||
:global LogPrint;
|
:global LogPrint;
|
||||||
|
|
@ -189,7 +189,7 @@
|
||||||
fingerprint!=[ :tostr ($CertVal->"fingerprint") ] expires-after>$CertRenewTime ];
|
fingerprint!=[ :tostr ($CertVal->"fingerprint") ] expires-after>$CertRenewTime ];
|
||||||
:local CertNewVal [ /certificate/get $CertNew ];
|
:local CertNewVal [ /certificate/get $CertNew ];
|
||||||
|
|
||||||
:if ([ $CertificateAvailable ([ $ParseKeyValueStore ($CertNewVal->"issuer") ]->"CN") ] = false) do={
|
:if ([ $CertificateAvailable ([ $ParseKeyValueStore ($CertNewVal->"issuer") ]->"CN") "fetch" ] = false) do={
|
||||||
$LogPrint warning $ScriptName ("The certificate chain is not available!");
|
$LogPrint warning $ScriptName ("The certificate chain is not available!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
17
contrib/Makefile
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
# Makefile
|
||||||
|
|
||||||
|
HTML := $(shell grep -xl '<!-- static html //-->' *.html)
|
||||||
|
|
||||||
|
.PHONY: all docs clean
|
||||||
|
|
||||||
|
all: docs
|
||||||
|
|
||||||
|
badges.html: badges.md
|
||||||
|
markdown $< > $@
|
||||||
|
|
||||||
|
docs: static-html.sh $(HTML) badges.html
|
||||||
|
./static-html.sh $(HTML)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f badges.html
|
||||||
|
git checkout HEAD -- $(HTML)
|
||||||
6
contrib/badges.md
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[](https://github.com/eworm-de/routeros-scripts/stargazers)
|
||||||
|
[](https://github.com/eworm-de/routeros-scripts/network)
|
||||||
|
[](https://github.com/eworm-de/routeros-scripts/watchers)
|
||||||
|
[](https://mikrotik.com/download/changelogs/)
|
||||||
|
[](https://t.me/routeros_scripts)
|
||||||
|
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J)
|
||||||
|
|
@ -6,4 +6,4 @@ set -e
|
||||||
|
|
||||||
md5sum $(find -name '*.rsc' | sort) | \
|
md5sum $(find -name '*.rsc' | sort) | \
|
||||||
sed -e "s| \./||" -e 's|.rsc$||' | \
|
sed -e "s| \./||" -e 's|.rsc$||' | \
|
||||||
jq --raw-input --null-input '[ inputs | split (" ") | { (.[1]): (.[0]) }] | add' > 'checksums.json'
|
jq --raw-input --null-input '[ inputs | split (" ") | { (.[1]): (.[0]) }] | add'
|
||||||
|
|
|
||||||
6
contrib/commitinfo.sh
Executable file
|
|
@ -0,0 +1,6 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
sed \
|
||||||
|
-e "/^:global CommitId/c :global CommitId \"${COMMITID:-unknown}\";" \
|
||||||
|
-e "/^:global CommitInfo/c :global CommitInfo \"${COMMITINFO:-unknown}\";" \
|
||||||
|
< "${1}"
|
||||||
|
|
@ -2,8 +2,22 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
sed "s|__TITLE__|$(head -n1 "${1}")|" < "${0}.d/head.html"
|
RELTO="$(dirname "${1}")"
|
||||||
|
|
||||||
|
sed \
|
||||||
|
-e "s|__TITLE__|$(head -n1 "${1}")|" \
|
||||||
|
-e "s|__GENERAL__|$(realpath --relative-to="${RELTO}" general/)|" \
|
||||||
|
-e "s|__ROOT__|$(realpath --relative-to="${RELTO}" ./)|" \
|
||||||
|
< "${0}.d/head.html"
|
||||||
|
|
||||||
markdown -f toc,idanchor "${1}" | sed \
|
markdown -f toc,idanchor "${1}" | sed \
|
||||||
-e 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' \
|
-e 's/href="\([-_\./[:alnum:]]*\)\.md\(#[-[:alnum:]]*\)\?"/href="\1.html\2"/g' \
|
||||||
-e '/<h[1234] /s| id="\(.*\)">| id="\L\1">|'
|
-e '/<h[1234] /s| id="\(.*\)">| id="\L\1">|' \
|
||||||
printf '</body></html>'
|
-e '/<h[1234] /s|-2[1789cd]-||g' -e '/<h[1234] /s|--26-amp-3b-||g' \
|
||||||
|
-e '/^<pre>/s|pre|pre onclick="CopyToClipboard(this)"|g' \
|
||||||
|
-e '/The above link may be broken on code hosting sites/s|blockquote|blockquote style="display: none;"|'
|
||||||
|
|
||||||
|
sed \
|
||||||
|
-e "s|__DATE__|${DATE:-$(date --rfc-email)}|" \
|
||||||
|
-e "s|__VERSION__|${VERSION:-unknown}|" \
|
||||||
|
< "${0}.d/foot.html"
|
||||||
|
|
|
||||||
5
contrib/html.sh.d/foot.html
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
<p class="foot">RouterOS Scripts documentation generated on <i>__DATE__</i> for <i>__VERSION__</i><br />
|
||||||
|
Copyright © 2013-2025 Christian Hesse <mail@eworm.de></p>
|
||||||
|
|
||||||
|
</body></html>
|
||||||
|
|
@ -1,15 +1,16 @@
|
||||||
<!DOCTYPE html><html lang="en">
|
<!DOCTYPE html><html lang="en">
|
||||||
<head><title>RouterOS Scripts :: __TITLE__</title>
|
<head><meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
<title>RouterOS Scripts :: __TITLE__</title>
|
||||||
<style>
|
<link rel="stylesheet" type="text/css" href="__GENERAL__/style.css">
|
||||||
body { font-family: sans-serif; }
|
<link rel="icon" type="image/png" href="__ROOT__/logo.png">
|
||||||
h2 { border-bottom: 1px solid #ccc; color: #000; }
|
<script type="text/javascript" src="__GENERAL__/clipboard.js"></script>
|
||||||
a { text-decoration: none; }
|
|
||||||
a:hover { text-decoration: underline; }
|
|
||||||
blockquote { border-left: 4px solid #ccc; padding: 0 10px; color: #777; }
|
|
||||||
code { margin: 0 2px; padding: 2px 5px; border: 1px solid #ccc; background-color: #f8f8f8; border-radius: 3px; }
|
|
||||||
pre { background-color: #f8f8f8; border: 1px solid #ccc; overflow: auto; padding: 6px 10px; border-radius: 3px; }
|
|
||||||
pre code { margin: 0; padding: 0; border: 0; }
|
|
||||||
</style>
|
|
||||||
<link rel="icon" href="/logo.png" type="image/png">
|
|
||||||
</head><body>
|
</head><body>
|
||||||
|
|
||||||
|
<table><tr>
|
||||||
|
<td><img src="__GENERAL__/eworm-meadow.avif" alt="eworm on meadow" /></td>
|
||||||
|
<td><img src="__GENERAL__/qr-code.png" alt="QR code: rsc.eworm.de" /></td>
|
||||||
|
<td class="head"><span class="top">RouterOS Scripts</span><br />
|
||||||
|
<span class="bottom">a collection of scripts for MikroTik RouterOS</span></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
body {
|
|
||||||
font-family: fira-sans, sans-serif;
|
|
||||||
font-size: 10pt;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
@ -1,14 +1,30 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html><html lang="en">
|
||||||
<html lang="en">
|
<!-- static html //-->
|
||||||
<head>
|
<head><meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||||
<meta charset="UTF-8">
|
<title>RouterOS Scripts :: Logo Color Changer</title>
|
||||||
<title>RouterOS-Scripts Logo Color Changer</title>
|
<link rel="stylesheet" type="text/css" href="../general/style.css">
|
||||||
<link rel="stylesheet" type="text/css" href="logo-color.d/style.css">
|
<link rel="icon" type="image/png" href="../logo.png">
|
||||||
<script src="logo-color.d/script.js"></script>
|
<script src="logo-color.d/script.js"></script>
|
||||||
</head>
|
</head><body>
|
||||||
<body>
|
|
||||||
|
|
||||||
<h1>RouterOS-Scripts Logo Color Changer</h1>
|
<table><tr>
|
||||||
|
<td><img src="../general/eworm-meadow.avif" alt="eworm on meadow" /></td>
|
||||||
|
<td><img src="../general/qr-code.png" alt="QR code: rsc.eworm.de" /></td>
|
||||||
|
<td class="head"><span class="top">RouterOS Scripts</span><br />
|
||||||
|
<span class="bottom">a collection of scripts for MikroTik RouterOS</span></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
<h1>Logo Color Changer</h1>
|
||||||
|
|
||||||
|
<!-- badges here //-->
|
||||||
|
|
||||||
|
<p><a href="../README.md">⬅️ Go back to main README</a></p>
|
||||||
|
|
||||||
|
<blockquote style="/* display */"><p>💡️ <strong>Hint</strong>: This site or links
|
||||||
|
on it may be broken on code hosting sites. Use
|
||||||
|
<a href="https://rsc.eworm.de/main/contrib/logo-color.html">Logo Color Changer</a>
|
||||||
|
instead.</p></blockquote>
|
||||||
|
|
||||||
<p>You want the logo for your own notifications? But you joined the
|
<p>You want the logo for your own notifications? But you joined the
|
||||||
<a href="https://t.me/routeros_scripts">Telegram Group</a> and want
|
<a href="https://t.me/routeros_scripts">Telegram Group</a> and want
|
||||||
|
|
@ -24,17 +40,23 @@ something that differentiates? Color it!</p>
|
||||||
<p>Then right-click, click "<i>Take Screenshot</i>" and finally select the
|
<p>Then right-click, click "<i>Take Screenshot</i>" and finally select the
|
||||||
logo and download it.</p>
|
logo and download it.</p>
|
||||||
|
|
||||||
<p><img src="logo-color.d/browser-01.avif" width=533 height=482 alt="Screenshot Browser 01">
|
<p><img src="logo-color.d/browser-01.avif" alt="Screenshot Browser 01"></p>
|
||||||
<img src="logo-color.d/browser-02.avif" width=533 height=482 alt="Screenshot Browser 02">
|
<p><img src="logo-color.d/browser-02.avif" alt="Screenshot Browser 02"></p>
|
||||||
<img src="logo-color.d/browser-03.avif" width=533 height=482 alt="Screenshot Browser 03"></p>
|
<p><img src="logo-color.d/browser-03.avif" alt="Screenshot Browser 03"></p>
|
||||||
|
|
||||||
<p>(This example is with
|
<p>(This example is with
|
||||||
<a href="https://www.mozilla.org/de/firefox/new/">Firefox</a>. The workflow
|
<a href="https://www.mozilla.org/de/firefox/new/">Firefox</a>. The workflow
|
||||||
for other browsers may differ.)</p>
|
for other browsers may differ.)</p>
|
||||||
|
|
||||||
<p>See how to
|
<p>See how to
|
||||||
<a href="../../about/doc/mod/notification-telegram.md#set-a-profile-photo">Set
|
<a href="../doc/mod/notification-telegram.md#set-a-profile-photo">Set
|
||||||
a profile photo</a> for your Telegram bot.</p>
|
a profile photo</a> for your Telegram bot.</p>
|
||||||
|
|
||||||
</body>
|
<hr />
|
||||||
</html>
|
|
||||||
|
<p><a href="../README.md">⬅️ Go back to main README</a><br/>
|
||||||
|
<a href="#top">⬆️ Go back to top</a></p>
|
||||||
|
|
||||||
|
<p class="foot">Copyright © 2013-2025 Christian Hesse <mail@eworm.de></p>
|
||||||
|
|
||||||
|
</body></html>
|
||||||
|
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
body {
|
|
||||||
font-family: fira-sans, sans-serif;
|
|
||||||
font-size: 10pt;
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
div.notification {
|
|
||||||
position: relative;
|
|
||||||
float: right;
|
|
||||||
width: 600px;
|
|
||||||
border: 3px outset #6c5d53;
|
|
||||||
/* border-radius: 5px; */
|
|
||||||
padding: 10px;
|
|
||||||
background-color: #e6e6e6;
|
|
||||||
}
|
|
||||||
div.content {
|
|
||||||
padding-left: 60px;
|
|
||||||
}
|
|
||||||
img.logo {
|
|
||||||
float: left;
|
|
||||||
border-radius: 50%;
|
|
||||||
}
|
|
||||||
p.heading {
|
|
||||||
margin: 0px;
|
|
||||||
font-weight: bold;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
p.hint {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
pre {
|
|
||||||
font-family: fira-mono, monospace;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
}
|
|
||||||
span.link {
|
|
||||||
color: #863600;
|
|
||||||
}
|
|
||||||
|
|
@ -1,14 +1,30 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html><html lang="en">
|
||||||
<html lang="en">
|
<!-- static html //-->
|
||||||
<head>
|
<head><meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||||
<meta charset="UTF-8">
|
<title>RouterOS Scripts :: Notification Generator</title>
|
||||||
<title>RouterOS-Scripts Notification Generator</title>
|
<link rel="stylesheet" type="text/css" href="../general/style.css">
|
||||||
<link rel="stylesheet" type="text/css" href="notification.d/style.css">
|
<link rel="icon" type="image/png" href="../logo.png">
|
||||||
<script src="notification.d/script.js"></script>
|
<script src="notification.d/script.js"></script>
|
||||||
</head>
|
</head><body>
|
||||||
<body>
|
|
||||||
|
|
||||||
<h1>RouterOS-Scripts Notification Generator</h1>
|
<table><tr>
|
||||||
|
<td><img src="../general/eworm-meadow.avif" alt="eworm on meadow" /></td>
|
||||||
|
<td><img src="../general/qr-code.png" alt="QR code: rsc.eworm.de" /></td>
|
||||||
|
<td class="head"><span class="top">RouterOS Scripts</span><br />
|
||||||
|
<span class="bottom">a collection of scripts for MikroTik RouterOS</span></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
<h1>Notification Generator</h1>
|
||||||
|
|
||||||
|
<!-- badges here //-->
|
||||||
|
|
||||||
|
<p><a href="../README.md">⬅️ Go back to main README</a></p>
|
||||||
|
|
||||||
|
<blockquote style="/* display */"><p>💡️ <strong>Hint</strong>: This site or links
|
||||||
|
on it may be broken on code hosting sites. Use
|
||||||
|
<a href="https://rsc.eworm.de/main/contrib/notification.html">Notification Generator</a>
|
||||||
|
instead.</p></blockquote>
|
||||||
|
|
||||||
<div class="notification">
|
<div class="notification">
|
||||||
<img src="../logo.svg" alt="logo" class="logo" width=48 height=48>
|
<img src="../logo.svg" alt="logo" class="logo" width=48 height=48>
|
||||||
|
|
@ -16,8 +32,8 @@
|
||||||
<p id="heading" class="heading">[<span id="hostname">MikroTik</span>] <span id="subject">ℹ️ Subject</span></p>
|
<p id="heading" class="heading">[<span id="hostname">MikroTik</span>] <span id="subject">ℹ️ Subject</span></p>
|
||||||
<pre id="message">Message</pre>
|
<pre id="message">Message</pre>
|
||||||
<p id="link" class="hint">🔗 <span id="link-text" class="link">https://eworm.de/</span></p>
|
<p id="link" class="hint">🔗 <span id="link-text" class="link">https://eworm.de/</span></p>
|
||||||
<p id="queued" class="hint">⏰ This message was queued since <span id="queued-since">oct/18/2022 18:30:48</span> and may be obsolete.</p>
|
<p id="queued" class="hint">⏰ This message was queued since <i><span id="queued-since">2025-10-29 16:06:18</span></i> and may be obsolete.</p>
|
||||||
<p id="cut" class="hint">✂️ The message was too long and has been truncated, cut off <span id="cut-percent">13</span>%!</p>
|
<p id="cut" class="hint">✂️ The message was too long and has been truncated, cut off <i><span id="cut-percent">13</span>%</i>!</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -25,11 +41,17 @@
|
||||||
<p>Subject: <input type="text" size=50 value="ℹ️ Subject" onchange="update(this, 'subject')"></p>
|
<p>Subject: <input type="text" size=50 value="ℹ️ Subject" onchange="update(this, 'subject')"></p>
|
||||||
<p>Message: <textarea id="w3review" name="w3review" rows="4" cols="50" onchange="update(this, 'message')">Message</textarea></p>
|
<p>Message: <textarea id="w3review" name="w3review" rows="4" cols="50" onchange="update(this, 'message')">Message</textarea></p>
|
||||||
<p><input type="checkbox" onclick="visible(this, 'link')"> Show link: <input type="text" value="https://eworm.de/" onchange="update(this, 'link-text')"></p>
|
<p><input type="checkbox" onclick="visible(this, 'link')"> Show link: <input type="text" value="https://eworm.de/" onchange="update(this, 'link-text')"></p>
|
||||||
<p><input type="checkbox" onclick="visible(this, 'queued')"> Queued since <input type="text" value="oct/18/2022 18:30:48" onchange="update(this, 'queued-since')"></p>
|
<p><input type="checkbox" onclick="visible(this, 'queued')"> Queued since <input type="text" value="2025-10-29 16:06:18" onchange="update(this, 'queued-since')"></p>
|
||||||
<p><input type="checkbox" onclick="visible(this, 'cut')"> Cut-off with <input type="number" min=1 max=99 value=13 onchange="update(this, 'cut-percent')"> percent</p>
|
<p><input type="checkbox" onclick="visible(this, 'cut')"> Cut-off with <input type="number" min=1 max=99 value=13 onchange="update(this, 'cut-percent')"> percent</p>
|
||||||
|
|
||||||
<p>Then right-click, click "<i>Take Screenshot</i>" and finally select the
|
<p>Then right-click, click "<i>Take Screenshot</i>" and finally select the
|
||||||
notification and download it.</p>
|
notification and download it.</p>
|
||||||
|
|
||||||
</body>
|
<hr />
|
||||||
</html>
|
|
||||||
|
<p><a href="../README.md">⬅️ Go back to main README</a><br/>
|
||||||
|
<a href="#top">⬆️ Go back to top</a></p>
|
||||||
|
|
||||||
|
<p class="foot">Copyright © 2013-2025 Christian Hesse <mail@eworm.de></p>
|
||||||
|
|
||||||
|
</body></html>
|
||||||
|
|
|
||||||
10
contrib/static-html.sh
Executable file
|
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
sed -i \
|
||||||
|
-e '/href=/s|\.md|\.html|' \
|
||||||
|
-e '/blockquote/s|/\* display \*/|display: none;|' \
|
||||||
|
-e '/<!-- badges here \/\/-->/r badges.html' \
|
||||||
|
-e '/<!-- badges here \/\/-->/d' \
|
||||||
|
"${@}"
|
||||||
11
contrib/template-capsman.sh
Executable file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
sed \
|
||||||
|
-e '/\/interface\/wifi\//d' \
|
||||||
|
-e '/\/interface\/wireless\//d' \
|
||||||
|
-e 's|%TEMPL%|.capsman|' \
|
||||||
|
-e '/^# NOT \/caps-man\/ #$/,/^# NOT \/caps-man\/ #$/d' \
|
||||||
|
-e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \
|
||||||
|
< "${1}"
|
||||||
11
contrib/template-local.sh
Executable file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
sed \
|
||||||
|
-e '/\/caps-man\//d' \
|
||||||
|
-e '/\/interface\/wifi\//d' \
|
||||||
|
-e 's|%TEMPL%|.local|' \
|
||||||
|
-e '/^# NOT \/interface\/wireless\/ #$/,/^# NOT \/interface\/wireless\/ #$/d' \
|
||||||
|
-e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \
|
||||||
|
< "${1}"
|
||||||
11
contrib/template-wifi.sh
Executable file
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
sed \
|
||||||
|
-e '/\/caps-man\//d' \
|
||||||
|
-e '/\/interface\/wireless\//d' \
|
||||||
|
-e 's|%TEMPL%|.wifi|' \
|
||||||
|
-e '/^# NOT \/interface\/wifi\/ #$/,/^# NOT \/interface\/wifi\/ #$/d' \
|
||||||
|
-e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \
|
||||||
|
< "${1}"
|
||||||
|
|
@ -49,7 +49,7 @@ your server in device's certificate store.
|
||||||
The example below is for `matrix.org`, which uses a trust chain from *Google
|
The example below is for `matrix.org`, which uses a trust chain from *Google
|
||||||
Trust Services*. Run this to import the required certificate:
|
Trust Services*. Run this to import the required certificate:
|
||||||
|
|
||||||
$CertificateAvailable "GTS Root R4";
|
$CertificateAvailable "GTS Root R4" "fetch";
|
||||||
|
|
||||||
Replace the CA certificate name with what ever is needed for your server.
|
Replace the CA certificate name with what ever is needed for your server.
|
||||||
You may want to find the
|
You may want to find the
|
||||||
|
|
|
||||||
|
|
@ -106,10 +106,13 @@ chat with [BotFather ↗️](https://t.me/BotFather) and set it there.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Have a look at my
|
Have a look at my [Logo Color Changer](../../contrib/logo-color.html)
|
||||||
[RouterOS-Scripts Logo Color Changer](https://git.eworm.de/cgit/routeros-scripts/plain/contrib/logo-color.html)
|
|
||||||
to create a colored version of this scripts' logo.
|
to create a colored version of this scripts' logo.
|
||||||
|
|
||||||
|
> 💡️ **Hint**: The above link may be broken on code hosting sites.
|
||||||
|
> Use [Logo Color Changer](https://rsc.eworm.de/main/contrib/logo-color.html)
|
||||||
|
> instead.
|
||||||
|
|
||||||
See also
|
See also
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ Usage and invocation
|
||||||
The function `$ScriptRunOnce` expects an URL (or name if
|
The function `$ScriptRunOnce` expects an URL (or name if
|
||||||
`ScriptRunOnceBaseUrl` is given) pointing to a script as parameter.
|
`ScriptRunOnceBaseUrl` is given) pointing to a script as parameter.
|
||||||
|
|
||||||
$ScriptRunOnce https://git.eworm.de/cgit/routeros-scripts/plain/doc/mod/scriptrunonce.d/hello-world.rsc;
|
$ScriptRunOnce https://rsc.eworm.de/main/doc/mod/scriptrunonce.d/hello-world.rsc;
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,12 +51,10 @@ The functions `$SSHKeysImportFile` can read an `authorized_keys`-style file
|
||||||
and import all the keys. The user given to the function can be overwritting
|
and import all the keys. The user given to the function can be overwritting
|
||||||
from comments in the file. Create a file `keys.pub` with this content:
|
from comments in the file. Create a file `keys.pub` with this content:
|
||||||
|
|
||||||
```
|
ssh-ed25519 AAAAC3Nza...3OcN8A user@client
|
||||||
ssh-ed25519 AAAAC3Nza...3OcN8A user@client
|
ssh-rsa AAAAB3Nza...ozyts= worker@station
|
||||||
ssh-rsa AAAAB3Nza...ozyts= worker@station
|
# user=example
|
||||||
# user=example
|
ssh-rsa AAAAB3Nza...GXQVk= person@host
|
||||||
ssh-rsa AAAAB3Nza...GXQVk= person@host
|
|
||||||
```
|
|
||||||
|
|
||||||
Then import it with:
|
Then import it with:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,17 +26,15 @@ can configure the reset button to act the same, see
|
||||||
|
|
||||||
Copy this code to terminal to check:
|
Copy this code to terminal to check:
|
||||||
|
|
||||||
```
|
:if ([ :len [ /system/routerboard/mode-button/print as-value ] ] > 0) do={
|
||||||
:if ([ :len [ /system/routerboard/mode-button/print as-value ] ] > 0) do={
|
:put "Mode button is supported.";
|
||||||
:put "Mode button is supported.";
|
} else={
|
||||||
} else={
|
:if ([ :len [ /system/routerboard/reset-button/print as-value ] ] > 0) do={
|
||||||
:if ([ :len [ /system/routerboard/reset-button/print as-value ] ] > 0) do={
|
:put "Mode button is not supported, but reset button is.";
|
||||||
:put "Mode button is not supported, but reset button is.";
|
} else={
|
||||||
} else={
|
:put "Neither mode button nor reset button is supported.";
|
||||||
:put "Neither mode button nor reset button is supported.";
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Requirements and installation
|
Requirements and installation
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
# an ip address list for use with fw-addr-lists script
|
# an ip address list for use with fw-addr-lists script
|
||||||
# https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md
|
# https://rsc.eworm.de/doc/fw-addr-lists.md
|
||||||
git.eworm.de
|
rsc.eworm.de
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
# an ip address list for use with fw-addr-lists script
|
# an ip address list for use with fw-addr-lists script
|
||||||
# https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md
|
# https://rsc.eworm.de/doc/fw-addr-lists.md
|
||||||
|
|
||||||
# example.net
|
# example.net
|
||||||
93.184.216.34
|
93.184.216.34
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@
|
||||||
|
|
||||||
:if ([ :len ($List->"cert") ] > 0) do={
|
:if ([ :len ($List->"cert") ] > 0) do={
|
||||||
:set CheckCertificate true;
|
:set CheckCertificate true;
|
||||||
:if ([ $CertificateAvailable ($List->"cert") ] = false) do={
|
:if ([ $CertificateAvailable ($List->"cert") "fetch" ] = false) do={
|
||||||
$LogPrint warning $ScriptName ("Downloading required certificate (" . $FwListName . \
|
$LogPrint warning $ScriptName ("Downloading required certificate (" . $FwListName . \
|
||||||
" / " . $List->"url" . ") failed, trying anyway.");
|
" / " . $List->"url" . ") failed, trying anyway.");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
8
general/clipboard.js
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
/* copy code to clipboard */
|
||||||
|
function CopyToClipboard(element) {
|
||||||
|
element.style.filter = 'invert(1)';
|
||||||
|
navigator.clipboard.writeText(element.firstElementChild.innerHTML);
|
||||||
|
setTimeout(function() {
|
||||||
|
element.style.filter = 'invert(0)';
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
BIN
general/eworm-meadow.avif
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 207 B After Width: | Height: | Size: 207 B |
101
general/style.css
Normal file
|
|
@ -0,0 +1,101 @@
|
||||||
|
/* stylesheet for RouterOS Scripts */
|
||||||
|
body {
|
||||||
|
background-color: transparent;
|
||||||
|
font-family: fira-sans, sans-serif;
|
||||||
|
font-size: 10pt;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
blockquote {
|
||||||
|
border-left: 4px solid #ccc;
|
||||||
|
padding: 0 10px;
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
code {
|
||||||
|
margin: 0 2px;
|
||||||
|
padding: 2px 5px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
div.notification {
|
||||||
|
position: relative;
|
||||||
|
float: none;
|
||||||
|
width: 600px;
|
||||||
|
border: 3px outset #6c5d53;
|
||||||
|
/* border-radius: 5px; */
|
||||||
|
padding: 10px;
|
||||||
|
background-color: #e6e6e6;
|
||||||
|
}
|
||||||
|
div.content {
|
||||||
|
padding-left: 60px;
|
||||||
|
}
|
||||||
|
img.logo {
|
||||||
|
float: left;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
p.foot {
|
||||||
|
color: #777;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
p.heading {
|
||||||
|
margin: 0px;
|
||||||
|
font-weight: bold;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
p.hint {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
pre {
|
||||||
|
font-family: fira-mono, monospace;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
background-color: #f8f8f8;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
overflow: auto;
|
||||||
|
padding: 6px 10px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
pre code {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
pre::before {
|
||||||
|
content: "📋 Copy!";
|
||||||
|
float: right;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
span.link {
|
||||||
|
color: #863600;
|
||||||
|
}
|
||||||
|
td.head {
|
||||||
|
line-height: 1.2;
|
||||||
|
padding: 0 2em;
|
||||||
|
}
|
||||||
|
td.head .top {
|
||||||
|
font-size: 250%;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
td.head .bottom {
|
||||||
|
font-size: 125%;
|
||||||
|
color: #555;
|
||||||
|
}
|
||||||
|
@media only screen and (orientation: landscape) {
|
||||||
|
body {
|
||||||
|
margin-left: 10vw;
|
||||||
|
margin-right: 10vw;
|
||||||
|
}
|
||||||
|
div.notification {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
# https://rsc.eworm.de/#editing-configuration
|
# https://rsc.eworm.de/#editing-configuration
|
||||||
|
|
||||||
# Copy relevant configuration from global-config, paste and modify it here.
|
# Copy relevant configuration from global-config, paste and modify it here.
|
||||||
# https://rsc.eworm.de/global-config.rsc
|
# https://rsc.eworm.de/main/global-config.rsc
|
||||||
|
|
||||||
|
|
||||||
# End of global-config-overlay
|
# End of global-config-overlay
|
||||||
|
|
|
||||||
|
|
@ -106,11 +106,15 @@
|
||||||
# check and download required certificate
|
# check and download required certificate
|
||||||
:set CertificateAvailable do={
|
:set CertificateAvailable do={
|
||||||
:local CommonName [ :tostr $1 ];
|
:local CommonName [ :tostr $1 ];
|
||||||
|
:local UseFor [ :tostr $2 ];
|
||||||
|
|
||||||
:global CertificateDownload;
|
:global CertificateDownload;
|
||||||
|
:global EitherOr;
|
||||||
:global LogPrint;
|
:global LogPrint;
|
||||||
:global ParseKeyValueStore;
|
:global ParseKeyValueStore;
|
||||||
|
|
||||||
|
:set UseFor [ $EitherOr $UseFor "undefined" ];
|
||||||
|
|
||||||
:if ([ /system/resource/get free-hdd-space ] < 8388608 && \
|
:if ([ /system/resource/get free-hdd-space ] < 8388608 && \
|
||||||
[ /certificate/settings/get crl-download ] = true && \
|
[ /certificate/settings/get crl-download ] = true && \
|
||||||
[ /certificate/settings/get crl-store ] = "system") do={
|
[ /certificate/settings/get crl-store ] = "system") do={
|
||||||
|
|
@ -123,7 +127,10 @@
|
||||||
:return false;
|
:return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
:if (([ /certificate/settings/get ]->"builtin-trust-anchors") = "trusted" && \
|
:local CertSettings [ /certificate/settings/get ];
|
||||||
|
:if ((($CertSettings->"builtin-trust-anchors") = "trusted" || \
|
||||||
|
($CertSettings->"builtin-trust-store") ~ $UseFor || \
|
||||||
|
($CertSettings->"builtin-trust-store") = "all") && \
|
||||||
[[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CommonName . "\" ] ]") ]] > 0) do={
|
[[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CommonName . "\" ] ]") ]] > 0) do={
|
||||||
:return true;
|
:return true;
|
||||||
}
|
}
|
||||||
|
|
@ -161,7 +168,6 @@
|
||||||
:global ScriptUpdatesBaseUrl;
|
:global ScriptUpdatesBaseUrl;
|
||||||
:global ScriptUpdatesUrlSuffix;
|
:global ScriptUpdatesUrlSuffix;
|
||||||
|
|
||||||
:global CertificateAvailable;
|
|
||||||
:global CertificateNameByCN;
|
:global CertificateNameByCN;
|
||||||
:global CleanName;
|
:global CleanName;
|
||||||
:global FetchUserAgentStr;
|
:global FetchUserAgentStr;
|
||||||
|
|
@ -398,7 +404,7 @@
|
||||||
:return true;
|
:return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
:if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={
|
:if ([ $CertificateAvailable "ISRG Root X1" "fetch" ] = false) do={
|
||||||
$LogPrint error $0 ("Downloading required certificate failed.");
|
$LogPrint error $0 ("Downloading required certificate failed.");
|
||||||
:return false;
|
:return false;
|
||||||
}
|
}
|
||||||
|
|
@ -533,10 +539,16 @@
|
||||||
:set FetchUserAgentStr do={
|
:set FetchUserAgentStr do={
|
||||||
:local Caller [ :tostr $1 ];
|
:local Caller [ :tostr $1 ];
|
||||||
|
|
||||||
|
:global CommitId;
|
||||||
|
:global CommitInfo;
|
||||||
|
|
||||||
|
:global IfThenElse;
|
||||||
|
|
||||||
:local Resource [ /system/resource/get ];
|
:local Resource [ /system/resource/get ];
|
||||||
|
|
||||||
:return ("User-Agent: Mikrotik/" . $Resource->"version" . " " . \
|
:return ("User-Agent: Mikrotik/" . $Resource->"version" . " " . $Resource->"architecture-name" . \
|
||||||
$Resource->"architecture-name" . " " . $Caller . "/Fetch (https://rsc.eworm.de/)");
|
" " . $Caller . "/Fetch (https://rsc.eworm.de/" . [ $IfThenElse ($CommitId != "unknown") \
|
||||||
|
("; " . $CommitInfo . "/" . [ :pick $CommitId 0 8 ]) ] . ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
# check for existence of file, optionally with type
|
# check for existence of file, optionally with type
|
||||||
|
|
@ -634,7 +646,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
:do {
|
:do {
|
||||||
:if ([ $CertificateAvailable "GTS Root R4" ] = false) do={
|
:if ([ $CertificateAvailable "GTS Root R4" "fetch" ] = false) do={
|
||||||
$LogPrint warning $0 ("Downloading required certificate failed.");
|
$LogPrint warning $0 ("Downloading required certificate failed.");
|
||||||
:error false;
|
:error false;
|
||||||
}
|
}
|
||||||
|
|
@ -1242,7 +1254,7 @@
|
||||||
:global SymbolForNotification;
|
:global SymbolForNotification;
|
||||||
:global ValidateSyntax;
|
:global ValidateSyntax;
|
||||||
|
|
||||||
:if ([ $CertificateAvailable "ISRG Root X2" ] = false) do={
|
:if ([ $CertificateAvailable "ISRG Root X2" "fetch" ] = false) do={
|
||||||
$LogPrint warning $0 ("Downloading certificate failed, trying without.");
|
$LogPrint warning $0 ("Downloading certificate failed, trying without.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1293,7 +1305,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
:if ([ :len ($ScriptInfo->"certificate") ] > 0) do={
|
:if ([ :len ($ScriptInfo->"certificate") ] > 0) do={
|
||||||
:if ([ $CertificateAvailable ($ScriptInfo->"certificate") ] = false) do={
|
:if ([ $CertificateAvailable ($ScriptInfo->"certificate") "fetch" ] = false) do={
|
||||||
$LogPrint warning $0 ("Downloading certificate failed, trying without.");
|
$LogPrint warning $0 ("Downloading certificate failed, trying without.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1310,9 +1322,19 @@
|
||||||
}
|
}
|
||||||
} do={
|
} do={
|
||||||
$LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "': " . $Err);
|
$LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "': " . $Err);
|
||||||
|
:if ($Err != "Fetch failed with status 404") do={
|
||||||
|
:error false;
|
||||||
|
}
|
||||||
|
|
||||||
:if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={
|
:if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={
|
||||||
$LogPrint warning $0 ("Removing dummy. Typo on installation?");
|
$LogPrint warning $0 ("Removing dummy. Typo on installation?");
|
||||||
/system/script/remove $Script;
|
/system/script/remove $Script;
|
||||||
|
:error false;
|
||||||
|
}
|
||||||
|
:if ([ :len ($ScriptInfo->"base-url") ] = 0 && [ :len ($ScriptInfo->"url-suffix") ] = 0 && \
|
||||||
|
[ :len $CheckSum ] = 0) do={
|
||||||
|
$LogPrintOnce warning $0 \
|
||||||
|
("Added the script manually? Skip updates with 'ignore=true' in comment.");
|
||||||
}
|
}
|
||||||
:error false;
|
:error false;
|
||||||
}
|
}
|
||||||
|
|
@ -1878,6 +1900,15 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# add (and fix) global scripts scheduler
|
||||||
|
:local OnEvent "/system/script { run global-config; run global-functions; }";
|
||||||
|
:if ([ :len [ /system/scheduler/find where name="global-scripts" ] ] = 0) do={
|
||||||
|
/system/scheduler/add name="global-scripts" start-time=startup;
|
||||||
|
}
|
||||||
|
:if ([ /system/scheduler/get "global-scripts" on-event ] != $OnEvent) do={
|
||||||
|
/system/scheduler/set "global-scripts" on-event=$OnEvent;
|
||||||
|
}
|
||||||
|
|
||||||
# Log success
|
# Log success
|
||||||
:local Resource [ /system/resource/get ];
|
:local Resource [ /system/resource/get ];
|
||||||
$LogPrintOnce info $ScriptName ("Loaded on " . $Resource->"board-name" . \
|
$LogPrintOnce info $ScriptName ("Loaded on " . $Resource->"board-name" . \
|
||||||
|
|
|
||||||
|
|
@ -132,7 +132,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
:if ($AllDone = true && $QueueLen = [ :len $EmailQueue ]) do={
|
:if ($AllDone = true && $QueueLen = [ :len $EmailQueue ]) do={
|
||||||
/system/scheduler/remove $Scheduler;
|
/system/scheduler/remove [ find where name="_FlushEmailQueue" ];
|
||||||
:set EmailQueue;
|
:set EmailQueue;
|
||||||
:return true;
|
:return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@
|
||||||
|
|
||||||
:onerror Err {
|
:onerror Err {
|
||||||
:if ($Server = "ntfy.sh") do={
|
:if ($Server = "ntfy.sh") do={
|
||||||
:if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={
|
:if ([ $CertificateAvailable "ISRG Root X1" "fetch" ] = false) do={
|
||||||
$LogPrint warning $0 ("Downloading required certificate failed.");
|
$LogPrint warning $0 ("Downloading required certificate failed.");
|
||||||
:error false;
|
:error false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@
|
||||||
:return false;
|
:return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
:if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={
|
:if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={
|
||||||
$LogPrint warning $0 ("Downloading required certificate failed.");
|
$LogPrint warning $0 ("Downloading required certificate failed.");
|
||||||
:return false;
|
:return false;
|
||||||
}
|
}
|
||||||
|
|
@ -72,7 +72,7 @@
|
||||||
:global CertificateAvailable;
|
:global CertificateAvailable;
|
||||||
:global LogPrint;
|
:global LogPrint;
|
||||||
|
|
||||||
:if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={
|
:if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={
|
||||||
$LogPrint warning $0 ("Downloading required certificate failed.");
|
$LogPrint warning $0 ("Downloading required certificate failed.");
|
||||||
:return false;
|
:return false;
|
||||||
}
|
}
|
||||||
|
|
@ -197,7 +197,7 @@
|
||||||
"&reply_to_message_id=" . ($Notification->"replyto") . "&message_thread_id=" . $ThreadId . \
|
"&reply_to_message_id=" . ($Notification->"replyto") . "&message_thread_id=" . $ThreadId . \
|
||||||
"&disable_web_page_preview=true&parse_mode=MarkdownV2");
|
"&disable_web_page_preview=true&parse_mode=MarkdownV2");
|
||||||
:onerror Err {
|
:onerror Err {
|
||||||
:if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={
|
:if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={
|
||||||
$LogPrint warning $0 ("Downloading required certificate failed.");
|
$LogPrint warning $0 ("Downloading required certificate failed.");
|
||||||
:error false;
|
:error false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,7 @@
|
||||||
|
|
||||||
:foreach DohServer in=$DohServers do={
|
:foreach DohServer in=$DohServers do={
|
||||||
:if ([ :len ($DohServer->"doh-cert") ] > 0) do={
|
:if ([ :len ($DohServer->"doh-cert") ] > 0) do={
|
||||||
:if ([ $CertificateAvailable ($DohServer->"doh-cert") ] = false) do={
|
:if ([ $CertificateAvailable ($DohServer->"doh-cert") "dns" ] = false) do={
|
||||||
$LogPrint warning $ScriptName ("Downloading certificate failed, trying without.");
|
$LogPrint warning $ScriptName ("Downloading certificate failed, trying without.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@
|
||||||
:set TelegramRandomDelay 0;
|
:set TelegramRandomDelay 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
:if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={
|
:if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={
|
||||||
$LogPrint warning $ScriptName ("Downloading required certificate failed.");
|
$LogPrint warning $ScriptName ("Downloading required certificate failed.");
|
||||||
:set ExitOK true;
|
:set ExitOK true;
|
||||||
:error false;
|
:error false;
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@
|
||||||
:error false;
|
:error false;
|
||||||
}
|
}
|
||||||
|
|
||||||
:if ([ $CertificateAvailable "Starfield Root Certificate Authority - G2" ] = false) do={
|
:if ([ $CertificateAvailable "Starfield Root Certificate Authority - G2" "fetch" ] = false) do={
|
||||||
$LogPrint error $ScriptName ("Downloading required certificate failed.");
|
$LogPrint error $ScriptName ("Downloading required certificate failed.");
|
||||||
:set ExitOK true;
|
:set ExitOK true;
|
||||||
:error false;
|
:error false;
|
||||||
|
|
|
||||||