Community discussions

 
Yogo
just joined
Topic Author
Posts: 23
Joined: Fri Oct 18, 2013 12:58 pm
Location: Sydney, Australia

Interface Data Quota

Wed Jul 30, 2014 11:42 am

Hi All,

Was wondering if it possible to set up a quota for an outbound interface?

The situation:

Basically I have two connections set up in failover.. One is hardwired, the other is a 4G connection as backup.
The 4G connection has an 8GB/month ISP quota (additional data is charged per MB), and I really don't want to exceed it.
I want to set up an outbound interface quota and shaping on the 4G interface, where at 6GB it starts shaping traffic, and at 7.8GB (allowing for usage discrepancies) to deny traffic.
Then I need the quota to reset at the start of each month

Is this possible? Would I do it via queues? Scripting? I'm a bit lost...

Hardwired interface is named "LAN" via ethernet
4G Backup interface is named "BigPondBackup" via USB

let me know if you want any more info and I appreciate the help.. I'm still learning..
Thank you for any help provided!
 
User avatar
cdiedrich
Forum Veteran
Forum Veteran
Posts: 896
Joined: Thu Feb 13, 2014 2:03 pm
Location: Basel, Switzerland // Bremen, Germany
Contact:

Re: Interface Data Quota

Wed Jul 30, 2014 6:20 pm

I am facing exactly this situation in the implementation of a dual-WAN config for a client of mine.

Since I never ever needed queues I went the scripting way, the outcome of which I like to share with you.
What you see is my initial very basic script, I'm sure there's much to improve, but I think it's pretty good for the start.
Some snipplets of this script are taken from other posts here in the forum and altered to my needs.

The first script is scheduled to run every 5 minutes. It collects the traffic of lte1 (sums up tx and rx bytes) and writes this to a file.
I prefer the file method over a global variable because it survives system reboots or interface losses.
As you can see it checks whether the actual data makes sense in context of the data read from the file. If current traffic on the interface is smaller, it gets added to the file content:

ros code

:local counter [/interface get lte1 rx-bytes]
:set $counter ($counter + [/interface get lte1 tx-bytes])
:local traffic
:if ([:len [/file find where name=counter.txt]] < 1 ) do={
/file print file=counter.txt where name=counter.txt;
/delay delay-time=2;
/file set counter.txt contents="0";
};
:local before value=[/file get counter.txt contents]

:if ($counter > $before) do={
/file set counter.txt contents=$counter
} else= {
:set $traffic ($counter+$before)
/file set counter.txt contents=$traffic
};
The second script is run every 15 minutes which checks the traffic usage and issues a warning email at 80% and triggers the stoplte script at 100%:

ros code

:local traffic ([/file get traffic.txt contents] / 1000 / 1000 / 1000)
#set the LTE quota in GB
:local limit 30
:local percent ($traffic*100 / $limit)

:if ([:len [/file find where name=warning.txt]] < 1 ) do={
/file print file=warning.txt where name=warning.txt;
/delay delay-time=2;
/file set warning.txt contents=$percent;

:if ($percent < 50) do={
#any action you like - maybe you want to issue daily reports, warnings at 50% or whatsoever
}

} else={
     :if ($percent < 79) do={
        /file set warning.txt contents=$percent;
                                :log info "Traffic at $percent%"
     } else={
        :if (($percent >=80) && ($traffic <$limit)) do={
                                  :if ([/file get warning.txt contents] <> "99") do={
                      /tool e-mail send to=<youremailaddress> subject="Traffic warning: $percent% reached at $[/system clock get date], $[/system clock get time]" body="The actual traffic amount is $traffic GB \r\nThis is $percent% of the monthly limit\r\n\"
          /file set warning.txt contents="99"
                      :log warning "Warning message sent at $percent%"};
        } else={
            :if ($percent >= 100) do={
                /system script run stoplte
                                } 
        }
    }
}
The stoplte script disables the interface and all related NAT-rules as well as the default route to lte1.
Then automatically the DSL backup kicks in since it still has an active default route (but with a higher distance).

Then I finally have another script, ran daily at midnight which checks if it's the first of the month and then enables lte1 and all rules/routes, resets the counters and warnings.

Hope that helps a little,
-Chris
Christopher Diedrich
MTCNA, MTCUME, MTCWE
Basel, Switzerland
Bremen, Germany

There are 10 types of people: Those who understand binary and those who don't.
There are two types of people: Those who can extrapolate from incomplete data
 
Yogo
just joined
Topic Author
Posts: 23
Joined: Fri Oct 18, 2013 12:58 pm
Location: Sydney, Australia

Re: Interface Data Quota

Thu Jul 31, 2014 12:22 am

OMG wow!

Thanks Chris, you've saved my wallet!

Now time to test..
Thank you for any help provided!
 
User avatar
cdiedrich
Forum Veteran
Forum Veteran
Posts: 896
Joined: Thu Feb 13, 2014 2:03 pm
Location: Basel, Switzerland // Bremen, Germany
Contact:

Re: Interface Data Quota

Thu Jul 31, 2014 8:40 am

Glad to hear this helps.
In case you modify the script and add new "features" I'd be very interested.

Cheers
-Chris ...and thanks for the Karma
Christopher Diedrich
MTCNA, MTCUME, MTCWE
Basel, Switzerland
Bremen, Germany

There are 10 types of people: Those who understand binary and those who don't.
There are two types of people: Those who can extrapolate from incomplete data
 
gniers
just joined
Posts: 9
Joined: Fri Nov 15, 2013 3:37 pm

Re: Interface Data Quota

Thu Nov 12, 2015 10:43 am

Great posting,

I try to build this script on a RB912UAG-2HPnD witth ROS 6.25 and a sierra board as LTE interface.

Unfortunatly i'm not getting any usage data with ; [/interface get lte1 rx-bytes
This works on a normal ether1 interface not on an LTE

Any suggestion how to get rx-bytes tx-bytes in a script from the LTE interface ??

Thanks !
 
maikel
just joined
Posts: 8
Joined: Thu Jun 08, 2017 2:53 pm

Re: Interface Data Quota

Fri Jun 16, 2017 8:37 pm

Dear Chris,

First of all I would like to thank you, your script is the first introduction for me with RouterOS (6.38.5) and the language C
Your script was not directly usable at first because of many updates of ROS but helped me tremendously, thanks again for that.
I would like to share the script that I build the last couple of days, I tested it on my router (hEX routerboard);
<as this is firstly commercially sold I removed the information, I will add it later>
 
luidoltp
newbie
Posts: 31
Joined: Mon Feb 22, 2016 6:27 am
Location: Graz, Austria

Re: Interface Data Quota

Fri Dec 22, 2017 8:20 am

Dear Maikel,

<as this is firstly commercially sold I removed the information, I will add it later>
Can you already share your script. I would highly appreciate it!

Thanks & best regards,
Peter
 
chrisjc
just joined
Posts: 11
Joined: Wed Sep 30, 2015 12:28 pm

Re: Interface Data Quota

Mon Feb 12, 2018 1:11 pm

Hi maikel,

I would also be very interested in your new and improved script if you're willing!

Thanks,

Chris
 
maikel
just joined
Posts: 8
Joined: Thu Jun 08, 2017 2:53 pm

Re: Interface Data Quota

Tue Feb 13, 2018 9:47 am

Dear Maikel,

<as this is firstly commercially sold I removed the information, I will add it later>
Can you already share your script. I would highly appreciate it!

Thanks & best regards,
Peter
Hi maikel,

I would also be very interested in your new and improved script if you're willing!

Thanks,

Chris
Dear Peter and Chris,
In the end we never really implemented this scripts, but if I'm remembering correctly it should be working. If you would like to know which specifik routerBoard I was programming this for, please ask me.
The scripts are a buch of different ones, one main scripts is executing the other ones;
mainscript freedata-mikrotik.c reads data from interfaces and writes them to files
#This first script is scheduled to run every 5 minutes. It collects the traffic of lte1 (sums up tx and rx bytes)
#and writes different data to multiple files. Kudos to Christopher Diedrich: https://forum.mikrotik.com/viewtopic.php?t=87565#
#Creator: Maikel Egberink Robacomm.nl
#The following crontab rule is essential for the correct execution of this script:
#
#Please crontab as follow:   */5 * * * *   which lets cron starts this script every 5 min, e.g. 21:40,21:45,21:50,21:55
#
#Get newest tx- and rx-data from interface and put in var $newdata
:local interf "ether2"
:global newdata
:global tx [/interface get $interf tx-byte] 
:put "tx: $tx"
:global rx [/interface get $interf rx-byte] 
:put "rx: $rx"
:set $newdata ( $rx + $tx )
:put "Newdata value: $newdata"
#
#Check if freedata is applicable
:local curtime [/system clock get time]
:put "Current time value: $curtime"
#Example: freedata is from 0:00:00 until 6:00:00 (when changing times please change if-then's too
:local startfreedata 0:00:00
:local beforestartfreedata 23:59:59
:local stopfreedata 6:00:00
:local freedata
#Between freedata-times count freedata
:if ( $curtime >= $startfreedata && $curtime <= $stopfreedata ) do={
	:set $freedata true
	:put "Freedata applicable"
};
#Later than (latest) freedata-times count no freedata. Cannot look before 0:00:00, so always later than 0:00:00
:if ( $curtime > $stopfreedata && $curtime < $beforestartfreedata ) do={
	:set $freedata false
	:put "Freedata NOT applicable"
};
:put "Freedata is set to: $freedata"
#
#Check if files are already created;
:local fileref "refcount.txt"
:local filename "counter.txt"
:local filefree "freecount.txt"
#Check if file refcount.txt not exists, then do (1=exist, 0=not exist)
:if ([:len [/file find where name=$fileref]] < 1 ) do={
	#Create new file
	/file print file=$fileref where name=$fileref;
	#Wait 2 sec
	/delay delay-time=2;
	#Put value 0 in file contents
	/file set $fileref contents=0;
	:put "New file $fileref is created with content 0"
};
#Check if file counter.txt not exists, then do (1=exist, 0=not exist)
:if ([:len [/file find where name=$filename]] < 1 ) do={
	#Create new file
	/file print file=$filename where name=$filename;
	#Wait 2 sec
	/delay delay-time=2;
	#Put value 0 in file contents
	/file set $filename contents=0;
	:put "New file $filename is created with content 0"
}

#Check if file freecount.txt not exists, then do (1=exist, 0=not exist)
:if ([:len [/file find where name=$filefree]] < 1 ) do={
	#Create new file
	/file print file=$filefree where name=$filefree;
	#Wait 2 sec
	/delay delay-time=2;
	#Put value 0 in file contents
	/file set $filefree contents=0;
	:put "New file $filefree is created with content 0"
};
#
:local ref
#Reference file stores the $newdata value on 1st of the month at 0:00 after script 'resetfiles-mikrotik-x.x' ran 
#If there is no value (0) in refcount.txt then put contents to file from var newdata 
#If there is a value in refcount.txt then read it and put it in var ref
:set $ref [/file get $fileref contents]
:put "Reference value from $fileref: $ref"
:if ( $ref = 0 ) do={
	#Write var $newdata to file
	/file set $fileref contents=$newdata
	#Wait 2 sec
	/delay delay-time=2;
	:put "Reference data $newdata put in $fileref"
	:log info "Freedatascripts: Reference data $newdata put in $fileref"
};
#
#When freedata is applicable then count bytes during freedata (not total interface bytes) and write it to freecount.txt.
:local before
:local correct
:local free
#
#Freedata is applicable; write bytes to freecount.txt
#Check if freedata; >0:00 and < 6:00 do
:if ( $freedata = true ) do={
	#:put "if freecount true do"	
	#Read freecount.txt (last freedata)
	:set $free [/file get $filefree contents]
	:put "Previous Free value from $filefree: $free"
	#When newdata is lower than before (e.g. when interface reset) do
	:if ( $newdata < $free ) do={
		#:put "freedata true if newdata < before do"  
		#Correct reference file when counters did reset (to prevent reset value, this way we remember 'old' bytes)
		/file set $fileref contents=$newdata	
		#correct value written to freecount.txt (we suppose that 5 min before also was freedata)
		:set $correct ( $free + $newdata )
		#Write corrected value to freecount.txt
		/file set $filefree contents=$correct
		:put "Writen $correct to $filefree"
	} else={
		#:put "freedata true else newdata < before  do"
	:if ( $newdata >= $free ) do={
		#:put "freedata true if newdata >= before do"  
		#Read reference data and set freedata
		:set $ref [/file get $fileref contents]
		#The var $newdata is now only the actual bytes used from 01-mm-yyyy 0:00:00
		:set $newdata ( $newdata - $ref )
		:put "Variable newdata is now set to new value: $newdata"
		#Newest data from interface - content of counter.txt + contents of freecount.txt
		:set $free ( $newdata - $free )
		#Write updated data to freecount.txt
		/file set $filefree contents=$free
		:put "Written $free to $filefree"
		};
	};
};  
#
#Freedata is not applicable; write bytes to counter.txt
#Check if not freedata; > 6:00 and <23:59 do
:if ( $freedata = false ) do={
	#:put "if freedata false" 	
	#Read contents from file counter.txt (no freetime) and puts it in var $before
	:set $before [/file get $filename contents]
	:put "Previous Before value from $filename: $before"
	#When newdata is lower than before (e.g. when interface reset) do  
	:if ( $newdata < $before ) do={
		#:put "freedata false if newdata < before do"	  
		#Correct reference file
		/file set $fileref contents=$newdata
		#correct value written to counter.txt (to prevent reset value, this way we remember 'old' bytes)
		:set $correct ( $before + $newdata )
		#Write corrected value to counter.txt
		/file set $filename contents=$correct
		:put "Written $correct to $filename"
	} else={
	:if ( $newdata >= $before ) do={ 
		#:put "freedata false if newdata >= before do"
		#Read reference data and set counterdata
		:set $ref [/file get $fileref contents]
		#The var $newdata is now only the actual bytes used from 01-mm-yyyy 0:00:00
		:set $newdata ( $newdata - $ref )
		:put "Variable newdata is now set to new value: $newdata"
		#Write newdata value to counter.txt
		:set $correct ( $newdata - $free )
		/file set $filename contents=$correct
		:put "Written $newdata to $filename"
		}; 
	}; 
};
warning-mikrotik.c checks traffic usage
#This second script is scheduled to run every 15 minutes. It checks the traffic usage and issues a warning email at 80% 
#and triggers the stoplte script at 100%. Kudos to Christopher Diedrich: https://forum.mikrotik.com/viewtopic.php?t=87565#
#Creator: Maikel Egberink Robacomm.nl
#The following crontab rule is essential for the correct execution of this script:
#
#Please crontab as follow:   */15 * * * *   which lets cron starts this script every 15 min, e.g. 21:30,21:45,22:00,22:15
#
#Wait for script one; freedata-mikrotik0.2  for 5 seconds
:local interf "ether2"
:put "Wait for 5 seconds to finish first script"
/delay delay-time=5
:local filecount "counter.txt"
:local filewarn "warning.txt"
:local traffic ([/file get $filecount contents] / 1024 / 1024 / 1024)
:put "Registered amount of data is now: $traffic GB"
#Set the interface quota in GB;
:local limit 100
:put "Quota is set to: $limit GB"
#Calculate percents
:local percent ($traffic*100 / $limit)
:put "$percent % is now reached until set quota of $limit GB"
#
#Check if file is already created. Check if file warning.txt not exists, then do (1=exist, 0=not exist)
:if ([:len [/file find where name=$filewarn]] < 1 ) do={
	/file print file=$filewarn where name=$filewarn
	/delay delay-time=2
	/file set $filewarn contents=$percent
};
#Write precentage to file
/file set $filewarn contents=$percent
#
#Select action according to percentage reached until quota
:if ($percent < 50) do={
	#any action you like - maybe you want to issue daily reports, warnings at 50% or whatsoever
	:log info "Traffic on $interf at $percent %"
	:log info "Freedatascripts: Traffic on $interf at $percent%"
	/tool e-mail send to=maikel@robacomm.nl subject="Traffic warning: $percent% reached at $[/system clock get date], $[/system clock get time]" body="The actual traffic amount is $traffic GB \r\nThis is $percent% of the monthly limit of $limit GB\r\nThis email is automatically generated by Freedatascript on mikrotik router at CarpeDiem, please do not reply\r\n\"
} else={
     :if ($percent < 79) do={
		#Write percentage to file
        :set $percent [/file get $filewarn contents]
		:put "Traffic on $interf at $percent % (less than 79%)"
        #:log info "Freedatascripts: Traffic on $interf at $percent%"
     } else={
        :if (($percent >=80) && ($traffic < $limit)) do={
			#Send email one time when percentage is over 80% and traffic is not reached quota yet
			:if ([/file get $filewarn contents] <> 99) do={
				#/tool e-mail send to=<youremailaddress> subject="Traffic warning: $percent% reached at $[/system clock get date], $[/system clock get time]" body="The actual traffic amount is $traffic GB \r\nThis is $percent% of the monthly limit\r\n\"
				/file set $filewarn contents=99
				:put "Traffic on $interf at $percent % (80% and over) -99 in file and email sent-"
				:log warning "Freedatascripts: Warning message sent for $interf at $percent%"
				}
		} else={
			:if ($percent >= 100) do={
				/file set $filewarn contents=$percent
				:put "Traffic at $percent % (100% or over) -stop interface-"
				/system script run stoplte
				};
		};
	};
};
reset-files-mikrotik.c resets all counter files every first of the month
#This script ran daily at midnight which checks if it's the first of the month and then enables lte1 (and all rules/routes)
#and resets the counters and warnings. Kudos to Christopher Diedrich: https://forum.mikrotik.com/viewtopic.php?t=87565#
#Creator: Maikel Egberink Robacomm.nl
#The following crontab rule is essential for the correct execution of this script:
#
#Please crontab as follow:   0 0 * 1 *   which lets cron starts this script every 1st of every month
#
:local interf "ether2"
:local curdate [/system clock get date]
:put "Current date value: $curdate"
:local fileref "refcount.txt"
:local filename "counter.txt"
:local filefree "freecount.txt"
:local filewarn "warning.txt"
:local day [ :pick $curdate 4 6 ];
:put $day
:if ( $day = 1 ) do={
	:put "Today is 1th of the month, resetting all counters..."
	#RAM
	:put "Resetting counters on RAM..."
	:put "Resetting counter for regular data $filename ..."
	/file set $filename contents=0
	:put "Resetting counter for free data $filefree ..."
	/file set $filefree contents=0
	:put "Resetting counter for warnings $filewarn ..."
	/file set $filewarn contents=0
	:put "Resetting counter for reference data $fileref ..."
	/file set $fileref contents=0
	#enable interface, which might be disabled after reaching 100% data-usage
	:put "Enabling interface LTE..."
	#/interface ethernet set $interf disabled=no
	:put "The interface is enabled"
	:log info "Freedatascripts: All counters are reset to 0, interface $interf is enabled"
};
:if ( $day = 13 ) do={
    :log info "Freedatascripts: test 00:00:01 13th day"
};
stoplte.c stops the interface lte
#This script stops interface when the quota is reached (100%)
#Change the interfacename here;
:local interf "ether2"
#Uncomment the following rules for running scripts in production;
#/interface ethernet set $interf disabled=yes
#:put "The interface is disabled"
#:log warning "Interface $interf is DISABLED due to reached datalimit"
readfiles.c helpscript to run manually so you can read all files at once
:local filename counter.txt
:local fileref refcount.txt
:local filefree freecount.txt
:local filewarn warning.txt
#:put "-- Reference point made when the freedatascripts started running (1st of the month) --"
:put "-- Referentie/Ijkpunt gemaakt wanneer de freedatascripts zijn gestart (1ste vd maand) --"
:set $ref [/file get $fileref contents]
#:put "Reference value from $fileref: $ref in bytes"
:put "Referentie waarde vanuit $fileref: $ref in bytes"
#:put "-- Registered amount of data during NON-free data times --"
:put "-- Geregistreerde hoeveelheid data tijdens NIET-vrije data tijden --"
:set $before [/file get $filename contents]
#:put "Counted bytes value from $filename: $before"
:put "Getelde bytes waarde vanuit $filename: $before"
:local beforemb ( $before / 1024 / 1024 )
#:put "Counted Megabytes value from $filename: $beforemb"
:put "Getelde Megabytes waarde vanuit $filename: $beforemb"
:local beforegb ( $before / 1024 / 1024 / 1024 )
:put "Getelde Gigabytes waarde vanuit $filename: $beforegb"
#:put "-- Registered amount of data during FREE data times --"
:put "-- Geregistreerde hoeveelheid data tijdens VRIJE data tijden --"
:set $free [/file get $filefree contents]
#:put "Counted bytes value from $filefree: $free"
:put "Getelde bytes waarde vanuit $filefree: $free"
:local freemb ( $free / 1024 / 1024 )
#:put "Counted Megabytes value from $filename: $freemb"
:put "Getelde Megabytes waarde vanuit $filename: $freemb"
:local freegb ( $free / 1024 / 1024 / 1024 )
#:put "Counted Gigabytes value from $filename: $freegb"
:put "Getelde Gigabytes waarde vanuit $filename: $freegb"
#:put "-- Amount of GB when interface has to be switched off --"
:put "-- Waarde in GB wanneer de interface uitgeschakeld moet worden --"
#:put "The limit is set to: $limit GB"
:put "De limiet is ingesteld op: $limit GB"
:set $percent [/file get $filewarn contents]
#:put "Counted traffic data is now at $percent %"
:put "Getelde traffic data is nu op $percent %"
Hope it helps, it was a lot of fun program this, so thanks again Chris. If you have any questions please let me know
Maikel
 
luidoltp
newbie
Posts: 31
Joined: Mon Feb 22, 2016 6:27 am
Location: Graz, Austria

Re: Interface Data Quota

Tue Feb 13, 2018 11:13 pm

Hi Maikel,

thanks so much for sharing! :)
I will try to implement it in the wAP LTE kit counting LTE traffic.

Best regards,
Peter
 
maikel
just joined
Posts: 8
Joined: Thu Jun 08, 2017 2:53 pm

Re: Interface Data Quota

Thu Feb 15, 2018 12:56 pm

Hi Maikel,

thanks so much for sharing! :)
I will try to implement it in the wAP LTE kit counting LTE traffic.

Best regards,
Peter
Very welcome
 
mikrofunckryptar
just joined
Posts: 1
Joined: Fri Dec 28, 2018 10:06 pm

Re: Interface Data Quota

Fri Dec 28, 2018 10:21 pm

Hello
For LTE:
#   /$$    /$$$$$$$$/$$$$$$$$ /$$       /$$               /$$   /$$                        
#  | $$   |__  $$__/ $$_____/| $$      |__/              |__/  | $$                        
#  | $$      | $$  | $$      | $$       /$$ /$$$$$$/$$$$  /$$ /$$$$$$    /$$$$$$   /$$$$$$ 
#  | $$      | $$  | $$$$$   | $$      | $$| $$_  $$_  $$| $$|_  $$_/   /$$__  $$ /$$__  $$
#  | $$      | $$  | $$__/   | $$      | $$| $$ \ $$ \ $$| $$  | $$    | $$$$$$$$| $$  \__/
#  | $$      | $$  | $$      | $$      | $$| $$ | $$ | $$| $$  | $$ /$$| $$_____/| $$      
#  | $$$$$$$$| $$  | $$$$$$$$| $$$$$$$$| $$| $$ | $$ | $$| $$  |  $$$$/|  $$$$$$$| $$      
#  |________/|__/  |________/|________/|__/|__/ |__/ |__/|__/   \___/   \_______/|__/      
#  
#  Using: Set all var in User config section. Add scripts to schedule with onstart and interval 30 sek       
:do {              
#######################################################################################################
#                                              User config
#Set limit in MB                                                                                                                                                     
:local limit 12288 
#Set day to reset limit
:local dayresetlimit 1
#Set interface
:local interf "lte1"
#Set auto bring up interface 
:local autointon true
#######################################################################################################
:local filename "counter.txt"
:local filewarn "warning.txt"
:local fileref "refcount.txt"
:local reblock "reblock.txt"
:local status
:if ([:len [/file find where name=$filewarn]] < 1 ) do={
	/file print file=$filewarn where name=$filewarn
	/delay delay-time=2
	/file set $filewarn contents=$percent
};
:if ([:len [/file find where name=$filename]] < 1 ) do={
	/file print file=$filename where name=$filename
	/delay delay-time=2;
	/file set $filename contents=0
}
:if ([:len [/file find where name=$reblock]] < 1 ) do={
	/file print file=$reblock where name=$reblock
	/delay delay-time=2;
	/file set $reblock contents=1
}
:if ([:len [/file find where name=$fileref]] < 1 ) do={
	/file print file=$fileref where name=$fileref
	/delay delay-time=2;
	/file set $fileref contents=0
}
:local reblocker ([/file get $reblock contents])
:local curdate [/system clock get date]
:local day [ :pick $curdate 4 6 ]
:if ( $day = $dayresetlimit and $reblocker = 0) do={
	/file set $filename contents=0
	/file set $filewarn contents=0
	/file set $fileref contents=0
	/interface lte set $interf disabled=no
	/file set $reblock contents=1
	:log info "Limit reset, int $interf bring up" 
	/delay delay-time=5;
	:log info "Clear int counters - reboot"
	#TODO find another method for interf clear counters 
        /system reboot
} 
:if ( $day != $dayresetlimit ) do={
        /file set $reblock contents=0
}
:local before
:local correct
:local ref
:local newdata
:local tx [/interface get $interf tx-byte] 
:local rx [/interface get $interf rx-byte] 
:set $newdata (( $rx + $tx ) / 1024 / 1024 )
:set $before [/file get $filename contents]
:if ( $newdata < $before ) do={
		:set $ref [/file get $fileref contents]
		:set $correct ( $before + $newdata - $ref ) 
		/file set $fileref contents=$newdata
		/file set $filename contents=$correct
	} 
:if ( $newdata >= $before ) do={
		/file set $filename contents=$newdata
}
:local traffic ([/file get $filename contents])
:log warning "Limit: $limit MB"
:local percent ($traffic*100 / $limit)
:log warning "Use: $percent%"
/file set $filewarn contents=$percent
:if ($percent >= 100) do={
	/file set $filewarn contents=$percent
	/interface lte set $interf disabled=yes
 }
:if ($percent < 100 and $autointon = true) do={
             :set $status [/interface get $interf value-name=disabled] 
             :if ($status = true) do={
             /interface lte set $interf disabled=no
              }
}
} on-error={ :log error "Error LTELimiter "};

for PPP-Client
#   /$$    /$$$$$$$$/$$$$$$$$ /$$       /$$               /$$   /$$                        
#  | $$   |__  $$__/ $$_____/| $$      |__/              |__/  | $$                        
#  | $$      | $$  | $$      | $$       /$$ /$$$$$$/$$$$  /$$ /$$$$$$    /$$$$$$   /$$$$$$ 
#  | $$      | $$  | $$$$$   | $$      | $$| $$_  $$_  $$| $$|_  $$_/   /$$__  $$ /$$__  $$
#  | $$      | $$  | $$__/   | $$      | $$| $$ \ $$ \ $$| $$  | $$    | $$$$$$$$| $$  \__/
#  | $$      | $$  | $$      | $$      | $$| $$ | $$ | $$| $$  | $$ /$$| $$_____/| $$      
#  | $$$$$$$$| $$  | $$$$$$$$| $$$$$$$$| $$| $$ | $$ | $$| $$  |  $$$$/|  $$$$$$$| $$      
#  |________/|__/  |________/|________/|__/|__/ |__/ |__/|__/   \___/   \_______/|__/      
#  
#  Using: Set all var in User config section. Add scripts to schedule with onstart and interval 30 sek       
:do {              
#######################################################################################################
#                                              User config
#Set limit in MB                                                                                                                                                     
:local limit 12288 
#Set day to reset limit
:local dayresetlimit 1
#Set interface
:local interf "ppp-out1"
#Set auto bring up interface 
:local autointon true
#######################################################################################################
:local filename "counter.txt"
:local filewarn "warning.txt"
:local fileref "refcount.txt"
:local reblock "reblock.txt"
:local status
:if ([:len [/file find where name=$filewarn]] < 1 ) do={
	/file print file=$filewarn where name=$filewarn
	/delay delay-time=2
	/file set $filewarn contents=$percent
};
:if ([:len [/file find where name=$filename]] < 1 ) do={
	/file print file=$filename where name=$filename
	/delay delay-time=2;
	/file set $filename contents=0
}
:if ([:len [/file find where name=$reblock]] < 1 ) do={
	/file print file=$reblock where name=$reblock
	/delay delay-time=2;
	/file set $reblock contents=1
}
:if ([:len [/file find where name=$fileref]] < 1 ) do={
	/file print file=$fileref where name=$fileref
	/delay delay-time=2;
	/file set $fileref contents=0
}
:local reblocker ([/file get $reblock contents])
:local curdate [/system clock get date]
:local day [ :pick $curdate 4 6 ]
:if ( $day = $dayresetlimit and $reblocker = 0) do={
	/file set $filename contents=0
	/file set $filewarn contents=0
	/file set $fileref contents=0
	/interface ppp-client set $interf disabled=no
	/file set $reblock contents=1
	:log info "Limit reset, int $interf bring up" 
	/delay delay-time=5;
	:log info "Clear int counters - reboot"
	#TODO find another method for interf clear counters 
        /system reboot
} 
:if ( $day != $dayresetlimit ) do={
        /file set $reblock contents=0
}
:local before
:local correct
:local ref
:local newdata
:local tx [/interface get $interf tx-byte] 
:local rx [/interface get $interf rx-byte] 
:set $newdata (( $rx + $tx ) / 1024 / 1024 )
:set $before [/file get $filename contents]
:if ( $newdata < $before ) do={
		:set $ref [/file get $fileref contents]
		:set $correct ( $before + $newdata - $ref ) 
		/file set $fileref contents=$newdata
		/file set $filename contents=$correct
	} 
:if ( $newdata >= $before ) do={
		/file set $filename contents=$newdata
}
:local traffic ([/file get $filename contents])
:log warning "Limit: $limit MB"
:local percent ($traffic*100 / $limit)
:log warning "Use: $percent%"
/file set $filewarn contents=$percent
:if ($percent >= 100) do={
	/file set $filewarn contents=$percent
	/interface ppp-client set $interf disabled=yes
 }
:if ($percent < 100 and $autointon = true) do={
             :set $status [/interface get $interf value-name=disabled] 
             :if ($status = true) do={
             /interface ppp-client set $interf disabled=no
              }
}
} on-error={ :log error "Error ppp-clientLimiter "};

 
bpwl
just joined
Posts: 15
Joined: Mon Apr 08, 2019 1:16 am

Re: Interface Data Quota

Mon Apr 08, 2019 1:34 am

Hi, I used this excellent LTELimiter script for several weeks on 2 SXT's. Keeping an eye on the data volumes. It works excellent. Thanks for sharing!

I made it only run every 10 minutes not to damage the flash with too many write operations. The reset of the interface counters in an SXT LTE kit is also done when you disable/enable the interface (or switch between the SIM cards). Yesterday we had a power failure, and the counters that have been incremented over a long time, were reduced to some value of an earlier interface reset. The calculation of the "correct" counter value is mistakenly subtracting the "ref" value in the case of a counter reset.. Anything accumulated in this period is subtracted. So I modified the script to avoid this substraction of the accumulated value.

The script reads in that lower part now as:

:log info "Clear int counters - reboot"
#TODO find another method for interf clear counters
#/system reboot
#resetting interface will clear counters
/interface lte set $interf disabled=yes
/delay delay-time=2;
/interface lte set $interf disabled=no
/delay delay-time=2;
}
:if ( $day != $dayresetlimit ) do={
/file set $reblock contents=0
}
:local before
:local correct
:local ref
:local newdata
:local tx [/interface get $interf tx-byte]
:local rx [/interface get $interf rx-byte]
:set $newdata (( $rx + $tx ) / 1024 / 1024 )
:set $before [/file get $filename contents]
# delta count ?
:if ( $newdata < $before ) do={
:set $ref [/file get $fileref contents]
# BPWL by counter reset then zero out old ref value
:if ( $newdata < $ref ) do={
set $ref (0)
}
:set $correct ( $before + $newdata - $ref )
/file set $fileref contents=$newdata
/file set $filename contents=$correct
}
# regular count
:if ( $newdata >= $before ) do={
/file set $filename contents=$newdata
}
:local traffic ([/file get $filename contents])
:local percent ($traffic*100 / $limit)
:log warning "Limit: $limit MB Traffic: $traffic MB Used: $percent%"
/file set $filewarn contents=$percent
:if ($percent >= 100) do={
/file set $filewarn contents=$percent
/interface lte set $interf disabled=yes
}
:if ($percent < 100 and $autointon = true) do={
:set $status [/interface get $interf value-name=disabled]
:if ($status = true) do={
/interface lte set $interf disabled=no
}
}
} on-error={ :log error "Error LTELimiter "};
 
leon84
Member Candidate
Member Candidate
Posts: 171
Joined: Wed Dec 02, 2009 12:15 pm

Re: Interface Data Quota

Fri Aug 02, 2019 1:27 pm

Very good this script but it has a problem, I think.
If the router is powered off in the day of dayresetlimit the counter reset never happens. Is it right?
Hello
For LTE:
#   /$$    /$$$$$$$$/$$$$$$$$ /$$       /$$               /$$   /$$                        
#  | $$   |__  $$__/ $$_____/| $$      |__/              |__/  | $$                        
#  | $$      | $$  | $$      | $$       /$$ /$$$$$$/$$$$  /$$ /$$$$$$    /$$$$$$   /$$$$$$ 
#  | $$      | $$  | $$$$$   | $$      | $$| $$_  $$_  $$| $$|_  $$_/   /$$__  $$ /$$__  $$
#  | $$      | $$  | $$__/   | $$      | $$| $$ \ $$ \ $$| $$  | $$    | $$$$$$$$| $$  \__/
#  | $$      | $$  | $$      | $$      | $$| $$ | $$ | $$| $$  | $$ /$$| $$_____/| $$      
#  | $$$$$$$$| $$  | $$$$$$$$| $$$$$$$$| $$| $$ | $$ | $$| $$  |  $$$$/|  $$$$$$$| $$      
#  |________/|__/  |________/|________/|__/|__/ |__/ |__/|__/   \___/   \_______/|__/      
#  
#  Using: Set all var in User config section. Add scripts to schedule with onstart and interval 30 sek       
:do {              
#######################################################################################################
#                                              User config
#Set limit in MB                                                                                                                                                     
:local limit 12288 
#Set day to reset limit
:local dayresetlimit 1
#Set interface
:local interf "lte1"
#Set auto bring up interface 
:local autointon true
#######################################################################################################
:local filename "counter.txt"
:local filewarn "warning.txt"
:local fileref "refcount.txt"
:local reblock "reblock.txt"
:local status
:if ([:len [/file find where name=$filewarn]] < 1 ) do={
	/file print file=$filewarn where name=$filewarn
	/delay delay-time=2
	/file set $filewarn contents=$percent
};
:if ([:len [/file find where name=$filename]] < 1 ) do={
	/file print file=$filename where name=$filename
	/delay delay-time=2;
	/file set $filename contents=0
}
:if ([:len [/file find where name=$reblock]] < 1 ) do={
	/file print file=$reblock where name=$reblock
	/delay delay-time=2;
	/file set $reblock contents=1
}
:if ([:len [/file find where name=$fileref]] < 1 ) do={
	/file print file=$fileref where name=$fileref
	/delay delay-time=2;
	/file set $fileref contents=0
}
:local reblocker ([/file get $reblock contents])
:local curdate [/system clock get date]
:local day [ :pick $curdate 4 6 ]
:if ( $day = $dayresetlimit and $reblocker = 0) do={
	/file set $filename contents=0
	/file set $filewarn contents=0
	/file set $fileref contents=0
	/interface lte set $interf disabled=no
	/file set $reblock contents=1
	:log info "Limit reset, int $interf bring up" 
	/delay delay-time=5;
	:log info "Clear int counters - reboot"
	#TODO find another method for interf clear counters 
        /system reboot
} 
:if ( $day != $dayresetlimit ) do={
        /file set $reblock contents=0
}
:local before
:local correct
:local ref
:local newdata
:local tx [/interface get $interf tx-byte] 
:local rx [/interface get $interf rx-byte] 
:set $newdata (( $rx + $tx ) / 1024 / 1024 )
:set $before [/file get $filename contents]
:if ( $newdata < $before ) do={
		:set $ref [/file get $fileref contents]
		:set $correct ( $before + $newdata - $ref ) 
		/file set $fileref contents=$newdata
		/file set $filename contents=$correct
	} 
:if ( $newdata >= $before ) do={
		/file set $filename contents=$newdata
}
:local traffic ([/file get $filename contents])
:log warning "Limit: $limit MB"
:local percent ($traffic*100 / $limit)
:log warning "Use: $percent%"
/file set $filewarn contents=$percent
:if ($percent >= 100) do={
	/file set $filewarn contents=$percent
	/interface lte set $interf disabled=yes
 }
:if ($percent < 100 and $autointon = true) do={
             :set $status [/interface get $interf value-name=disabled] 
             :if ($status = true) do={
             /interface lte set $interf disabled=no
              }
}
} on-error={ :log error "Error LTELimiter "};

for PPP-Client
#   /$$    /$$$$$$$$/$$$$$$$$ /$$       /$$               /$$   /$$                        
#  | $$   |__  $$__/ $$_____/| $$      |__/              |__/  | $$                        
#  | $$      | $$  | $$      | $$       /$$ /$$$$$$/$$$$  /$$ /$$$$$$    /$$$$$$   /$$$$$$ 
#  | $$      | $$  | $$$$$   | $$      | $$| $$_  $$_  $$| $$|_  $$_/   /$$__  $$ /$$__  $$
#  | $$      | $$  | $$__/   | $$      | $$| $$ \ $$ \ $$| $$  | $$    | $$$$$$$$| $$  \__/
#  | $$      | $$  | $$      | $$      | $$| $$ | $$ | $$| $$  | $$ /$$| $$_____/| $$      
#  | $$$$$$$$| $$  | $$$$$$$$| $$$$$$$$| $$| $$ | $$ | $$| $$  |  $$$$/|  $$$$$$$| $$      
#  |________/|__/  |________/|________/|__/|__/ |__/ |__/|__/   \___/   \_______/|__/      
#  
#  Using: Set all var in User config section. Add scripts to schedule with onstart and interval 30 sek       
:do {              
#######################################################################################################
#                                              User config
#Set limit in MB                                                                                                                                                     
:local limit 12288 
#Set day to reset limit
:local dayresetlimit 1
#Set interface
:local interf "ppp-out1"
#Set auto bring up interface 
:local autointon true
#######################################################################################################
:local filename "counter.txt"
:local filewarn "warning.txt"
:local fileref "refcount.txt"
:local reblock "reblock.txt"
:local status
:if ([:len [/file find where name=$filewarn]] < 1 ) do={
	/file print file=$filewarn where name=$filewarn
	/delay delay-time=2
	/file set $filewarn contents=$percent
};
:if ([:len [/file find where name=$filename]] < 1 ) do={
	/file print file=$filename where name=$filename
	/delay delay-time=2;
	/file set $filename contents=0
}
:if ([:len [/file find where name=$reblock]] < 1 ) do={
	/file print file=$reblock where name=$reblock
	/delay delay-time=2;
	/file set $reblock contents=1
}
:if ([:len [/file find where name=$fileref]] < 1 ) do={
	/file print file=$fileref where name=$fileref
	/delay delay-time=2;
	/file set $fileref contents=0
}
:local reblocker ([/file get $reblock contents])
:local curdate [/system clock get date]
:local day [ :pick $curdate 4 6 ]
:if ( $day = $dayresetlimit and $reblocker = 0) do={
	/file set $filename contents=0
	/file set $filewarn contents=0
	/file set $fileref contents=0
	/interface ppp-client set $interf disabled=no
	/file set $reblock contents=1
	:log info "Limit reset, int $interf bring up" 
	/delay delay-time=5;
	:log info "Clear int counters - reboot"
	#TODO find another method for interf clear counters 
        /system reboot
} 
:if ( $day != $dayresetlimit ) do={
        /file set $reblock contents=0
}
:local before
:local correct
:local ref
:local newdata
:local tx [/interface get $interf tx-byte] 
:local rx [/interface get $interf rx-byte] 
:set $newdata (( $rx + $tx ) / 1024 / 1024 )
:set $before [/file get $filename contents]
:if ( $newdata < $before ) do={
		:set $ref [/file get $fileref contents]
		:set $correct ( $before + $newdata - $ref ) 
		/file set $fileref contents=$newdata
		/file set $filename contents=$correct
	} 
:if ( $newdata >= $before ) do={
		/file set $filename contents=$newdata
}
:local traffic ([/file get $filename contents])
:log warning "Limit: $limit MB"
:local percent ($traffic*100 / $limit)
:log warning "Use: $percent%"
/file set $filewarn contents=$percent
:if ($percent >= 100) do={
	/file set $filewarn contents=$percent
	/interface ppp-client set $interf disabled=yes
 }
:if ($percent < 100 and $autointon = true) do={
             :set $status [/interface get $interf value-name=disabled] 
             :if ($status = true) do={
             /interface ppp-client set $interf disabled=no
              }
}
} on-error={ :log error "Error ppp-clientLimiter "};

 
bpwl
just joined
Posts: 15
Joined: Mon Apr 08, 2019 1:16 am

Re: Interface Data Quota

Fri Aug 23, 2019 11:48 pm

Yes leon84, it has a problem with power failure or reboot.
See my version above with the correction

Who is online

Users browsing this forum: No registered users and 27 guests