diff options
author | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2009-06-13 21:09:28 +0800 |
---|---|---|
committer | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2009-06-13 21:09:28 +0800 |
commit | 043d8361706539a4aa620232e096682fc83035ab (patch) | |
tree | 59794d299825825436863c92bfc5e4b5c6dcc70a | |
parent | 7a80b6b9984876bd3ebe1b5aa41df90dc61fa892 (diff) | |
download | pttbbs-043d8361706539a4aa620232e096682fc83035ab.tar pttbbs-043d8361706539a4aa620232e096682fc83035ab.tar.gz pttbbs-043d8361706539a4aa620232e096682fc83035ab.tar.bz2 pttbbs-043d8361706539a4aa620232e096682fc83035ab.tar.lz pttbbs-043d8361706539a4aa620232e096682fc83035ab.tar.xz pttbbs-043d8361706539a4aa620232e096682fc83035ab.tar.zst pttbbs-043d8361706539a4aa620232e096682fc83035ab.zip |
* support bindports.conf in bbsctl.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4592 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r-- | sample/etc/bindports.conf | 88 | ||||
-rw-r--r-- | util/bbsctl.c | 109 |
2 files changed, 153 insertions, 44 deletions
diff --git a/sample/etc/bindports.conf b/sample/etc/bindports.conf index de90f73b..ed6cfe33 100644 --- a/sample/etc/bindports.conf +++ b/sample/etc/bindports.conf @@ -1,47 +1,65 @@ # Bind Port List # ---------------------------------------------- -# syntax: <program> <port> <option> +# syntax: <program> <port/service> <option> # program: arbitary name # port: numeric port number or special name. -# currently supported special name(s): -# * tunnel (tunnel mode connection) # option: parameter to this connection. -# * port: none -# * tunnel: tunnel path # ---------------------------------------------- +# mode selection for 'bbsctl start' +# ---------------------------------------------- +# * current available modes: mbbsd, logind +bbsctl mode mbbsd +#bbsctl mode logind + # standalone mbbsd ports +# ---------------------------------------------- +# * list all ports you want mbbsd to listen here. mbbsd 23 -#mbbsd 443 -#mbbsd 3000 -#mbbsd 3001 -#mbbsd 3002 -#mbbsd 3003 -#mbbsd 3004 -#mbbsd 3005 -#mbbsd 3006 -#mbbsd 3007 -#mbbsd 3008 -#mbbsd 3009 -#mbbsd 3010 +mbbsd 443 +mbbsd 3000 +mbbsd 3001 +mbbsd 3002 +mbbsd 3003 +mbbsd 3004 +mbbsd 3005 +mbbsd 3006 +mbbsd 3007 +mbbsd 3008 +mbbsd 3009 +mbbsd 3010 + +# logind ports +# ---------------------------------------------- +# * list all ports for logind to listen here. +#logind 23 +#logind 443 +#logind 3000 +#logind 3001 +#logind 3002 +#logind 3003 +#logind 3004 +#logind 3005 +#logind 3006 +#logind 3007 +#logind 3008 +#logind 3009 +#logind 3010 -# following settings are only required if you use logind -# # tunnel mappings -# mbbsd tunnel run/logind.tunnel -# logind tunnel run/logind.tunnel +# logind client setings +# ---------------------------------------------- +# * if this is set, each restart logind will +# also invoke the client. +# +# * example (let mbbsd listen to all tunnel+ports) +#logind client bin/mbbsd -d -f etc/bindports.conf # -# # logind ports -# logind 23 -# logind 443 -# logind 3000 -# logind 3001 -# logind 3002 -# logind 3003 -# logind 3004 -# logind 3005 -# logind 3006 -# logind 3007 -# logind 3008 -# logind 3009 -# logind 3010 +# * example (let one mbbsd listen to tunnel only) +#logind client bin/mbbsd -n run/logind.tunnel + +# tunnel mappings +# ---------------------------------------------- +# * to configure the path of tunnels +#mbbsd tunnel run/logind.tunnel +#logind tunnel run/logind.tunnel diff --git a/util/bbsctl.c b/util/bbsctl.c index 80a57dfa..e8b6e067 100644 --- a/util/bbsctl.c +++ b/util/bbsctl.c @@ -48,17 +48,95 @@ int HaveBBSADM(void) return 0; } +enum { + BINDPORTS_MODE_NONE = 0, + BINDPORTS_MODE_MBBSD, + BINDPORTS_MODE_LOGIND, +}; + +int parse_bindports_mode(const char *fn) +{ + int mode = BINDPORTS_MODE_NONE; + char buf[PATHLEN], vprogram[STRLEN], vservice[STRLEN], vopt[STRLEN]; + FILE *fp = fopen(fn, "rt"); + if (!fp) + return mode; + + while(fgets(buf, sizeof(buf), fp)) + { + if (sscanf(buf, "%s%s%s", vprogram, vservice, vopt) != 3 || + strcmp(vprogram, "bbsctl") != 0) + continue; + + // the only service we understand now is 'mode' + if (strcmp(vservice, "mode") != 0) + { + printf("sorry, unknown service: %s", buf); + break; + } + + if (strcmp(vopt, "mbbsd") == 0) + { + mode = BINDPORTS_MODE_MBBSD; + break; + } + else if (strcmp(vopt, "logind") == 0) + { + mode = BINDPORTS_MODE_LOGIND; + break; + } + } + + fclose(fp); + return mode; +} + int startbbs(int argc, char **argv) { + const char *bindports_fn = BBSHOME "/" FN_CONF_BINDPORTS; +#if 0 if( setuid(0) < 0 ){ perror("setuid(0)"); exit(1); } - printf("starting mbbsd at 23, 443, 3000-3010\n"); +#endif + + // if there's bindports.conf, use it. + if (dashs(bindports_fn) > 0) + { + // rule 2, if bindports.conf exists, load it. + printf("starting bbs by %s\n", bindports_fn); + + // load the conf and determine how should we start the services. + switch(parse_bindports_mode(bindports_fn)) + { + case BINDPORTS_MODE_NONE: + printf("mode is not assigned. fallback to default ports.\n"); + break; + case BINDPORTS_MODE_MBBSD: + execl(BBSHOME "/bin/mbbsd", "mbbsd", "-d", "-f", bindports_fn, NULL); + printf("mbbsd startup failed...\n"); + break; + case BINDPORTS_MODE_LOGIND: + execl(BBSHOME "/bin/logind", "logind", "-d", "-f", bindports_fn, NULL); + printf("logind startup failed...\n"); + break; + } + } + + // default: start listening ports with mbbsd. + printf("starting mbbsd by at 23, 443, 3000-3010\n"); execl(BBSHOME "/bin/mbbsd", "mbbsd", "-d", "-p23", "-p443", - "-p3000", "-p3001", "-p3002", "-p3003", "-p3004", "-p3005", - "-p3006", "-p3007", "-p3008", "-p3009", "-p3010", NULL); - printf("starting mbbsd failed\n"); + "-p3000", "-p3001", "-p3002", "-p3003", "-p3004", "-p3005", + "-p3006", "-p3007", "-p3008", "-p3009", "-p3010", NULL); + + if (dashs(BBSHOME "/" FN_CONF_BINDPORTS) > 0) + { + // execl(BBSHOME "/bin/mbbsd", "mbbsd", "-d", "-f", FN_CONF_BINDPORTS, NULL); + execl(BBSHOME "/bin/logind", "logind", "-f", BBSHOME "/" FN_CONF_BINDPORTS, NULL); + } else { + } + printf("starting daemons failed\n"); return 1; } @@ -74,12 +152,25 @@ int stopbbs(int argc, char **argv) } while( (de = readdir(dirp)) ){ - if( strstr(de->d_name, "mbbsd") && strstr(de->d_name, "pid")){ + if (!strstr(de->d_name, ".pid")) + continue; + // TODO use "mbbsd." and "logind." ? + if( strstr(de->d_name, "mbbsd") || strstr(de->d_name, "logind")) { sprintf(fn, BBSHOME "/run/%s", de->d_name); if( (fp = fopen(fn, "r")) != NULL ){ if( fgets(buf, sizeof(buf), fp) != NULL ){ - printf("stopping listening-mbbsd at pid %5d\n", atoi(buf)); - kill(atoi(buf), SIGKILL); + int pid = atoi(buf); + if (pid < 2) + { + printf("invalid pid record: %s\n", fn); + } else { + char *sdot = NULL; + strlcpy(buf, de->d_name, sizeof(buf)); + sdot = strchr(buf, '.'); + if (sdot) *sdot = 0; + printf("stopping listening-%s at pid %5d\n", buf, pid); + kill(pid, SIGKILL); + } } fclose(fp); unlink(fn); @@ -418,8 +509,8 @@ struct { int (*func)(int, char **); char *cmd, *descript; } cmds[] = - { {startbbs, "start", "start mbbsd at port 23, 3000~3010"}, - {stopbbs, "stop", "killall listening mbbsd"}, + { {startbbs, "start", "start mbbsd/logind daemons "}, + {stopbbs, "stop", "killall listening daemons (mbbsd+logind)"}, {restartbbs, "restart", "stop and then start"}, {bbsadm, "bbsadm", "switch to user: bbsadm"}, {bbstest, "test", "run ./mbbsd as bbsadm"}, |