void start_pptpd(void) { int ret = 0, mss = 0; char *lpTemp; FILE *fp; if (!nvram_invmatch("pptpd_enable", "0")) { stop_pptpd(); return; } #ifdef HAVE_PPTP_ACCEL insmod("pptp"); #endif // cprintf("stop vpn modules\n"); // stop_vpn_modules (); // copy existing peer data to /tmp if (nvram_default_match("sys_enable_jffs2", "1", "0")) system("/bin/cp /jffs/etc/pptp_peer.db /tmp/"); // Create directory for use by pptpd daemon and its supporting files mkdir("/tmp/pptpd", 0744); cprintf("open options file\n"); // Create options file that will be unique to pptpd to avoid interference // with pppoe and pptp fp = fopen("/tmp/pptpd/options.pptpd", "w"); cprintf("adding radius plugin\n"); if (nvram_match("pptpd_radius", "1")) fprintf(fp, "plugin radius.so\nplugin radattr.so\n" "radius-config-file /tmp/pptpd/radius/radiusclient.conf\n"); cprintf("check if wan_wins = zero\n"); int nowins = 0; if (nvram_match("wan_wins", "0.0.0.0")) { nvram_set("wan_wins", ""); nowins = 1; } if (strlen(nvram_safe_get("wan_wins")) == 0) nowins = 1; cprintf("write config\n"); fprintf(fp, "lock\n" "name *\n" "nobsdcomp\n" "nodeflate\n" "auth\n" "refuse-pap\n" "refuse-eap\n" "refuse-chap\n" "refuse-mschap\n" "require-mschap-v2\n"); if (nvram_match("pptpd_forcemppe", "1")) fprintf(fp, "mppe required,stateless,no40,no56\n"); else fprintf(fp, "mppe stateless\n"); fprintf(fp, "mppc\n" //enable compression "debug\n" "logfd 2\n" "ms-ignore-domain\n" "chap-secrets /tmp/pptpd/chap-secrets\n" "ip-up-script /tmp/pptpd/ip-up\n" "ip-down-script /tmp/pptpd/ip-down\n" "proxyarp\n" "ipcp-accept-local\n" "ipcp-accept-remote\n" "lcp-echo-failure 15\n" "lcp-echo-interval 4\n" // "lcp-echo-adaptive" //disable interval "mtu %s\n" "mru %s\n", nvram_safe_get("pptpd_mtu"), nvram_safe_get("pptpd_mru")); if (!nowins) { fprintf(fp, "ms-wins %s\n", nvram_safe_get("wan_wins")); } if (strlen(nvram_safe_get("pptpd_wins1"))) { fprintf(fp, "ms-wins %s\n", nvram_safe_get("pptpd_wins1")); } if (strlen(nvram_safe_get("pptpd_wins2"))) { fprintf(fp, "ms-wins %s\n", nvram_safe_get("pptpd_wins2")); } struct dns_lists *dns_list = get_dns_list(); if (nvram_match("dnsmasq_enable", "1")) { if (nvram_invmatch("lan_ipaddr", "")) fprintf(fp, "ms-dns %s\n", nvram_safe_get("lan_ipaddr")); } else if (nvram_match("local_dns", "1")) { if (dns_list && (nvram_invmatch("lan_ipaddr", "") || strlen(dns_list->dns_server[0]) > 0 || strlen(dns_list->dns_server[1]) > 0 || strlen(dns_list->dns_server[2]) > 0)) { if (nvram_invmatch("lan_ipaddr", "")) fprintf(fp, "ms-dns %s\n", nvram_safe_get("lan_ipaddr")); if (strlen(dns_list->dns_server[0]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[0]); if (strlen(dns_list->dns_server[1]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[1]); if (strlen(dns_list->dns_server[2]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[2]); } } else { if (dns_list && (strlen(dns_list->dns_server[0]) > 0 || strlen(dns_list->dns_server[1]) > 0 || strlen(dns_list->dns_server[2]) > 0)) { if (strlen(dns_list->dns_server[0]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[0]); if (strlen(dns_list->dns_server[1]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[1]); if (strlen(dns_list->dns_server[2]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[2]); } } if (dns_list) free(dns_list); if (strlen(nvram_safe_get("pptpd_dns1"))) { fprintf(fp, "ms-dns %s\n", nvram_safe_get("pptpd_dns1")); } if (strlen(nvram_safe_get("pptpd_dns2"))) { fprintf(fp, "ms-dns %s\n", nvram_safe_get("pptpd_dns2")); } // Following is all crude and need to be revisited once testing confirms // that it does work // Should be enough for testing.. if (nvram_match("pptpd_radius", "1")) { if (nvram_get("pptpd_radserver") != NULL && nvram_get("pptpd_radpass") != NULL) { fclose(fp); mkdir("/tmp/pptpd/radius", 0744); fp = fopen("/tmp/pptpd/radius/radiusclient.conf", "w"); fprintf(fp, "auth_order radius\n" "login_tries 4\n" "login_timeout 60\n" "radius_timeout 10\n" "nologin /etc/nologin\n" "servers /tmp/pptpd/radius/servers\n" "dictionary /etc/dictionary\n" "seqfile /var/run/radius.seq\n" "mapfile /etc/port-id-map\n" "radius_retries 3\n" "authserver %s:%s\n", nvram_get("pptpd_radserver"), nvram_get("pptpd_radport") ? nvram_get("pptpd_radport") : "radius"); if (nvram_get("pptpd_radserver") != NULL && nvram_get("pptpd_acctport") != NULL) fprintf(fp, "acctserver %s:%s\n", nvram_get("pptpd_radserver"), nvram_get("pptpd_acctport") ? nvram_get("pptpd_acctport") : "radacct"); fclose(fp); fp = fopen("/tmp/pptpd/radius/servers", "w"); fprintf(fp, "%s\t%s\n", nvram_get("pptpd_radserver"), nvram_get("pptpd_radpass")); fclose(fp); } else fclose(fp); } else fclose(fp); // Create pptpd.conf options file for pptpd daemon fp = fopen("/tmp/pptpd/pptpd.conf", "w"); if (nvram_match("pptpd_bcrelay", "1")) fprintf(fp, "bcrelay %s\n", nvram_safe_get("lan_ifname")); fprintf(fp, "connections %s\nlocalip %s\n" "remoteip %s\n", nvram_safe_get("pptpd_conn"),nvram_safe_get("pptpd_lip"), nvram_safe_get("pptpd_rip")); fclose(fp); // Create ip-up and ip-down scripts that are unique to pptpd to avoid // interference with pppoe and pptp /* * adjust for tunneling overhead (mtu - 40 byte IP - 108 byte tunnel * overhead) */ if (nvram_match("mtu_enable", "1")) mss = atoi(nvram_safe_get("wan_mtu")) - 40 - 108; else mss = 1500 - 40 - 108; char bcast[32]; strcpy(bcast, nvram_safe_get("lan_ipaddr")); get_broadcast(bcast, nvram_safe_get("lan_netmask")); fp = fopen("/tmp/pptpd/ip-up", "w"); fprintf(fp, "#!/bin/sh\n" "startservice set_routes\n" // reinitialize "echo $PPPD_PID $1 $5 $6 $PEERNAME >> /tmp/pptp_connected\n" "iptables -I INPUT -i $1 -j ACCEPT\n" "iptables -I FORWARD -i $1 -j ACCEPT\n" // "iptables -I FORWARD -i $1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu\n" "iptables -t nat -I PREROUTING -i $1 -p udp -m udp --sport 9 -j DNAT --to-destination %s\n" // rule for wake on lan over pptp tunnel "%s\n", bcast, nvram_get("pptpd_ipdown_script") ? nvram_get("pptpd_ipdown_script") : ""); // per peer shaping if (nvram_match("pptpd_radius", "1")) fprintf(fp, "IN=`grep -i RP-Upstream-Speed-Limit /var/run/radattr.$1 | awk '{print $2}'`\n" "OUT=`grep -i RP-Downstream-Speed-Limit /var/run/radattr.$1 | awk '{print $2}'`\n" "if [ ! -z $IN ] && [ $IN -gt 0 ]\n" //Speed limit !0 and !empty "then tc qdisc del root dev $1\n" "\t tc qdisc add dev $1 handle ffff: ingress\n" "\t tc filter add dev $1 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate \"$IN\"kbit burst \"$IN\"kbit drop flowid :1\n" "fi\n" "if [ ! -z $OUT ] && [ $OUT -gt 0 ]\n" "then tc qdisc del dev $1 ingress\n" "\t tc qdisc add dev $1 root tbf rate \"$OUT\"kbit latency 50ms burst \"$OUT\"kbit\n" "fi\n"); fclose(fp); fp = fopen("/tmp/pptpd/ip-down", "w"); fprintf(fp, "#!/bin/sh\n" "grep -v $PPPD_PID /tmp/pptp_connected > /tmp/pptp_connected.tmp\n" "mv /tmp/pptp_connected.tmp /tmp/pptp_connected\n" // calc connected time and volume per peer "CONTIME=$(($CONNECT_TIME+`grep $PEERNAME /tmp/pptp_peer.db | awk '{print $3}'`))\n" "SENT=$(($BYTES_SENT+`grep $PEERNAME /tmp/pptp_peer.db | awk '{print $4}'`))\n" "RCVD=$(($BYTES_RCVD+`grep $PEERNAME /tmp/pptp_peer.db | awk '{print $5}'`))\n" "grep -v $PEERNAME /tmp/ppp_peer.db > /tmp/pptp_peer.db.tmp\n" "mv /tmp/pptp_peer.db.tmp /tmp/pptp_peer.db\n" "echo \"$PEERNAME $CONTIME $SENT $RCVD\" >> /tmp/pptp_peer.db\n" "iptables -D FORWARD -i $1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu\n" "iptables -D INPUT -i $1 -j ACCEPT\n" "iptables -D FORWARD -i $1 -j ACCEPT\n" "iptables -t nat -D PREROUTING -i $1 -p udp -m udp --sport 9 -j DNAT --to-destination %s\n" // rule for wake on lan over pptp tunnel "%s\n", bcast, nvram_get("pptpd_ipdown_script") ? nvram_get("pptpd_ipdown_script") : ""); if (nvram_match("pptpd_radius", "1")) fprintf(fp, "tc qdisc del root dev $1\n" "tc qdisc del ingress dev $1\n"); fclose(fp); chmod("/tmp/pptpd/ip-up", 0744); chmod("/tmp/pptpd/ip-down", 0744); // Exctract chap-secrets from nvram and add the default account with // routers password lpTemp = nvram_safe_get("pptpd_auth"); fp = fopen("/tmp/pptpd/chap-secrets", "w"); // fprintf (fp, "root\t*\t%s\t*\n", nvram_safe_get ("http_passwd")); if (strlen(lpTemp) != 0) fprintf(fp, "%s\n", lpTemp); fclose(fp); chmod("/tmp/pptpd/chap-secrets", 0600); // Execute pptpd daemon ret = eval("pptpd", "-c", "/tmp/pptpd/pptpd.conf", "-o", "/tmp/pptpd/options.pptpd"); dd_syslog(LOG_INFO, "pptpd : pptp daemon successfully started\n"); return; }
static void do_pppoeconfig(FILE * fp) { int nowins = 0; if (nvram_match("wan_wins", "0.0.0.0")) { nvram_set("wan_wins", ""); nowins = 1; } if (strlen(nvram_safe_get("wan_wins")) == 0) nowins = 1; // fprintf (fp, "crtscts\n"); if (nvram_default_match("pppoeserver_bsdcomp", "0", "0")) fprintf(fp, "nobsdcomp\n"); else fprintf(fp, "bsdcomp 12\n"); if (nvram_default_match("pppoeserver_deflate", "0", "0")) fprintf(fp, "nodeflate\n"); else fprintf(fp, "deflate 12\n"); if (nvram_default_match("pppoeserver_lzs", "0", "0")) fprintf(fp, "nolzs\n"); else fprintf(fp, "lzs\n"); if (nvram_default_match("pppoeserver_mppc", "0", "0")) fprintf(fp, "nomppc\n"); else fprintf(fp, "mppc\n"); if (nvram_default_match("pppoeserver_encryption", "1", "0")) fprintf(fp, "require-mppe-128\n"); else fprintf(fp, "nomppe\n"); fprintf(fp, "auth\n" // "endpoint <epdisc>\n" needed 4 ml // "multilink\n" "refuse-eap\n" // be sure using best auth methode "refuse-pap\n" // "refuse-chap\n" //erlauben??? "refuse-mschap\n" // "require-mschap-v2\n" "nopcomp\n" // no protocol field compression //"default-mru\n" "mtu %s\n" "mru %s\n" "default-asyncmap\n" "noipdefault\n" "defaultroute\n" "netmask 255.255.255.255\n" // "ip-up-script /tmp/pppoeserver/ip-up.sh\n" // "ip-down-script /tmp/pppoeserver/ip-down.sh\n" //"lcp-echo-adaptive\n" "lcp-echo-interval %s\n" "lcp-echo-failure %s\n" "idle %s\n", nvram_safe_get("pppoeserver_mtu"), nvram_safe_get("pppoeserver_mru"), nvram_safe_get("pppoeserver_lcpechoint"), nvram_safe_get("pppoeserver_lcpechofail"), nvram_safe_get("pppoeserver_idle")); if (nvram_match("pppoeserver_interface", "br0")) fprintf(fp, "proxyarp\n" "ktune\n"); else fprintf(fp, "noktune\n"); if (!nowins) { fprintf(fp, "ms-wins %s\n", nvram_safe_get("wan_wins")); } struct dns_lists *dns_list = get_dns_list(); /* if (nvram_match("dnsmasq_enable", "1")) { if (strcmp(getifip(), "")) { fprintf(fp, "ms-dns %s\n", getifip()); fprintf(fp, "ms-dns %s\n", dns_list->dns_server[0]); } } else if (nvram_match("local_dns", "1")) { if (dns_list && (strcmp(getifip(), "") || strlen(dns_list->dns_server[0]) > 0 || strlen(dns_list->dns_server[1]) > 0 || strlen(dns_list->dns_server[2]) > 0)) { if (strcmp(getifip(), "")) fprintf(fp, "ms-dns %s\n", getifip()); if (strlen(dns_list->dns_server[0]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[0]); if (strlen(dns_list->dns_server[1]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[1]); if (strlen(dns_list->dns_server[2]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[2]); } } else { if (dns_list && (strlen(dns_list->dns_server[0]) > 0 || strlen(dns_list->dns_server[1]) > 0 || strlen(dns_list->dns_server[2]) > 0)) { */ if (strlen(dns_list->dns_server[0]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[0]); if (strlen(dns_list->dns_server[1]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[1]); if (strlen(dns_list->dns_server[2]) > 0) fprintf(fp, "ms-dns %s\n", dns_list->dns_server[2]); // } // } if (dns_list) free(dns_list); }
static int bound(void) { nvram_unset("dhcpc_done"); char *wan_ifname = safe_getenv("interface"); char *value; static char temp_wan_ipaddr[16], temp_wan_netmask[16], temp_wan_gateway[16]; int changed = 0; static char *cidr; if (nvram_match("wan_proto", "iphone")) stop_process("ipheth-loop", "IPhone Pairing Daemon"); cidr = getenv("cidrroute"); if (cidr && wan_ifname) { char *callbuffer = malloc(strlen(cidr) + 128); sprintf(callbuffer, "export cidrroute=\"%s\";export interface=\"%s\";/etc/cidrroute.sh", cidr, wan_ifname); system(callbuffer); free(callbuffer); } if ((value = getenv("ip"))) { chomp(value); if (nvram_match("wan_proto", "pptp") && nvram_match("pptp_use_dhcp", "1")) strcpy(temp_wan_ipaddr, value); else { if (nvram_invmatch("wan_ipaddr", value)) changed = 1; } nvram_set("wan_ipaddr", value); } if ((value = getenv("subnet"))) { chomp(value); if (nvram_match("wan_proto", "pptp") && nvram_match("pptp_use_dhcp", "1")) strcpy(temp_wan_netmask, value); else { if (nvram_invmatch("wan_netmask", value)) changed = 1; nvram_set("wan_netmask", value); } } if ((value = getenv("router"))) { chomp(value); if (nvram_invmatch("wan_gateway", value)) changed = 1; nvram_set("wan_gateway", value); } if ((value = getenv("dns"))) { chomp(value); // if (nvram_invmatch("wan_get_dns",value)) // changed=1; nvram_set("wan_get_dns", value); } /* * Don't care for linksys spec if ((value = getenv("wins"))) * nvram_set("wan_wins", value); if ((value = getenv("hostname"))) * sethostname(value, strlen(value) + 1); */ if ((value = getenv("domain"))) { chomp(value); if (nvram_invmatch("wan_get_domain", value)) changed = 1; nvram_set("wan_get_domain", value); // HeartBeat need to use } if ((value = getenv("lease"))) { chomp(value); nvram_set("wan_lease", value); expires(atoi(value)); } if (!changed) { cprintf("interface hasnt changed, do nothing\n"); return 0; } stop_firewall(); cprintf("configure to IF[%s] , IP[%s], MASK[%s]\n", wan_ifname, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask")); if (nvram_match("wan_proto", "pptp") && nvram_match("pptp_use_dhcp", "1")) eval("ifconfig", wan_ifname, temp_wan_ipaddr, "netmask", temp_wan_netmask, "up"); else eval("ifconfig", wan_ifname, nvram_safe_get("wan_ipaddr"), "netmask", nvram_safe_get("wan_netmask"), "up"); /* * We only want to exec bellow functions after dhcp get ip if the * wan_proto is heartbeat */ #ifdef HAVE_HEARTBEAT if (nvram_match("wan_proto", "heartbeat")) { int i = 0; /* * Delete all default routes */ while (route_del(wan_ifname, 0, NULL, NULL, NULL) == 0 || i++ < 10) ; /* * Set default route to gateway if specified */ route_add(wan_ifname, 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0"); /* * save dns to resolv.conf */ dns_to_resolv(); stop_udhcpd(); start_udhcpd(); start_firewall(); stop_wland(); start_wshaper(); start_wland(); start_heartbeat_boot(); } #else if (0) { // nothing } #endif #ifdef HAVE_PPTP else if (nvram_match("wan_proto", "pptp") && nvram_match("pptp_use_dhcp", "1")) { char pptpip[64]; struct dns_lists *dns_list = NULL; dns_to_resolv(); dns_list = get_dns_list(); int i = 0; if (dns_list) { for (i = 0; i < dns_list->num_servers; i++) route_add(wan_ifname, 0, dns_list->dns_server[i], nvram_safe_get("wan_gateway"), "255.255.255.255"); free(dns_list); } route_add(wan_ifname, 0, "0.0.0.0", nvram_safe_get("wan_gateway"), "0.0.0.0"); nvram_set("wan_gateway_buf", nvram_get("wan_gateway")); getIPFromName(nvram_safe_get("pptp_server_name"), pptpip); nvram_set("pptp_server_ip", pptpip); // Add the route to the PPTP server on the wan interface for pptp // client to reach it if (nvram_match("wan_gateway", "0.0.0.0") || nvram_match("wan_netmask", "0.0.0.0")) route_add(wan_ifname, 0, nvram_safe_get("pptp_server_ip"), nvram_safe_get("wan_gateway"), "255.255.255.255"); else route_add(wan_ifname, 0, nvram_safe_get("pptp_server_ip"), nvram_safe_get("wan_gateway"), nvram_safe_get("wan_netmask")); } #endif #ifdef HAVE_L2TP else if (nvram_match("wan_proto", "l2tp")) { char l2tpip[64]; struct dns_lists *dns_list = NULL; dns_to_resolv(); dns_list = get_dns_list(); int i = 0; if (dns_list) { for (i = 0; i < dns_list->num_servers; i++) route_add(wan_ifname, 0, dns_list->dns_server[i], nvram_safe_get("wan_gateway"), "255.255.255.255"); free(dns_list); } /* * Backup the default gateway. It should be used if L2TP connection * is broken */ nvram_set("wan_gateway_buf", nvram_get("wan_gateway")); getIPFromName(nvram_safe_get("l2tp_server_name"), l2tpip); nvram_set("l2tp_server_ip", l2tpip); route_add(wan_ifname, 0, nvram_safe_get("l2tp_server_ip"), nvram_safe_get("wan_gateway"), "255.255.255.255"); start_firewall(); start_l2tp_boot(); } #endif else { cprintf("start wan done\n"); start_wan_done(wan_ifname); } nvram_set("dhcpc_done", "1"); cprintf("done\n"); return 0; }
void start_pptp(int status) { int ret; FILE *fp; char *pptp_argv[] = { "pppd", NULL }; char username[80], passwd[80]; stop_dhcpc(); #ifdef HAVE_PPPOE stop_pppoe(); #endif stop_vpn_modules(); snprintf(username, sizeof(username), "%s", nvram_safe_get("ppp_username")); snprintf(passwd, sizeof(passwd), "%s", nvram_safe_get("ppp_passwd")); if (status != REDIAL) { create_pptp_config(nvram_safe_get("pptp_server_name"), username); /* * Generate pap-secrets file */ if (!(fp = fopen("/tmp/ppp/pap-secrets", "w"))) { perror("/tmp/ppp/pap-secrets"); return; } fprintf(fp, "\"%s\" * \"%s\" *\n", username, passwd); fclose(fp); chmod("/tmp/ppp/pap-secrets", 0600); /* * Generate chap-secrets file */ if (!(fp = fopen("/tmp/ppp/chap-secrets", "w"))) { perror("/tmp/ppp/chap-secrets"); return; } fprintf(fp, "\"%s\" * \"%s\" *\n", username, passwd); fclose(fp); chmod("/tmp/ppp/chap-secrets", 0600); /* * Enable Forwarding */ if ((fp = fopen("/proc/sys/net/ipv4/ip_forward", "r+"))) { fputc('1', fp); fclose(fp); } else perror("/proc/sys/net/ipv4/ip_forward"); } char *wan_ifname = nvram_safe_get("wan_ifname"); if (isClient()) { wan_ifname = getSTA(); } nvram_set("pptp_ifname", wan_ifname); /* * Bring up WAN interface */ if (nvram_match("pptp_use_dhcp", "1")) { // pid_t pid; // char *wan_ipaddr; // char *wan_netmask; // char *wan_gateway; // char *pptp_server_ip = nvram_safe_get ("pptp_server_ip"); // char *wan_hostname = nvram_safe_get ("wan_hostname"); nvram_set("wan_get_dns", ""); nvram_unset("dhcpc_done"); //dirty hack start_dhcpc(wan_ifname, NULL, NULL, 1); int timeout; for (timeout = 60; !nvram_match("dhcpc_done", "1") && timeout > 0; --timeout) { /* wait for info from dhcp server */ sleep(1); } stop_dhcpc(); /* we don't need dhcp client anymore */ create_pptp_config(nvram_safe_get("pptp_server_ip"), username); } else { ifconfig(wan_ifname, IFUP, nvram_safe_get("wan_ipaddr"), nvram_safe_get("wan_netmask")); struct dns_lists *dns_list = NULL; dns_to_resolv(); dns_list = get_dns_list(); int i = 0; if (dns_list) { for (i = 0; i < dns_list->num_servers; i++) route_add(wan_ifname, 0, dns_list->dns_server[i], nvram_safe_get("pptp_wan_gateway"), "255.255.255.255"); } route_add(wan_ifname, 0, "0.0.0.0", nvram_safe_get("pptp_wan_gateway"), "0.0.0.0"); char pptpip[64]; getIPFromName(nvram_safe_get("pptp_server_name"), pptpip); route_del(wan_ifname, 0, "0.0.0.0", nvram_safe_get("pptp_wan_gateway"), "0.0.0.0"); if (dns_list) { for (i = 0; i < dns_list->num_servers; i++) route_del(wan_ifname, 0, dns_list->dns_server[i], nvram_safe_get("pptp_wan_gateway"), "255.255.255.255"); free(dns_list); } nvram_set("pptp_server_ip", pptpip); if (!nvram_match("pptp_wan_gateway", "0.0.0.0")) route_add(wan_ifname, 0, nvram_safe_get("pptp_server_ip"), nvram_safe_get("pptp_wan_gateway"), "255.255.255.255"); } ret = _evalpid(pptp_argv, NULL, 0, NULL); if (nvram_match("ppp_demand", "1")) { /* * Trigger Connect On Demand if user press Connect button in Status * page */ if (nvram_match("action_service", "start_pptp") || nvram_match("action_service", "start_l2tp")) { start_force_to_dial(); // force_to_dial(nvram_safe_get("action_service")); nvram_unset("action_service"); } /* * Trigger Connect On Demand if user ping pptp server */ else { eval("listen", nvram_safe_get("lan_ifname")); } } stop_wland(); start_wshaper(); start_wland(); cprintf("done\n"); return; }
void start_dnsmasq(void) { FILE *fp; struct dns_lists *dns_list = NULL; int ret; int i; if (nvram_match("dhcp_dnsmasq", "1") && nvram_match("lan_proto", "dhcp") && nvram_match("dnsmasq_enable", "0")) { nvram_set("dnsmasq_enable", "1"); nvram_commit(); } if (!nvram_invmatch("dnsmasq_enable", "0")) { stop_dnsmasq(); return; } usejffs = 0; if (nvram_match("dhcpd_usejffs", "1")) { if (!(fp = fopen("/jffs/dnsmasq.leases", "a"))) { usejffs = 0; } else { fclose(fp); usejffs = 1; } } /* * Write configuration file based on current information */ if (!(fp = fopen("/tmp/dnsmasq.conf", "w"))) { perror("/tmp/dnsmasq.conf"); return; } // fprintf(fp, "bind-interfaces\n"); if (nvram_match("chilli_enable", "1")) { if (canlan()) fprintf(fp, "interface=%s", get_wdev()); else fprintf(fp, "interface=%s,", get_wdev()); } else if (nvram_match("pptpd_enable", "1")) { if (canlan()) fprintf(fp, "listen-address=%s,%s", "127.0.0.1", nvram_safe_get("lan_ipaddr")); else fprintf(fp, "listen-address=%s", "127.0.0.1"); } else { if (canlan()) fprintf(fp, "interface=%s", nvram_safe_get("lan_ifname")); else fprintf(fp, "interface="); } int mdhcpcount = 0; if (nvram_get("mdhcpd_count") != NULL) { mdhcpcount = atoi(nvram_safe_get("mdhcpd_count")); for (i = 0; i < mdhcpcount; i++) { if (strlen(nvram_nget("%s_ipaddr", getmdhcp(0, i))) == 0 || strlen(nvram_nget("%s_netmask", getmdhcp(0, i))) == 0) continue; if (canlan() || i > 0) { if (nvram_match("pptpd_enable", "1")) fprintf(fp, ",%s", nvram_nget("%s_ipaddr", getmdhcp(0, i))); else fprintf(fp, ",%s", getmdhcp(0, i)); } else { if (nvram_match("pptpd_enable", "1")) fprintf(fp, "%s", nvram_nget("%s_ipaddr", getmdhcp(0, i))); else fprintf(fp, "%s", getmdhcp(0, i)); } } } fprintf(fp, "\n"); fprintf(fp, "resolv-file=/tmp/resolv.dnsmasq\n" "all-servers\n"); // /* * Domain */ if (nvram_match("dhcp_domain", "wan")) { if (nvram_invmatch("wan_domain", "")) fprintf(fp, "domain=%s\n", nvram_safe_get("wan_domain")); else if (nvram_invmatch("wan_get_domain", "")) fprintf(fp, "domain=%s\n", nvram_safe_get("wan_get_domain")); } else { if (nvram_invmatch("lan_domain", "")) fprintf(fp, "domain=%s\n", nvram_safe_get("lan_domain")); } /* * DD-WRT use dnsmasq as DHCP replacement */ //bs mod if (hasdhcp()) { /* * DHCP leasefile */ if (nvram_match("dhcpd_usenvram", "1")) { fprintf(fp, "leasefile-ro\n"); fprintf(fp, "dhcp-script=%s\n", "/etc/lease_update.sh"); } else { if (usejffs) fprintf(fp, "dhcp-leasefile=/jffs/dnsmasq.leases\n"); else fprintf(fp, "dhcp-leasefile=/tmp/dnsmasq.leases\n"); } int dhcp_max = 0; if (landhcp()) dhcp_max += atoi(nvram_safe_get("dhcp_num")) + atoi(nvram_safe_get("static_leasenum")); for (i = 0; i < mdhcpcount; i++) { if (strlen(nvram_nget("%s_ipaddr", getmdhcp(0, i))) == 0 || strlen(nvram_nget("%s_netmask", getmdhcp(0, i))) == 0) continue; dhcp_max += atoi(getmdhcp(3, i)); } fprintf(fp, "dhcp-lease-max=%d\n", dhcp_max); if (landhcp()) fprintf(fp, "dhcp-option=lan,3,%s\n", nvram_safe_get("lan_ipaddr")); for (i = 0; i < mdhcpcount; i++) { if (strlen(nvram_nget("%s_ipaddr", getmdhcp(0, i))) == 0 || strlen(nvram_nget("%s_netmask", getmdhcp(0, i))) == 0) continue; fprintf(fp, "dhcp-option=%s,3,", getmdhcp(0, i)); fprintf(fp, "%s\n", nvram_nget("%s_ipaddr", getmdhcp(0, i))); } if (nvram_invmatch("wan_wins", "") && nvram_invmatch("wan_wins", "0.0.0.0")) fprintf(fp, "dhcp-option=44,%s\n", nvram_safe_get("wan_wins")); if (nvram_match("dns_dnsmasq", "0")) { dns_list = get_dns_list(); if (dns_list && (strlen(dns_list->dns_server[0]) > 0 || strlen(dns_list->dns_server[1]) > 0 || strlen(dns_list->dns_server[2]) > 0)) { fprintf(fp, "dhcp-option=6"); if (strlen(dns_list->dns_server[0]) > 0) fprintf(fp, ",%s", dns_list->dns_server[0]); if (strlen(dns_list->dns_server[1]) > 0) fprintf(fp, ",%s", dns_list->dns_server[1]); if (strlen(dns_list->dns_server[2]) > 0) fprintf(fp, ",%s", dns_list->dns_server[2]); fprintf(fp, "\n"); } if (dns_list) free(dns_list); } if (nvram_match("auth_dnsmasq", "1")) fprintf(fp, "dhcp-authoritative\n"); if (landhcp()) { fprintf(fp, "dhcp-range=lan,"); fprintf(fp, "%d.%d.%d.%s,", get_single_ip(nvram_safe_get("lan_ipaddr"), 0), get_single_ip(nvram_safe_get("lan_ipaddr"), 1), get_single_ip(nvram_safe_get("lan_ipaddr"), 2), nvram_safe_get("dhcp_start")); if (nvram_match("dhcp_num", "0")) { fprintf(fp, "static,"); } else { fprintf(fp, "%d.%d.%d.%d,", get_single_ip(nvram_safe_get ("lan_ipaddr"), 0), get_single_ip(nvram_safe_get ("lan_ipaddr"), 1), get_single_ip(nvram_safe_get ("lan_ipaddr"), 2), atoi(nvram_safe_get("dhcp_start")) + atoi(nvram_safe_get("dhcp_num")) - 1); } fprintf(fp, "%s,", nvram_safe_get("lan_netmask")); fprintf(fp, "%sm\n", nvram_safe_get("dhcp_lease")); } for (i = 0; i < mdhcpcount; i++) { if (strcmp(getmdhcp(1, i), "On")) continue; if (strlen(nvram_nget("%s_ipaddr", getmdhcp(0, i))) == 0 || strlen(nvram_nget("%s_netmask", getmdhcp(0, i))) == 0) continue; fprintf(fp, "dhcp-range=%s,", getmdhcp(0, i)); fprintf(fp, "%d.%d.%d.", get_single_ip(nvram_nget ("%s_ipaddr", getmdhcp(0, i)), 0), get_single_ip(nvram_nget ("%s_ipaddr", getmdhcp(0, i)), 1), get_single_ip(nvram_nget ("%s_ipaddr", getmdhcp(0, i)), 2)); fprintf(fp, "%s,", getmdhcp(2, i)); fprintf(fp, "%d.%d.%d.", get_single_ip(nvram_nget ("%s_ipaddr", getmdhcp(0, i)), 0), get_single_ip(nvram_nget ("%s_ipaddr", getmdhcp(0, i)), 1), get_single_ip(nvram_nget ("%s_ipaddr", getmdhcp(0, i)), 2)); int end = atoi(getmdhcp(2, i)); end += atoi(getmdhcp(3, i)); fprintf(fp, "%d,", end); fprintf(fp, "%s,", nvram_nget("%s_netmask", getmdhcp(0, i))); fprintf(fp, "%sm\n", getmdhcp(4, i)); } int leasenum = atoi(nvram_safe_get("static_leasenum")); if (leasenum > 0) { char *lease = nvram_safe_get("static_leases"); char *leasebuf = (char *)malloc(strlen(lease) + 1); char *cp = leasebuf; strcpy(leasebuf, lease); for (i = 0; i < leasenum; i++) { char *mac = strsep(&leasebuf, "="); char *host = strsep(&leasebuf, "="); char *ip = strsep(&leasebuf, "="); char *time = strsep(&leasebuf, " "); if (mac == NULL || host == NULL || ip == NULL) continue; if (!time || strlen(time) == 0) fprintf(fp, "dhcp-host=%s,%s,%s,infinite\n", mac, host, ip); else fprintf(fp, "dhcp-host=%s,%s,%s,%sm\n", mac, host, ip, time); addHost(host, ip); } free(cp); } } /* stop dns rebinding for private addresses */ if (nvram_match("dnsmasq_no_dns_rebind", "1")) { fprintf(fp, "stop-dns-rebind\n"); } /* * Additional options */ if (nvram_invmatch("dnsmasq_options", "")) { fwritenvram("dnsmasq_options", fp); } fclose(fp); dns_to_resolv(); chmod("/etc/lease_update.sh", 0700); ret = eval("dnsmasq", "--conf-file=/tmp/dnsmasq.conf"); dd_syslog(LOG_INFO, "dnsmasq : dnsmasq daemon successfully started\n"); cprintf("done\n"); return; }
void ej_nvram_status_get(webs_t wp, int argc, char_t ** argv) { char *type; char *wan_ipaddr, *wan_netmask, *wan_gateway; char *status1 = "", *status2 = "", *hidden1, *hidden2, *button1 = ""; char *wan_proto = nvram_safe_get("wan_proto"); struct dns_lists *dns_list = NULL; int wan_link = check_wan_link(0); int trans = 0; ejArgs(argc, argv, "%s %d", &type, &trans); if (!strcmp(wan_proto, "pptp")) { wan_ipaddr = wan_link ? nvram_safe_get("pptp_get_ip") : nvram_safe_get("wan_ipaddr"); wan_netmask = wan_link ? nvram_safe_get("wan_netmask") : nvram_safe_get("wan_netmask"); wan_gateway = wan_link ? nvram_safe_get("wan_gateway") : nvram_safe_get("pptp_server_ip"); } else if (!strcmp(wan_proto, "pppoe") #ifdef HAVE_PPPOEDUAL || !strcmp(wan_proto, "pppoe_dual") #endif #ifdef HAVE_PPPOATM || !strcmp(wan_proto, "pppoa") #endif #ifdef HAVE_3G || !strcmp(wan_proto, "3g") #endif #ifdef HAVE_IPETH || !strcmp(wan_proto, "iphone") #endif ) { wan_ipaddr = wan_link ? nvram_safe_get("wan_ipaddr") : "0.0.0.0"; wan_netmask = wan_link ? nvram_safe_get("wan_netmask") : "0.0.0.0"; wan_gateway = wan_link ? nvram_safe_get("wan_gateway") : "0.0.0.0"; } #ifdef HAVE_L2TP else if (!strcmp(wan_proto, "l2tp")) { wan_ipaddr = wan_link ? nvram_safe_get("l2tp_get_ip") : nvram_safe_get("wan_ipaddr"); wan_netmask = wan_link ? nvram_safe_get("wan_netmask") : nvram_safe_get("wan_netmask"); wan_gateway = wan_link ? nvram_safe_get("wan_gateway") : nvram_safe_get("wan_gateway"); } #endif else { wan_ipaddr = nvram_safe_get("wan_ipaddr"); wan_gateway = nvram_safe_get("wan_gateway"); wan_netmask = nvram_safe_get("wan_netmask"); } dns_list = get_dns_list(); if (!strcmp(wan_proto, "pppoe") || !strcmp(wan_proto, "pptp") #ifdef HAVE_PPPOEDUAL || !strcmp(wan_proto, "pppoe_dual") #endif #ifdef HAVE_3G || !strcmp(wan_proto, "3g") #endif #ifdef HAVE_IPETH || !strcmp(wan_proto, "iphone") #endif #ifdef HAVE_PPPOATM || !strcmp(wan_proto, "pppoa") #endif #ifdef HAVE_L2TP || !strcmp(wan_proto, "l2tp") #endif || !strcmp(wan_proto, "heartbeat")) { hidden1 = ""; hidden2 = ""; if (wan_link == 0) { // submit_button old format is "Connect", new format is // "Connect_pppoe" or "Connect_pptp" or "Connect_heartbeat" // if(submit_type && !strncmp(submit_type,"Connect",7) && // retry_count != -1){ if (retry_count != -1) { status1 = "share.statu"; status2 = "share.connecting"; if (trans) button1 = "share.disconnect"; else button1 = "Disconnect"; } else { status1 = "share.statu"; status2 = "share.disconnected"; if (trans) button1 = "share.connect"; else button1 = "Connect"; } } else { retry_count = -1; status1 = "share.statu"; status2 = "share.connected"; if (trans) button1 = "share.disconnect"; else button1 = "Disconnect"; } } else { status1 = "share.disable"; // only for nonbrand status2 = " "; hidden1 = "<!--"; hidden2 = "-->"; } if (!strcmp(type, "wan_ipaddr")) { if (getWET() || !strcmp(wan_proto, "disabled")) { websWrite(wp, "%s", live_translate("share.disabled")); } else websWrite(wp, "%s", wan_ipaddr); } else if (!strcmp(type, "wan_netmask")) websWrite(wp, "%s", wan_netmask); else if (!strcmp(type, "wan_gateway")) websWrite(wp, "%s", wan_gateway); else if (!strcmp(type, "wan_dns0")) { if (dns_list) websWrite(wp, "%s", dns_list->dns_server[0]); } else if (!strcmp(type, "wan_dns1")) { if (dns_list) websWrite(wp, "%s", dns_list->dns_server[1]); } else if (!strcmp(type, "wan_dns2")) { if (dns_list) websWrite(wp, "%s", dns_list->dns_server[2]); } else if (!strcmp(type, "status1")) websWrite(wp, "%s", live_translate(status1)); else if (!strcmp(type, "status2")) websWrite(wp, "%s", live_translate(status2)); else if (!strcmp(type, "button1")) { if (trans) websWrite(wp, "%s", live_translate(button1)); else websWrite(wp, "%s", button1); } else if (!strcmp(type, "hidden1")) websWrite(wp, "%s", hidden1); else if (!strcmp(type, "hidden2")) websWrite(wp, "%s", hidden2); else if (!strcmp(type, "wan_3g_signal")) websWrite(wp, "-40 DBm"); if (dns_list) free(dns_list); return; }