#!/bin/sh /etc/rc.common

START=19

TIMECONTROL_ENABLE=0

iptables_w(){
	iptables -w 1 "$@"
}

add_rule(){
	local enable macaddr timeoff timeon z1 z2 z3 z4 z5 z6 z7
	config_get enable "$1" enable "0"
	config_get macaddr "$1" macaddr
	config_get timeoff "$1" timeoff
	config_get timeon "$1" timeon
	config_get z1 "$1" z1
	config_get z2 "$1" z2
	config_get z3 "$1" z3
	config_get z4 "$1" z4
	config_get z5 "$1" z5
	config_get z6 "$1" z6
	config_get z7 "$1" z7

	if [ -z $enable ] || [ "$enable" != "1" ] || [ -z $macaddr ] || [ -z $timeoff ] || [ -z $timeon ]; then
		return 0
	fi

	local Z1 Z2 Z3 Z4 Z5 Z6 Z7
	[ "$z1" == "1" ] && Z1="Mon,"
	[ "$z2" == "1" ] && Z2="Tue,"
	[ "$z3" == "1" ] && Z3="Wed,"
	[ "$z4" == "1" ] && Z4="Thu,"
	[ "$z5" == "1" ] && Z5="Fri,"
	[ "$z6" == "1" ] && Z6="Sat,"
	[ "$z7" == "1" ] && Z7="Sun"
	local weekdays="$Z1$Z2$Z3$Z4$Z5$Z6$Z7"
	[ -z "$weekdays" ] || weekdays="--weekdays $weekdays"

	local table
	for table in filter nat; do
		iptables_w -t $table -A TIMECONTROL_RULES -m mac --mac-source $macaddr -m time --kerneltz --timestart $timeon --timestop $timeoff $weekdays -j TIMECONTROL_REJECT
	done
}

timecontrol_header(){
	config_get TIMECONTROL_ENABLE "$1" enable "0"
}

start(){
	local table
	config_load timecontrol
	config_foreach timecontrol_header basic

	[ "$TIMECONTROL_ENABLE" != "1" ] && return 0
	# resolve interface
	local interface=$(
		. /lib/functions/network.sh

		network_is_up "lan" && network_get_device device "lan"
		echo "${device:-br-lan}"
	)

	for table in filter nat; do
		iptables_w -t $table -N TIMECONTROL
		iptables_w -t $table -F TIMECONTROL
		iptables_w -t $table -N TIMECONTROL_RULES
		iptables_w -t $table -F TIMECONTROL_RULES
		iptables_w -t $table -N TIMECONTROL_REJECT
		iptables_w -t $table -F TIMECONTROL_REJECT
	done
	iptables_w -t filter -I TIMECONTROL_REJECT -j DROP
	iptables_w -t filter -I TIMECONTROL_REJECT -p tcp -j REJECT --reject-with tcp-reset
	iptables_w -t nat -I TIMECONTROL_REJECT -j ACCEPT

	config_foreach add_rule macbind

	iptables_w -t filter -I TIMECONTROL -i $interface -j TIMECONTROL_RULES
	iptables_w -t filter -I FORWARD -j TIMECONTROL
	iptables_w -t nat -I TIMECONTROL -i $interface -j TIMECONTROL_RULES
	iptables_w -t nat -I PREROUTING -j TIMECONTROL
}

stop(){
	local table
	iptables_w -t filter -D FORWARD -j TIMECONTROL
	iptables_w -t nat -D PREROUTING -j TIMECONTROL

	for table in filter nat; do
		iptables_w -t $table -F TIMECONTROL
		iptables_w -t $table -X TIMECONTROL
		iptables_w -t $table -F TIMECONTROL_RULES
		iptables_w -t $table -X TIMECONTROL_RULES
		iptables_w -t $table -F TIMECONTROL_REJECT
		iptables_w -t $table -X TIMECONTROL_REJECT
	done
}
