rjs@a.cs.okstate.edu (Roland Stolfa) (12/07/88)
Posting-number: Volume 5, Issue 71 Submitted-by: "Roland Stolfa" <rjs@a.cs.okstate.edu> Archive-name: trouble echo x - README sed '1,$s/^X//' <<\!FUNKY!STUFF! > README XINTRODUCTION: X X This is the Trouble Report System (TRS) by X X Roland J. Stolfa X Department of Computing and Information Sciences X Oklahoma State University X X Internet: rjs@a.cs.okstate.edu X X XDISCLAIMER: X X All code is public domain. No guarentee, expressed nor implied, X covers this code. I will NOT be responsible for it's use or X misuse in your application. I just hope (Underline that in red) X that it may prove useful to you. If something doesn't compile, X I hope that the comments that surround the troble line will be X sufficient to fix the problem. X X XDESCRIPTION: X X This is a set of Bourne shell scrips and C programs intended X to maintain a database of trouble reports. The actions supported X in this package are open a trouble report (trouble), post a followup X on a trouble report (followup), remove a 'thread' of trouble reports X (rmthread), report all open trouble report ticket numbers (opentr), X and summarize a class of trouble reports (report). X X XINSTALLATION PROCEDURES: X X1. Make a directory and put this shar in it. Then say "sh <fn>". X X2. Edit the file "Localize" to point the "ROOT", "BIN" and X shell script escape sequences at the localally correct X values. Then type "sh Localize" to install these values X on all files in this directory. Then edit the Makefile X and change the -DSYS5 to either -DSYS5 or -DULTRIX. X X3. Say "make install". This makes the various directories & X sets the permissions to allow the next procedure to function. X X4. Say "make all". X X5. Done. X X XDIRECTORY STRUCTURE: X X Trs X | X +-------+------------+----------+---------------+-------+ X | | | | | | X Entry <Soundex1> ... <SoundexN> tmp bin X | | | | X +---+-----+ +-------+-+ +----+----+ +-----+ X | ... | | ... | | ... | | ... | X <Timestamp1> ... <Timestamp1> ..<Timestamp1> ... trs.seq <temps> X XEach TRS record is first built in a temporary. It is then linked into the X.../Trs/Entry/<Timestamp>" file. Then it is linked into a subdirectory Xfor each SOUNDEX encoded keyword given during data entry. X X XNOTES: X X1. If you need to move this datastructure, please use a program X that preserves the link relationships. X X2. If the average TRS record size is small and the default X block size on the storage device is large, you loose... X X3. This system typically uses a large number of links. This X implies that a large number of inodes will be used. This X can be a problem on smaller systems... X X4. Each user can override the default "ROOT" setting by having X an environment variable "TRSROOT" set to some directory X that has the same structure as the one above. X X XFILES: X X Localize X X This shell script patches all the files in this system to X work with the locally chosen directories. X X Makefile X X Used to create all the executables for each program. X X README X X This file. X X followup.sh X X This program is used to enter a follow up report onto X the end of a TRS thread. It walks the thread, from anywhere X on the thread, to then end and then doubly links the end X of the current thread to the new report. X X mkpath.c X X A utility program to generate directories along a given X path without complaining. X X opentr.sh X X This shell script lists the initial trouble report ticket X number for all active trouble reports. X X parse.awk X X This "awk(1)" program is used to parse the command line X arguments to "report.sh". X X print.c X X This simple program is used to print all the command line X arguments on a line by itself without a carriage return X on the end. X X report.sh X X This shell script attempts to extract data from the TRS X database given any combination of keys. X X reporter.awk X X This "awk(1)" program is used in one stage of the "report.sh" X program. X X rmthread.sh X X This shell script removes an entire linked list of trouble X reports, given a report anywhere in the list. X X soundex.c X X This C program implements a "SOUNDEX" algorithm and is used X in the TRS to encode keywords within the database to ease X searching. X X trouble.sh X X This shell script does the actual data entry for the TRS system. X It attempts to prompt for all the relavant data, generates X some stuff by default, and then builds all the linked files X that constitue the database. !FUNKY!STUFF! echo x - Localize sed '1,$s/^X//' <<\!FUNKY!STUFF! > Localize X# X# Localizing script for the (T)rouble (R)eport (S)ystem X# X Xfor i in Makefile *.sh Xdo X X # X # Attach the "ROOT" to some clean point like /usr/local/lib/trs X # as this will need to be a publically writable directory that X # will hold all trouble reports. X # X # Attach the "BIN" to some global point like /usr/lbin for all X # the executables X # Xed - $i <<'EOF' Xg;^ROOT;s;=.*$;=/u/rjs/lib/Trs; Xg;^BIN;s;=.*$;=/u/rjs/bin; Xw Xq XEOF X Xdone X Xfor i in *.sh Xdo X X # X # The ":" in the ed script below is the first line of all shell X # scripts for SYS5. For ULTRIX, it should be "#!/bin/sh". X # Xed - $i <<'EOF' X1 s;^.*$;:; Xw Xq XEOF X Xdone !FUNKY!STUFF! echo x - Makefile sed '1,$s/^X//' <<\!FUNKY!STUFF! > Makefile X# X# Package : TRS X# Module : (Makefile) X# Programmer : R. Stolfa X# X# Purpose : To maintain a Trouble Report System for an X# university environment X# X# Modification History: X# 04/11/88 Created X# 10/25/88 Updated for distribution outside of OSU X# XROOT=/u/rjs/lib/Trs XLIB=$(ROOT)/lib XBIN=/u/rjs/bin XCFLAGS= -O -DSYS5 X XDuMb: X @echo Make what? X Xfollowup: $(BIN)/followup X$(BIN)/followup: followup.sh X cp followup.sh $(BIN)/followup X chmod 755 $(BIN)/followup X Xmkpath: $(LIB)/mkpath X$(LIB)/mkpath: mkpath.c X cc $(CFLAGS) mkpath.c -o $(LIB)/mkpath X chmod 755 $(LIB)/mkpath X Xopentr: $(BIN)/opentr X$(BIN)/opentr: opentr.sh X cp opentr.sh $(BIN)/opentr X chmod 755 $(BIN)/opentr X XParse.awk: $(LIB)/parse.awk X$(LIB)/parse.awk: parse.awk X cp parse.awk $(LIB)/parse.awk X chmod 644 $(LIB)/parse.awk X Xprint: $(LIB)/print X$(LIB)/print: print.c X cc print.c -o $(LIB)/print X chmod 755 $(LIB)/print X Xreport: Parse.awk Reporter.awk $(BIN)/report X$(BIN)/report: report.sh X cp report.sh $(BIN)/report X chmod 755 $(BIN)/report X XReporter.awk: $(LIB)/reporter.awk X$(LIB)/reporter.awk: reporter.awk X cp reporter.awk $(LIB)/reporter.awk X chmod 644 $(LIB)/reporter.awk X Xrmthread: $(BIN)/rmthread X$(BIN)/rmthread: rmthread.sh X cp rmthread.sh $(BIN)/rmthread X chmod 755 $(BIN)/rmthread X Xsoundex: $(LIB)/soundex X$(LIB)/soundex: soundex.c X cc soundex.c -o $(LIB)/soundex X chmod 755 $(LIB)/soundex X Xtrouble: $(BIN)/trouble X$(BIN)/trouble: trouble.sh X cp trouble.sh $(BIN)/trouble X chmod 755 $(BIN)/trouble X X# X# Housekeeping X# X Xall: followup opentr mkpath print report rmthread soundex trouble X @echo "Don't forget 'make install' to setup sequence file" X Xbackout: clean X rm -rf $(ROOT) X rm -if $(BIN)/followup $(BIN)/opentr $(BIN)/report $(BIN)/rmthread \ X $(BIN)/trouble X Xclean: X rm -f *.o a.out core X Xinstall: X -mkdir $(ROOT) $(ROOT)/Entry $(ROOT)/tmp $(ROOT)/lib X chmod 777 $(ROOT) $(ROOT)/Entry $(ROOT)/tmp X chmod 755 $(ROOT)/lib X echo "0" > $(ROOT)/sequence X Xshar: X shar README Localize Makefile [a-z]* > Trs.shar X X# X# Dependancies X# Xmkpath.o print.o soundex.o : /usr/include/stdio.h !FUNKY!STUFF! echo x - followup.1 sed '1,$s/^X//' <<\!FUNKY!STUFF! > followup.1 X.TH FOLLOWUP L X.SH NAME Xfollowup - post a followup trouble report X.SH SYNOPSIS X.B followup [ ticket number ] X.br X.SH DESCRIPTION X.I followup Xis intended to be the method of posting a new report in a "thread" of Xreports assoicated with a reported problem in hardware/software. X.PP XIf X.I followup Xis invoked without a ticket number, it prompts for one. Then an entire Xnew trouble report is attached to a thread of reports assoicated together. XThis list of reports is doubly linked in the trouble report file and then Xlinked (using "ln(1)") to all soundex encoded subdirectories relating Xto the keywords specified. X.PP XAll of the files and directories contained in the system are all plain Xtext files, with an easy format that can be used to your advantage. X.sp 1 X.SH "INTERNALS" X.I followup Xuses a tree structured file data-base to store all trouble reports. Each Xreport occupies one file in the "../Trs/Entry" directory with the name Xbeing equal to that of the date (in YYMMDD format) and a sequence number Xappended (i.e. 881025.1). This file is then linked (using "ln(1)") to Xa subdirectory for each keyword specified in the X.I followup Xkeyword prompt. Each keyword is encoded via the X.I soundex Xalgorythm to be the "link" directory. This allows fast searches of Xrecurring problems (see "report(L)"). X.SH "FILES" X"/usr/local/lib/trs/...." - Root directory for help X.br X"/usr/local/lib/trs/entry/..." - Directory where ALL trouble reports reside X.br X"/usr/local/lib/trs/sequence" - Sequence file X.PP X.SH DIAGNOSTICS XThere are no real diagnostics. X.SH AUTHOR XRoland J. Stolfa X.br XDepartment of Computing and Information Sciences X.br XOklahoma State University X.br Xrjs@a.cs.okstate.edu !FUNKY!STUFF! echo x - followup.sh sed '1,$s/^X//' <<\!FUNKY!STUFF! > followup.sh X: X# X# Package : TRS X# Module : followup.sh X# Programmer : R. Stolfa X# X# Purpose : To 'needle & thread' TRS records together. X# X# Modification History: X# 04/12/88 Created X# 10/25/88 Added user configurable "ROOT" to allow more than X# one TRS to exist on a particular system. X# X X# X# Some variables X# Xumask 000 Xif [ "$TRSROOT" != "" ] Xthen X ROOT=$TRSROOT Xelse XROOT=/u/rjs/lib/Trs Xfi XBIN=/u/rjs/bin XENTRY=$ROOT/Entry XLIB=$ROOT/lib Xtrap "rm -f $ROOT/tmp/* ; exit 1" 1 2 15 X X# X# Ok. Get the 'trouble ticket' number. X# Xnum="$*" Xif test ! -s $ENTRY/$num Xthen X echo "Invalid trouble ticket number. Try again." X num="" Xfi Xwhile [ "$num" = "" ] Xdo X $LIB/print "Enter trouble ticket number? " X read num X X if test ! -s $ENTRY/$num X then X echo "Invalid trouble ticket number. Try again." X num="" X fi Xdone X X# X# Follow it's threads until you reach the last one. X# Xthread="+" Xwhile [ "$thread" != "" ] Xdo X thread="`grep '^thread=' $ENTRY/$num | awk -F= '{print $2}'`" X if [ "$thread" != "" ] X then X num="$thread" X fi Xdone X X# X# Display last entry. X# Xecho "Last entry as follows:" Xecho "" Xecho "ticket=$num" Xecho "reporter=`ls -l $ENTRY/$num | awk '{print $3}'`" Xmore $ENTRY/$num Xecho "" Xyesno="" Xwhile [ "$yesno" = "" ] Xdo X $LIB/print "Is this the correct one? (Y/N) " X read yesno Xdone X X# X# If incorrect, try again. X# Xif [ "$yesno" = "N" -o "$yesno" = "n" ] Xthen X exec $BIN/followup Xfi X X# X# Ok. Generate a new trouble report and then fix the threading. X# Do this by 'including' the trouble ticket generator. X# Xnumber=$num X. $BIN/trouble Xecho "thread=$NTN" >> $ENTRY/$number Xecho "needle=$num" >> $ENTRY/$NTN !FUNKY!STUFF! echo x - mkpath.c sed '1,$s/^X//' <<\!FUNKY!STUFF! > mkpath.c X/* X * Package : TRS X * Module : mkpath.c X * Programmer : R. Stolfa X * X * Purpose : To create all the subdirectories that are needed X * for a file specified on the command line. X * X * Usage: X * % mkpath foo/bar/cat/dog X * Will make the directories foo, foo/bar, and foo/bar/cat X * if they don't already exist. X * X * Modification History: X * 02/15/88 Created X */ X X#include <stdio.h> X Xmain (argc, argv) Xint argc; Xchar *argv[]; X{ X int i; X X for (i = 1; i < argc; i ++) X mkpath (argv[i]); X} X Xmkpath (name) Xchar name[]; X{ X X char buff[512]; X int i, X dumb; X#ifdef SYS5 X char cmd[512]; X#endif X X for (i = 0; i < strlen(name); i ++) { X buff[i] = '\0'; X if (name[i] == '/') { X#ifdef ULTRIX X dumb = mkdir (buff, 0755); X#endif X X#ifdef SYS5 X sprintf (cmd, "mkdir %s > /dev/null 2>&1", buff); X system (cmd); X#endif X } X buff[i] = name[i]; X } X} !FUNKY!STUFF! echo x - opentr.1 sed '1,$s/^X//' <<\!FUNKY!STUFF! > opentr.1 X.TH OPENTR L X.SH NAME Xopentr - report all open trouble reports X.SH SYNOPSIS X.B opentr X.br X.SH DESCRIPTION X.I opentr Xis intended to be used to find all open trouble reports to give Xthe trouble manager something to do in their spare time :-). X.SH AUTHOR XRoland J. Stolfa X.br XDepartment of Computing and Information Sciences X.br XOklahoma State University X.br Xrjs@a.cs.okstate.edu !FUNKY!STUFF! echo x - opentr.sh sed '1,$s/^X//' <<\!FUNKY!STUFF! > opentr.sh X: X# X# Package : TRS X# Module : opentr.sh X# Programmer : R. Stolfa X# X# Purpose : To list all open trouble report ticket numbers X# in the TRS database. X# X# Modification History: X# 04/15/88 Created X# 10/25/88 Added a user configurable "ROOT" to allow more than X# one TRS on a system. X# X X# X# Some variables X# Xumask 000 Xif [ "$TRSROOT" != "" ] Xthen X ROOT=$TRSROOT Xelse XROOT=/u/rjs/lib/Trs Xfi XENTRY=$ROOT/Entry XLIB=$ROOT/lib Xif [ `ls $ENTRY | wc -l` -gt 0 ] Xthen X for i in $ENTRY/* X do X if [ `grep "^needle=" $i | wc -l` -eq 0 ] X then X echo `basename $i` X fi X done Xfi !FUNKY!STUFF! echo x - parse.awk sed '1,$s/^X//' <<\!FUNKY!STUFF! > parse.awk X# X# Package : TRS X# Module : parse.awk X# Programmer : R. Stolfa X# X# Purpose : To parse the command line arguments to "report.sh". X# X# Modification History: X# 04/12/88 Created X# X XBEGIN { X FS = "="; X} X X{ X if (NF == 2) { X char = substr ($1, 0, 1); X if ((char == "t") || (char == "T")) X printf "T\n"; X else if ((char == "k") || (char == "K")) X printf "K\n"; X else if ((char == "d") || (char == "D")) X printf "D\n"; X else if ((char == "r") || (char == "R")) X printf "R\n"; X else if ((char == "e") || (char == "E")) X printf "E\n"; X } X} !FUNKY!STUFF! echo x - print.c sed '1,$s/^X//' <<\!FUNKY!STUFF! > print.c X/* X * Package : TRS X * Module : print.c X * Programmer : R. Stolfa X * X * Purpose : To provide a portable way of printing a string X * of text on stdout without having a newline at the X * end. X * X * Modification History: X * 04/01/88 Created X */ X X#include <stdio.h> X Xmain (argc, argv) Xint argc; Xchar *argv[]; X{ X int i; X X if (argc > 1) { X for (i = 1; i < argc - 1 ; i ++) X printf ("%s ", argv[i]); X X printf ("%s", argv[argc-1]); X } X} !FUNKY!STUFF! echo x - report.1 sed '1,$s/^X//' <<\!FUNKY!STUFF! > report.1 X.TH REPORT L X.SH NAME Xreport - extract all requested trouble reports by selection criteria X.SH SYNOPSIS X.B report [ t=<thread> ] [ k=<keyword> ] [ d=<date> ] [ r=<reporter> ] [ e=<equipment> ] X.br X.SH DESCRIPTION X.I report Xis intended to extract the utmost information from the (T)rouble (R)eport X(S)ystem. With this shell script, you can extract an entire thread Xusing the X.B [ t=<thread id> ] Xoption, or you may select all reports with a particular keyword Xusing the X.B [ k=<keyword> ] Xoption. In addition, you may select all reports on a particular day Xusing the X.B [ d=<date> ] Xoption. If that isn't enough, you can select a particular reporter (read that Xas UN*X user login id) by using the X.B [ r=<reporter> ] Xoption. Lastly, you can use the X.B [ e=<equipment id string> ] Xoption to extract all info about a particular peice of equipment and or a class Xof equipment, depending on what you use for the X.B <equipment id string>. X.PP XIn addition, you can use the different options of X.I report Xadditvely. Several examples follow. X.PP Xreport t=881025.1 e="terminal" X.br Xextracts all trouble report entries in the thread assoicated with the head Xof the thread pointed to by 881025.1 that deal with the "terminal" class Xof devices. X.PP Xreport d=881025 r=joe e="terminal" X.br Xextracts all trouble reports on 10/25/88 by user "joe" involving a X"terminal". X.PP Xreport k=broken e="terminal" X.br Xextracts all trouble reports about "broken" "terminal"s. X.PP XIn short, you get the idea. X.sp 1 X.SH "INTERNALS" X.I report Xuses a single pass over the arguments above X.B IN THE LISTED ORDER Xto refine the eventual list of trouble report tickets to be printed Xas the "report". Note that any missordering of the arguments will be Xhandled by re-ordering them as listed above BEFORE selection occurs. X.sp 1 X.SH DIAGNOSTICS XThere are no real diagnostics. You are expected to be able to fathom Xthe deep-dark recesses of shell programming & have a good working knowledge Xof links in order to do ANY debugging of this system. X.sp 1 X.SH AUTHOR XRoland J. Stolfa X.br XDepartment of Computing and Information Sciences X.br XOklahoma State University X.br Xrjs@a.cs.okstate.edu !FUNKY!STUFF! echo x - report.sh sed '1,$s/^X//' <<\!FUNKY!STUFF! > report.sh X: X# X# Package : TRS X# Module : report.sh X# Programmer : R. Stolfa X# X# Purpose : To scan the TRS database and extract "reasonable" X# information. This information will be presented X# on the screen in a format suitable for printing X# X# Command line syntax: X# report <flags> X# where <flags> are some set of the following X# X# t=<thread id> X# k=<keyword to search on> X# d=<date in YYMMDD format> X# r=<reporter (userid)> X# e=<equipment id string (inventory number?)> X# X# Modification History: X# 04/12/88 Created X# 10/25/88 Added a user configurable "ROOT" to allow more than X# one TRS on a system X# X X# X# Some variables X# Xumask 000 Xif [ "$TRSROOT" != "" ] Xthen X ROOT=$TRSROOT Xelse XROOT=/u/rjs/lib/Trs Xfi XENTRY=$ROOT/Entry XLIB=$ROOT/lib XTEMP=$ROOT/tmp/trs.$$ XTEMP2=$ROOT/tmp/trs2.$$ XTEMP3=$ROOT/tmp/trs3.$$ Xtrap "rm -f $ROOT/tmp/* ; exit 1" 1 2 15 X Xthread="" Xkey="Entry" Xdate="*" Xreporter="" Xequip="" X X# X# Parse the command line with "parse.awk" X# Xfor i in $* Xdo X case `echo $i | awk -f $LIB/parse.awk` in X T) X thread="`echo $i | awk -F= '{print $2}'`" X continue;; X K) X item=`echo $i | awk -F= '{print $2}'` X key=`$LIB/soundex $item` X continue;; X D) X date="`echo $i | awk -F= '{print $2}'`" X continue;; X R) X reporter="`echo $i | awk -F= '{print $2}'`" X continue;; X E) X equip="`echo $i | awk -F= '{print $2}'`" X continue;; X esac Xdone X X# X# Separate out a thread (if required). X# Xif [ "$thread" != "" ] Xthen X # X # Ok. Let's generate a thread list. X # X if test ! -s $ENTRY/$thread X then X echo "Invalid thread id. Try again." X exit X fi X rm -f $TEMP X # X # Find head of thread X # X needle=$thread X while [ "$needle" != "" ] X do X thread=$needle X needle="`grep '^needle=' $ENTRY/$needle | awk -F= '{print $2}'`" X done X # X # List the members of the thread X # X while [ "$thread" != "" ] X do X echo "$ENTRY/$thread" >> $TEMP X thread="`grep '^thread=' $ENTRY/$thread | awk -F= '{print $2}'`" X done Xelse X # X # Get all files X # X ls $ROOT/$key/$date* > $TEMP2 2>/dev/null X sort -u < $TEMP2 > $TEMP X date="*" X key="" Xfi X X# X# Now lets get the key field taken care of. X# Xif [ "$key" != "" ] Xthen X for i in `cat $TEMP` X do X ls $ROOT/$key/`basename $i` 2>/dev/null X done > $TEMP2 X mv $TEMP2 $TEMP Xfi X X# X# Ok. Now let's generate the subset of the list that has occured on X# the date in question. X# Xif [ "$date" != "*" ] Xthen X grep "$date" < $TEMP > $TEMP2 X mv $TEMP2 $TEMP Xfi X X# X# Do the awking for a particular reporter (if necessary). X# Xif [ "$reporter" != "" ] Xthen X echo "$reporter" > $TEMP2 X ls -l `cat $TEMP` >> $TEMP2 X awk -f $LIB/reporter.awk < $TEMP2 > $TEMP X rm $TEMP2 Xfi X X# X# Do the greping for a particular piece of equipment (if necessary). X# Xif [ "$equip" != "" ] Xthen X grep -l "^equipment=$equip" `cat $TEMP` > $TEMP Xfi X X# X# Ok. More the junk to the screen... X# Xfor i in `cat $TEMP` Xdo X echo "ticket=`basename $i`" X echo "reporter=`ls -l $i | awk '{print $3}'`" X cat $i X echo "" Xdone | more X X# X# Now clean up and exit. X# Xrm -f $TEMP $TEMP2 $TEMP3 !FUNKY!STUFF! echo x - reporter.awk sed '1,$s/^X//' <<\!FUNKY!STUFF! > reporter.awk X# X# Package : TRS X# Module : reporter.awk X# Programmer : R. Stolfa X# X# Purpose : This program returns only those lines with the X# correct user field as the reporter. X# X# Modification History: X# 04/12/88 Created X# X X{ X if (NR == 1) X reporter = $1; X else if (NF > 1) { X if (substr($3, 0, length(reporter)) == reporter) X printf "%s\n", $NF; X } X} !FUNKY!STUFF! echo x - rmthread.1 sed '1,$s/^X//' <<\!FUNKY!STUFF! > rmthread.1 X.TH RMTHREAD L X.SH NAME Xrmthread - remove a trouble report system thread from anywhere on the thread X.SH SYNOPSIS X.B rmthread [threadid] X.br X.SH DESCRIPTION X.I rmthread Xis to be used when an entire thread of trouble reports have been delt with Xand the ammased information is no longer of any use. This program finds Xthe head of the list of trouble reports (on the thread given) and then builds Xa list of thread files to remove. It then displays the entire thread and Xasks you if you really want to remove it. If so, it then gets rid of all Xoccurances of the associated thread from the trouble report system. X.sp 1 X.SH "INTERNALS" X.I rmthread Xuses an text line in the thread file to provide both a forward link to the Xnext trouble report and another text line to provide the backward link to Xthe previous trouble report. This is why it is so slow at times. X.sp 1 X.SH AUTHOR XRoland J. Stolfa X.br XDepartment of Computing and Information Sciences X.br XOklahoma State University X.br Xrjs@a.cs.okstate.edu !FUNKY!STUFF! echo x - rmthread.sh sed '1,$s/^X//' <<\!FUNKY!STUFF! > rmthread.sh X: X# X# Package : TRS X# Module : rmthread.sh X# Programmer : R. Stolfa X# X# Purpose : To delete a thread of trouble reports in the TRS X# database system. X# X# Modification History: X# 04/12/88 Created X# 10/25/88 Added a user configurable "ROOT" to allow more than X# one TRS on a system X# X X# X# Some variables X# Xumask 000 Xif [ "$TRSROOT" != "" ] Xthen X ROOT=$TRSROOT Xelse XROOT=/u/rjs/lib/Trs Xfi XENTRY=$ROOT/Entry XLIB=$ROOT/lib Xtrap "rm -f $ROOT/tmp/* ; exit 1" 1 2 15 X X# X# Get the tread to delete. X# Xthread="$*" Xwhile [ "$thread" = "" ] Xdo X $LIB/print "Enter thread to delete? " X read thread X X if test ! -s $ENTRY/$thread X then X echo "Invalid thread. Try again" X thread="" X fi Xdone X X# X# Search backwards (if possible) for head of thread. X# Xneedle="+" Xwhile [ "$needle" != "" ] Xdo X needle="`grep '^needle=' $ENTRY/$thread | awk -F= '{print $2}'`" X if [ "$needle" != "" ] X then X thread="$needle" X fi Xdone X X# X# ASSERT: X# At this point, thread is the original trouble report ticket X# number. Now let's keep that number safe and display the thread X# to assure that it is the one that needs to be removed. X# X Xptr="$thread" Xecho "The following is the listing of this thread." Xecho "" Xwhile [ "$ptr" != "" ] Xdo X echo "ticket=$ptr" X echo "reporter=`ls -l $ENTRY/$ptr | awk '{print $3}'`" X cat $ENTRY/$ptr X echo "" X ptr="`grep '^thread=' $ENTRY/$ptr | awk -F= '{print $2}'`" Xdone | more X X# X# Prompt for removal. X# Xyesno="" Xwhile [ "$yesno" = "" ] Xdo X $LIB/print "Is this the thread you want to delete? (Y/N) " X read yesno Xdone X Xif [ "$yesno" = "n" -o "$yesno" = "N" ] Xthen X exit Xfi X X# X# Ok. We have permission. Just remove the whole stupid thing... X# Xptr="$thread" Xwhile [ "$ptr" != "" ] Xdo X thread="`grep '^thread=' $ENTRY/$ptr | awk -F= '{print $2}'`" X rm -f $ROOT/*/$ptr X ptr="$thread" Xdone !FUNKY!STUFF! echo x - soundex.c sed '1,$s/^X//' <<\!FUNKY!STUFF! > soundex.c X/* X * Package : TRS X * Program : soundex.c X * Programmer : Roland Stolfa X * X * Function : This program implements the SOUNDEX procedure as X * outlined on page 655 of "Database Design" by X * Gio Wiederhold. This procedure was originally X * introduced by Odell & Russel (1918) and was X * described by McEwen (1974). X * X * Usage : soundex <string1> <string2> ... <stringN> X */ X X#include <stdio.h> X X#define BS 200 X Xmain (argc, argv) Xint argc; Xchar *argv[]; X{ X char sound[BS]; X int i; X X if (argc == 1) { X fprintf (stderr, X "Usage: soundex <string1> <string2> ... <stringN>\n"); X exit (-1); X } X X for (i = 1; i < argc; i ++) { X soundex (argv[i], sound); X printf ("%s\n", sound); X } X} X Xsoundex (word, sound) Xchar word[], /* String to convert to SOUNDEX */ X sound[]; /* Output SOUNDEX */ X{ X int outpos, /* Current output position in SOUNDEX */ X j; /* Index into word */ X X /* Initialize return word */ X outpos = 0; X sound[outpos] = '\0'; X X /* If the word is null, then the output should be null */ X if (strlen(word) == 0) X return; X X /* Copy first character of word to SOUNDEX */ X sound[outpos] = toupper (word[0]); X X for (j = 1; j < strlen (word); j ++) { X X /* Convert each character to uppercase */ X word[j] = toupper(word[j]); X X switch (word[j]) { X X /* Replace Labials with "1" */ X case 'B': X case 'F': X case 'P': X case 'V': X if (sound[outpos] != '1') { X outpos ++; X sound[outpos] = '1'; X } X break; X X /* Replace Gutterals & sibilants with "2" */ X case 'C': X case 'G': X case 'J': X case 'K': X case 'Q': X case 'S': X case 'X': X case 'Z': X if (sound[outpos] != '2') { X outpos ++; X sound[outpos] = '2'; X } X break; X X /* Replace Dentals with "3" */ X case 'D': X case 'T': X if (sound[outpos] != '3') { X outpos ++; X sound[outpos] = '3'; X } X break; X X /* Replace Longliquids with "4" */ X case 'L': X if (sound[outpos] != '4') { X outpos ++; X sound[outpos] = '4'; X } X break; X X /* Replace Nasals with "5" */ X case 'M': X case 'N': X if (sound[outpos] != '5') { X outpos ++; X sound[outpos] = '5'; X } X break; X X /* Replace Shortliquids with "6" */ X case 'R': X if (sound[outpos] != '6') { X outpos ++; X sound[outpos] = '6'; X } X break; X } X } X X /* Terminate the soundex string */ X outpos ++; X sound[outpos] = '\0'; X X /* Forcably trunicate soundex to 4 characters */ X sound[4] = '\0'; X} X !FUNKY!STUFF! echo x - trouble.1 sed '1,$s/^X//' <<\!FUNKY!STUFF! > trouble.1 X.TH TROUBLE L X.SH NAME Xtrouble - enter an initial trouble report X.SH SYNOPSIS X.B trouble X.br X.SH DESCRIPTION X.I trouble Xenters the inital trouble report in the trouble report system. It is Xused also by X.I followup Xto enter all followup trouble reports in the current thread. X.PP XThis program is self prompting and fairly self explanitory. X.sp 1 X.SH AUTHOR XRoland J. Stolfa X.br XDepartment of Computing and Information Sciences X.br XOklahoma State University X.br Xrjs@a.cs.okstate.edu !FUNKY!STUFF! echo x - trouble.sh sed '1,$s/^X//' <<\!FUNKY!STUFF! > trouble.sh X: X# X# Package : TRS X# Module : trouble.sh X# Programmer : R. Stolfa X# X# Purpose : To enter trouble reports into the TRS database system. X# X# Modification History: X# 04/11/88 Created X# 04/12/88 Added hooks for recording the new trouble number in the X# environment variable NTN for use in "followup" X# 10/25/88 Added user configurable "ROOT" to allow more than X# one TRS on a system X# X X# X# Some variables X# Xumask 000 Xif [ "$TRSROOT" != "" ] Xthen X ROOT=$TRSROOT Xelse XROOT=/u/rjs/lib/Trs Xfi XENTRY=$ROOT/Entry XLIB=$ROOT/lib XSEQ=$ROOT/sequence XTEMP=$ROOT/tmp/trs.$$ Xtrap "rm -f $ROOT/tmp/* ; exit 1" 1 2 15 X Xrm -f $TEMP X X# X# Prompt for what piece of equipment is down. X# Xequipment="" Xwhile [ "$equipment" = "" ] Xdo X $LIB/print "Enter equipment ID string? " X read equipment Xdone Xecho "equipment=$equipment" >> $TEMP X X# X# Get the keywords to link the file in "Entry" to under each X# of their respective "SOUNDEX" equivalents. X# Xecho "Enter the keywords that are to be associated with this" Xecho "report one per line, ending with a blank line." X$LIB/print "keywords=" >> $TEMP Xkeywords="" Xdummy="+" Xwhile [ "$dummy" != "" ] Xdo X read dummy X if [ "$dummy" != "" ] X then X $LIB/print "$dummy " >> $TEMP X keywords="$keywords`$LIB/soundex $dummy` " X fi Xdone Xecho "" >> $TEMP X X# X# Enter the report. X# Xecho "Enter report, ending with a blank line" Xdummy="+" Xwhile [ "$dummy" != "" ] Xdo X read dummy X if [ "$dummy" != "" ] X then X echo "desc=$dummy" >> $TEMP X fi Xdone X X# X# Attempt to link in to "Entry" directory. This could be an area X# of contension (for the sequence file). The following sheme was X# choosen to give some reasonable operation. X# Xcond=1 Xwhile test $cond -ne 0 Xdo X entry="`date '+%y%m%d'`.`cat $SEQ`" X seq=`cat $SEQ` X expr $seq + 1 > $SEQ X ln $TEMP $ENTRY/$entry X cond=$? X if test $cond -ne 0 X then X echo "Collision. Attempting fix..." X fi Xdone Xrm $TEMP X X# X# Report the "trouble ticket" number for future 'threading'. X# Xecho " " Xecho "Your trouble ticket number is $entry" Xecho "save this number for future reference." X X# X# Record the new trouble number in the environment variable NTN. X# XNTN=$entry X X# X# Now link the "Entry" directory trouble report to a file with X# the same timestamp.sequence filename in a directory for each of X# the "SOUNDEX" keywords. This is in an attempt to make the X# system easier to search. X# Xfor i in $keywords Xdo X $LIB/mkpath $ROOT/$i/$entry X ln $ENTRY/$entry $ROOT/$i/$entry Xdone X X# X# Ok. Let's be clean... X# Xrm -f $TEMP !FUNKY!STUFF!