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

#SFE connection manager has a lower priority, it should be started after other connection manager
#to detect the existence of connection manager with higher priority
START=72

USE_PROCD=1

PDNSD_BIN="/var/sbin/dnscache"
DNSMASQ_RESTART=N
DNS_SERVER="114.114.114.114,114.114.115.115"

pdnsd_genconfig() {
  DNS_SERVER=$(uci get sfe.config.dns_server 2>/dev/null)

	[ -d /var/etc ] || mkdir -p /var/etc
	
  if [ ! -f /var/dnscache/pdnsd.cache ]; then
    mkdir -p /var/dnscache
    echo -ne "pd13\000\000\000\000" > /var/dnscache/pdnsd.cache
    chown -R nobody.nogroup /var/dnscache
	fi
	
	cat > /var/etc/dnscache.conf <<EOF
global {
    perm_cache=1024;        # dnsСλKB鲻Ҫд̫
    cache_dir="/var/dnscache";     # ļλ
    pid_file = /var/run/dnscache.pid;
    server_ip = 0.0.0.0;        # pdnsd0.0.0.0ȫ
    server_port=5333;           # pdnsdĶ˿ڣҪͱķͻ
    status_ctl = on;
    paranoid=on;                  # ģʽDNSصַ÷
    query_method=udp_only;      
    neg_domain_pol = off;  
    par_queries = 400;          # ͬʱ
    min_ttl = 1h;               # DNS̻ʱ
    max_ttl = 1w;               # DNSʱ
    timeout = 10;               # DNSʱʱ䣬λ
}

server {  
    label = "routine";         
    ip = $DNS_SERVER;     # ΪҪϼ dns  ip ַдһDNSַ  
    timeout = 5;              # DNSʱʱ
    reject = 74.125.127.102,  # IPҲDNSȾһ᷵صĽյDNSᴥTCPЭһ㲻IP
        74.125.155.102,  
        74.125.39.102,  
        74.125.39.113,  
        209.85.229.138,  
        128.121.126.139,  
        159.106.121.75,  
        169.132.13.103,  
        192.67.198.6,  
        202.106.1.2,  
        202.181.7.85,  
        203.161.230.171,  
        203.98.7.65,  
        207.12.88.98,  
        208.56.31.43,  
        209.145.54.50,  
        209.220.30.174,  
        209.36.73.33,  
        211.94.66.147,  
        213.169.251.35,  
        216.221.188.182,  
        216.234.179.13,  
        243.185.187.39,  
        37.61.54.158,  
        4.36.66.178,  
        46.82.174.68,  
        59.24.3.173,  
        64.33.88.161,  
        64.33.99.47,  
        64.66.163.251,  
        65.104.202.252,  
        65.160.219.113,  
        66.45.252.237,  
        69.55.52.253,  
        72.14.205.104,  
        72.14.205.99,  
        78.16.49.15,  
        8.7.198.45,  
        93.46.8.89,  
        37.61.54.158,  
        243.185.187.39,  
        190.93.247.4,  
        190.93.246.4,  
        190.93.245.4,  
        190.93.244.4,  
        65.49.2.178,  
        189.163.17.5,  
        23.89.5.60,  
        49.2.123.56,  
        54.76.135.1,  
        77.4.7.92,  
        118.5.49.6,  
        159.24.3.173,  
        188.5.4.96,  
        197.4.4.12,  
        220.250.64.24,  
        243.185.187.30,  
        249.129.46.48,  
        253.157.14.165;  
    reject_policy = fail;  
}

server {  
    label = "special";                  # д  
    ip = 208.67.222.222,208.67.220.220; # ΪDNS ip ַ  
    port = 5353;                        # Ƽʹ53Ķ˿ڣDNS֧֣ 
    proxy_only = on;
    timeout = 5;  
}  

source {
	owner=localhost;
//	serve_aliases=on;
	file="/etc/hosts";
}

rr {
	name=localhost;
	reverse=on;
	a=127.0.0.1;
	owner=localhost;
	soa=localhost,root.localhost,42,86400,900,86400,86400;
}
EOF

	[ -d /var/sbin ] || mkdir -p /var/sbin
  [ -f /var/sbin/dnscache ] || cp -a /usr/sbin/pdnsd /var/sbin/dnscache
}

change_dns() {
 	uci delete dhcp.@dnsmasq[0].server >/dev/null 2>&1
	uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#5333
	uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto
	uci set dhcp.@dnsmasq[0].noresolv=0
	uci commit dhcp
}

revert_dns() {
	uci del_list dhcp.@dnsmasq[0].server=127.0.0.1#5333 >/dev/null 2>&1
	uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto
	uci set dhcp.@dnsmasq[0].noresolv=0
	uci commit dhcp
}

have_cm() {
	[ -d "/sys/kernel/debug/ecm" ] && echo 1 && return

	echo 0
}

#load shortcut-fe connection manager
load_sfe_cm() {
	local kernel_version=$(uname -r)

	#shortcut-fe-drv.ko is not needed because other connection manager is not enabled
	[ -d "/sys/module/shortcut_fe_drv" ] && rmmod shortcut_fe_drv

	[ -e "/lib/modules/$kernel_version/shortcut-fe-cm.ko" ] && {
		[ -d /sys/module/shortcut_fe_cm ] || modprobe shortcut-fe-cm
	}
}

start_service() {
	enable=$(uci get sfe.config.enabled 2>/dev/null)
	wifi=$(uci get sfe.config.wifi)
	ipv6=$(uci get sfe.config.ipv6)
	dns=$(uci get sfe.config.dns 2>/dev/null)
	
	if [ $enable -eq 1 ]; then
      [ "$(have_cm)" = "1" ] || load_sfe_cm
	fi
	
	if [ $dns -eq 1 ];  then
    pdnsd_genconfig
    procd_open_instance
    procd_set_param command "$PDNSD_BIN" -c /var/etc/dnscache.conf
    procd_set_param respawn
    procd_set_param stderr 1
    procd_close_instance
    change_dns
  fi
	
	if [ "$DNSMASQ_RESTART" = N ]; then
    /etc/init.d/dnsmasq restart
  fi
}

stop_service() {
	[ -d /sys/module/shortcut_fe_cm ] && rmmod shortcut_fe_cm 
	[ -d /sys/module/shortcut_fe ] && rmmod shortcut-fe
	[ -d /sys/module/fast_classifier ] && rmmod fast_classifier
	revert_dns
	if [ "$DNSMASQ_RESTART" = N ]; then
     /etc/init.d/dnsmasq restart
  fi
}

restart(){
    DNSMASQ_RESTART=Y
	  stop
	  start
}
