This is ConController.m in view mode; [Download] [Up]
/* Ronin Consulting, Inc. Copyright (C) 1992, Nicholas Christopher (nwc@gun.com) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #import <pwd.h> #import <libc.h> #import "version.h" #import "Defaults.h" #import "EnhancedText.h" #import "EnhancedApp.h" #import "Subprocess.h" #import "ConController.h" #import "LogController.h" #import "InfoController.h" #import "SweepView.h" #import <appkit/ScrollView.h> #import <appkit/PopUpList.h> #import <appkit/Window.h> #import <appkit/Matrix.h> #import <string.h> static char tempFile[30] = "/tmp/.UUCon.XXXXXX"; static void sweepIncrement(DPSTimedEntry teNumber, double now, void *userData); @interface ConController (PRIVATE) /* Private methods */ -_startSweep; -_endSweep; @end @implementation ConController - init { [super init]; [NXApp appDirectory]; /* cd to Apps directory so files in wrapper can be found */ defaults = [Defaults new]; teNum = (DPSTimedEntry)0; procType = NO_SPROC; logfile = syslog = nil; return self; } - pollHost:sender { const char *host = [hostsPopUp title]; char buff[80 + strlen(host)]; if(procType != NO_SPROC) return self; sprintf(buff,"Polling host: %s\n", host); [consoleLog appendString: buff]; [self _startSweep]; if(*[defaults get: "DebugPoll"] == 'Y' && !auditProc) { auditFile = mktemp(tempFile); /* build a temporary audit file */ sprintf(buff,"/usr/lib/uucp/uucico -r1 -s%s -x9 2> %s", host, auditFile); } else { [consoleLog appendString: "\nStarting to Poll - check log tool to watch progress\n"]; sprintf(buff,"uupoll %s", host); } procType = POLL_HOST; subProc = [[Subprocess alloc] init: buff withDelegate: self]; if(*[defaults get: "DebugPoll"] == 'Y') { sprintf(buff, "tail -f %s", auditFile); auditProc = [[Subprocess alloc] init: buff withDelegate: self]; } return self; } - getBPS: sender { char cmd[512] = "tail -14 /usr/spool/uucp/SYSLOG | fgrep bytes | \ awk '/failed/ { printf \" %8d bytes %8s (%8s) in %7.2f sec FAILED\\n\",\ $7, $5, $2, $9 } \ { if ( $7 > 100 && ($9 + 0) > 0) \ { bytes += $7; seconds += $9; \ printf \"%8d bytes %8s(%s) in %7.2f\\n\", $7, $5, $2, $9}} \ END { printf \"\\nAvg %8.2f bps\\n\", (bytes/seconds) * 8 }'"; if (procType != NO_SPROC) return self; [self _startSweep]; [consoleLog appendString: "Speed of last 7 jobs\n"]; procType = GET_BPS; subProc = [[Subprocess alloc] init: cmd withDelegate: self]; return self; } - hostsQueue:sender { const char *host = [hostsPopUp title]; char buff[80 + strlen(host)]; if(procType != NO_SPROC) return self; [self _startSweep]; sprintf(buff,"Queue for host: %s\n", host); [consoleLog appendString: buff]; sprintf(buff,"uuq -l -s%s -b%s", host, [defaults get: "BaudRate"]); procType = HOST_QUEUE; subProc = [[Subprocess alloc] init: buff withDelegate: self]; return self; } - hostsSnap:sender { if(procType != NO_SPROC) return self; [self _startSweep]; [consoleLog appendString: "Snapshot of uucp hosts\n"]; procType = SNAP_HOSTS; subProc = [[Subprocess alloc] init: "uusnap" withDelegate: self]; return self; } - setConsoleLog:sender { consoleLog = [sender docView]; return self; } - deleteJob:sender { const char *host = [hostsPopUp title]; const char *job = [consoleLog selectedText]; char buff[80 + strlen(host) + strlen(job)]; if(procType != NO_SPROC) return self; [self _startSweep]; sprintf(buff,"Deleting job %s for host: %s\n", job, host); [consoleLog appendString: buff]; sprintf(buff, "uuq -s%s -d%s", host, job); procType = DELETE_JOB; subProc = [[Subprocess alloc] init: buff withDelegate: self]; return self; } - keyWindowLogClear: sender { id keyController = [[NXApp keyWindow] delegate]; if([keyController respondsTo: @selector(logClear)]) [keyController logClear]; return self; } - logClear { [consoleLog empty: self]; return self; } - syslog: sender { if(!syslog) syslog = [[LogController alloc] initForCommand: "tail -10f /usr/spool/uucp/SYSLOG" entitled: "SYSLOG" ]; [syslog makeKeyAndOrderFront: self]; return self; } - logfile: sender { if(!logfile) logfile = [[LogController alloc] initForCommand: "tail -10f /usr/spool/uucp/LOGFILE" entitled: "LOGFILE" ]; [logfile makeKeyAndOrderFront: self]; return self; } @end /* ConController */ @implementation ConController (PRIVATE) -_startSweep { [progress setIntValue: 0]; teNum = DPSAddTimedEntry(.02, sweepIncrement, &progress, NX_RUNMODALTHRESHOLD + 1); return self; } -_endSweep { if(teNum) { DPSRemoveTimedEntry(teNum); teNum = (DPSTimedEntry)0; } [progress setIntValue: -1]; // [progress display]; return self; } @end /* ConController (PRIVATE) */ @implementation ConController (ApplicationDelegate) - appDidInit:sender { /* if this program is set gid to daemon and L.sys is group readable to same we can debug */ setgid(getegid()); [infoController setVersionValue: version]; procType = BUILDING_MENU; subProc = [[Subprocess alloc] init: "uuname" withDelegate: self]; [progress setIntValue: -1]; [progress setStepSize: 10]; return self; } - appWillTerminate:sender { if(procType != NO_SPROC) [subProc free]; if(auditProc) [auditProc free]; if(logfile) [logfile free]; if(syslog) [syslog free]; return self; } @end /* ApplicationDelegate */ @implementation ConController (SubprocessDelegate) - subprocess:sender done:(int)exitStatus { switch(procType) { case BUILDING_MENU: [[hostsPopUp target] removeItem: [hostsPopUp title]]; [hostsPopUp setTitle: [[[[hostsPopUp target] itemList] cellAt:0:0] title]]; /* choose the default host if one set */ if([[hostsPopUp target] indexOfItem: [defaults get: "DefaultHost"]] != -1) [hostsPopUp setTitle: [defaults get: "DefaultHost"]]; [consoleLog appendString: "Ready to go.\n"]; if(*[defaults get: "ShowLog"] == 'Y') [self logfile: self]; if(*[defaults get: "ShowSysLog"] == 'Y') [self syslog: self]; [window makeKeyAndOrderFront: self]; break; case HOST_QUEUE: [consoleLog appendString: "\nQueue Complete\n"]; break; case SNAP_HOSTS: [consoleLog appendString: "\nSnapshot Complete\n"]; break; case POLL_HOST: if(auditProc) { [consoleLog appendString:"\nDebug Poll done.\n"]; [NXApp delayedFree: auditProc]; auditProc = nil; unlink(auditFile); } break; case DELETE_JOB: [consoleLog appendString: "\nDelete Complete\n"]; break; case GET_BPS: [consoleLog appendString: "\nSpeed Listing Complete.\n"]; break; case NO_SPROC: return self; /* don't want to free unknown */ break; } if(sender == subProc) { procType = NO_SPROC; [self _endSweep]; } [NXApp delayedFree: sender]; return self; } - subprocess:sender output:(char *)buffer { [progress increment: self]; switch(procType) { case BUILDING_MENU: [[hostsPopUp target] addItem: buffer]; break; default: [consoleLog appendString: buffer]; [consoleLog appendString: "\n"]; break; } return self; } - subprocess:sender stderrOutput:(char *)buffer { [progress increment: self]; [consoleLog appendString: buffer]; return self; } - subprocess:sender error:(const char *)errorString { [consoleLog appendString: "Failed to create subprocess.\n"]; return self; } @end void sweepIncrement(DPSTimedEntry teNumber, double now, void *userData) { [*(id *)userData increment: nil]; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.