Annotation of sbbs/sbbs3/umonitor/umonitor.c, revision 1.1.1.1

1.1       root        1: /* umonitor.c */
                      2: 
                      3: /* Synchronet for *nix node activity monitor */
                      4: 
                      5: /* $Id: umonitor.c,v 1.66 2004/11/05 01:08:44 deuce Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include <signal.h>
                     39: #include <sys/types.h>
                     40: #include <time.h>
                     41: #include <sys/time.h>
                     42: #ifdef __QNX__
                     43: #include <string.h>
                     44: #endif
                     45: #include <stdio.h>
                     46: #include <unistd.h>
                     47: 
                     48: #include "ciolib.h"
                     49: #include "keys.h"
                     50: #define __COLORS               /* Disable the colour macros in sbbsdefs.h ToDo */
                     51: #include "sbbs.h"
                     52: #include "genwrap.h"
                     53: #include "uifc.h"
                     54: #include "sbbsdefs.h"
                     55: #include "genwrap.h"   /* stricmp */
                     56: #include "dirwrap.h"   /* lock/unlock/sopen */
                     57: #include "filewrap.h"  /* lock/unlock/sopen */
                     58: #include "sbbs_ini.h"  /* INI parsing */
                     59: #include "scfglib.h"   /* SCFG files */
                     60: #include "ars_defs.h"  /* needed for SCFG files */
                     61: #include "userdat.h"   /* getnodedat() */
                     62: #include "spyon.h"
                     63: #include "chat.h"
                     64: 
                     65: #define CTRL(x) (x&037)
                     66: 
                     67: /********************/
                     68: /* Global Variables */
                     69: /********************/
                     70: uifcapi_t uifc; /* User Interface (UIFC) Library API */
                     71: const char *YesStr="Yes";
                     72: const char *NoStr="No";
                     73: 
                     74: int lprintf(char *fmt, ...)
                     75: {
                     76:        va_list argptr;
                     77:        char sbuf[1024];
                     78:        int     len;
                     79: 
                     80:        va_start(argptr,fmt);
                     81:        len=vsnprintf(sbuf,sizeof(sbuf),fmt,argptr);
                     82:        sbuf[sizeof(sbuf)-1]=0;
                     83:        va_end(argptr);
                     84:        uifc.msg(sbuf);
                     85:        return(len);
                     86: }
                     87: 
                     88: void bail(int code)
                     89: {
                     90:     if(code) {
                     91:         puts("\nHit a key...");
                     92:         getch();
                     93:        }
                     94:     uifc.bail();
                     95: 
                     96:     exit(code);
                     97: }
                     98: 
                     99: void allocfail(uint size)
                    100: {
                    101:     printf("\7Error allocating %u bytes of memory.\n",size);
                    102:     bail(1);
                    103: }
                    104: 
                    105: void freeopt(char** opt)
                    106: {
                    107:        int i;
                    108: 
                    109:        for(i=0;i<(MAX_OPTS+1);i++)
                    110:                free(opt[i]);
                    111: 
                    112:        free(opt);
                    113: }
                    114: 
                    115: void node_toggles(scfg_t *cfg,int nodenum)  {
                    116:        int nodefile;
                    117:        char**  opt;
                    118:        int             i,j;
                    119:        node_t  node;
                    120:        int             save=0;
                    121: 
                    122:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
                    123:                allocfail(sizeof(char *)*(MAX_OPTS+1));
                    124:        for(i=0;i<(MAX_OPTS+1);i++)
                    125:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
                    126:                        allocfail(MAX_OPLN);
                    127: 
                    128:        i=0;
                    129:        uifc.helpbuf=   "`Node Toggles\n"
                    130:                        "`------------`\n\n"
                    131:                                        "`The following are `Yes/No `options.  Hitting Enter toggles between.\n\n"
                    132:                                        "`Locked for SysOps only : `Locks the node so that only SysOps may \n"
                    133:                                        "                         logon to them.\n"
                    134:                                        "`Interrupt (Hangup)     : `The current user will be kicked as soon as it \n"
                    135:                                        "                         is safe to do so.  A brief message is given\n"
                    136:                                        "                         to user.\n"
                    137:                                        "`Re-run on logoff       : `Toggles the system to reload the configuration\n"
                    138:                                        "                         files when the current user logs off.\n"
                    139:                                        "`Down node after logoff : `Takes the node offline after current user logs\n"
                    140:                                        "                         off.\n\n"
                    141:                                        "`[Note] `These toggles take effect immediately.";
                    142:        while(save==0) {
                    143:                if(getnodedat(cfg,nodenum,&node,&nodefile)) {
                    144:                        uifc.msg("Error reading node data!");
                    145:                        break;
                    146:                }
                    147:                j=0;
                    148:                sprintf(opt[j++],"%-30s%3s","Locked for SysOps only",node.misc&NODE_LOCK ? YesStr : NoStr);
                    149:                sprintf(opt[j++],"%-30s%3s","Interrupt (Hangup)",node.misc&NODE_INTR ? YesStr : NoStr);
                    150:                sprintf(opt[j++],"%-30s%3s","Re-run on logoff",node.misc&NODE_RRUN ? YesStr : NoStr);
                    151:                sprintf(opt[j++],"%-30s%3s","Down node after logoff"
                    152:                        ,(node.misc&NODE_DOWN || (node.status==NODE_OFFLINE)) ? YesStr : NoStr);
                    153:                opt[j][0]=0;
                    154: 
                    155:                switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Node Toggles",opt)) {
                    156:                        case 0: /* Locked */
                    157:                                node.misc ^= NODE_LOCK;
                    158:                                break;
                    159: 
                    160:                        case 1: /* Interrupt */
                    161:                                node.misc ^= NODE_INTR;
                    162:                                break;
                    163: 
                    164:                        case 2: /* Re-run */
                    165:                                node.misc ^= NODE_RRUN;
                    166:                                break;
                    167: 
                    168:                        case 3: /* Down */
                    169:                                if(node.status != NODE_WFC && node.status != NODE_OFFLINE)
                    170:                                        node.misc ^= NODE_DOWN;
                    171:                                else {
                    172:                                        if(node.status!=NODE_OFFLINE)
                    173:                                                node.status=NODE_OFFLINE;
                    174:                                        else
                    175:                                                node.status=NODE_WFC;
                    176:                                }
                    177:                                break;
                    178: 
                    179:                        case -1:
                    180:                                save=1;
                    181:                                break;
                    182: 
                    183:                        default:
                    184:                                uifc.msg("Option not implemented");
                    185:                                continue;
                    186:                }
                    187:                putnodedat(cfg,nodenum,&node,nodefile);
                    188:        }
                    189:        freeopt(opt);
                    190: }
                    191: 
                    192: int dospy(int nodenum, bbs_startup_t *bbs_startup)  {
                    193:        char str[80],str2[80];
                    194:        int i;
                    195: 
                    196:        if(bbs_startup->temp_dir[0])
                    197:        snprintf(str,sizeof(str),"%slocalspy%d.sock", bbs_startup->temp_dir, nodenum);
                    198:        else
                    199:                snprintf(str,sizeof(str),"%slocalspy%d.sock", bbs_startup->ctrl_dir, nodenum);
                    200:        i=spyon(str);
                    201:        switch(i) {
                    202:                case SPY_NOSOCKET:
                    203:                        uifc.msg("Could not create socket");
                    204:                        return(-1);
                    205: 
                    206:                case SPY_NOCONNECT:
                    207:                        sprintf(str2,"Failed to connect to %s",str);
                    208:                        uifc.msg(str2);
                    209:                        return(-1);
                    210: 
                    211:                case SPY_SELECTFAILED:
                    212:                        uifc.msg("select() failed, connection terminated.");
                    213:                        return(-1);
                    214: 
                    215:                case SPY_SOCKETLOST:
                    216:                        uifc.msg("Spy socket lost");
                    217:                        return(-1);
                    218: 
                    219:                case SPY_STDINLOST:
                    220:                        uifc.msg("STDIN has gone away... you probably can't close this window.  :-)");
                    221:                        return(-1);
                    222: 
                    223:                case SPY_CLOSED:
                    224:                        break;
                    225: 
                    226:                default:
                    227:                        sprintf(str,"Unknown return code %d",i);
                    228:                        uifc.msg(str);
                    229:                        return(-1);
                    230:        }
                    231:        return(0);
                    232: }
                    233: 
                    234: int sendmessage(scfg_t *cfg, int nodenum,node_t *node)  {
                    235:        char str[80],str2[80];
                    236: 
                    237:        uifc.input(WIN_MID|WIN_SAV,0,0,"Telegram",str2,58,K_WRAP|K_MSG);
                    238:        sprintf(str,"\1n\1y\1hMessage From Sysop:\1w %s\r\n",str2);
                    239:        if(getnodedat(cfg,nodenum,node,NULL))
                    240:                return(-1);
                    241:        if(node->useron==0)
                    242:                return(-1);
                    243:        putsmsg(cfg, node->useron, str);
                    244:        return(0);
                    245: }
                    246: 
                    247: int clearerrors(scfg_t *cfg, int nodenum, node_t *node) {
                    248:        int nodefile;
                    249:        if(getnodedat(cfg,nodenum,node,&nodefile)) {
                    250:                uifc.msg("getnodedat() failed! (Nothing done)");
                    251:                return(-1);
                    252:        }
                    253:        node->errors=0;
                    254:        putnodedat(cfg,nodenum,node,nodefile);
                    255:        uifc.msg("Error count cleared for this node.");
                    256:        return(0);
                    257: }
                    258: 
                    259: /* Assumes a 12 char outstr */
                    260: char *getsizestr(char *outstr, long size, BOOL bytes) {
                    261:        if(bytes) {
                    262:                if(size < 1000) {       /* Bytes */
                    263:                        snprintf(outstr,12,"%ld bytes",size);
                    264:                        return(outstr);
                    265:                }
                    266:                if(size<10000) {        /* Bytes with comma */
                    267:                        snprintf(outstr,12,"%ld,%03ld bytes",(size/1000),(size%1000));
                    268:                        return(outstr);
                    269:                }
                    270:                size = size/1024;
                    271:        }
                    272:        if(size<1000) { /* KB */
                    273:                snprintf(outstr,12,"%ld KB",size);
                    274:                return(outstr);
                    275:        }
                    276:        if(size<999999) { /* KB With comma */
                    277:                snprintf(outstr,12,"%ld,%03ld KB",(size/1000),(size%1000));
                    278:                return(outstr);
                    279:        }
                    280:        size = size/1024;
                    281:        if(size<1000) { /* MB */
                    282:                snprintf(outstr,12,"%ld MB",size);
                    283:                return(outstr);
                    284:        }
                    285:        if(size<999999) { /* MB With comma */
                    286:                snprintf(outstr,12,"%ld,%03ld MB",(size/1000),(size%1000));
                    287:                return(outstr);
                    288:        }
                    289:        size = size/1024;
                    290:        if(size<1000) { /* GB */
                    291:                snprintf(outstr,12,"%ld GB",size);
                    292:                return(outstr);
                    293:        }
                    294:        if(size<999999) { /* GB With comma */
                    295:                snprintf(outstr,12,"%ld,%03ld GB",(size/1000),(size%1000));
                    296:                return(outstr);
                    297:        }
                    298:        size = size/1024;
                    299:        if(size<1000) { /* TB (Yeah, right) */
                    300:                snprintf(outstr,12,"%ld TB",size);
                    301:                return(outstr);
                    302:        }
                    303:        sprintf(outstr,"Plenty");
                    304:        return(outstr);
                    305: }
                    306: 
                    307: /* Assumes a 12 char outstr */
                    308: char *getnumstr(char *outstr, ulong size) {
                    309:        if(size < 1000) {
                    310:                snprintf(outstr,12,"%ld",size);
                    311:                return(outstr);
                    312:        }
                    313:        if(size<1000000) {
                    314:                snprintf(outstr,12,"%ld,%03ld",(size/1000),(size%1000));
                    315:                return(outstr);
                    316:        }
                    317:        if(size<1000000000) {
                    318:                snprintf(outstr,12,"%ld,%03ld,%03ld",(size/1000000),((size/1000)%1000),(size%1000));
                    319:                return(outstr);
                    320:        }
                    321:        size=size/1000000;
                    322:        if(size<1000000) {
                    323:                snprintf(outstr,12,"%ld,%03ld M",(size/1000),(size%1000));
                    324:                return(outstr);
                    325:        }
                    326:        if(size<10000000) {
                    327:                snprintf(outstr,12,"%ld,%03ld,%03ld M",(size/1000000),((size/1000)%1000),(size%1000));
                    328:                return(outstr);
                    329:        }
                    330:        sprintf(outstr,"Plenty");
                    331:        return(outstr);
                    332: }
                    333: 
                    334: int drawstats(scfg_t *cfg, int nodenum, node_t *node, int *curp, int *barp) {
                    335:        stats_t sstats;
                    336:        stats_t nstats;
                    337:        char    statbuf[6*78];          /* Buffer to hold the stats for passing to uifc.showbuf() */
                    338:        char    str[4][4][12];
                    339:        char    usrname[128];
                    340:        ulong   free;
                    341:        uint    i,l,m;
                    342:        time_t  t;
                    343:        int             shownode=1;
                    344: 
                    345:        if(getnodedat(cfg,nodenum,node,NULL)) {
                    346:                shownode=0;
                    347:        }
                    348:        else {
                    349:                getstats(cfg, nodenum, &nstats);
                    350:        }
                    351:        username(cfg,node->useron,usrname);
                    352: 
                    353:        getstats(cfg, 0, &sstats);
                    354:        t=time(NULL);
                    355:        strftime(str[0][0],12,"%b %e",localtime(&t));
                    356:        free=getfreediskspace(cfg->temp_dir,1024);
                    357:        if(free<1000) {
                    358:                free=getfreediskspace(cfg->temp_dir,0);
                    359:                getsizestr(str[0][1],free,TRUE);
                    360:        }
                    361:        else
                    362:                getsizestr(str[0][1],free,FALSE);
                    363:        if(shownode) {
                    364:                snprintf(str[1][0],12,"%s/%s",getnumstr(str[3][2],nstats.ltoday),getnumstr(str[3][3],sstats.ltoday));
                    365:                getnumstr(str[1][1],sstats.logons);
                    366:                snprintf(str[1][2],12,"%s/%s",getnumstr(str[3][2],nstats.ttoday),getnumstr(str[3][3],sstats.ttoday));
                    367:                getnumstr(str[1][3],sstats.timeon);
                    368:                snprintf(str[2][0],12,"%s/%s",getnumstr(str[3][2],sstats.etoday),getnumstr(str[3][3],getmail(cfg,0,0)));
                    369:                l=m=0;
                    370:                for(i=0;i<cfg->total_subs;i++)
                    371:                        l+=getposts(cfg,i);                     /* l=total posts */
                    372:                for(i=0;i<cfg->total_dirs;i++)
                    373:                        m+=getfiles(cfg,i);                     /* m=total files */
                    374:                snprintf(str[2][1],12,"%s/%s",getnumstr(str[3][2],sstats.ptoday),getnumstr(str[3][3],l));
                    375:                snprintf(str[2][2],12,"%s/%s",getnumstr(str[3][2],sstats.ftoday),getnumstr(str[3][3],getmail(cfg,1,0)));
                    376:                snprintf(str[2][3],12,"%s/%s",getnumstr(str[3][2],sstats.nusers),getnumstr(str[3][3],total_users(cfg)));
                    377:                getsizestr(str[3][0],sstats.ulb,TRUE);
                    378:                snprintf(str[3][1],12,"%s/%s",getnumstr(str[3][2],sstats.uls),getnumstr(str[3][3],m));
                    379:                getsizestr(str[3][2],sstats.dlb,TRUE);
                    380:                getnumstr(str[3][3],sstats.dls);
                    381:        }
                    382:        else {
                    383:                snprintf(str[1][0],12,"%s",getnumstr(str[3][3],sstats.ltoday));
                    384:                getnumstr(str[1][1],sstats.logons);
                    385:                snprintf(str[1][2],12,"%s",getnumstr(str[3][3],sstats.ttoday));
                    386:                getnumstr(str[1][3],sstats.timeon);
                    387:                snprintf(str[2][0],12,"%s/%s",getnumstr(str[3][2],sstats.etoday),getnumstr(str[3][3],getmail(cfg,0,0)));
                    388:                l=m=0;
                    389:                for(i=0;i<cfg->total_subs;i++)
                    390:                        l+=getposts(cfg,i);                     /* l=total posts */
                    391:                for(i=0;i<cfg->total_dirs;i++)
                    392:                        m+=getfiles(cfg,i);                     /* m=total files */
                    393:                snprintf(str[2][1],12,"%s/%s",getnumstr(str[3][2],sstats.ptoday),getnumstr(str[3][3],l));
                    394:                snprintf(str[2][2],12,"%s/%s",getnumstr(str[3][2],sstats.ftoday),getnumstr(str[3][3],getmail(cfg,1,0)));
                    395:                snprintf(str[2][3],12,"%s/%s",getnumstr(str[3][2],sstats.nusers),getnumstr(str[3][3],total_users(cfg)));
                    396:                getsizestr(str[3][0],sstats.ulb,TRUE);
                    397:                snprintf(str[3][1],12,"%s/%s",getnumstr(str[3][2],sstats.uls),getnumstr(str[3][3],m));
                    398:                getsizestr(str[3][2],sstats.dlb,TRUE);
                    399:                getnumstr(str[3][3],sstats.dls);
                    400:        }
                    401:        snprintf(statbuf,sizeof(statbuf),"`Node #`: %-3d %6s  `Space`: %s"
                    402:                        "\n`Logons`: %-11s `Total`: %-11s `Timeon`: %-11s `Total`: %-11s"
                    403:                        "\n`Emails`: %-11s `Posts`: %-11s `Fbacks`: %-11s `Users`: %-11s"
                    404:                        "\n`Uloads`: %-11s `Files`: %-11s `Dloads`: %-11s `Files`: %-11s",
                    405:                        nodenum,str[0][0],str[0][1],
                    406:                        str[1][0],str[1][1],str[1][2],str[1][3],
                    407:                        str[2][0],str[2][1],str[2][2],str[2][3],
                    408:                        str[3][0],str[3][1],str[3][2],str[3][3]);
                    409: 
                    410:        uifc.showbuf(WIN_HLP|WIN_L2R|WIN_DYN|WIN_PACK,1,1,80,6,"Statistics",statbuf,curp,barp);
                    411: /* Node 5 :    Mar 11  Space: 162,024k
                    412:    Logons: 23/103      Total: 62,610      Timeon: 322/2430    Total: 5,321,900
                    413:    Emails: 4/265       Posts: 4/12811     Fbacks: 2/17        Users: 1/592
                    414:    Uloads: 324k        Files: 1/2195      Dloads: 9,308k      Files: 52 */
                    415:        return(0);
                    416: }
                    417: 
                    418: int view_log(char *filename, char *title)
                    419: {
                    420:        char str[1024];
                    421:        int buffile;
                    422:        int j;
                    423:        char *buf;
                    424: 
                    425:        if(fexist(filename)) {
                    426:                if((buffile=sopen(filename,O_RDONLY,SH_DENYWR))>=0) {
                    427:                        j=filelength(buffile);
                    428:                        if((buf=(char *)MALLOC(j+1))!=NULL) {
                    429:                                read(buffile,buf,j);
                    430:                                close(buffile);
                    431:                                *(buf+j)=0;
                    432:                                uifc.showbuf(WIN_MID,0,0,76,uifc.scrn_len-2,title,buf,NULL,NULL);
                    433:                                free(buf);
                    434:                                return(0);
                    435:                        }
                    436:                        close(buffile);
                    437:                        uifc.msg("Error allocating memory for the error log");
                    438:                        return(3);
                    439:                }
                    440:                sprintf(str,"Error opening %s",title);
                    441:                uifc.msg(str);
                    442:                return(1);
                    443:        }
                    444:        sprintf(str,"%s does not exists",title);
                    445:        uifc.msg(str);
                    446:        return(2);
                    447: }
                    448: 
                    449: int view_logs(scfg_t *cfg)
                    450: {
                    451:        char**  opt;
                    452:        int             i;
                    453:        char    str[1024];
                    454:        struct tm tm;
                    455:        struct tm tm_yest;
                    456:        time_t  now;
                    457: 
                    458:        now=time(NULL);
                    459:        localtime_r(&now,&tm);
                    460:        now -= 60*60*24;
                    461:        localtime_r(&now,&tm_yest);
                    462:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
                    463:                allocfail(sizeof(char *)*(MAX_OPTS+1));
                    464:        for(i=0;i<(MAX_OPTS+1);i++)
                    465:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
                    466:                        allocfail(MAX_OPLN);
                    467: 
                    468:        i=0;
                    469:        strcpy(opt[i++],"Today's callers");
                    470:        strcpy(opt[i++],"Yesterday's callers");
                    471:        strcpy(opt[i++],"Error log");
                    472:        strcpy(opt[i++],"Today's log");
                    473:        strcpy(opt[i++],"Yesterday's log");
                    474:        strcpy(opt[i++],"Spam log");
                    475:        strcpy(opt[i++],"SBBSEcho log");
                    476:        strcpy(opt[i++],"Guru log");
                    477:        strcpy(opt[i++],"Hack log");
                    478:        opt[i][0]=0;
                    479:        i=0;
                    480:        uifc.helpbuf=   "`View Logs\n"
                    481:                                        "`---------\n\n"
                    482:                                        "`Today's callers     : `View a list of Today's callers.\n"
                    483:                                        "`Yesterday's callers : `View a list of Yesterday's callers.\n"
                    484:                                        "`Error log           : `View the Error log.\n"
                    485:                                        "`Today's log         : `View Today's system activity.\n"
                    486:                                        "`Yesterday's log     : `View Yesterday's system activity.\n"
                    487:                                        "`Spam log            : `View the log of Spam E-Mail sent to the system.\n"
                    488:                                        "`SBBSEcho log        : `View the SBBSecho tosser log.\n"
                    489:                                        "`Guru log            : `View the transcriptions of chats with the Guru.\n"
                    490:                                        "`Hack log            : `View the Hack attempt log.";
                    491: 
                    492:        while(1) {
                    493:                switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"View Logs",opt))  {
                    494:                        case -1:
                    495:                                freeopt(opt);
                    496:                                return(0);
                    497:                        case 0:
                    498:                                sprintf(str,"%slogs/%2.2d%2.2d%2.2d.lol",cfg->logs_dir,tm.tm_mon+1,tm.tm_mday
                    499:                                        ,TM_YEAR(tm.tm_year));
                    500:                                view_log(str,"Todays Callers");
                    501:                                break;
                    502:                        case 1:
                    503:                                sprintf(str,"%slogs/%2.2d%2.2d%2.2d.lol",cfg->logs_dir,tm_yest.tm_mon+1
                    504:                                        ,tm_yest.tm_mday,TM_YEAR(tm_yest.tm_year));
                    505:                                view_log(str,"Yesterdays Callers");
                    506:                                break;
                    507:                        case 2:
                    508:                                sprintf(str,"%s/error.log",cfg->logs_dir);
                    509:                                view_log(str,"Error Log");
                    510:                                break;
                    511:                        case 3:
                    512:                                sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log",cfg->logs_dir,tm.tm_mon+1,tm.tm_mday
                    513:                                        ,TM_YEAR(tm.tm_year));
                    514:                                view_log(str,"Todays Log");
                    515:                                break;
                    516:                        case 4:
                    517:                                sprintf(str,"%slogs/%2.2d%2.2d%2.2d.log",cfg->logs_dir,tm_yest.tm_mon+1
                    518:                                        ,tm_yest.tm_mday,TM_YEAR(tm_yest.tm_year));
                    519:                                view_log(str,"Yesterdays Log");
                    520:                                break;
                    521:                        case 5:
                    522:                                sprintf(str,"%sspam.log",cfg->logs_dir);
                    523:                                view_log(str,"SPAM Log");
                    524:                                break;
                    525:                        case 6:
                    526:                                sprintf(str,"%ssbbsecho.log",cfg->logs_dir);
                    527:                                view_log(str,"SBBSEcho Log");
                    528:                                break;
                    529:                        case 7:
                    530:                                sprintf(str,"%sguru.log",cfg->logs_dir);
                    531:                                view_log(str,"Guru Log");
                    532:                                break;
                    533:                        case 8:
                    534:                                sprintf(str,"%shack.log",cfg->logs_dir);
                    535:                                view_log(str,"Hack Log");
                    536:                                break;
                    537:                }
                    538:        }
                    539: }
                    540: 
                    541: int do_cmd(char *cmd)
                    542: {
                    543:        int i;
                    544:        struct text_info ti;
                    545:        char *p;
                    546: 
                    547:        gettextinfo(&ti);
                    548:        p=malloc(ti.screenheight*ti.screenwidth*2);
                    549:        gettext(1,1,ti.screenwidth,ti.screenheight,p);
                    550:        i=system(cmd);
                    551:        puttext(1,1,ti.screenwidth,ti.screenheight,p);
                    552:        free(p);
                    553:        return(i);
                    554: }
                    555: 
                    556: int qwk_callouts(scfg_t *cfg)
                    557: {
                    558:        char**  opt;
                    559:        int             i,j;
                    560:        char    str[1024];
                    561: 
                    562:        if(cfg->total_qhubs<1) {
                    563:                uifc.msg("No QWK hubs configured!");
                    564:                return(1);
                    565:        }
                    566: 
                    567:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
                    568:                allocfail(sizeof(char *)*(MAX_OPTS+1));
                    569:        for(i=0;i<(MAX_OPTS+1);i++)
                    570:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
                    571:                        allocfail(MAX_OPLN);
                    572: 
                    573: 
                    574:        uifc.helpbuf=   "`QWK Callouts\n"
                    575:                                        "`------------\n\n"
                    576:                                        "Select the Hub and press enter to initiate a call out to\n"
                    577:                                        "the highlighted system.";
                    578: 
                    579:        j=0;
                    580:        while(1) {
                    581:                for(i=0;i<cfg->total_qhubs;i++) {
                    582:                        strcpy(opt[i],cfg->qhub[i]->id);
                    583:                        sprintf(str,"%sqnet/%s.now",cfg->data_dir,cfg->qhub[i]->id);
                    584:                        if(fexist(str))
                    585:                                strcat(opt[i]," (pending)");
                    586:                }
                    587:                opt[i][0]=0;
                    588:                switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0,"QWK Callouts",opt))  {
                    589:                        case -1:
                    590:                                freeopt(opt);
                    591:                                return(0);
                    592:                                break;
                    593:                        default:
                    594:                                sprintf(str,"%sqnet/%s.now",cfg->data_dir,cfg->qhub[j]->id);
                    595:                                ftouch(str);
                    596:                }
                    597:        }
                    598:        return(0);
                    599: }
                    600: 
                    601: int run_events(scfg_t *cfg)
                    602: {
                    603:        char**  opt;
                    604:        int             i,j;
                    605:        char    str[1024];
                    606: 
                    607:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
                    608:                allocfail(sizeof(char *)*(MAX_OPTS+1));
                    609:        for(i=0;i<(MAX_OPTS+1);i++)
                    610:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
                    611:                        allocfail(MAX_OPLN);
                    612: 
                    613:        if(cfg->total_events<1) {
                    614:                uifc.msg("No events configured!");
                    615:                return(1);
                    616:        }
                    617:        j=0;
                    618: 
                    619:        uifc.helpbuf=   "`Run Events\n"
                    620:                                        "`----------\n\n"
                    621:                                        "To run and event, highlight it and press Enter";
                    622: 
                    623:        while(1) {
                    624:                for(i=0;i<cfg->total_events;i++) {
                    625:                        strcpy(opt[i],cfg->event[i]->code);
                    626:                        sprintf(str,"%s%s.now",cfg->data_dir,cfg->event[i]->code);
                    627:                        if(fexist(str))
                    628:                                strcat(opt[i]," (pending)");
                    629:                }
                    630:                opt[i][0]=0;
                    631:                switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0,"Run Events",opt))  {
                    632:                        case -1:
                    633:                                freeopt(opt);
                    634:                                return(0);
                    635:                                break;
                    636:                        default:
                    637:                                sprintf(str,"%s%s.now",cfg->data_dir,cfg->event[j]->code);
                    638:                                ftouch(str);
                    639:                }
                    640:        }
                    641:        return(0);
                    642: }
                    643: 
                    644: int recycle_servers(scfg_t *cfg)
                    645: {
                    646:        char str[1024];
                    647:        char **opt;
                    648:        int i=0;
                    649: 
                    650:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
                    651:                allocfail(sizeof(char *)*(MAX_OPTS+1));
                    652:        for(i=0;i<(MAX_OPTS+1);i++)
                    653:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
                    654:                        allocfail(MAX_OPLN);
                    655: 
                    656:        i=0;
                    657:        strcpy(opt[i++],"FTP server");
                    658:        strcpy(opt[i++],"Mail server");
                    659:        strcpy(opt[i++],"Services");
                    660:        strcpy(opt[i++],"Telnet server");
                    661:        strcpy(opt[i++],"Web server");
                    662:        opt[i][0]=0;
                    663: 
                    664:        uifc.helpbuf=   "`Recycle Servers\n"
                    665:                                        "`---------------\n\n"
                    666:                                        "To rerun a server, highlight it and press Enter.\n"
                    667:                                        "This will reload the configuration files for selected\n"
                    668:                                        "server.";
                    669: 
                    670:        i=0;
                    671:        while(1) {
                    672:                switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Recycle Servers",opt))  {
                    673:                        case -1:
                    674:                                freeopt(opt);
                    675:                                return(0);
                    676:                                break;
                    677:                        case 0:
                    678:                                sprintf(str,"%sftpsrvr.rec",cfg->ctrl_dir);
                    679:                                ftouch(str);
                    680:                                break;
                    681:                        case 1:
                    682:                                sprintf(str,"%smailsrvr.rec",cfg->ctrl_dir);
                    683:                                ftouch(str);
                    684:                                break;
                    685:                        case 2:
                    686:                                sprintf(str,"%sservices.rec",cfg->ctrl_dir);
                    687:                                ftouch(str);
                    688:                                break;
                    689:                        case 3:
                    690:                                sprintf(str,"%stelnet.rec",cfg->ctrl_dir);
                    691:                                ftouch(str);
                    692:                                break;
                    693:                        case 4:
                    694:                                sprintf(str,"%swebsrvr.rec",cfg->ctrl_dir);
                    695:                                ftouch(str);
                    696:                                break;
                    697:                }
                    698:        }
                    699:        return(0);
                    700: }
                    701: 
                    702: char *geteditor(char *edit)
                    703: {
                    704:        if(getenv("EDITOR")==NULL && (getenv("VISUAL")==NULL || getenv("DISPLAY")==NULL))
                    705:                strcpy(edit,"vi");
                    706:        else {
                    707:                if(getenv("DISPLAY")!=NULL && getenv("VISUAL")!=NULL)
                    708:                        strcpy(edit,getenv("VISUAL"));
                    709:                else
                    710:                        strcpy(edit,getenv("EDITOR"));
                    711:        }
                    712:        return(edit);
                    713: }
                    714: 
                    715: 
                    716: int edit_cfg(scfg_t *cfg)
                    717: {
                    718:        char**  opt;
                    719:        int             i;
                    720:        char    cmd[1024];
                    721:        char    editcmd[1024];
                    722: 
                    723:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
                    724:                allocfail(sizeof(char *)*(MAX_OPTS+1));
                    725:        for(i=0;i<(MAX_OPTS+1);i++)
                    726:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
                    727:                        allocfail(MAX_OPLN);
                    728: 
                    729:        i=0;
                    730:        strcpy(opt[i++],"sbbs.ini");
                    731:        strcpy(opt[i++],"alias.cfg");
                    732:        strcpy(opt[i++],"attr.cfg");
                    733:        strcpy(opt[i++],"dns_blacklist.cfg");
                    734:        strcpy(opt[i++],"dnsbl_exempt.cfg");
                    735:        strcpy(opt[i++],"domains.cfg");
                    736:        strcpy(opt[i++],"mailproc.cfg");
                    737:        strcpy(opt[i++],"mime_types.cfg");
                    738:        strcpy(opt[i++],"relay.cfg");
                    739:        strcpy(opt[i++],"sbbsecho.cfg");
                    740:        strcpy(opt[i++],"services.cfg");
                    741:        strcpy(opt[i++],"services.ini");
                    742:        strcpy(opt[i++],"ftpalias.cfg");
                    743:        strcpy(opt[i++],"sockopts.cfg");
                    744:        strcpy(opt[i++],"spambait.cfg");
                    745:        strcpy(opt[i++],"spamblock.cfg");
                    746:        strcpy(opt[i++],"twitlist.cfg");
                    747:        opt[i][0]=0;
                    748:        uifc.helpbuf= "Highlight desired file and hit Enter to edit it.";
                    749:        i=0;
                    750:        while(1) {
                    751:                switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"System Options",opt))  {
                    752:                        case -1:
                    753:                                freeopt(opt);
                    754:                                return(0);
                    755:                                break;
                    756:                        default:
                    757:                                sprintf(cmd,"%s %s%s",geteditor(editcmd),cfg->ctrl_dir,opt[i]);
                    758:                                do_cmd(cmd);
                    759:                                break;
                    760:                }
                    761:        }
                    762:        return(0);
                    763: }
                    764: 
                    765: int edit_can(scfg_t *cfg)
                    766: {
                    767:        char**  opt;
                    768:        int             i;
                    769:        char    cmd[1024];
                    770:        char    editcmd[1024];
                    771: 
                    772:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
                    773:                allocfail(sizeof(char *)*(MAX_OPTS+1));
                    774:        for(i=0;i<(MAX_OPTS+1);i++)
                    775:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
                    776:                        allocfail(MAX_OPLN);
                    777: 
                    778:        i=0;
                    779:        strcpy(opt[i++],"email.can");
                    780:        strcpy(opt[i++],"file.can");
                    781:        strcpy(opt[i++],"host.can");
                    782:        strcpy(opt[i++],"ip.can");
                    783:        strcpy(opt[i++],"ip-silent.can");
                    784:        strcpy(opt[i++],"name.can");
                    785:        strcpy(opt[i++],"phone.can");
                    786:        strcpy(opt[i++],"rlogin.can");
                    787:        strcpy(opt[i++],"subject.can");
                    788:        opt[i][0]=0;
                    789:        uifc.helpbuf="Highlight desired file and hit Enter to edit it.";
                    790:        i=0;
                    791:        while(1) {
                    792:                switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"System Options",opt))  {
                    793:                        case -1:
                    794:                                freeopt(opt);
                    795:                                return(0);
                    796:                                break;
                    797:                        default:
                    798:                                sprintf(cmd,"%s %s%s",geteditor(editcmd),cfg->text_dir,opt[i]);
                    799:                                do_cmd(cmd);
                    800:                                break;
                    801:                }
                    802:        }
                    803:        return(0);
                    804: }
                    805: 
                    806: int main(int argc, char** argv)  {
                    807: 
                    808:        char**  opt;
                    809:        char**  mopt;
                    810:        int             main_dflt=0;
                    811:        int             main_bar=0;
                    812:        char    revision[16];
                    813:        char    str[256],ctrl_dir[41],*p;
                    814:        char    title[256];
                    815:        int             i,j;
                    816:        node_t  node;
                    817:        int             nodefile;
                    818:        box_t   boxch;
                    819:        scfg_t  cfg;
                    820:        int             done;
                    821:        int             ciolib_mode=CIOLIB_MODE_AUTO;
                    822: 
                    823:        /******************/
                    824:        /* Ini file stuff */
                    825:        /******************/
                    826:        char    ini_file[MAX_PATH+1];
                    827:        FILE*                           fp;
                    828:        bbs_startup_t           bbs_startup;
                    829: 
                    830:        sscanf("$Revision: 1.66 $", "%*s %s", revision);
                    831: 
                    832:     printf("\nSynchronet UNIX Monitor %s-%s  Copyright 2004 "
                    833:         "Rob Swindell\n",revision,PLATFORM_DESC);
                    834: 
                    835:        p=getenv("SBBSCTRL");
                    836:        if(p==NULL) {
                    837:                printf("\7\nSBBSCTRL environment variable is not set.\n");
                    838:                printf("This environment variable must be set to your CTRL directory.");
                    839:                printf("\nExample: SET SBBSCTRL=/sbbs/ctrl\n");
                    840:                exit(1); }
                    841: 
                    842:        sprintf(ctrl_dir,"%.40s",p);
                    843:        if(ctrl_dir[strlen(ctrl_dir)-1]!='\\'
                    844:                && ctrl_dir[strlen(ctrl_dir)-1]!='/')
                    845:                strcat(ctrl_dir,"/");
                    846: 
                    847:        gethostname(str,sizeof(str)-1);
                    848: 
                    849:        sbbs_get_ini_fname(ini_file, ctrl_dir, str);
                    850: 
                    851:        /* Initialize BBS startup structure */
                    852:     memset(&bbs_startup,0,sizeof(bbs_startup));
                    853:     bbs_startup.size=sizeof(bbs_startup);
                    854:     strcpy(bbs_startup.ctrl_dir,ctrl_dir);
                    855: 
                    856:        /* Read .ini file here */
                    857:        if(ini_file[0]!=0 && (fp=fopen(ini_file,"r"))!=NULL) {
                    858:                printf("Reading %s\n",ini_file);
                    859:        }
                    860:        /* We call this function to set defaults, even if there's no .ini file */
                    861:        sbbs_read_ini(fp,
                    862:                NULL,           /* global_startup */
                    863:                NULL, &bbs_startup,
                    864:                NULL, NULL, /* ftp_startup */
                    865:                NULL, NULL, /* web_startup */
                    866:                NULL, NULL, /* mail_startup */
                    867:                NULL, NULL  /* services_startup */
                    868:                );
                    869: 
                    870:        /* close .ini file here */
                    871:        if(fp!=NULL)
                    872:                fclose(fp);
                    873: 
                    874:        chdir(bbs_startup.ctrl_dir);
                    875: 
                    876:        /* Read .cfg files here */
                    877:     memset(&cfg,0,sizeof(cfg));
                    878:        cfg.size=sizeof(cfg);
                    879:        SAFECOPY(cfg.ctrl_dir,bbs_startup.ctrl_dir);
                    880:        if(!load_cfg(&cfg, NULL, TRUE, str)) {
                    881:                printf("ERROR! %s\n",str);
                    882:                exit(1);
                    883:        }
                    884:        prep_dir(cfg.data_dir, cfg.temp_dir, sizeof(cfg.temp_dir));
                    885: 
                    886:     memset(&uifc,0,sizeof(uifc));
                    887: 
                    888:        uifc.esc_delay=500;
                    889: 
                    890:        boxch.ls=186;
                    891:        boxch.rs=186;
                    892:        boxch.ts=205;
                    893:        boxch.bs=205;
                    894:        boxch.tl=201;
                    895:        boxch.tr=187;
                    896:        boxch.bl=200;
                    897:        boxch.br=188;
                    898:        for(i=1;i<argc;i++) {
                    899:         if(argv[i][0]=='-'
                    900:             )
                    901:             switch(toupper(argv[i][1])) {
                    902:                 case 'C':
                    903:                                uifc.mode|=UIFC_COLOR;
                    904:                     break;
                    905:                 case 'L':
                    906:                     uifc.scrn_len=atoi(argv[i]+2);
                    907:                     break;
                    908:                 case 'E':
                    909:                     uifc.esc_delay=atoi(argv[i]+2);
                    910:                     break;
                    911:                                case 'I':
                    912:                                        switch(toupper(argv[i][2])) {
                    913:                                                case 'A':
                    914:                                                        ciolib_mode=CIOLIB_MODE_ANSI;
                    915:                                                        break;
                    916:                                                case 'C':
                    917:                                                        ciolib_mode=CIOLIB_MODE_CURSES;
                    918:                                                        break;
                    919:                                                case 0:
                    920:                                                        printf("NOTICE: The -i option is depreciated, use -if instead\r\n");
                    921:                                                        SLEEP(2000);
                    922:                                                case 'F':
                    923:                                                        ciolib_mode=CIOLIB_MODE_CURSES_IBM;
                    924:                                                        break;
                    925:                                                case 'X':
                    926:                                                        ciolib_mode=CIOLIB_MODE_X;
                    927:                                                        break;
                    928:                                                case 'W':
                    929:                                                        ciolib_mode=CIOLIB_MODE_CONIO;
                    930:                                                        break;
                    931:                                                default:
                    932:                                                        goto USAGE;
                    933:                                        }
                    934:                                        break;
                    935:                 default:
                    936:                                        USAGE:
                    937:                     printf("\nusage: %s [ctrl_dir] [options]"
                    938:                         "\n\noptions:\n\n"
                    939:                         "-c  =  force color mode\n"
                    940:                         "-e# =  set escape delay to #msec\n"
                    941:                                                "-iX =  set interface mode to X (default=auto) where X is one of:\r\n"
                    942: #ifdef __unix__
                    943:                                                "       X = X11 mode\r\n"
                    944:                                                "       C = Curses mode\r\n"
                    945:                                                "       F = Curses mode with forced IBM charset\r\n"
                    946: #else
                    947:                                                "       W = Win32 native mode\r\n"
                    948: #endif
                    949:                                                "       A = ANSI mode\r\n"
                    950:                         "-l# =  set screen lines to #\n"
                    951:                                                ,argv[0]
                    952:                         );
                    953:                                exit(0);
                    954:            }
                    955:     }
                    956: 
                    957:        signal(SIGPIPE, SIG_IGN);
                    958: 
                    959:        uifc.size=sizeof(uifc);
                    960:        i=initciolib(ciolib_mode);
                    961:        if(i!=0) {
                    962:        printf("ciolib library init returned error %d\n",i);
                    963:        exit(1);
                    964:        }
                    965:        i=uifcini32(&uifc);  /* curses */
                    966:        if(i!=0) {
                    967:                printf("uifc library init returned error %d\n",i);
                    968:                exit(1);
                    969:        }
                    970: 
                    971:        if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL)
                    972:                allocfail(sizeof(char *)*(MAX_OPTS+1));
                    973:        for(i=0;i<(MAX_OPTS+1);i++)
                    974:                if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
                    975:                        allocfail(MAX_OPLN);
                    976: 
                    977:        if((mopt=(char **)MALLOC(sizeof(char *)*MAX_OPTS))==NULL)
                    978:                allocfail(sizeof(char *)*MAX_OPTS);
                    979:        for(i=0;i<MAX_OPTS;i++)
                    980:                if((mopt[i]=(char *)MALLOC(MAX_OPLN))==NULL)
                    981:                        allocfail(MAX_OPLN);
                    982: 
                    983:        sprintf(title,"Synchronet UNIX Monitor %s-%s",revision,PLATFORM_DESC);
                    984:        if(uifc.scrn(title)) {
                    985:                printf(" USCRN (len=%d) failed!\n",uifc.scrn_len+1);
                    986:                bail(1);
                    987:        }
                    988: 
                    989:        while(1) {
                    990:                strcpy(mopt[0],"System Options");
                    991:                for(i=1;i<=cfg.sys_nodes;i++) {
                    992:                        if((j=getnodedat(&cfg,i,&node,NULL)))
                    993:                                sprintf(mopt[i],"Error reading node data (%d)!",j);
                    994:                        else
                    995:                                sprintf(mopt[i],"%3d: %s",i,nodestatus(&cfg,&node,str,71));
                    996:                }
                    997:                mopt[i][0]=0;
                    998: 
                    999:                uifc.helpbuf=   "`Synchronet UNIX Monitor\n"
                   1000:                                "`------------------\n"
                   1001:                                "Welcome to the Synchronet UNIX Monitor.\n"
                   1002:                                "Displayed on this screen are the statitics for the BBS\n"
                   1003:                                "You can scroll through the list starting at \"System Options\" \n"
                   1004:                                "Pressing Enter on each will give a menu of option to perform.\n"
                   1005:                                "Additionally these keys are available from this screen:\n\n"
                   1006:                                                "`CTRL-E : `Displays the error log\n"
                   1007:                                                "`F12    : `Spys on the currently selected node\n"
                   1008:                                                "`F11    : `Send message to the currently selected node\n"
                   1009:                                                "`F10    : `Chats with the user on the currently selected node\n"
                   1010:                                                "`DEL    : `Clear errors on currently selected node\n"
                   1011:                                                "`CTRL-L : `Lock node toggle\n"
                   1012:                                                "`CTRL-R : `Rerun node\n"
                   1013:                                                "`CTRL-D : `Down node toggle\n"
                   1014:                                                "`CTRL-I : `Interrupt node\n";
                   1015: 
                   1016:                drawstats(&cfg, main_dflt, &node, &main_dflt, &main_bar);
                   1017: 
                   1018:                j=uifc.list(WIN_L2R|WIN_ESC|WIN_ACT|WIN_DYN,0,5,70,&main_dflt,&main_bar
                   1019:                        ,title,mopt);
                   1020: 
                   1021:                if(j == -2)
                   1022:                        continue;
                   1023: 
                   1024:                if(j==-7) {     /* CTRL-E */
                   1025:                        sprintf(str,"%s/error.log",cfg.data_dir);
                   1026:                        view_log(str,"Error Log");
                   1027:                        continue;
                   1028:                }
                   1029: 
                   1030:                if(j==0) {
                   1031:                        /* System Options */
                   1032:                        i=0;
                   1033:                        strcpy(opt[i++],"Run SCFG");
                   1034:                        strcpy(opt[i++],"Run User Editor");
                   1035:                        strcpy(opt[i++],"Run SyncTERM");
                   1036:                        strcpy(opt[i++],"View logs");
                   1037:                        strcpy(opt[i++],"Force QWK Net callout");
                   1038:                        strcpy(opt[i++],"Run event");
                   1039:                        strcpy(opt[i++],"Recycle servers");
                   1040:                        strcpy(opt[i++],"Edit CFG/INI files");
                   1041:                        strcpy(opt[i++],"Edit trashcan files");
                   1042:                        opt[i][0]=0;
                   1043:                        uifc.helpbuf=   "`System Options`\n"
                   1044:                                        "`------------`\n\n"
                   1045:                                                        "`Run SCFG              : `Run the Synchronet Configuration Utility.\n"
                   1046:                                                        "`Run User Editor       : `Call up the User Editor.\n"
                   1047:                                                        "`Run SynchTERM         : `Run SyncTERM for RLogin.  SyncTERM must be\n"
                   1048:                                                        "                        in the exec directory.\n"
                   1049:                                                        "`View logs             : `View the various system logs.\n"
                   1050:                                                        "`Force QWK Net callout : `Force a callout to QWK Net Hub.  Select which\n"
                   1051:                                                        "                        Hub from a popup list of configured Hubs.\n"
                   1052:                                                        "`Run Event             : `Call up a menu of system events that can be\n"
                   1053:                                                        "                        manually.\n"
                   1054:                                                        "`Recycle Servers       : `Have the Servers reload their configuration \n"
                   1055:                                                        "                        files.\n"
                   1056:                                                        "`Edit trashcan files   : `Edit the various .can files.  i.e.; ip.can";
                   1057: 
                   1058:                        done=0;
                   1059:                        i=0;
                   1060:                        while(!done) {
                   1061:                                switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"System Options",opt))  {
                   1062:                                        case -1:
                   1063:                                                done=1;
                   1064:                                                break;
                   1065:                                        case 0:
                   1066:                                                sprintf(str,"%sscfg ",cfg.exec_dir);
                   1067:                                                for(j=1; j<argc; j++) {
                   1068:                                                        strcat(str,"'");
                   1069:                                                        strcat(str,argv[j]);
                   1070:                                                        strcat(str,"' ");
                   1071:                                                }
                   1072:                                                do_cmd(str);
                   1073:                                                break;
                   1074:                                        case 1:
                   1075:                                                sprintf(str,"%suedit ",cfg.exec_dir);
                   1076:                                                for(j=1; j<argc; j++) {
                   1077:                                                        strcat(str,"'");
                   1078:                                                        strcat(str,argv[j]);
                   1079:                                                        strcat(str,"' ");
                   1080:                                                }
                   1081:                                                do_cmd(str);
                   1082:                                                break;
                   1083:                                        case 2:
                   1084:                                                sprintf(str,"%ssyncterm",cfg.exec_dir);
                   1085:                                                for(j=1; j<argc; j++) {
                   1086:                                                        strcat(str,"'");
                   1087:                                                        strcat(str,argv[j]);
                   1088:                                                        strcat(str,"' ");
                   1089:                                                }
                   1090:                                                do_cmd(str);
                   1091:                                                break;
                   1092:                                        case 3:
                   1093:                                                view_logs(&cfg);
                   1094:                                                break;
                   1095:                                        case 4:
                   1096:                                                qwk_callouts(&cfg);
                   1097:                                                break;
                   1098:                                        case 5:
                   1099:                                                run_events(&cfg);
                   1100:                                                break;
                   1101:                                        case 6:
                   1102:                                                recycle_servers(&cfg);
                   1103:                                                break;
                   1104:                                        case 7:
                   1105:                                                edit_cfg(&cfg);
                   1106:                                                break;
                   1107:                                        case 8:
                   1108:                                                edit_can(&cfg);
                   1109:                                                break;
                   1110:                                }
                   1111:                        }
                   1112:                        continue;
                   1113:                }
                   1114: 
                   1115:                if(j==-1) {
                   1116:                        i=0;
                   1117:                        strcpy(opt[0],YesStr);
                   1118:                        strcpy(opt[1],NoStr);
                   1119:                        opt[2][0]=0;
                   1120:                        uifc.helpbuf=   "`Exit Synchronet UNIX Monitor:`\n"
                   1121:                                                        "\n"
                   1122:                                                        "\nIf you want to exit the Synchronet UNIX monitor utility,"
                   1123:                                                        "\nselect `Yes`. Otherwise, select `No` or hit ~ ESC ~.";
                   1124:                        i=uifc.list(WIN_MID,0,0,0,&i,0,"Exit Synchronet Monitor",opt);
                   1125:                        if(!i)
                   1126:                                bail(0);
                   1127:                        continue;
                   1128:                }
                   1129: 
                   1130:                /* Everything after this point is invalid for the System Options */
                   1131:                if(main_dflt==0)
                   1132:                        continue;
                   1133: 
                   1134:                if(j==-2-CIO_KEY_DC) {  /* Clear errors */
                   1135:                        clearerrors(&cfg, main_dflt,&node);
                   1136:                        continue;
                   1137:                }
                   1138: 
                   1139:                if(j==-2-CIO_KEY_F(10)) {       /* Chat */
                   1140:                        if(getnodedat(&cfg,main_dflt,&node,NULL)) {
                   1141:                                uifc.msg("Error reading node data!");
                   1142:                                continue;
                   1143:                        }
                   1144:                        if((node.status==NODE_INUSE) && node.useron)
                   1145:                                chat(&cfg,main_dflt,&node,&boxch,NULL);
                   1146:                        continue;
                   1147:                }
                   1148: 
                   1149:                if(j==-2-CIO_KEY_F(11)) {       /* Send message */
                   1150:                        sendmessage(&cfg, main_dflt,&node);
                   1151:                        continue;
                   1152:                }
                   1153: 
                   1154:                if(j==-2-CIO_KEY_F(12)) {       /* Spy */
                   1155:                        dospy(main_dflt,&bbs_startup);
                   1156:                        continue;
                   1157:                }
                   1158: 
                   1159:                if(j==-2-CTRL('l')) {   /* Lock node */
                   1160:                        if(getnodedat(&cfg,main_dflt,&node,&nodefile)) {
                   1161:                                uifc.msg("Error reading node data!");
                   1162:                                continue;
                   1163:                        }
                   1164:                        node.misc^=NODE_LOCK;
                   1165:                        putnodedat(&cfg,main_dflt,&node,nodefile);
                   1166:                        continue;
                   1167:                }
                   1168: 
                   1169:                if(j==-2-CTRL('r')) {   /* Rerun node */
                   1170:                        if(getnodedat(&cfg,main_dflt,&node,&nodefile)) {
                   1171:                                uifc.msg("Error reading node data!");
                   1172:                                continue;
                   1173:                        }
                   1174:                        node.misc^=NODE_RRUN;
                   1175:                        putnodedat(&cfg,main_dflt,&node,nodefile);
                   1176:                        continue;
                   1177:                }
                   1178: 
                   1179:                if(j==-2-CTRL('d')) {   /* Down node */
                   1180:                        if(getnodedat(&cfg,main_dflt,&node,&nodefile)) {
                   1181:                                uifc.msg("Error reading node data!");
                   1182:                                continue;
                   1183:                        }
                   1184:                        if(node.status != NODE_WFC && node.status != NODE_OFFLINE)
                   1185:                                node.misc ^= NODE_DOWN;
                   1186:                        else {
                   1187:                                if(node.status!=NODE_OFFLINE)
                   1188:                                        node.status=NODE_OFFLINE;
                   1189:                                else
                   1190:                                        node.status=NODE_WFC;
                   1191:                        }
                   1192:                        putnodedat(&cfg,main_dflt,&node,nodefile);
                   1193:                        continue;
                   1194:                }
                   1195: 
                   1196:                if(j==-2-CTRL('i')) {   /* Interrupt node */
                   1197:                        if(getnodedat(&cfg,main_dflt,&node,&nodefile)) {
                   1198:                                uifc.msg("Error reading node data!");
                   1199:                                continue;
                   1200:                        }
                   1201:                        node.misc^=NODE_INTR;
                   1202:                        putnodedat(&cfg,main_dflt,&node,nodefile);
                   1203:                        continue;
                   1204:                }
                   1205: 
                   1206:                if(j <= -2)
                   1207:                        continue;
                   1208: 
                   1209:                if(j<=cfg.sys_nodes && j>0) {
                   1210:                  if((node.status==NODE_INUSE) && node.useron) {
                   1211:                i=0;
                   1212:                        strcpy(opt[i++],"Edit User");
                   1213:                        strcpy(opt[i++],"Spy on node");
                   1214:                        strcpy(opt[i++],"Send message to user");
                   1215:                        strcpy(opt[i++],"Chat with user");
                   1216:                        strcpy(opt[i++],"Node toggles");
                   1217:                        strcpy(opt[i++],"Clear Errors");
                   1218:                        strcpy(opt[i++],"View node log");
                   1219:                        strcpy(opt[i++],"View crash log");
                   1220: 
                   1221:                        opt[i][0]=0;
                   1222:                        i=0;
                   1223:                        uifc.helpbuf=   "`Node Options\n"
                   1224:                                        "`------------\n\n"
                   1225:                                                        "`Edit User            : `Call up the user editor to edit current user.\n"
                   1226:                                                        "`Spy on User          : `Spy on current user.\n"
                   1227:                                                        "`Send message to user : `Send on online message to user.\n"
                   1228:                                                        "`Chat with user       : `Initiate private split-screen chat wityh user.\n"
                   1229:                                                        "`Node Toggles         : `Call up Node Toggles menu to set various toggles\n"
                   1230:                                                        "                       for current node.\n"
                   1231:                                                        "`Clear Errors         : `Clears the error count for node.\n"
                   1232:                                                        "`View node log        : `View activity log for current node.\n"
                   1233:                                                        "`View crash log       : `View the crash log for current node.";
                   1234:                        done=0;
                   1235:                        while(!done) {
                   1236:                                switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Node Options",opt))  {
                   1237: 
                   1238:                                        case 0:  /* Edit Users */
                   1239:                                                sprintf(str,"%suedit %d",cfg.exec_dir,node.useron);
                   1240:                                                for(j=1; j<argc; j++) {
                   1241:                                                  strcat(str,"'");
                   1242:                                                  strcat(str,argv[j]);
                   1243:                                                  strcat(str,"' ");
                   1244:                                                }
                   1245:                                                do_cmd(str);
                   1246:                                                break;
                   1247: 
                   1248:                                    case 1:     /* Spy */
                   1249:                                                dospy(j,&bbs_startup);
                   1250:                                                break;
                   1251: 
                   1252:                                        case 2: /* Send message */
                   1253:                                                sendmessage(&cfg, j,&node);
                   1254:                                                break;
                   1255: 
                   1256:                                        case 3: /* Chat with User */
                   1257:                                                chat(&cfg,main_dflt,&node,&boxch,NULL);
                   1258:                                                break;
                   1259: 
                   1260:                                        case 4: /* Node Toggles */
                   1261:                                                node_toggles(&cfg, j);
                   1262:                                                break;
                   1263: 
                   1264:                                        case 5:
                   1265:                                                clearerrors(&cfg, j,&node);
                   1266:                                                break;
                   1267: 
                   1268:                                        case 6: /* Node log */
                   1269:                                                sprintf(str,"%snode.log",cfg.node_path[j-1]);
                   1270:                                                view_log(str,"Node Log");
                   1271:                                                break;
                   1272: 
                   1273:                                        case 7: /* Crash log */
                   1274:                                                sprintf(str,"%scrash.log",cfg.node_path[j-1]);
                   1275:                                                view_log(str,"Crash Log");
                   1276:                                                break;
                   1277: 
                   1278:                                        case -1:
                   1279:                                                done=1;
                   1280:                                                break;
                   1281: 
                   1282:                                        default:
                   1283:                                                uifc.msg("Option not implemented");
                   1284:                                                break;
                   1285:                                        }
                   1286:                                }
                   1287:             }
                   1288:          }
                   1289:                if(j<=cfg.sys_nodes && j>0) {
                   1290:                  if(!((node.status==NODE_INUSE) && node.useron)) {
                   1291: 
                   1292:                i=0;
                   1293:                        strcpy(opt[i++],"Node toggles");
                   1294:                        strcpy(opt[i++],"Clear Errors");
                   1295:                        strcpy(opt[i++],"View node log");
                   1296:                        strcpy(opt[i++],"View crash log");
                   1297: 
                   1298:                        opt[i][0]=0;
                   1299:                        i=0;
                   1300:                        uifc.helpbuf=   "`Node Options\n"
                   1301:                                        "`------------\n\n"
                   1302:                                                        "`Node Toggles   : `Call up Node Toggles menu to set various toggles\n"
                   1303:                                                        "                 for current node.\n"
                   1304:                                                        "`Clear Errors   : `Clears the error count for node.\n"
                   1305:                                                        "`View node log  : `View activity log for current node.\n"
                   1306:                                                        "`View crash log : `View the crash log for current node.";
                   1307:                        done=0;
                   1308:                        while(!done) {
                   1309:                                switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Node Options",opt))  {
                   1310: 
                   1311:                                        case 0: /* Node Toggles */
                   1312:                                                node_toggles(&cfg, j);
                   1313:                                                break;
                   1314: 
                   1315:                                        case 1:
                   1316:                                                clearerrors(&cfg, j,&node);
                   1317:                                                break;
                   1318: 
                   1319:                                        case 2: /* Node log */
                   1320:                                                sprintf(str,"%snode.log",cfg.node_path[j-1]);
                   1321:                                                view_log(str,"Node Log");
                   1322:                                                break;
                   1323: 
                   1324:                                        case 3: /* Crash log */
                   1325:                                                sprintf(str,"%scrash.log",cfg.node_path[j-1]);
                   1326:                                                view_log(str,"Crash Log");
                   1327:                                                break;
                   1328: 
                   1329:                                case -1:
                   1330:                                                done=1;
                   1331:                                                break;
                   1332: 
                   1333:                                        default:
                   1334:                                                uifc.msg("Option not implemented");
                   1335:                                                break;
                   1336:                                        }
                   1337:                                }
                   1338:             }
                   1339:                }
                   1340:        }
                   1341: }
                   1342: 
                   1343: 
                   1344: 
                   1345: 
                   1346: 
                   1347: 
                   1348: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.