====== Scripting Access Restrictions ====== Access Restriction rules are coded as strings separated by pipe ( | ) symbols. These are stored in NVRAM as variables named //rrule0//, //rrule1//, //rrule2// and so on. \\ To see what's in the first rule, we can issue the following command at a FreshTomato shell prompt: \\ nvram get rrule0 \\ The returned string might look something like this: \\ 1|540|1140|62|||block-site.com$|0|New Rule 1 \\ Let's look more closely at what each of these fields separated by a pipe ( | ) symbol means. **Field 1:** indicates whether the rule is currently enabled (1) or disabled (0). **Field 2:** specifies the start time, (time to start applying this rule), in minutes elapsed since midnight. In this case, start time is 5:40 AM, so the router should enforce this rule starting at 9:00 AM. **Field 3:** is the end time, (time to stop applying this rule). This is coded similarly to the start time. Both the second and third fields will be -1 if you select the //‘All Day’// option in the Access Restrictions menu. **Field 4:** specifies on which days the rule will be applied. It is coded in binary: * 1 = Sunday * 2 = Monday * 4 = Tuesday * 8 = Wednesday * 16 = Thursday * 32 = Friday * 64 = Saturday \\ For multiple days, simply add together the corresponding numbers for each day. In the above example, the fourth field is 62, which is equal to 2 + 4 + 8 + 16 + 32 . This means the rule should be active on Mon, Tue, Wed, Thu, and Fri. That is, only on weekdays. If you had checked the //Everyday// option, the value would have been 127. **Field 5:** shows the IP or MAC Address range on your network for which the rule should be applied. **Field 6:** has the //Port/Application// information coded in it. In other words, which port numbers and protocols. This rule should block Layer 7 and p2p applications. **Field 7:** contains the Domains/URLs to block. It partially supports regular expressions. In the example above, domain names ending with "block-site.com" are blocked. **Field 8:** stores a binary coded value if ActiveX, Flash or Java are set to be blocked. * A "1" will block ActiveX. * A "2" will block Flash. * A "4" will block Java. \\ **Field 9:** stores the name that you gave to the rule being edited. \\ Now that we have a basic sense of how Access Restriction rules work, we can write shell scripts to control the rules. The script below will enable or disable a rule. Two values are passed on the command line – the rule number and either a "0" or "1" to disable or enable the service. \\ #!/bin/sh #Wait if any service is currently being restarted nvstat=`nvram get action_service` while [ "$nvstat" != "" ]; do echo done #Assume we are going to enable the rule enable=1 #Was a 1 or 0 passed on the command line? [ "$2" != "" ] && enable=$2 #Get the current setting of the rule. #Rule number is passed as the first parameter on the command line. rr=`nvram get rrule$1` #Set the first field to the value in variable $enable rr=$(echo $rr|sed "s/^./$enable/") echo $rr #Replace the old rule with the new value nvram set rrule$1="$rr" #Prepare to restart the service by killing the init process nvram set action_service=restrict-restart #kill the init process kill -USR1 1 #Wait for the service to restart while [ "`nvram get action_service`" == "restrict-restart" ]; do echo done \\ If you have JFFS enabled in FreshTomato, you can copy the script under the jffs directory and schedule it to run as a cron job, if you wish. \\ \\ ===== Credits ===== [[http://web.archive.org/web/20160321090715/http://infinilogix.com/wordpress/network-programming/routers/how-to-control-access-restriction-rules-in-tomato-by-a-shell-script|Credit: Justin from "infinilogix.com" - original page which is now only accessible via archive.org]]