Using scripting to overcome the inability to specify number ranges on the command line

From MikroTik Wiki
Revision as of 11:24, 8 March 2011 by Mattx86 (talk | contribs) (Created page with 'Admittedly, I (mattx86) have not really bothered to request that number ranges be allowed on the command line for operations such as disable, remove, etc., and as we don't yet ha…')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Admittedly, I (mattx86) have not really bothered to request that number ranges be allowed on the command line for operations such as disable, remove, etc., and as we don't yet have it available as of RouterOS version 5.0rc11, I have devised a method in order to do so.

What am I talking about?

Say we have the following list: (The extra addresses were created for demonstration purposes.)

[admin@MikroTik] > /ip address print
Flags: X - disabled, I - invalid, D - dynamic
 #   ADDRESS            NETWORK         INTERFACE
 0   192.168.1.1/24     192.168.1.0     lan-bridge
 1   192.168.3.2/30     192.168.3.0     fast-ipip
 2 D xxx.xxx.xxx.xxx     xxx.xxx.xxx.xxx    dsl-pppoe
 3   192.168.1.24/32    192.168.1.24    lan-bridge
 4   192.168.1.25/32    192.168.1.25    lan-bridge
 5   192.168.1.26/32    192.168.1.26    lan-bridge
 6   192.168.1.27/32    192.168.1.27    lan-bridge

Now let's say that want to disable numbers 3-6. Rather than doing:

/ip address disable 3,4,5,6

Suppose you wanted to specify a range, such as:

/ip address disable 3-6

Guess what? It won't work (at least at the time of this writing). Yes, I realize it's not a big deal to simply specify "3,4,5,6" in this case, but if you have a bigger list?

Well, thankfully(?), I've devised a method that works:

Compact Version:

:local from 3;:local to 6;:local i 0;:foreach id in=[/ip address find] do={:if ($i >= $from && $i <= $to) do={/ip address disable $id}; :set i ($i+1)}

Expanded Version:

:local from 3  #update this
:local to 6      #update this
:local i 0         #set to zero because my list starts at zero
:foreach id in=[/ip address find] do={
	:if ($i >= $from && $i <= $to) do={
		/ip address disable $id
	}
	:set i ($i+1)
}

Just change the from and to variables, replace "/ip address" in the foreach line to whatever list it is you're dealing with and change the command in the if block to whatever you need to do. (You can even use the set operation, e.g.: /ip address set $id disabled=yes)