diff --git a/README.d/12-setup-lease-script.avif b/README.d/12-setup-lease-script.avif index 99f9c30c..2a8bcb24 100644 Binary files a/README.d/12-setup-lease-script.avif and b/README.d/12-setup-lease-script.avif differ diff --git a/README.md b/README.md index e739756b..2c87acec 100644 --- a/README.md +++ b/README.md @@ -254,8 +254,8 @@ Some events can run a script. If you want your DHCP hostnames to be available in DNS use `dhcp-to-dns` with the events from dhcp server. For a regular cleanup add a scheduler entry. - $ScriptInstallUpdate dhcp-to-dns,dhcpv4-server-lease; - /ip/dhcp-server/set lease-script="dhcpv4-server-lease" [ find ]; + $ScriptInstallUpdate dhcp-to-dns,lease-script; + /ip/dhcp-server/set lease-script=lease-script [ find ]; /system/scheduler/add name="dhcp-to-dns" interval=5m start-time=startup on-event="/system/script/run dhcp-to-dns;"; ![screenshot: setup lease script](README.d/12-setup-lease-script.avif) @@ -282,8 +282,6 @@ Available scripts * [Use wireless network with daily psk](doc/daily-psk.md) (`daily-psk`) * [Comment DHCP leases with info from access list](doc/dhcp-lease-comment.md) (`dhcp-lease-comment`) * [Create DNS records for DHCP leases](doc/dhcp-to-dns.md) (`dhcp-to-dns`) -* [Run other scripts on IPv4 DHCP server lease](doc/dhcpv4-server-lease.md) (`dhcpv4-server-lease`) -* [Run other scripts on IPv6 DHCP client lease](doc/dhcpv6-client-lease.md) (`dhcpv6-client-lease`) * [Automatically upgrade firmware and reboot](doc/firmware-upgrade-reboot.md) (`firmware-upgrade-reboot`) * [Download, import and update firewall address-lists](doc/fw-addr-lists.md) (`fw-addr-lists`) * [Wait for global functions und modules](doc/global-wait.md) (`global-wait`) @@ -292,6 +290,7 @@ Available scripts * [Create DNS records for IPSec peers](doc/ipsec-to-dns.md) (`ipsec-to-dns`) * [Update configuration on IPv6 prefix change](doc/ipv6-update.md) (`ipv6-update`) * [Manage IP addresses with bridge status](doc/ip-addr-bridge.md) (`ip-addr-bridge`) +* [Run other scripts on DHCP lease](doc/lease-script.md) (`lease-script`) * [Manage LEDs dark mode](doc/leds-mode.md) (`leds-day-mode`, `leds-night-mode` & `leds-toggle-mode`) * [Forward log messages via notification](doc/log-forward.md) (`log-forward`) * [Mode button with multiple presses](doc/mode-button.md) (`mode-button`) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 1cc93445..4d55eb8c 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=40 +# provides: lease-script, order=40 # requires RouterOS, version=7.22 # # collect wireless mac adresses in access list diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 5c897a4e..3d65300f 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=40 +# provides: lease-script, order=40 # requires RouterOS, version=7.22 # # collect wireless mac adresses in access list diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index f9041b69..c1b68ae2 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=40 +# provides: lease-script, order=40 # requires RouterOS, version=7.22 # # collect wireless mac adresses in access list diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 0134fdb0..599b8fac 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=40 +# provides: lease-script, order=40 # requires RouterOS, version=7.22 # # collect wireless mac adresses in access list diff --git a/contrib/telegram.md b/contrib/telegram.md index 487d31f6..76c88858 100644 --- a/contrib/telegram.md +++ b/contrib/telegram.md @@ -91,10 +91,6 @@ Notes /save dhcp-to-dns Create DNS records for DHCP leases with [dhcp-to-dns](https://rsc.eworm.de/doc/dhcp-to-dns.md). -#### dhcpv4-server-lease - - /save dhcpv4-server-lease Run other scripts on IPv4 DHCP server lease with [dhcpv4-server-lease](https://rsc.eworm.de/doc/dhcpv4-server-lease.md). - #### firmware-upgrade-reboot /save firmware-upgrade-reboot Automatically upgrade firmware and reboot with [firmware-upgrade-reboot](https://rsc.eworm.de/doc/firmware-upgrade-reboot.md). @@ -127,6 +123,10 @@ Notes /save ip-addr-bridge Manage IP addresses with [ip-addr-bridge](https://rsc.eworm.de/doc/ip-addr-bridge.md). +#### lease-script + + /save lease-script Run other scripts on DHCP lease with [lease-script](https://rsc.eworm.de/doc/lease-script.md). + #### leds-mode /save leds-mode Manage LEDs dark mode with [leds-mode](https://rsc.eworm.de/doc/leds-mode.md). diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 8d069512..7038d461 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=60 +# provides: lease-script, order=60 # requires RouterOS, version=7.22 # # update dhcp-server lease comment with infos from access-list diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 01d431e9..c684d2e9 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=60 +# provides: lease-script, order=60 # requires RouterOS, version=7.22 # # update dhcp-server lease comment with infos from access-list diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 9e159145..4a2a5987 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=60 +# provides: lease-script, order=60 # requires RouterOS, version=7.22 # # update dhcp-server lease comment with infos from access-list diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index adfab447..1d522465 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=60 +# provides: lease-script, order=60 # requires RouterOS, version=7.22 # # update dhcp-server lease comment with infos from access-list diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 692403ba..088c2dee 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=20 +# provides: lease-script, order=20 # requires RouterOS, version=7.22 # # check DHCP leases and add/remove/update DNS entries diff --git a/dhcpv4-server-lease.rsc b/dhcpv4-server-lease.rsc deleted file mode 100644 index 2352f9ca..00000000 --- a/dhcpv4-server-lease.rsc +++ /dev/null @@ -1,61 +0,0 @@ -#!rsc by RouterOS -# RouterOS script: dhcpv4-server-lease -# Copyright (c) 2013-2026 Christian Hesse -# https://rsc.eworm.de/COPYING.md -# -# requires RouterOS, version=7.22 -# -# run scripts on IPv4 DHCP server lease -# https://rsc.eworm.de/doc/dhcpv4-server-lease.md - -:onerror Err { - :global GlobalConfigReady; :global GlobalFunctionsReady; - :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ - do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; - :local ScriptName [ :jobname ]; - - :global Grep; - :global IfThenElse; - :global LogPrint; - :global ParseKeyValueStore; - :global ScriptLock; - - :if ([ :typeof $leaseActIP ] = "nothing" || \ - [ :typeof $leaseActMAC ] = "nothing" || \ - [ :typeof $leaseServerName ] = "nothing" || \ - [ :typeof $leaseBound ] = "nothing") do={ - $LogPrint error $ScriptName ("This script is supposed to run from ip dhcp-server."); - :exit; - } - - $LogPrint debug $ScriptName ("DHCP Server " . $leaseServerName . " " . [ $IfThenElse ($leaseBound = 0) \ - "de" "" ] . "assigned lease " . $leaseActIP . " to " . $leaseActMAC); - - :if ([ $ScriptLock $ScriptName 10 ] = false) do={ - :exit; - } - - :if ([ :len [ /system/script/job/find where script=$ScriptName ] ] > 1) do={ - $LogPrint debug $ScriptName ("More invocations are waiting, exiting early."); - :exit; - } - - :local RunOrder ({}); - :foreach Script in=[ /system/script/find where source~("\n# provides: dhcpv4-server-lease\\b") ] do={ - :local ScriptVal [ /system/script/get $Script ]; - :local Store [ $ParseKeyValueStore [ $Grep ($ScriptVal->"source") ("\23 provides: dhcpv4-server-lease, ") ] ]; - - :set ($RunOrder->($Store->"order" . "-" . $ScriptVal->"name")) ($ScriptVal->"name"); - } - - :foreach Order,Script in=$RunOrder do={ - :onerror Err { - $LogPrint debug $ScriptName ("Running script with order " . $Order . ": " . $Script); - /system/script/run $Script; - } do={ - $LogPrint warning $ScriptName ("Running script '" . $Script . "' failed: " . $Err); - } - } -} do={ - :global ExitOnError; $ExitOnError [ :jobname ] $Err; -} diff --git a/doc/collect-wireless-mac.md b/doc/collect-wireless-mac.md index 88a4ee7d..9dc6d80b 100644 --- a/doc/collect-wireless-mac.md +++ b/doc/collect-wireless-mac.md @@ -64,14 +64,14 @@ Usage and invocation Run this script from a dhcp server as lease-script to collect the MAC address when a new address is leased. You may want to use -[dhcpv4-server-lease](dhcpv4-server-lease.md). +[lease-script](lease-script.md). See also -------- * [Comment DHCP leases with info from access list](dhcp-lease-comment.md) * [Create DNS records for DHCP leases](dhcp-to-dns.md) -* [Run other scripts on IPv4 DHCP server lease](dhcpv4-server-lease.md) +* [Run other scripts on DHCP lease](lease-script.md) --- [⬅️ Go back to main README](../README.md) diff --git a/doc/dhcp-lease-comment.md b/doc/dhcp-lease-comment.md index 41ec9fe6..75333876 100644 --- a/doc/dhcp-lease-comment.md +++ b/doc/dhcp-lease-comment.md @@ -50,14 +50,14 @@ Usage and invocation Run this script from a dhcp server as lease-script to update the comment just after a new address is leased. You may want to use -[dhcpv4-server-lease](dhcpv4-server-lease.md). +[lease-script](lease-script.md). See also -------- * [Collect MAC addresses in wireless access list](collect-wireless-mac.md) * [Create DNS records for DHCP leases](dhcp-to-dns.md) -* [Run other scripts on IPv4 DHCP server lease](dhcpv4-server-lease.md) +* [Run other scripts on DHCP lease](lease-script.md) --- [⬅️ Go back to main README](../README.md) diff --git a/doc/dhcp-to-dns.md b/doc/dhcp-to-dns.md index bf0db384..7607200a 100644 --- a/doc/dhcp-to-dns.md +++ b/doc/dhcp-to-dns.md @@ -28,7 +28,7 @@ Just install the script: $ScriptInstallUpdate dhcp-to-dns; Then run it from dhcp server as lease script. You may want to use -[dhcpv4-server-lease](dhcpv4-server-lease.md). +[lease-script](lease-script.md). A scheduler cares about cleanup: @@ -106,8 +106,8 @@ See also * [Collect MAC addresses in wireless access list](collect-wireless-mac.md) * [Comment DHCP leases with info from access list](dhcp-lease-comment.md) -* [Run other scripts on IPv4 DHCP server lease](dhcpv4-server-lease.md) * [Create DNS records for IPSec peers](ipsec-to-dns.md) +* [Run other scripts on DHCP lease](lease-script.md) --- [⬅️ Go back to main README](../README.md) diff --git a/doc/dhcpv4-server-lease.md b/doc/dhcpv4-server-lease.md deleted file mode 100644 index bcf74c24..00000000 --- a/doc/dhcpv4-server-lease.md +++ /dev/null @@ -1,54 +0,0 @@ -Run other scripts on IPv4 DHCP server lease -=========================================== - -[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) -[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) -[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.22-yellow?style=flat)](https://mikrotik.com/download/changelogs/) -[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) -[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) - -[⬅️ Go back to main README](../README.md) - -> ℹ️ **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 is supposed to run from IPv4 DHCP server as lease script. On a -DHCP lease it runs each script containing the following line, where `##` is -a decimal number for ordering: - - # provides: dhcpv4-server-lease, order=## - -Currently it runs if available, in order: - -* [dhcp-to-dns](dhcp-to-dns.md) -* [collect-wireless-mac](collect-wireless-mac.md) -* [dhcp-lease-comment](dhcp-lease-comment.md) -* `hotspot-to-wpa-cleanup`, which is an optional cleanup script - of [hotspot-to-wpa](hotspot-to-wpa.md) - -Requirements and installation ------------------------------ - -Just install the script: - - $ScriptInstallUpdate dhcpv4-server-lease; - -... and add it as `lease-script` to your dhcp server: - - /ip/dhcp-server/set lease-script="dhcpv4-server-lease" [ find ]; - -See also --------- - -* [Collect MAC addresses in wireless access list](collect-wireless-mac.md) -* [Comment DHCP leases with info from access list](dhcp-lease-comment.md) -* [Create DNS records for DHCP leases](dhcp-to-dns.md) -* [Use WPA network with hotspot credentials](hotspot-to-wpa.md) - ---- -[⬅️ Go back to main README](../README.md) -[⬆️ Go back to top](#top) diff --git a/doc/dhcpv6-client-lease.md b/doc/dhcpv6-client-lease.md deleted file mode 100644 index dc79e560..00000000 --- a/doc/dhcpv6-client-lease.md +++ /dev/null @@ -1,64 +0,0 @@ -Run other scripts on IPv6 DHCP client lease -=========================================== - -[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) -[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) -[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.22-yellow?style=flat)](https://mikrotik.com/download/changelogs/) -[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) -[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) - -[⬅️ Go back to main README](../README.md) - -> ℹ️ **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 is supposed to run from IPv6 DHCP client as lease script. On a -DHCP leasse it runs each script containing the following line, where `##` is -a decimal number for ordering: - - # provides: dhcpv6-client-lease, order=## - -The lease script is started with some variables injected, but these are not -available in child scripts. However this script makes these variables -available with a global variable. This code is required in child script: - - :global EitherOr; - - :global DHCPv6ClientLeaseVars; - - :local NaAddress [ $EitherOr $"na-address" ($DHCPv6ClientLeaseVars->"na-address") ]; - :local NaValid [ $EitherOr $"na-valid" ($DHCPv6ClientLeaseVars->"na-valid") ]; - :local PdPrefix [ $EitherOr $"pd-prefix" ($DHCPv6ClientLeaseVars->"pd-prefix") ]; - :local PdValid [ $EitherOr $"pd-valid" ($DHCPv6ClientLeaseVars->"pd-valid") ]; - -The values are available under different name then, use `$PdPrefix` instead -of `$"pd-prefix"`, and so on. The resulting script supports both, being a -lease script itself or being run as child. - -Currently it runs if available, in order: - -* [ipv6-update](ipv6-update.md) - -Requirements and installation ------------------------------ - -Just install the script: - - $ScriptInstallUpdate dhcpv6-client-lease; - -... and add it as `lease-script` to your dhcp client: - - /ipv6/dhcp-client/set lease-script="dhcpv6-client-lease" [ find ]; - -See also --------- - -* [Update configuration on IPv6 prefix change](ipv6-update.md) - ---- -[⬅️ Go back to main README](../README.md) -[⬆️ Go back to top](#top) diff --git a/doc/hotspot-to-wpa.md b/doc/hotspot-to-wpa.md index e5a47839..5187671b 100644 --- a/doc/hotspot-to-wpa.md +++ b/doc/hotspot-to-wpa.md @@ -49,24 +49,24 @@ and add a scheduler. For `wifi`: - $ScriptInstallUpdate hotspot-to-wpa-cleanup.wifi,dhcpv4-server-lease; - /system/scheduler/add interval=1d name="hotspot-to-wpa-cleanup" on-event="/system/script/run hotspot-to-wpa-cleanup.wifi;" start-time=startup; + $ScriptInstallUpdate hotspot-to-wpa-cleanup.wifi,lease-script; + /system/scheduler/add interval=1d name=hotspot-to-wpa-cleanup on-event="/system/script/run hotspot-to-wpa-cleanup.wifi;" start-time=startup; For legacy CAPsMAN: - $ScriptInstallUpdate hotspot-to-wpa-cleanup.capsman,dhcpv4-server-lease; - /system/scheduler/add interval=1d name="hotspot-to-wpa-cleanup" on-event="/system/script/run hotspot-to-wpa-cleanup.capsman;" start-time=startup; + $ScriptInstallUpdate hotspot-to-wpa-cleanup.capsman,lease-script; + /system/scheduler/add interval=1d name=hotspot-to-wpa-cleanup on-event="/system/script/run hotspot-to-wpa-cleanup.capsman;" start-time=startup; And add the lease script and matcher comment to your wpa interfaces' dhcp server. You can add more information to the comment, separated by comma. In this example the server is called `hotspot-to-wpa`. - /ip/dhcp-server/set lease-script="dhcpv4-server-lease" comment="hotspot-to-wpa=wpa" hotspot-to-wpa; + /ip/dhcp-server/set lease-script=lease-script comment="hotspot-to-wpa=wpa" hotspot-to-wpa; You can specify the timeout after which a device is removed from leases and access-list. The default is four weeks. - /ip/dhcp-server/set lease-script="dhcpv4-server-lease" comment="hotspot-to-wpa=wpa, timeout=2w" hotspot-to-wpa; + /ip/dhcp-server/set lease-script=lease-script comment="hotspot-to-wpa=wpa, timeout=2w" hotspot-to-wpa; Configuration ------------- @@ -117,7 +117,7 @@ passphrase from hotspot credentials. See also -------- -* [Run other scripts on IPv4 DHCP server lease](dhcpv4-server-lease.md) +* [Run other scripts on DHCP lease](lease-script.md) --- [⬅️ Go back to main README](../README.md) diff --git a/doc/ipv6-update.md b/doc/ipv6-update.md index a8d2c7e7..672b5fac 100644 --- a/doc/ipv6-update.md +++ b/doc/ipv6-update.md @@ -77,7 +77,6 @@ start with "`ipv6-pool-`" and actual pool name, followed by a comma, See also -------- -* [Run other scripts on IPv6 DHCP client lease](dhcpv6-client-lease.md) * [Run scripts on ppp connection](ppp-on-up.md) --- diff --git a/doc/lease-script.md b/doc/lease-script.md index 3cba7045..f4241afa 100644 --- a/doc/lease-script.md +++ b/doc/lease-script.md @@ -1 +1,54 @@ -This script has been renamed. Please see [dhcpv4-server-lease](dhcpv4-server-lease.md). +Run other scripts on DHCP lease +=============================== + +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.22-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) + +[⬅️ Go back to main README](../README.md) + +> ℹ️ **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 is supposed to run from dhcp server as lease script. On a dhcp +lease it runs each script containing the following line, where `##` is a +decimal number for ordering: + + # provides: lease-script, order=## + +Currently it runs if available, in order: + +* [dhcp-to-dns](dhcp-to-dns.md) +* [collect-wireless-mac](collect-wireless-mac.md) +* [dhcp-lease-comment](dhcp-lease-comment.md) +* `hotspot-to-wpa-cleanup`, which is an optional cleanup script + of [hotspot-to-wpa](hotspot-to-wpa.md) + +Requirements and installation +----------------------------- + +Just install the script: + + $ScriptInstallUpdate lease-script; + +... and add it as `lease-script` to your dhcp server: + + /ip/dhcp-server/set lease-script=lease-script [ find ]; + +See also +-------- + +* [Collect MAC addresses in wireless access list](collect-wireless-mac.md) +* [Comment DHCP leases with info from access list](dhcp-lease-comment.md) +* [Create DNS records for DHCP leases](dhcp-to-dns.md) +* [Use WPA network with hotspot credentials](hotspot-to-wpa.md) + +--- +[⬅️ Go back to main README](../README.md) +[⬆️ Go back to top](#top) diff --git a/doc/ppp-on-up.md b/doc/ppp-on-up.md index e492eb1b..51c8bc96 100644 --- a/doc/ppp-on-up.md +++ b/doc/ppp-on-up.md @@ -36,7 +36,6 @@ Just install the script: See also -------- -* [Run other scripts on IPv6 DHCP client lease](dhcpv6-client-lease.md) * [Update configuration on IPv6 prefix change](ipv6-update.md) * [Update tunnelbroker configuration](update-tunnelbroker.md) diff --git a/global-functions.rsc b/global-functions.rsc index d7f1aa70..33d00562 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -15,7 +15,7 @@ # Git commit id & info, expected configuration version :global CommitId "unknown"; :global CommitInfo "unknown"; -:global ExpectedConfigVersion 141; +:global ExpectedConfigVersion 139; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 897d4f02..10b762fb 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2021-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=80 +# provides: lease-script, order=80 # requires RouterOS, version=7.22 # requires device-mode, hotspot # diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index e85093fa..749f47e6 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2021-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=80 +# provides: lease-script, order=80 # requires RouterOS, version=7.22 # requires device-mode, hotspot # diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 818a1f6d..eec7253b 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2021-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# provides: dhcpv4-server-lease, order=80 +# provides: lease-script, order=80 # requires RouterOS, version=7.22 # requires device-mode, hotspot # diff --git a/dhcpv6-client-lease.rsc b/ipv6-dhcp-client-script.rsc similarity index 80% rename from dhcpv6-client-lease.rsc rename to ipv6-dhcp-client-script.rsc index 3f79d63c..c1b2ede1 100644 --- a/dhcpv6-client-lease.rsc +++ b/ipv6-dhcp-client-script.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS -# RouterOS script: dhcpv6-client-lease +# RouterOS script: ipv6-dhcp-client-script # Copyright (c) 2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.22 # -# run scripts on IPv6 DHCP client lease -# https://rsc.eworm.de/doc/dhcpv6-client-lease.md +# TODO +# https://rsc.eworm.de/doc/ipv6-dhcp-client-script.md :onerror Err { :global GlobalConfigReady; :global GlobalFunctionsReady; @@ -19,7 +19,7 @@ :global ParseKeyValueStore; :global ScriptLock; - :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :if ([ $ScriptLock $ScriptName ] = false) do={ :exit; } @@ -29,16 +29,16 @@ :exit; } - :global DHCPv6ClientLeaseVars { + :global IPv6DHCPClientEnvVars { "na-address"=$"na-address"; "na-valid"=$"na-valid"; "pd-prefix"=$"pd-prefix"; "pd-valid"=$"pd-valid" }; :local RunOrder ({}); - :foreach Script in=[ /system/script/find where source~("\n# provides: dhcpv6-client-lease\\b") ] do={ + :foreach Script in=[ /system/script/find where source~("\n# provides: ipv6-dhcp-client-script\\b") ] do={ :local ScriptVal [ /system/script/get $Script ]; - :local Store [ $ParseKeyValueStore [ $Grep ($ScriptVal->"source") ("\23 provides: dhcpv6-client-lease, ") ] ]; + :local Store [ $ParseKeyValueStore [ $Grep ($ScriptVal->"source") ("\23 provides: ipv6-dhcp-client-script, ") ] ]; :set ($RunOrder->($Store->"order" . "-" . $ScriptVal->"name")) ($ScriptVal->"name"); } @@ -52,8 +52,8 @@ } } - :set DHCPv6ClientLeaseVars; + :set IPv6DHCPClientEnvVars; } do={ - :global DHCPv6ClientLeaseVars; :set DHCPv6ClientLeaseVars; + :global IPv6DHCPClientEnvVars; :set IPv6DHCPClientEnvVars; :global ExitOnError; $ExitOnError [ :jobname ] $Err; } diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 54c08179..8d7081f3 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.22 -# provides: dhcpv6-client-lease, order=40 +# provides: ipv6-dhcp-client-script, order=40 # # update firewall and dns settings on IPv6 prefix change # https://rsc.eworm.de/doc/ipv6-update.md @@ -20,12 +20,12 @@ :global ParseKeyValueStore; :global ScriptLock; - :global DHCPv6ClientLeaseVars; + :global IPv6DHCPClientEnvVars; - :local NaAddress [ $EitherOr $"na-address" ($DHCPv6ClientLeaseVars->"na-address") ]; - :local NaValid [ $EitherOr $"na-valid" ($DHCPv6ClientLeaseVars->"na-valid") ]; - :local PdPrefix [ $EitherOr $"pd-prefix" ($DHCPv6ClientLeaseVars->"pd-prefix") ]; - :local PdValid [ $EitherOr $"pd-valid" ($DHCPv6ClientLeaseVars->"pd-valid") ]; + :local NaAddress [ $EitherOr $"na-address" ($IPv6DHCPClientEnvVars->"na-address") ]; + :local NaValid [ $EitherOr $"na-valid" ($IPv6DHCPClientEnvVars->"na-valid") ]; + :local PdPrefix [ $EitherOr $"pd-prefix" ($IPv6DHCPClientEnvVars->"pd-prefix") ]; + :local PdValid [ $EitherOr $"pd-valid" ($IPv6DHCPClientEnvVars->"pd-valid") ]; :if ([ $ScriptLock $ScriptName ] = false) do={ :exit; diff --git a/lease-script.rsc b/lease-script.rsc index 2da00ca8..a30dcc2d 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -1,3 +1,61 @@ #!rsc by RouterOS +# RouterOS script: lease-script +# Copyright (c) 2013-2026 Christian Hesse +# https://rsc.eworm.de/COPYING.md # -# dummy for migration +# requires RouterOS, version=7.22 +# +# run scripts on DHCP lease +# https://rsc.eworm.de/doc/lease-script.md + +:onerror Err { + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; + :local ScriptName [ :jobname ]; + + :global Grep; + :global IfThenElse; + :global LogPrint; + :global ParseKeyValueStore; + :global ScriptLock; + + :if ([ :typeof $leaseActIP ] = "nothing" || \ + [ :typeof $leaseActMAC ] = "nothing" || \ + [ :typeof $leaseServerName ] = "nothing" || \ + [ :typeof $leaseBound ] = "nothing") do={ + $LogPrint error $ScriptName ("This script is supposed to run from ip dhcp-server."); + :exit; + } + + $LogPrint debug $ScriptName ("DHCP Server " . $leaseServerName . " " . [ $IfThenElse ($leaseBound = 0) \ + "de" "" ] . "assigned lease " . $leaseActIP . " to " . $leaseActMAC); + + :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :exit; + } + + :if ([ :len [ /system/script/job/find where script=$ScriptName ] ] > 1) do={ + $LogPrint debug $ScriptName ("More invocations are waiting, exiting early."); + :exit; + } + + :local RunOrder ({}); + :foreach Script in=[ /system/script/find where source~("\n# provides: lease-script\\b") ] do={ + :local ScriptVal [ /system/script/get $Script ]; + :local Store [ $ParseKeyValueStore [ $Grep ($ScriptVal->"source") ("\23 provides: lease-script, ") ] ]; + + :set ($RunOrder->($Store->"order" . "-" . $ScriptVal->"name")) ($ScriptVal->"name"); + } + + :foreach Order,Script in=$RunOrder do={ + :onerror Err { + $LogPrint debug $ScriptName ("Running script with order " . $Order . ": " . $Script); + /system/script/run $Script; + } do={ + $LogPrint warning $ScriptName ("Running script '" . $Script . "' failed: " . $Err); + } + } +} do={ + :global ExitOnError; $ExitOnError [ :jobname ] $Err; +} diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 109244ea..709e7744 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -64,17 +64,14 @@ 137="Added support to send notifications via Gotify (gotify.net)."; 138="RouterOS 7.19 is suffering an issue with certificate store. Fixing trust state for all certificates..."; 139="Certificate Authorities will reduce the leaf certificate validity times soon. Thus the defaults for renewal and warning in 'check-certificates' were decreased."; - 140="The scripts 'lease-script' was renamed to 'dhcpv4-server-lease', configuration was updated automatically."; - 141="Introduced script 'dhcpv6-client-lease' to run several scripts on IPv6 DHCP client lease."; }; # Migration steps to be applied on script updates :global GlobalConfigMigration { - 97=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; };"; - 100=":global ScriptInstallUpdate; :if ([ :len [ /system/script/find where name=\"ssh-keys-import\" source~\"^#!rsc by RouterOS\\r?\\n\" ] ] > 0) do={ /system/script/set name=\"mod/ssh-keys-import\" ssh-keys-import; \$ScriptInstallUpdate; };"; + 97=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; + 100=":global ScriptInstallUpdate; :if ([ :len [ /system/script/find where name=\"ssh-keys-import\" source~\"^#!rsc by RouterOS\\r?\\n\" ] ] > 0) do={ /system/script/set name=\"mod/ssh-keys-import\" ssh-keys-import; \$ScriptInstallUpdate; }"; 104=":global CharacterReplace; :global ScriptInstallUpdate; :foreach Script in={ \"capsman-download-packages\"; \"capsman-rolling-upgrade\"; \"hotspot-to-wpa\"; \"hotspot-to-wpa-cleanup\" } do={ /system/script/set name=(\$Script . \".capsman\") [ find where name=\$Script ]; :foreach Scheduler in=[ /system/scheduler/find where on-event~(\$Script . \"([^-.]|\\\$)\") ] do={ /system/scheduler/set \$Scheduler on-event=[ \$CharacterReplace [ get \$Scheduler on-event ] \$Script (\$Script . \".capsman\") ]; }; }; /ip/hotspot/user/profile/set on-login=\"hotspot-to-wpa.capsman\" [ find where on-login=\"hotspot-to-wpa\" ]; \$ScriptInstallUpdate;"; - 111=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; };"; - 132=":if ([ :len [ /system/script/find where name=\"check-health\" ] ] > 0) do={ :local Code \":local Install \\\"check-health\\\"; :if ([ :len [ /system/health/find where type=\\\"\\\" name~\\\"-state\\\\\\\$\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/state\\\"); }; :if ([ :len [ /system/health/find where type=\\\"C\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/temperature\\\"); }; :if ([ :len [ /system/health/find where type=\\\"V\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/voltage\\\"); }; :global ScriptInstallUpdate; \\\$ScriptInstallUpdate \\\$Install;\"; :global ValidateSyntax; :if ([ \$ValidateSyntax \$Code ] = true) do={ :do { [ :parse \$Code ]; } on-error={ }; }; };"; + 111=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; + 132=":if ([ :len [ /system/script/find where name=\"check-health\" ] ] > 0) do={ :local Code \":local Install \\\"check-health\\\"; :if ([ :len [ /system/health/find where type=\\\"\\\" name~\\\"-state\\\\\\\$\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/state\\\"); }; :if ([ :len [ /system/health/find where type=\\\"C\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/temperature\\\"); }; :if ([ :len [ /system/health/find where type=\\\"V\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/voltage\\\"); }; :global ScriptInstallUpdate; \\\$ScriptInstallUpdate \\\$Install;\"; :global ValidateSyntax; :if ([ \$ValidateSyntax \$Code ] = true) do={ :do { [ :parse \$Code ]; } on-error={ }; }; }"; 138="/certificate/set trusted=yes [ find where trusted=yes ];"; - 140=":if ([ :len [ /system/script/find where name=\"lease-script\" ] ] > 0) do={ /system/script/set name=\"dhcpv4-server-lease\" \"lease-script\"; :global ScriptInstallUpdate; \$ScriptInstallUpdate; /ip/dhcp-server/set lease-script=\"dhcpv4-server-lease\" [ find where lease-script=\"lease-script\" ]; };"; };