Usermanager is MikroTik’s version of radius and is a great way to centralize AAA on your network. In addition, it also has facility to allow users to buy credits on your network through hotspot, however, the only limitation it can automatically create is a time limitation. You can create packages that allow access for a day, week, month, etc., but in order to set a rate limit for that customer and their package, you have to manually make that change to the user in Usermanager.
I needed a way to automatically accomplish this so I enlisted the help of my script guru, Andrew Cox. Although I have never met Andrew in person, I can tell you he is a bright guy who is one of the few people I know that truly speaks MikroTik’s scripting language. As usual, Andrew rose to the challenge and wrote a few lines of code that function perfectly.
A few notes, first the script uses the user property “credit-price” to determine which package the customer purchased, therefore, you need to have unique prices for each rate limit. For example, if the Gold package is 128k/64k and costs $25, then users that buy the 64k/64k package that costs $25 will get the same rate limit. In this example, just change the price slightly on one of the packages and it will work correctly. For example, make the 128k/64k package $19.95 or something similar.
So, here is the code, past it into a new script item through Winbox, set the scheduler to run it once every minute or so and you will enjoy the benefits of automatic rate limits with self created user accounts.
— Script—
#Script to add rate limit’s to newly created user-manager accounts.
#Written by Andrew Cox | https://www.mikrotik-routeros.com
:local counter
:local check
#Loop through all users in user-manager
:foreach counter in=[/tool user-manager user find] do={
#Check to see if comment contains “RLA” (short for ‘rate limit added’). If it doesn’t, this account hasn’t had a rate limit set yet.
#We only check the first 3 characters, this means you can continue to use the comment field for whatever you like so long as you leave the ‘RLA’ untouched (if present)
:set check [:pick [/tool user-manager user get $counter value=comment] 0 3]
:if ($check=”RLA”) do={
#Has RLA, rate limit is already set so ignore
} else={
#Doesn’t have RLA Set rate-limit based on initial purchase pricing
:if ([/tool user-manager user get $counter credit-price] =”1000″) do={/tool user-manager user set $counter rate-limit=”256k/128k” comment=”RLA”}
:if ([/tool user-manager user get $counter credit-price] =”2500″) do={/tool user-manager user set $counter rate-limit=”256k/128k” comment=”RLA”}
:if ([/tool user-manager user get $counter credit-price] =”4500″) do={/tool user-manager user set $counter rate-limit=”96k/48k” comment=”RLA”}
:if ([/tool user-manager user get $counter credit-price] =”6000″) do={/tool user-manager user set $counter rate-limit=”128k/64k” comment=”RLA”}
:if ([/tool user-manager user get $counter credit-price] =”7500″) do={/tool user-manager user set $counter rate-limit=”256k/128k” comment=”RLA”}
}
}
— End of Script—