#!/bin/sh


IGNORE=/opt/etc/ignore.list
IGNORE2=/opt/etc/ignore.user


flush_r() {

iptables -t nat -F SHADOWSOCKS 2>/dev/null
iptables -t nat -D PREROUTING -p tcp -j SHADOWSOCKS 2>/dev/null
iptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS 2>/dev/null
iptables -t nat -X SHADOWSOCKS  2>/dev/null

return 0	
}


# Get argument
while getopts "s:l:f" arg #选项后面的冒号表示该选项需要参数
do
        case $arg in
             s)
                server=$OPTARG
                ;;
             l)
                local_port=$OPTARG
                ;;
             f)
                flush_r
                exit 0
                ;;
             ?)  #当有不认识的选项的时候arg为?
            echo "unkonw argument"
        exit 1
        ;;
        esac
done


[ ! -f $IGNORE ] && echo "$IGNORE not found." && exit 1

# Check variable
[ -z $server ] || [ -z $local_port ] && {
	echo "Invalid variable, please check CONFIG."
	exit 1
}



# Create a new chain
BEGIN="*nat\n\
:SHADOWSOCKS - [0:0]\n\
-I PREROUTING -p tcp -j SHADOWSOCKS\n\
-I OUTPUT 1 -p tcp -j SHADOWSOCKS\n\
-A SHADOWSOCKS -d $server/32 -j RETURN\n\
-A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN\n\
-A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN\n\
-A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN\n\
-A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN\n\
-A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN\n\
-A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN\n\
-A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN\n\
-A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN\n"

# Read the ignore list

RULES=$(awk '$1 ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}/ {
	printf("-A SHADOWSOCKS -d %s -j RETURN\n", $1)
}' $IGNORE)
RULES2=$(awk '$1 ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}/ {
	printf("-A SHADOWSOCKS -d %s -j RETURN\n", $1)
}' $IGNORE2)


# Apply the rules
echo -e "$BEGIN$RULES\n$RULES2\n\
-A SHADOWSOCKS -p tcp  -j REDIRECT --to-ports $local_port\n\
COMMIT" | iptables-restore -n

exit 0


