nas/net restart tweaks
[tomato.git] / release / src / router / rc / services.c
blob67f698d8e6ee7ad4cf4cc607c866cf62518712d4
1 /*
3 Copyright 2003, CyberTAN Inc. All Rights Reserved
5 This is UNPUBLISHED PROPRIETARY SOURCE CODE of CyberTAN Inc.
6 the contents of this file may not be disclosed to third parties,
7 copied or duplicated in any form without the prior written
8 permission of CyberTAN Inc.
10 This software should be used as a reference only, and it not
11 intended for production use!
13 THIS SOFTWARE IS OFFERED "AS IS", AND CYBERTAN GRANTS NO WARRANTIES OF ANY
14 KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. CYBERTAN
15 SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
16 FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE
21 Copyright 2005, Broadcom Corporation
22 All Rights Reserved.
24 THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
25 KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
26 SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
27 FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
32 Modified for Tomato Firmware
33 Portions, Copyright (C) 2006-2009 Jonathan Zarate
36 #include "rc.h"
38 #include <arpa/inet.h>
39 #include <time.h>
40 #include <sys/time.h>
41 #include <errno.h>
43 // !!TB
44 #include <sys/mount.h>
45 #include <mntent.h>
46 #include <dirent.h>
48 #define IFUP (IFF_UP | IFF_RUNNING | IFF_BROADCAST | IFF_MULTICAST)
49 #define sin_addr(s) (((struct sockaddr_in *)(s))->sin_addr)
51 // -----------------------------------------------------------------------------
53 static const char dmhosts[] = "/etc/hosts.dnsmasq";
54 static const char dmresolv[] = "/etc/resolv.dnsmasq";
55 static const char dmpid[] = "/var/run/dnsmasq.pid";
57 static pid_t pid_dnsmasq = -1;
60 void start_dnsmasq()
62 FILE *f;
63 const char *nv;
64 char buf[512];
65 char lan[24];
66 const char *router_ip;
67 const char *lan_ifname;
68 char sdhcp_lease[32];
69 char *e;
70 int n;
71 char *mac, *ip, *name;
72 char *p;
73 int ipn;
74 char ipbuf[32];
75 FILE *hf;
76 int dhcp_start;
77 int dhcp_count;
78 int dhcp_lease;
79 int do_dhcpd;
80 int do_dns;
82 TRACE_PT("begin\n");
84 if (getpid() != 1) {
85 start_service("dnsmasq");
86 return;
89 stop_dnsmasq();
91 if (nvram_match("wl_mode", "wet")) return;
92 if ((f = fopen("/etc/dnsmasq.conf", "w")) == NULL) return;
94 lan_ifname = nvram_safe_get("lan_ifname");
95 router_ip = nvram_safe_get("lan_ipaddr");
96 strlcpy(lan, router_ip, sizeof(lan));
97 if ((p = strrchr(lan, '.')) != NULL) *(p + 1) = 0;
99 fprintf(f,
100 "pid-file=%s\n"
101 "interface=%s\n",
102 dmpid, lan_ifname);
103 if (((nv = nvram_get("wan_domain")) != NULL) || ((nv = nvram_get("wan_get_domain")) != NULL)) {
104 if (*nv) fprintf(f, "domain=%s\n", nv);
107 // dns
108 const dns_list_t *dns = get_dns(); // this always points to a static buffer
110 if (((nv = nvram_get("dns_minport")) != NULL) && (*nv)) n = atoi(nv);
111 else n = 4096;
112 fprintf(f,
113 "resolv-file=%s\n" // the real stuff is here
114 "addn-hosts=%s\n" // "
115 "expand-hosts\n" // expand hostnames in hosts file
116 "min-port=%u\n", // min port used for random src port
117 dmresolv, dmhosts, n);
118 do_dns = nvram_match("dhcpd_dmdns", "1");
120 for (n = 0 ; n < dns->count; ++n) {
121 if (dns->dns[n].port != 53) {
122 fprintf(f, "server=%s#%u\n", inet_ntoa(dns->dns[n].addr), dns->dns[n].port);
127 // dhcp
128 do_dhcpd = nvram_match("lan_proto", "dhcp");
129 if (do_dhcpd) {
130 dhcp_lease = nvram_get_int("dhcp_lease");
131 if (dhcp_lease <= 0) dhcp_lease = 1440;
133 if ((e = nvram_get("dhcpd_slt")) != NULL) n = atoi(e); else n = 0;
134 if (n < 0) strcpy(sdhcp_lease, "infinite");
135 else sprintf(sdhcp_lease, "%dm", (n > 0) ? n : dhcp_lease);
137 if (!do_dns) {
138 // if not using dnsmasq for dns
140 if ((dns->count == 0) && (nvram_get_int("dhcpd_llndns"))) {
141 // no DNS might be temporary. use a low lease time to force clients to update.
142 dhcp_lease = 2;
143 strcpy(sdhcp_lease, "2m");
144 do_dns = 1;
146 else {
147 // pass the dns directly
148 buf[0] = 0;
149 for (n = 0 ; n < dns->count; ++n) {
150 if (dns->dns[n].port == 53) { // check: option 6 doesn't seem to support other ports
151 sprintf(buf + strlen(buf), ",%s", inet_ntoa(dns->dns[n].addr));
154 fprintf(f, "dhcp-option=6%s\n", buf);
158 if ((p = nvram_get("dhcpd_startip")) && (*p) && (e = nvram_get("dhcpd_endip")) && (*e)) {
159 fprintf(f, "dhcp-range=%s,%s,%s,%dm\n", p, e, nvram_safe_get("lan_netmask"), dhcp_lease);
161 else {
162 // for compatibility
163 dhcp_start = nvram_get_int("dhcp_start");
164 dhcp_count = nvram_get_int("dhcp_num");
165 fprintf(f, "dhcp-range=%s%d,%s%d,%s,%dm\n",
166 lan, dhcp_start, lan, dhcp_start + dhcp_count - 1, nvram_safe_get("lan_netmask"), dhcp_lease);
169 nv = router_ip;
170 if ((nvram_get_int("dhcpd_gwmode") == 1) && (get_wan_proto() == WP_DISABLED)) {
171 p = nvram_safe_get("lan_gateway");
172 if ((*p) && (strcmp(p, "0.0.0.0") != 0)) nv = p;
175 n = nvram_get_int("dhcpd_lmax");
176 fprintf(f,
177 "dhcp-option=3,%s\n" // gateway
178 "dhcp-lease-max=%d\n",
180 (n > 0) ? n : 255);
182 if (nvram_get_int("dhcpd_auth") >= 0) {
183 fprintf(f, "dhcp-authoritative\n");
186 if (((nv = nvram_get("wan_wins")) != NULL) && (*nv) && (strcmp(nv, "0.0.0.0") != 0)) {
187 fprintf(f, "dhcp-option=44,%s\n", nv);
189 #ifdef TCONFIG_SAMBASRV
190 else if (nvram_get_int("smbd_enable") && nvram_invmatch("lan_hostname", "") && nvram_get_int("smbd_wins")) {
191 if ((nv == NULL) || (*nv == 0) || (strcmp(nv, "0.0.0.0") == 0)) {
192 // Samba will serve as a WINS server
193 fprintf(f, "dhcp-option=44,0.0.0.0\n");
196 #endif
198 else {
199 fprintf(f, "no-dhcp-interface=%s\n", lan_ifname);
202 // write static lease entries & create hosts file
204 if ((hf = fopen(dmhosts, "w")) != NULL) {
205 if (((nv = nvram_get("wan_hostname")) != NULL) && (*nv))
206 fprintf(hf, "%s %s\n", router_ip, nv);
207 #ifdef TCONFIG_SAMBASRV
208 else if (((nv = nvram_get("lan_hostname")) != NULL) && (*nv))
209 fprintf(hf, "%s %s\n", router_ip, nv);
210 #endif
213 // 00:aa:bb:cc:dd:ee<123<xxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 53 w/ delim
214 // 00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 85 w/ delim
215 // 00:aa:bb:cc:dd:ee,00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 106 w/ delim
216 p = nvram_safe_get("dhcpd_static");
217 while ((e = strchr(p, '>')) != NULL) {
218 n = (e - p);
219 if (n > 105) {
220 p = e + 1;
221 continue;
224 strncpy(buf, p, n);
225 buf[n] = 0;
226 p = e + 1;
228 if ((e = strchr(buf, '<')) == NULL) continue;
229 *e = 0;
230 mac = buf;
232 ip = e + 1;
233 if ((e = strchr(ip, '<')) == NULL) continue;
234 *e = 0;
235 if (strchr(ip, '.') == NULL) {
236 ipn = atoi(ip);
237 if ((ipn <= 0) || (ipn > 255)) continue;
238 sprintf(ipbuf, "%s%d", lan, ipn);
239 ip = ipbuf;
241 else {
242 if (inet_addr(ip) == INADDR_NONE) continue;
245 name = e + 1;
247 if ((hf) && (*name != 0)) {
248 fprintf(hf, "%s %s\n", ip, name);
251 if ((do_dhcpd) && (*mac != 0) && (strcmp(mac, "00:00:00:00:00:00") != 0)) {
252 fprintf(f, "dhcp-host=%s,%s,%s\n", mac, ip, sdhcp_lease);
256 if (hf) fclose(hf);
260 #ifdef TCONFIG_OPENVPN
261 write_vpn_dnsmasq_config(f);
262 #endif
264 fprintf(f, "%s\n\n", nvram_safe_get("dnsmasq_custom"));
266 fappend(f, "/etc/dnsmasq.custom");
270 fclose(f);
272 if (do_dns) {
273 unlink("/etc/resolv.conf");
274 symlink("/rom/etc/resolv.conf", "/etc/resolv.conf"); // nameserver 127.0.0.1
277 TRACE_PT("run dnsmasq\n");
279 eval("dnsmasq");
281 if (!nvram_contains_word("debug_norestart", "dnsmasq")) {
282 f_read_string(dmpid, buf, sizeof(buf));
283 pid_dnsmasq = atol(buf);
286 TRACE_PT("end\n");
289 void stop_dnsmasq(void)
291 TRACE_PT("begin\n");
293 if (getpid() != 1) {
294 stop_service("dnsmasq");
295 return;
298 pid_dnsmasq = -1;
300 unlink("/etc/resolv.conf");
301 symlink(dmresolv, "/etc/resolv.conf");
303 killall_tk("dnsmasq");
305 TRACE_PT("end\n");
308 void clear_resolv(void)
310 f_write(dmresolv, NULL, 0, 0, 0); // blank
313 void dns_to_resolv(void)
315 FILE *f;
316 const dns_list_t *dns;
317 int i;
318 mode_t m;
320 m = umask(022); // 077 from pppoecd
321 if ((f = fopen(dmresolv, "w")) != NULL) {
322 // Check for VPN DNS entries
323 if (!write_vpn_resolv(f)) {
324 dns = get_dns(); // static buffer
325 if (dns->count == 0) {
326 // Put a pseudo DNS IP to trigger Connect On Demand
327 if ((nvram_match("ppp_demand", "1")) &&
328 (nvram_match("wan_proto", "pppoe") || nvram_match("wan_proto", "pptp") || nvram_match("wan_proto", "l2tp"))) {
329 fprintf(f, "nameserver 1.1.1.1\n");
332 else {
333 for (i = 0; i < dns->count; i++) {
334 if (dns->dns[i].port == 53) { // resolv.conf doesn't allow for an alternate port
335 fprintf(f, "nameserver %s\n", inet_ntoa(dns->dns[i].addr));
340 fclose(f);
342 umask(m);
345 // -----------------------------------------------------------------------------
347 void start_httpd(void)
349 chdir("/www");
350 if (!nvram_match("http_enable", "0")) {
351 xstart("httpd");
353 if (!nvram_match("https_enable", "0")) {
354 xstart("httpd", "-s");
356 chdir("/");
359 void stop_httpd(void)
361 killall_tk("httpd");
364 // -----------------------------------------------------------------------------
366 void start_upnp(void)
368 if (get_wan_proto() == WP_DISABLED) return;
370 int enable;
371 FILE *f;
372 int upnp_port;
374 if (((enable = nvram_get_int("upnp_enable")) & 3) != 0) {
375 mkdir("/etc/upnp", 0777);
376 if (f_exists("/etc/upnp/config.alt")) {
377 xstart("miniupnpd", "-f", "/etc/upnp/config.alt");
379 else {
380 if ((f = fopen("/etc/upnp/config", "w")) != NULL) {
381 upnp_port = nvram_get_int("upnp_port");
382 if ((upnp_port < 0) || (upnp_port >= 0xFFFF)) upnp_port = 0;
384 char *lanip = nvram_safe_get("lan_ipaddr");
385 char *lanmask = nvram_safe_get("lan_netmask");
387 fprintf(f,
388 "ext_ifname=%s\n"
389 "listening_ip=%s/%s\n"
390 "port=%d\n"
391 "enable_upnp=%s\n"
392 "enable_natpmp=%s\n"
393 "secure_mode=%s\n"
394 "upnp_forward_chain=upnp\n"
395 "upnp_nat_chain=upnp\n"
396 "notify_interval=%d\n"
397 "system_uptime=yes\n"
398 "\n"
400 nvram_safe_get("wan_iface"),
401 lanip, lanmask,
402 upnp_port,
403 (enable & 1) ? "yes" : "no", // upnp enable
404 (enable & 2) ? "yes" : "no", // natpmp enable
405 nvram_get_int("upnp_secure") ? "yes" : "no", // secure_mode (only forward to self)
406 nvram_get_int("upnp_ssdp_interval")
409 if (nvram_get_int("upnp_clean")) {
410 int interval = nvram_get_int("upnp_clean_interval");
411 if (interval < 60) interval = 60;
412 fprintf(f,
413 "clean_ruleset_interval=%d\n"
414 "clean_ruleset_threshold=%d\n",
415 interval,
416 nvram_get_int("upnp_clean_threshold")
419 else
420 fprintf(f,"clean_ruleset_interval=0\n");
422 if (nvram_match("upnp_mnp", "1")) {
423 int https = nvram_get_int("https_enable");
424 fprintf(f, "presentation_url=http%s://%s:%s/forward-upnp.asp\n",
425 https ? "s" : "", lanip,
426 nvram_safe_get(https ? "https_lanport" : "http_lanport"));
428 else {
429 // Empty parameters are not included into XML service description
430 fprintf(f, "presentation_url=\n");
433 char uuid[45];
434 f_read_string("/proc/sys/kernel/random/uuid", uuid, sizeof(uuid));
435 fprintf(f, "uuid=%s\n", uuid);
437 int ports[4];
438 if ((ports[0] = nvram_get_int("upnp_min_port_int")) > 0 &&
439 (ports[1] = nvram_get_int("upnp_max_port_int")) > 0 &&
440 (ports[2] = nvram_get_int("upnp_min_port_ext")) > 0 &&
441 (ports[3] = nvram_get_int("upnp_max_port_ext")) > 0) {
442 fprintf(f,
443 "allow %d-%d %s/%s %d-%d\n",
444 ports[0], ports[1],
445 lanip, lanmask,
446 ports[2], ports[3]
449 else {
450 // by default allow only redirection of ports above 1024
451 fprintf(f, "allow 1024-65535 %s/%s 1024-65535\n", lanip, lanmask);
454 fappend(f, "/etc/upnp/config.custom");
455 fprintf(f, "\ndeny 0-65535 0.0.0.0/0 0-65535\n");
456 fclose(f);
458 xstart("miniupnpd", "-f", "/etc/upnp/config");
464 void stop_upnp(void)
466 killall_tk("miniupnpd");
469 // -----------------------------------------------------------------------------
471 static pid_t pid_crond = -1;
473 void start_cron(void)
475 char *argv[] = { "crond", "-l", "9", NULL };
477 stop_cron();
479 if (nvram_contains_word("log_events", "crond")) argv[1] = NULL;
480 _eval(argv, NULL, 0, NULL);
481 if (!nvram_contains_word("debug_norestart", "crond")) {
482 pid_crond = -2;
487 void stop_cron(void)
489 pid_crond = -1;
490 killall_tk("crond");
493 // -----------------------------------------------------------------------------
494 #ifdef LINUX26
496 static pid_t pid_hotplug2 = -1;
498 void start_hotplug2()
500 stop_hotplug2();
502 f_write_string("/proc/sys/kernel/hotplug", "", FW_NEWLINE, 0);
503 xstart("hotplug2", "--persistent", "--no-coldplug");
504 sleep(1);
506 if (!nvram_contains_word("debug_norestart", "hotplug2")) {
507 pid_hotplug2 = -2;
511 void stop_hotplug2(void)
513 pid_hotplug2 = -1;
514 killall_tk("hotplug2");
517 #endif /* LINUX26 */
518 // -----------------------------------------------------------------------------
520 // Written by Sparq in 2002/07/16
521 void start_zebra(void)
523 #ifdef TCONFIG_ZEBRA
524 FILE *fp;
526 char *lan_tx = nvram_safe_get("dr_lan_tx");
527 char *lan_rx = nvram_safe_get("dr_lan_rx");
528 char *wan_tx = nvram_safe_get("dr_wan_tx");
529 char *wan_rx = nvram_safe_get("dr_wan_rx");
531 if ((*lan_tx == '0') && (*lan_rx == '0') && (*wan_tx == '0') && (*wan_rx == '0')) {
532 return;
535 // empty
536 if ((fp = fopen("/etc/zebra.conf", "w")) != NULL) {
537 fclose(fp);
541 if ((fp = fopen("/etc/ripd.conf", "w")) != NULL) {
542 char *lan_ifname = nvram_safe_get("lan_ifname");
543 char *wan_ifname = nvram_safe_get("wan_ifname");
545 fprintf(fp, "router rip\n");
546 fprintf(fp, "network %s\n", lan_ifname);
547 fprintf(fp, "network %s\n", wan_ifname);
548 fprintf(fp, "redistribute connected\n");
549 //fprintf(fp, "redistribute static\n");
551 // 43011: modify by zg 2006.10.18 for cdrouter3.3 item 173(cdrouter_rip_30) bug
552 // fprintf(fp, "redistribute kernel\n"); // 1.11: removed, redistributes indirect -- zzz
554 fprintf(fp, "interface %s\n", lan_ifname);
555 if (*lan_tx != '0') fprintf(fp, "ip rip send version %s\n", lan_tx);
556 if (*lan_rx != '0') fprintf(fp, "ip rip receive version %s\n", lan_rx);
558 fprintf(fp, "interface %s\n", wan_ifname);
559 if (*wan_tx != '0') fprintf(fp, "ip rip send version %s\n", wan_tx);
560 if (*wan_rx != '0') fprintf(fp, "ip rip receive version %s\n", wan_rx);
562 fprintf(fp, "router rip\n");
563 if (*lan_tx == '0') fprintf(fp, "distribute-list private out %s\n", lan_ifname);
564 if (*lan_rx == '0') fprintf(fp, "distribute-list private in %s\n", lan_ifname);
565 if (*wan_tx == '0') fprintf(fp, "distribute-list private out %s\n", wan_ifname);
566 if (*wan_rx == '0') fprintf(fp, "distribute-list private in %s\n", wan_ifname);
567 fprintf(fp, "access-list private deny any\n");
569 //fprintf(fp, "debug rip events\n");
570 //fprintf(fp, "log file /etc/ripd.log\n");
571 fclose(fp);
574 xstart("zebra", "-d");
575 xstart("ripd", "-d");
576 #endif
579 void stop_zebra(void)
581 #ifdef TCONFIG_ZEBRA
582 killall("zebra", SIGTERM);
583 killall("ripd", SIGTERM);
585 unlink("/etc/zebra.conf");
586 unlink("/etc/ripd.conf");
587 #endif
590 // -----------------------------------------------------------------------------
592 void start_syslog(void)
594 #if 1
595 char *argv[12];
596 int argc;
597 char *nv;
598 char rem[256];
599 int n;
600 char s[64];
602 argv[0] = "syslogd";
603 argc = 1;
605 if (nvram_match("log_remote", "1")) {
606 nv = nvram_safe_get("log_remoteip");
607 if (*nv) {
608 snprintf(rem, sizeof(rem), "%s:%s", nv, nvram_safe_get("log_remoteport"));
609 argv[argc++] = "-R";
610 argv[argc++] = rem;
614 if (nvram_match("log_file", "1")) {
615 argv[argc++] = "-L";
616 argv[argc++] = "-s";
617 argv[argc++] = "50";
620 if (argc > 1) {
621 argv[argc] = NULL;
622 _eval(argv, NULL, 0, NULL);
623 //usleep(500000);
624 sleep(1);
626 argv[0] = "klogd";
627 argv[1] = NULL;
628 _eval(argv, NULL, 0, NULL);
629 usleep(500000);
631 // used to be available in syslogd -m
632 n = nvram_get_int("log_mark");
633 if (n > 0) {
634 sprintf(s, "cru a syslogdmark \"%s %s * * * logger -p syslog.info -- -- MARK --\"",
635 (n < 60) ? "*/30" : "0", (n < 120) ? "*" : "*/2");
636 system(s);
638 else {
639 system("cru d syslogdmark");
643 #else
644 char *argv[12];
645 int argc;
646 char *nv;
647 char rem[256];
649 argv[0] = "syslogd";
650 argv[1] = "-m";
651 argv[2] = nvram_get("log_mark");
652 argc = 3;
654 if (nvram_match("log_remote", "1")) {
655 nv = nvram_safe_get("log_remoteip");
656 if (*nv) {
657 snprintf(rem, sizeof(rem), "%s:%s", nv, nvram_safe_get("log_remoteport"));
658 argv[argc++] = "-R";
659 argv[argc++] = rem;
663 if (nvram_match("log_file", "1")) {
664 argv[argc++] = "-L";
665 argv[argc++] = "-s";
666 argv[argc++] = "50";
669 if (argc > 3) {
670 argv[argc] = NULL;
671 _eval(argv, NULL, 0, NULL);
672 usleep(500000);
674 argv[0] = "klogd";
675 argv[1] = NULL;
676 _eval(argv, NULL, 0, NULL);
677 usleep(500000);
679 #endif
682 void stop_syslog(void)
684 killall("klogd", SIGTERM);
685 killall("syslogd", SIGTERM);
688 // -----------------------------------------------------------------------------
690 static pid_t pid_igmp = -1;
692 void start_igmp_proxy(void)
694 FILE *fp;
695 char *p;
697 pid_igmp = -1;
698 if (nvram_match("multicast_pass", "1")) {
699 switch (get_wan_proto()) {
700 case WP_DISABLED:
701 return;
702 case WP_PPPOE:
703 case WP_PPTP:
704 case WP_L2TP:
705 p = "wan_iface";
706 break;
707 default:
708 p = "wan_ifname";
709 break;
712 if (f_exists("/etc/igmp.alt")) {
713 xstart("igmpproxy", "/etc/igmp.alt");
715 else if ((fp = fopen("/etc/igmp.conf", "w")) != NULL) {
716 fprintf(fp,
717 "quickleave\n"
718 "phyint %s upstream\n"
719 "\taltnet %s\n"
720 "phyint %s downstream ratelimit 0\n",
721 nvram_safe_get(p),
722 nvram_get("multicast_altnet") ? : "0.0.0.0/0",
723 nvram_safe_get("lan_ifname"));
724 fclose(fp);
725 xstart("igmpproxy", "/etc/igmp.conf");
727 else {
728 return;
730 if (!nvram_contains_word("debug_norestart", "igmprt")) {
731 pid_igmp = -2;
736 void stop_igmp_proxy(void)
738 pid_igmp = -1;
739 killall("igmpproxy", SIGTERM);
743 // -----------------------------------------------------------------------------
745 void set_tz(void)
747 f_write_string("/etc/TZ", nvram_safe_get("tm_tz"), FW_CREATE|FW_NEWLINE, 0644);
750 void start_ntpc(void)
752 set_tz();
754 stop_ntpc();
756 if (nvram_get_int("ntp_updates") >= 0) {
757 xstart("ntpsync", "--init");
761 void stop_ntpc(void)
763 killall("ntpsync", SIGTERM);
766 // -----------------------------------------------------------------------------
768 static void stop_rstats(void)
770 int n;
771 int pid;
773 n = 60;
774 while ((n-- > 0) && ((pid = pidof("rstats")) > 0)) {
775 if (kill(pid, SIGTERM) != 0) break;
776 sleep(1);
780 static void start_rstats(int new)
782 if (nvram_match("rstats_enable", "1")) {
783 stop_rstats();
784 if (new) xstart("rstats", "--new");
785 else xstart("rstats");
789 // -----------------------------------------------------------------------------
791 // !!TB - FTP Server
793 #ifdef TCONFIG_USB
795 * Return non-zero if we created the directory,
796 * and zero if it already existed.
798 int mkdir_if_none(char *dir)
800 DIR *dp;
801 if (!(dp=opendir(dir))) {
802 umask(0000);
803 mkdir(dir, 0777);
804 return 1;
806 closedir(dp);
807 return 0;
810 char *get_full_storage_path(char *val)
812 static char buf[128];
813 int len;
815 if (val[0] == '/')
816 len = sprintf(buf, "%s", val);
817 else
818 len = sprintf(buf, "%s/%s", MOUNT_ROOT, val);
820 if (len > 1 && buf[len - 1] == '/')
821 buf[len - 1] = 0;
823 return buf;
826 char *nvram_storage_path(char *var)
828 char *val = nvram_safe_get(var);
829 return get_full_storage_path(val);
831 #endif // TCONFIG_USB
833 #ifdef TCONFIG_FTP
835 char vsftpd_conf[] = "/etc/vsftpd.conf";
836 char vsftpd_users[] = "/etc/vsftpd.users";
837 char vsftpd_passwd[] = "/etc/vsftpd.passwd";
838 #endif
840 #ifdef TCONFIG_FTP
841 /* VSFTPD code mostly stolen from Oleg's ASUS Custom Firmware GPL sources */
842 static void do_start_stop_ftpd(int stop, int start)
844 if (stop) killall_tk("vsftpd");
846 char tmp[256];
847 FILE *fp, *f;
849 if (!start || !nvram_get_int("ftp_enable")) return;
851 mkdir_if_none(vsftpd_users);
852 mkdir_if_none("/var/run/vsftpd");
854 if ((fp = fopen(vsftpd_conf, "w")) == NULL)
855 return;
857 if (nvram_get_int("ftp_super"))
859 /* rights */
860 sprintf(tmp, "%s/%s", vsftpd_users, "admin");
861 if ((f = fopen(tmp, "w")))
863 fprintf(f,
864 "dirlist_enable=yes\n"
865 "write_enable=yes\n"
866 "download_enable=yes\n");
867 fclose(f);
871 #ifdef TCONFIG_SAMBASRV
872 if (nvram_match("smbd_cset", "utf8"))
873 fprintf(fp, "utf8=yes\n");
874 #endif
876 if (nvram_invmatch("ftp_anonymous", "0"))
878 fprintf(fp,
879 "anon_allow_writable_root=yes\n"
880 "anon_world_readable_only=no\n"
881 "anon_umask=022\n");
883 /* rights */
884 sprintf(tmp, "%s/ftp", vsftpd_users);
885 if ((f = fopen(tmp, "w")))
887 if (nvram_match("ftp_dirlist", "0"))
888 fprintf(f, "dirlist_enable=yes\n");
889 if (nvram_match("ftp_anonymous", "1") ||
890 nvram_match("ftp_anonymous", "3"))
891 fprintf(f, "write_enable=yes\n");
892 if (nvram_match("ftp_anonymous", "1") ||
893 nvram_match("ftp_anonymous", "2"))
894 fprintf(f, "download_enable=yes\n");
895 fclose(f);
897 if (nvram_match("ftp_anonymous", "1") ||
898 nvram_match("ftp_anonymous", "3"))
899 fprintf(fp,
900 "anon_upload_enable=yes\n"
901 "anon_mkdir_write_enable=yes\n"
902 "anon_other_write_enable=yes\n");
903 } else {
904 fprintf(fp, "anonymous_enable=no\n");
907 fprintf(fp,
908 "dirmessage_enable=yes\n"
909 "download_enable=no\n"
910 "dirlist_enable=no\n"
911 "hide_ids=yes\n"
912 "syslog_enable=yes\n"
913 "local_enable=yes\n"
914 "local_umask=022\n"
915 "chmod_enable=no\n"
916 "chroot_local_user=yes\n"
917 "check_shell=no\n"
918 "log_ftp_protocol=%s\n"
919 "user_config_dir=%s\n"
920 "passwd_file=%s\n"
921 "listen=yes\n"
922 "listen_port=%s\n"
923 "background=yes\n"
924 "isolate=no\n"
925 "max_clients=%d\n"
926 "max_per_ip=%d\n"
927 "idle_session_timeout=%s\n"
928 "use_sendfile=no\n"
929 "anon_max_rate=%d\n"
930 "local_max_rate=%d\n"
931 "%s\n",
932 nvram_get_int("log_ftp") ? "yes" : "no",
933 vsftpd_users, vsftpd_passwd,
934 nvram_get("ftp_port") ? : "21",
935 nvram_get_int("ftp_max"),
936 nvram_get_int("ftp_ipmax"),
937 nvram_get("ftp_staytimeout") ? : "300",
938 nvram_get_int("ftp_anonrate") * 1024,
939 nvram_get_int("ftp_rate") * 1024,
940 nvram_safe_get("ftp_custom"));
942 fclose(fp);
944 /* prepare passwd file and default users */
945 if ((fp = fopen(vsftpd_passwd, "w")) == NULL)
946 return;
948 fprintf(fp, /* anonymous, admin, nobody */
949 "ftp:x:0:0:ftp:%s:/sbin/nologin\n"
950 "%s:%s:0:0:root:/:/sbin/nologin\n"
951 "nobody:x:65534:65534:nobody:%s/:/sbin/nologin\n",
952 nvram_storage_path("ftp_anonroot"), "admin",
953 nvram_get_int("ftp_super") ? crypt(nvram_safe_get("http_passwd"), "$1$") : "x",
954 MOUNT_ROOT);
956 char *buf;
957 char *p, *q;
958 char *user, *pass, *rights;
960 if ((buf = strdup(nvram_safe_get("ftp_users"))) != NULL)
963 username<password<rights
964 rights:
965 Read/Write
966 Read Only
967 View Only
968 Private
970 p = buf;
971 while ((q = strsep(&p, ">")) != NULL) {
972 if (vstrsep(q, "<", &user, &pass, &rights) != 3) continue;
973 if (!user || !pass) continue;
975 /* directory */
976 if (strncmp(rights, "Private", 7) == 0)
978 sprintf(tmp, "%s/%s", nvram_storage_path("ftp_pvtroot"), user);
979 mkdir_if_none(tmp);
981 else
982 sprintf(tmp, "%s", nvram_storage_path("ftp_pubroot"));
984 fprintf(fp, "%s:%s:0:0:%s:%s:/sbin/nologin\n",
985 user, crypt(pass, "$1$"), user, tmp);
987 /* rights */
988 sprintf(tmp, "%s/%s", vsftpd_users, user);
989 if ((f = fopen(tmp, "w")))
991 tmp[0] = 0;
992 if (nvram_invmatch("ftp_dirlist", "1"))
993 strcat(tmp, "dirlist_enable=yes\n");
994 if (strstr(rights, "Read") || !strcmp(rights, "Private"))
995 strcat(tmp, "download_enable=yes\n");
996 if (strstr(rights, "Write") || !strncmp(rights, "Private", 7))
997 strcat(tmp, "write_enable=yes\n");
999 fputs(tmp, f);
1000 fclose(f);
1003 free(buf);
1006 fclose(fp);
1007 killall("vsftpd", SIGHUP);
1009 /* start vsftpd if it's not already running */
1010 if (pidof("vsftpd") <= 0)
1011 eval("vsftpd");
1013 #endif
1015 void start_ftpd(void)
1017 #ifdef TCONFIG_FTP
1018 int fd = file_lock("usb");
1019 do_start_stop_ftpd(0, 1);
1020 file_unlock(fd);
1021 #endif
1024 void stop_ftpd(void)
1026 #ifdef TCONFIG_FTP
1027 int fd = file_lock("usb");
1028 do_start_stop_ftpd(1, 0);
1029 unlink(vsftpd_passwd);
1030 unlink(vsftpd_conf);
1031 eval("rm", "-rf", vsftpd_users);
1032 file_unlock(fd);
1033 #endif
1036 // -----------------------------------------------------------------------------
1038 // !!TB - Samba
1040 #ifdef TCONFIG_SAMBASRV
1041 void kill_samba(int sig)
1043 if (sig == SIGTERM) {
1044 killall_tk("smbd");
1045 killall_tk("nmbd");
1047 else {
1048 killall("smbd", sig);
1049 killall("nmbd", sig);
1052 #endif
1054 #ifdef TCONFIG_SAMBASRV
1055 static void do_start_stop_samba(int stop, int start)
1057 if (stop) kill_samba(SIGTERM);
1059 FILE *fp;
1060 DIR *dir = NULL;
1061 struct dirent *dp;
1062 char nlsmod[15];
1063 int mode;
1064 char *nv;
1066 mode = nvram_get_int("smbd_enable");
1067 if (!start || !mode || !nvram_invmatch("lan_hostname", ""))
1068 return;
1070 if ((fp = fopen("/etc/smb.conf", "w")) == NULL)
1071 return;
1073 fprintf(fp, "[global]\n"
1074 " interfaces = %s\n"
1075 " bind interfaces only = yes\n"
1076 " workgroup = %s\n"
1077 " netbios name = %s\n"
1078 " server string = %s\n"
1079 " guest account = nobody\n"
1080 " security = %s\n"
1081 " browseable = yes\n"
1082 " guest ok = yes\n"
1083 " guest only = no\n"
1084 " log level = %d\n"
1085 " syslog only = yes\n"
1086 " timestamp logs = no\n"
1087 " syslog = 1\n"
1088 " dns proxy = no\n"
1089 " encrypt passwords = yes\n"
1090 " preserve case = yes\n"
1091 " short preserve case = yes\n",
1092 nvram_safe_get("lan_ifname"),
1093 nvram_get("smbd_wgroup") ? : "WORKGROUP",
1094 nvram_safe_get("lan_hostname"),
1095 nvram_get("router_name") ? : "Tomato",
1096 mode == 2 ? "user" : "share",
1097 nvram_get_int("smbd_loglevel")
1100 if (nvram_get_int("smbd_wins")) {
1101 nv = nvram_safe_get("wan_wins");
1102 if ((*nv == 0) || (strcmp(nv, "0.0.0.0") == 0)) {
1103 fprintf(fp, " wins support = yes\n");
1107 if (nvram_get_int("smbd_master")) {
1108 fprintf(fp,
1109 " domain master = yes\n"
1110 " local master = yes\n"
1111 " preferred master = yes\n"
1112 " os level = 65\n");
1115 nv = nvram_safe_get("smbd_cpage");
1116 if (*nv) {
1117 #ifndef TCONFIG_SAMBA3
1118 fprintf(fp, " client code page = %s\n", nv);
1119 #endif
1120 sprintf(nlsmod, "nls_cp%s", nv);
1122 nv = nvram_safe_get("smbd_nlsmod");
1123 if ((*nv) && (strcmp(nv, nlsmod) != 0))
1124 modprobe_r(nv);
1126 modprobe(nlsmod);
1127 nvram_set("smbd_nlsmod", nlsmod);
1130 #ifndef TCONFIG_SAMBA3
1131 if (nvram_match("smbd_cset", "utf8"))
1132 fprintf(fp, " coding system = utf8\n");
1133 else if (nvram_invmatch("smbd_cset", ""))
1134 fprintf(fp, " character set = %s\n", nvram_safe_get("smbd_cset"));
1135 #endif
1137 fprintf(fp, "%s\n\n", nvram_safe_get("smbd_custom"));
1139 /* configure shares */
1141 char *buf;
1142 char *p, *q;
1143 char *name, *path, *comment, *writeable, *hidden;
1144 int cnt = 0;
1146 if ((buf = strdup(nvram_safe_get("smbd_shares"))) != NULL)
1148 /* sharename<path<comment<writeable[0|1]<hidden[0|1] */
1150 p = buf;
1151 while ((q = strsep(&p, ">")) != NULL) {
1152 if (vstrsep(q, "<", &name, &path, &comment, &writeable, &hidden) != 5) continue;
1153 if (!path || !name) continue;
1155 /* share name */
1156 fprintf(fp, "\n[%s]\n", name);
1158 /* path */
1159 fprintf(fp, " path = %s\n", path);
1161 /* access level */
1162 if (!strcmp(writeable, "1"))
1163 fprintf(fp, " writable = yes\n force user = %s\n", "root");
1164 if (!strcmp(hidden, "1"))
1165 fprintf(fp, " browseable = no\n");
1167 /* comment */
1168 if (comment)
1169 fprintf(fp, " comment = %s\n", comment);
1171 cnt++;
1173 free(buf);
1176 /* share everything below MOUNT_ROOT */
1177 if (nvram_get_int("smbd_autoshare") && (dir = opendir(MOUNT_ROOT))) {
1178 while ((dp = readdir(dir))) {
1179 if (strcmp(dp->d_name, ".") && strcmp(dp->d_name, "..")) {
1181 /* smbd_autoshare: 0 - disable, 1 - read-only, 2 - writable, 3 - hidden writable */
1182 fprintf(fp, "\n[%s]\n path = %s/%s\n comment = %s\n",
1183 dp->d_name, MOUNT_ROOT, dp->d_name, dp->d_name);
1184 if (nvram_match("smbd_autoshare", "3")) // Hidden
1185 fprintf(fp, "\n[%s$]\n path = %s/%s\n browseable = no\n",
1186 dp->d_name, MOUNT_ROOT, dp->d_name);
1187 if (nvram_match("smbd_autoshare", "2") || nvram_match("smbd_autoshare", "3")) // RW
1188 fprintf(fp, " writable = yes\n force user = %s\n", "root");
1190 cnt++;
1194 if (dir) closedir(dir);
1196 if (cnt == 0) {
1197 /* by default share MOUNT_ROOT as read-only */
1198 fprintf(fp, "\n[share]\n"
1199 " path = %s\n"
1200 " writable = no\n",
1201 MOUNT_ROOT);
1204 fclose(fp);
1206 mkdir_if_none("/var/run/samba");
1207 mkdir_if_none("/etc/samba");
1209 /* write smbpasswd */
1210 #ifdef TCONFIG_SAMBA3
1211 eval("smbpasswd", "nobody", "\"\"");
1212 #else
1213 eval("smbpasswd", "-a", "nobody", "\"\"");
1214 #endif
1215 if (mode == 2) {
1216 char *smbd_user;
1217 if (((smbd_user = nvram_get("smbd_user")) == NULL) || (*smbd_user == 0) || !strcmp(smbd_user, "root"))
1218 smbd_user = "nas";
1219 #ifdef TCONFIG_SAMBA3
1220 eval("smbpasswd", smbd_user, nvram_safe_get("smbd_passwd"));
1221 #else
1222 eval("smbpasswd", "-a", smbd_user, nvram_safe_get("smbd_passwd"));
1223 #endif
1226 kill_samba(SIGHUP);
1227 int ret1 = 0, ret2 = 0;
1228 /* start samba if it's not already running */
1229 if (pidof("nmbd") <= 0)
1230 ret1 = eval("nmbd", "-D");
1231 if (pidof("smbd") <= 0)
1232 ret2 = eval("smbd", "-D");
1234 if (ret1 || ret2) kill_samba(SIGTERM);
1236 #endif
1238 void start_samba(void)
1240 #ifdef TCONFIG_SAMBASRV
1241 int fd = file_lock("usb");
1242 do_start_stop_samba(0, 1);
1243 file_unlock(fd);
1244 #endif
1247 void stop_samba(void)
1249 #ifdef TCONFIG_SAMBASRV
1250 int fd = file_lock("usb");
1251 do_start_stop_samba(1, 0);
1253 #if 0
1254 if (nvram_invmatch("smbd_nlsmod", "")) {
1255 modprobe_r(nvram_get("smbd_nlsmod"));
1256 nvram_set("smbd_nlsmod", "");
1258 #endif
1260 /* clean up */
1261 unlink("/var/log/smb");
1262 unlink("/var/log/nmb");
1263 eval("rm", "-rf", "/var/run/samba");
1264 file_unlock(fd);
1265 #endif
1268 #ifdef TCONFIG_USB
1269 void restart_nas_services(int stop, int start)
1271 /* restart all NAS applications */
1272 #if TCONFIG_SAMBASRV || TCONFIG_FTP
1273 int fd = file_lock("usb");
1274 #ifdef TCONFIG_SAMBASRV
1275 do_start_stop_samba(stop, start && nvram_get_int("smbd_enable"));
1276 #endif
1277 #ifdef TCONFIG_FTP
1278 do_start_stop_ftpd(stop, start && nvram_get_int("ftp_enable"));
1279 #endif
1280 file_unlock(fd);
1281 #endif // TCONFIG_SAMBASRV || TCONFIG_FTP
1283 #endif // TCONFIG_USB
1285 // -----------------------------------------------------------------------------
1287 static void _check(pid_t *pid, const char *name, void (*func)(void) )
1289 if (*pid != -1) {
1290 if (kill(*pid, 0) != 0) {
1291 if ((*pid = pidof(name)) == -1) func();
1296 void check_services(void)
1298 #ifdef LINUX26
1299 _check(&pid_hotplug2, "hotplug2", start_hotplug2);
1300 #endif
1301 _check(&pid_dnsmasq, "dnsmasq", start_dnsmasq);
1302 _check(&pid_crond, "crond", start_cron);
1303 _check(&pid_igmp, "igmpproxy", start_igmp_proxy);
1306 // -----------------------------------------------------------------------------
1308 void start_services(void)
1310 static int once = 1;
1312 if (once) {
1313 once = 0;
1315 create_passwd();
1316 if (nvram_get_int("telnetd_eas")) start_telnetd();
1317 if (nvram_get_int("sshd_eas")) start_sshd();
1320 // start_syslog();
1321 start_nas();
1322 start_zebra();
1323 start_dnsmasq();
1324 start_cifs();
1325 start_httpd();
1326 start_cron();
1327 // start_upnp();
1328 start_rstats(0);
1329 start_sched();
1330 restart_nas_services(1, 1); // !!TB - Samba and FTP Server
1333 void stop_services(void)
1335 clear_resolv();
1337 stop_ftpd(); // !!TB - FTP Server
1338 stop_samba(); // !!TB - Samba
1339 stop_sched();
1340 stop_rstats();
1341 // stop_upnp();
1342 stop_cron();
1343 stop_httpd();
1344 stop_cifs();
1345 stop_dnsmasq();
1346 stop_zebra();
1347 stop_nas();
1348 // stop_syslog();
1351 // -----------------------------------------------------------------------------
1353 void exec_service(void)
1355 const int A_START = 1;
1356 const int A_STOP = 2;
1357 const int A_RESTART = 1|2;
1358 char buffer[128];
1359 char *service;
1360 char *act;
1361 char *next;
1362 int action;
1363 int i;
1365 strlcpy(buffer, nvram_safe_get("action_service"), sizeof(buffer));
1366 next = buffer;
1368 TOP:
1369 act = strsep(&next, ",");
1370 service = strsep(&act, "-");
1371 if (act == NULL) {
1372 next = NULL;
1373 goto CLEAR;
1376 TRACE_PT("service=%s action=%s\n", service, act);
1378 if (strcmp(act, "start") == 0) action = A_START;
1379 else if (strcmp(act, "stop") == 0) action = A_STOP;
1380 else if (strcmp(act, "restart") == 0) action = A_RESTART;
1381 else action = 0;
1384 if (strcmp(service, "dhcpc") == 0) {
1385 if (action & A_STOP) stop_dhcpc();
1386 if (action & A_START) start_dhcpc();
1387 goto CLEAR;
1390 if ((strcmp(service, "dhcpd") == 0) || (strcmp(service, "dns") == 0) || (strcmp(service, "dnsmasq") == 0)) {
1391 if (action & A_STOP) stop_dnsmasq();
1392 if (action & A_START) {
1393 dns_to_resolv();
1394 start_dnsmasq();
1396 goto CLEAR;
1399 if (strcmp(service, "firewall") == 0) {
1400 if (action & A_STOP) {
1401 stop_firewall();
1402 stop_igmp_proxy();
1404 if (action & A_START) {
1405 start_firewall();
1406 start_igmp_proxy();
1408 goto CLEAR;
1411 if (strcmp(service, "restrict") == 0) {
1412 if (action & A_STOP) {
1413 stop_firewall();
1415 if (action & A_START) {
1416 i = nvram_get_int("rrules_radio"); // -1 = not used, 0 = enabled by rule, 1 = disabled by rule
1418 start_firewall();
1420 // if radio was disabled by access restriction, but no rule is handling it now, enable it
1421 if (i == 1) {
1422 if (nvram_get_int("rrules_radio") < 0) {
1423 if (!get_radio()) eval("radio", "on");
1427 goto CLEAR;
1430 if (strcmp(service, "qos") == 0) {
1431 if (action & A_STOP) {
1432 stop_qos();
1434 stop_firewall(); start_firewall(); // always restarted
1435 if (action & A_START) {
1436 start_qos();
1437 if (nvram_match("qos_reset", "1")) f_write_string("/proc/net/clear_marks", "1", 0, 0);
1439 goto CLEAR;
1442 if (strcmp(service, "upnp") == 0) {
1443 if (action & A_STOP) {
1444 stop_upnp();
1446 stop_firewall(); start_firewall(); // always restarted
1447 if (action & A_START) {
1448 start_upnp();
1450 goto CLEAR;
1453 if (strcmp(service, "telnetd") == 0) {
1454 if (action & A_STOP) stop_telnetd();
1455 if (action & A_START) start_telnetd();
1456 goto CLEAR;
1459 if (strcmp(service, "sshd") == 0) {
1460 if (action & A_STOP) stop_sshd();
1461 if (action & A_START) start_sshd();
1462 goto CLEAR;
1465 if (strcmp(service, "httpd") == 0) {
1466 if (action & A_STOP) stop_httpd();
1467 if (action & A_START) start_httpd();
1468 goto CLEAR;
1471 if (strcmp(service, "admin") == 0) {
1472 if (action & A_STOP) {
1473 stop_sshd();
1474 stop_telnetd();
1475 stop_httpd();
1477 stop_firewall(); start_firewall(); // always restarted
1478 if (action & A_START) {
1479 start_httpd();
1480 create_passwd();
1481 if (nvram_match("telnetd_eas", "1")) start_telnetd();
1482 if (nvram_match("sshd_eas", "1")) start_sshd();
1484 goto CLEAR;
1487 if (strcmp(service, "ddns") == 0) {
1488 if (action & A_STOP) stop_ddns();
1489 if (action & A_START) start_ddns();
1490 goto CLEAR;
1493 if (strcmp(service, "ntpc") == 0) {
1494 if (action & A_STOP) stop_ntpc();
1495 if (action & A_START) start_ntpc();
1496 goto CLEAR;
1499 if (strcmp(service, "logging") == 0) {
1500 if (action & A_STOP) {
1501 stop_syslog();
1502 stop_cron();
1504 stop_firewall(); start_firewall(); // always restarted
1505 if (action & A_START) {
1506 start_cron();
1507 start_syslog();
1509 goto CLEAR;
1512 if (strcmp(service, "crond") == 0) {
1513 if (action & A_STOP) {
1514 stop_cron();
1516 if (action & A_START) {
1517 start_cron();
1519 goto CLEAR;
1522 #ifdef LINUX26
1523 if (strncmp(service, "hotplug", 7) == 0) {
1524 if (action & A_STOP) {
1525 stop_hotplug2();
1527 if (action & A_START) {
1528 start_hotplug2(1);
1530 goto CLEAR;
1532 #endif
1534 if (strcmp(service, "upgrade") == 0) {
1535 if (action & A_START) {
1536 #if TOMATO_SL
1537 stop_usbevent();
1538 stop_smbd();
1539 #endif
1540 stop_ftpd(); // !!TB - FTP Server
1541 stop_samba(); // !!TB - Samba
1542 stop_jffs2();
1543 // stop_cifs();
1544 stop_zebra();
1545 stop_cron();
1546 stop_ntpc();
1547 stop_upnp();
1548 // stop_dhcpc();
1549 killall("rstats", SIGTERM);
1550 killall("buttons", SIGTERM);
1551 stop_syslog();
1552 remove_storage_main(1); // !!TB - USB Support
1553 stop_usb(); // !!TB - USB Support
1555 goto CLEAR;
1558 #ifdef TCONFIG_CIFS
1559 if (strcmp(service, "cifs") == 0) {
1560 if (action & A_STOP) stop_cifs();
1561 if (action & A_START) start_cifs();
1562 goto CLEAR;
1564 #endif
1566 #ifdef TCONFIG_JFFS2
1567 if (strcmp(service, "jffs2") == 0) {
1568 if (action & A_STOP) stop_jffs2();
1569 if (action & A_START) start_jffs2();
1570 goto CLEAR;
1572 #endif
1574 if (strcmp(service, "routing") == 0) {
1575 if (action & A_STOP) {
1576 stop_zebra();
1577 do_static_routes(0); // remove old '_saved'
1578 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "0");
1580 stop_firewall();
1581 start_firewall();
1582 if (action & A_START) {
1583 do_static_routes(1); // add new
1584 start_zebra();
1585 eval("brctl", "stp", nvram_safe_get("lan_ifname"), nvram_safe_get("lan_stp"));
1587 goto CLEAR;
1590 if (strcmp(service, "ctnf") == 0) {
1591 if (action & A_START) {
1592 setup_conntrack();
1593 stop_firewall();
1594 start_firewall();
1596 goto CLEAR;
1599 if (strcmp(service, "wan") == 0) {
1600 if (action & A_STOP) {
1601 if (get_wan_proto() == WP_PPPOE) {
1602 stop_dnsmasq();
1603 stop_redial();
1604 stop_singe_pppoe(PPPOE0);
1605 if (((action & A_START) == 0) && (nvram_match("ppp_demand", "1"))) {
1606 sleep(1);
1607 start_pppoe(PPPOE0);
1609 start_dnsmasq();
1611 else {
1612 stop_wan();
1616 if (action & A_START) {
1617 rename("/tmp/ppp/log", "/tmp/ppp/log.~");
1619 if (get_wan_proto() == WP_PPPOE) {
1620 stop_singe_pppoe(PPPOE0);
1621 start_pppoe(PPPOE0);
1622 if (nvram_invmatch("ppp_demand", "1")) {
1623 start_redial();
1626 else {
1627 start_wan(BOOT);
1629 sleep(2);
1630 force_to_dial();
1632 goto CLEAR;
1635 if (strcmp(service, "net") == 0) {
1636 if (action & A_STOP) {
1637 stop_dnsmasq();
1638 stop_nas();
1639 stop_wan();
1640 stop_lan();
1641 stop_vlan();
1643 if (action & A_START) {
1644 start_vlan();
1645 start_lan();
1646 start_wan(BOOT);
1647 start_nas();
1648 start_dnsmasq();
1649 start_wl();
1651 goto CLEAR;
1654 if (strcmp(service, "nas") == 0) {
1655 if (action & A_STOP) {
1656 stop_nas();
1658 if (action & A_START) {
1659 start_nas();
1660 start_wl();
1662 goto CLEAR;
1665 if (strcmp(service, "rstats") == 0) {
1666 if (action & A_STOP) stop_rstats();
1667 if (action & A_START) start_rstats(0);
1668 goto CLEAR;
1671 if (strcmp(service, "rstatsnew") == 0) {
1672 if (action & A_STOP) stop_rstats();
1673 if (action & A_START) start_rstats(1);
1674 goto CLEAR;
1677 if (strcmp(service, "sched") == 0) {
1678 if (action & A_STOP) stop_sched();
1679 if (action & A_START) start_sched();
1680 goto CLEAR;
1683 #ifdef TCONFIG_USB
1684 // !!TB - USB Support
1685 if (strcmp(service, "usb") == 0) {
1686 if (action & A_STOP) stop_usb();
1687 if (action & A_START) {
1688 start_usb();
1689 // restart Samba and ftp since they may be killed by stop_usb()
1690 restart_nas_services(0, 1);
1692 goto CLEAR;
1694 #endif
1696 #ifdef TCONFIG_FTP
1697 // !!TB - FTP Server
1698 if (strcmp(service, "ftpd") == 0) {
1699 if (action & A_STOP) stop_ftpd();
1700 setup_conntrack();
1701 stop_firewall();
1702 start_firewall();
1703 if (action & A_START) start_ftpd();
1704 goto CLEAR;
1706 #endif
1708 #ifdef TCONFIG_SAMBASRV
1709 // !!TB - Samba
1710 if (strcmp(service, "samba") == 0 || strcmp(service, "smbd") == 0) {
1711 if (action & A_STOP) stop_samba();
1712 if (action & A_START) {
1713 create_passwd();
1714 stop_dnsmasq();
1715 start_dnsmasq();
1716 start_samba();
1718 goto CLEAR;
1720 #endif
1722 #ifdef TCONFIG_OPENVPN
1723 if (strncmp(service, "vpnclient", 9) == 0) {
1724 if (action & A_STOP) stop_vpnclient(atoi(&service[9]));
1725 if (action & A_START) start_vpnclient(atoi(&service[9]));
1726 goto CLEAR;
1729 if (strncmp(service, "vpnserver", 9) == 0) {
1730 if (action & A_STOP) stop_vpnserver(atoi(&service[9]));
1731 if (action & A_START) start_vpnserver(atoi(&service[9]));
1732 goto CLEAR;
1734 #endif
1736 CLEAR:
1737 if (next) goto TOP;
1739 // some functions check action_service and must be cleared at end -- zzz
1740 nvram_set("action_service", "");
1743 static void do_service(const char *name, const char *action, int user)
1745 int n;
1746 char s[64];
1748 n = 15;
1749 while (!nvram_match("action_service", "")) {
1750 if (user) {
1751 putchar('*');
1752 fflush(stdout);
1754 else if (--n < 0) break;
1755 sleep(1);
1758 snprintf(s, sizeof(s), "%s-%s", name, action);
1759 nvram_set("action_service", s);
1760 kill(1, SIGUSR1);
1762 n = 15;
1763 while (nvram_match("action_service", s)) {
1764 if (user) {
1765 putchar('.');
1766 fflush(stdout);
1768 else if (--n < 0) {
1769 break;
1771 sleep(1);
1775 int service_main(int argc, char *argv[])
1777 if (argc != 3) usage_exit(argv[0], "<service> <action>");
1778 do_service(argv[1], argv[2], 1);
1779 printf("\nDone.\n");
1780 return 0;
1783 void start_service(const char *name)
1785 do_service(name, "start", 0);
1788 void stop_service(const char *name)
1790 do_service(name, "stop", 0);
1794 void restart_service(const char *name)
1796 do_service(name, "restart", 0);