|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.