Add my DNS to IPv6 Subnet resolver to my custom scripts repo
This commit is contained in:
parent
9d98352e65
commit
7a8adad529
2 changed files with 172 additions and 0 deletions
78
dns-to-ipv6-subnet-resolver.rsc
Normal file
78
dns-to-ipv6-subnet-resolver.rsc
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
# -------------------------------------------------------------------------------
|
||||
# Script to grab IPv6 Addresses from DNS an converting them to subnets
|
||||
#
|
||||
# by Philip 'ShokiNN' Henning <mail@philip-henning.com>
|
||||
# RouterOS compatibility: 7+
|
||||
# Version 1.1
|
||||
# last update: 03.01.2026
|
||||
# https://git.s1q.dev/phg/routeros-scripts-custom/about/doc/dns-to-ipv6-subnet-resolver.md
|
||||
# -------------------------------------------------------------------------------
|
||||
|
||||
:local ExitOK false;
|
||||
onerror Err {
|
||||
:global GlobalConfigReady; :global GlobalFunctionsReady; :global GlobalFunctionsCustomPhgReady;
|
||||
:retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true || $GlobalFunctionsCustomPhgReady != true) \
|
||||
do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50;
|
||||
:local ScriptName [ :jobname ];
|
||||
|
||||
:global LogPrint;
|
||||
:global ParseKeyValueStore;
|
||||
:global ScriptLock;
|
||||
:global SafeResolve;
|
||||
:global PhgDomainToIpv6Subnet;
|
||||
:global PhgIpv6AddressList;
|
||||
:global PhgIpv6AddressListCommentPrefix;
|
||||
|
||||
:if ([ $ScriptLock $ScriptName ] = false) do={
|
||||
:set ExitOK true;
|
||||
:error false;
|
||||
}
|
||||
|
||||
:if ([:typeof $PhgDomainToIpv6Subnet ] != "array" || ([:len $PhgDomainToIpv6Subnet ] = 0)) do={
|
||||
$LogPrint error $ScriptName ("Variable 'PhgDomainToIpv6Subnet' is not set or not of type 'array'. Please set it to an array of domain/subnet-length/comment tuples.");
|
||||
:error true;
|
||||
}
|
||||
|
||||
:if ([:typeof $PhgIpv6AddressList ] != "str" || $PhgIpv6AddressList = "") do={
|
||||
$LogPrint error $ScriptName ("Variable 'PhgIpv6AddressList' is not set or not of type 'string'. Please set it to the name of the IPv6 address list to use.");
|
||||
:error true;
|
||||
}
|
||||
|
||||
# Log "run of script"
|
||||
$LogPrint info $ScriptName ("running");
|
||||
|
||||
:local index 0;
|
||||
:foreach i in=$PhgDomainToIpv6Subnet do={
|
||||
onerror SubnetErr {
|
||||
:local configDomain ("$($i->0)");
|
||||
:local configSubnetLength ("$($i->1)");
|
||||
:local configComment "";
|
||||
if ([:typeof $PhgIpv6AddressListCommentPrefix ] != "str" || $PhgIpv6AddressListCommentPrefix = "") do={
|
||||
:set configComment ("$($i->2)");
|
||||
} else={
|
||||
:set configComment ("$PhgIpv6AddressListCommentPrefix" . " " . "$($i->2)");
|
||||
}
|
||||
:local dnsIp "";
|
||||
|
||||
$LogPrint info $ScriptName ("Start configuring domain: $configDomain");
|
||||
/ipv6/firewall/address-list/remove [/ipv6/firewall/address-list/find list="$PhgIpv6AddressList" comment="$configComment"];
|
||||
|
||||
:set dnsIp [$SafeResolve $configDomain ipv6];
|
||||
:if ($dnsIp != false) do={
|
||||
/ipv6/firewall/address-list/add list="$PhgIpv6AddressList" address="$dnsIp/$configSubnetLength" comment="$configComment";
|
||||
:local addedSubnet [:pick [/ipv6/firewall/address-list/get [/ipv6/firewall/address-list/find list="$PhgIpv6AddressList" comment="$configComment"]] 1];
|
||||
$LogPrint info $ScriptName ("domain: $configDomain - Set to: $addedSubnet");
|
||||
}
|
||||
|
||||
$LogPrint info $ScriptName ("Finished configuring domain: $configDomain");
|
||||
} do={
|
||||
#TODO Send error via Notification system
|
||||
$LogPrint error $ScriptName ("Error processing entry index $index: $i - $SubnetErr");
|
||||
}
|
||||
};
|
||||
:set index;
|
||||
|
||||
$LogPrint info $ScriptName ("finished");
|
||||
} do={
|
||||
:global ExitError; $ExitError $ExitOK [ :jobname ] $Err;
|
||||
}
|
||||
94
doc/dns-to-ipv6-subnet-resolver.md
Normal file
94
doc/dns-to-ipv6-subnet-resolver.md
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
# DNS to IPv6 subnet resolver
|
||||
|
||||
[⬅️ 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.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [DNS to IPv6 subnet resolver](#dns-to-ipv6-subnet-resolver)
|
||||
- [Table of Contents](#table-of-contents)
|
||||
- [Description](#description)
|
||||
- [Requirements and installation](#requirements-and-installation)
|
||||
- [Configuration](#configuration)
|
||||
- [`PhgIpv6AddressList`](#phgipv6addresslist)
|
||||
- [`PhgDomainToIpv6Subnet`](#phgdomaintoipv6subnet)
|
||||
- [`PhgIpv6AddressListCommentPrefix`](#phgipv6addresslistcommentprefix)
|
||||
- [Usage and invocation](#usage-and-invocation)
|
||||
|
||||
## Description
|
||||
|
||||
This script resolved IPv6 addresses from a domain and calculates the Subnet from the configured subnet length.
|
||||
|
||||
## Requirements and installation
|
||||
|
||||
Just install the script:
|
||||
|
||||
```rsc
|
||||
$ScriptInstallUpdate dns-to-ipv6-subnet-resolver "base-url=https://git.s1q.dev/phg/routeros-scripts-custom/raw/branch/main/";
|
||||
/system/script/set [find name="dns-to-ipv6-subnet-resolver"] policy=read,write,test
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
Edit `global-config-overlay` and Add the following variables.
|
||||
|
||||
| Variable name | Required | Data type | Example | Description |
|
||||
| :-------------------------------- | :------- | :-------- | :---------------------------------- | :--------------------------------------------------------------------------- |
|
||||
| `PhgIpv6AddressList` | true | String | `resolved_ipv6_subnets` | IPv6 address list (address list which will contain the resolved subnets) |
|
||||
| `PhgDomainToIpv6Subnet` | true | tuple | `{"example.com";64;"example.com"};` | Object containing a domain, a prefix length and a comment for the List entry |
|
||||
| `PhgIpv6AddressListCommentPrefix` | false | String | `Resolved subnet for` | If set, prefixes the comment for the address list |
|
||||
|
||||
### `PhgIpv6AddressList`
|
||||
|
||||
Example:
|
||||
|
||||
```rsc
|
||||
:global PhgIpv6AddressList "resolved_ipv6_subnets";
|
||||
```
|
||||
|
||||
### `PhgDomainToIpv6Subnet`
|
||||
|
||||
Example:
|
||||
|
||||
```rsc
|
||||
:global PhgDomainToIpv6Subnet {
|
||||
{"example.com";64;"example.com"};
|
||||
{"example.net";56;"example.net - Home IP of John Doe"};
|
||||
};
|
||||
```
|
||||
|
||||
`PhgDomainToIpv6Subnet` tuple variables:
|
||||
|
||||
| Object variable | Data type | Example | Description |
|
||||
| :-------------- | :-------- | :-------------- | :------------------------------------------------------------------------------------ |
|
||||
| Domain | String | `"example.com"` | The domain which the IPv6 address should be resolved |
|
||||
| Prefix length | Integer | `64` | The prefix length for the resolved IPv6 address. Used to calculate the subnet address |
|
||||
| Comment | String | `"example.com"` | Comment for the list entry |
|
||||
|
||||
### `PhgIpv6AddressListCommentPrefix`
|
||||
|
||||
Example:
|
||||
|
||||
```rsc
|
||||
:global PhgIpv6AddressListCommentPrefix "Resolved subnet for";
|
||||
```
|
||||
|
||||
## Usage and invocation
|
||||
|
||||
How to run the script manually:
|
||||
|
||||
```rsc
|
||||
/system/script/run dns-to-ipv6-subnet-resolver;
|
||||
```
|
||||
|
||||
Setup a Scheduler to run the script regularly:
|
||||
|
||||
```rsc
|
||||
/system/scheduler/add name="dns-to-ipv6-subnet-resolver" interval="00:05:00" policy="read,write,test" on-event="/system/script/run dns-to-ipv6-subnet-resolver;";
|
||||
```
|
||||
|
||||
---
|
||||
[⬅️ Go back to main README](../README.md)
|
||||
[⬆️ Go back to top](#top)
|
||||
Loading…
Add table
Add a link
Reference in a new issue