home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume9 / trs2_rs < prev    next >
Text File  |  1990-01-04  |  47KB  |  1,979 lines

  1. Newsgroups: comp.sources.misc
  2. organization: Oklahoma State Univ., Stillwater
  3. subject: v09i100: Trouble Report System 2
  4. From: rjs@a.cs.okstate.edu (Roland Stolfa)
  5. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  6.  
  7. Posting-number: Volume 9, Issue 100
  8. Submitted-by: rjs@a.cs.okstate.edu (Roland Stolfa)
  9. Archive-name: trs2_rs
  10.  
  11. Hello,
  12.  
  13. This is a set of Bourne shell scrips and C programs intended
  14. to maintain a database of trouble reports.  The actions supported
  15. in this package are open a trouble report (trouble), post a followup
  16. on a trouble report (followup), remove a 'thread' of trouble reports
  17. (rmthread), report all open trouble report ticket numbers (opentr),
  18. and summarize a class of trouble reports (report).
  19.  
  20. Roland J. Stolfa
  21. Department of Computing and Information Sciences
  22. Oklahoma State University
  23.  
  24. Internet:       rjs@a.cs.okstate.edu
  25.  
  26. Disclaimer:    You have lost your MIND if you think ANYBODY speaks for
  27.         this place!
  28.  
  29. echo x - README
  30. sed '1,$s/^X//' <<\!FUNKY!STUFF! > README
  31. XINTRODUCTION:
  32. X
  33. X    This is the Trouble Report System (TRS2) by
  34. X
  35. X    @(#) README 1.2 89/12/19
  36. X
  37. X    Roland J. Stolfa
  38. X    Department of Computing and Information Sciences
  39. X    Oklahoma State University
  40. X
  41. X    Internet:       rjs@a.cs.okstate.edu
  42. X
  43. X
  44. XDISCLAIMER:
  45. X
  46. X    All code is public domain.  No guarentee, expressed nor implied,
  47. X    covers this code.  I will NOT be responsible for it's use or
  48. X    misuse in your application.  I just hope (Underline that in red)
  49. X    that it may prove useful to you.  If something doesn't compile,
  50. X    I hope that the comments that surround the troble line will be
  51. X    sufficient to fix the problem.
  52. X
  53. X
  54. XDESCRIPTION:
  55. X
  56. X    This is a set of Bourne shell scrips and C programs intended
  57. X    to maintain a database of trouble reports.  The actions supported
  58. X    in this package are open a trouble report (trouble), post a followup
  59. X    on a trouble report (followup), remove a 'thread' of trouble reports
  60. X    (rmthread), report all open trouble report ticket numbers (opentr),
  61. X    and summarize a class of trouble reports (report).
  62. X
  63. X    As the second release of this package, several things have been
  64. X    attempted to clean up the operation.  First off, the links (using
  65. X    "ln(2)") have been done away with.  This has been replaced by using
  66. X    the trouble ticket id number stored in a soundex index file.  Second,
  67. X    some race conditions have been handled better using the "P" and "V"
  68. X    shell commands, contained herein.
  69. X
  70. X
  71. XINSTALLATION PROCEDURES:
  72. X
  73. X1.    Make a directory and put this shar in it.  Then say "sh <fn>".
  74. X
  75. X2.    Edit the file "Localize" to point the "ROOT", "BIN" and
  76. X    shell script escape sequences at the localally correct
  77. X    values.  Then type "sh Localize" to install these values
  78. X    on all files in this directory.  Then edit the Makefile
  79. X    and change the -DSYS5 to either -DSYS5 or -DULTRIX.
  80. X
  81. X3.    Say "make install".  This makes the various directories &
  82. X    sets the permissions to allow the next procedure to function.
  83. X
  84. X4.    Say "make all".
  85. X
  86. X5.    Done.
  87. X
  88. X
  89. XDIRECTORY STRUCTURE:
  90. X
  91. X              /usr/local/lib/Trs
  92. X                |
  93. X        +---------------+---------------+
  94. X            |        |        |
  95. X          Entry           Seq          Xref
  96. X        |                |
  97. X        +---+-----+            +-------+-------+
  98. X        |   ...   |            |        |
  99. X   <Timestamp1> ... <Timestamp1>     <Soundex> ... <Soundex>
  100. X
  101. XEach TRS record is first built in a temporary.  It is then copied into the
  102. X.../Trs/Entry/<Timestamp>" file.  Then it is referenced in a file in the
  103. X.../Trs/Xref subdirectory for each SOUNDEX encoded keyword given during
  104. Xdata entry.
  105. X
  106. X
  107. XNOTES:
  108. X
  109. X1.    If the average TRS record size is small and the default
  110. X    block size on the storage device is large, you loose...
  111. X
  112. X2.    Each user can override the default "ROOT" setting by having
  113. X    an environment variable "TRSROOT" set to some directory
  114. X    that has the same structure as the one above.
  115. X
  116. X
  117. XFILES:
  118. X
  119. X    Localize
  120. X
  121. X        This shell script patches all the files in this system to
  122. X        work with the locally chosen directories.
  123. X
  124. X    Makefile
  125. X
  126. X        Used to create all the executables for each program.
  127. X
  128. X    README
  129. X
  130. X        This file.
  131. X
  132. X    followup.sh
  133. X
  134. X        This program is used to enter a follow up report onto
  135. X        the end of a TRS thread.  It walks the thread, from anywhere
  136. X        on the thread, to then end and then doubly links the end
  137. X        of the current thread to the new report.
  138. X
  139. X    opentr.sh
  140. X
  141. X        This shell script lists the initial trouble report ticket
  142. X        number for all active trouble reports.
  143. X
  144. X    print.c
  145. X
  146. X        This simple program is used to print all the command line
  147. X        arguments on a line by itself without a carriage return
  148. X        on the end.
  149. X
  150. X    report.sh
  151. X
  152. X        This shell script attempts to extract data from the TRS
  153. X        database given any combination of keys.
  154. X
  155. X    rmthread.sh
  156. X
  157. X        This shell script removes an entire linked list of trouble
  158. X        reports, given a report anywhere in the list.
  159. X
  160. X    soundex.c
  161. X
  162. X        This C program implements a "SOUNDEX" algorithm and is used
  163. X        in the TRS to encode keywords within the database to ease
  164. X        searching.
  165. X
  166. X    trouble.sh
  167. X
  168. X        This shell script does the actual data entry for the TRS system.
  169. X        It attempts to prompt for all the relavant data, generates
  170. X        some stuff by default, and then builds all the linked files
  171. X        that constitue the database.
  172. X
  173. X    P.c, V.c, lockp.c
  174. X
  175. X        These two programs provide a method of binary semaphores from
  176. X        the shell using "link(2)" to be the final arbitrator.
  177. X
  178. X    *.1
  179. X
  180. X        Manual pages for all of the directly executable programs above.
  181. !FUNKY!STUFF!
  182. echo x - Localize
  183. sed '1,$s/^X//' <<\!FUNKY!STUFF! > Localize
  184. X#
  185. X# Localizing script for the (T)rouble (R)eport (S)ystem
  186. X#
  187. X#    @(#) Localize 1.2 89/12/19
  188. X#
  189. X
  190. Xfor i in Makefile *.sh
  191. Xdo
  192. X
  193. X    #
  194. X    # Attach the "ROOT" to some clean point like /usr/local/lib/trs
  195. X    # as this will need to be a publically writable directory that
  196. X    # will hold all trouble reports.
  197. X    #
  198. X    # Attach the "BIN" to some global point like /usr/lbin for all
  199. X    # the executables
  200. X    #
  201. Xed - $i <<'EOF'
  202. Xg;^ROOT;s;=.*$;=/u/rjs/lib/Trs;
  203. Xg;^BIN;s;=.*$;=/u/rjs/bin;
  204. Xw
  205. Xq
  206. XEOF
  207. X
  208. Xdone
  209. X
  210. Xfor i in *.sh
  211. Xdo
  212. X
  213. X    #
  214. X    # The ":" in the ed script below is the first line of all shell
  215. X    # scripts for SYS5.  For ULTRIX, it should be "#!/bin/sh".
  216. X    #
  217. Xed - $i <<'EOF'
  218. X1 s;^.*$;:;
  219. Xw
  220. Xq
  221. XEOF
  222. X
  223. Xdone
  224. !FUNKY!STUFF!
  225. echo x - Makefile
  226. sed '1,$s/^X//' <<\!FUNKY!STUFF! > Makefile
  227. X#
  228. X# Package    : TRS
  229. X# Module    : (Makefile)
  230. X# Programmer    : R. Stolfa
  231. X# SCCS id    : @(#) Makefile 1.2 89/12/19
  232. X#
  233. X# Purpose :    To maintain a Trouble Report System for an
  234. X#        university environment
  235. X#
  236. X# Modification History:
  237. X#   04/11/88    Created
  238. X#   10/25/88    Updated for distribution outside of OSU
  239. X#
  240. X#   10/16/89    Rewrote for release 2
  241. X#
  242. XROOT =        /u/rjs/lib/Trs
  243. XBIN =        /u/rjs/bin
  244. XCFLAGS =    -O -DSYS5        # For System 5 Un*x
  245. X#CFLAGS =    -O -DULTRIX        # For VAX Ultr*x
  246. XMANDIR =    /u/rjs/lib/man/l_man/man1
  247. XMANPAGES =    followup.1 opentr.1 report.1 rmthread.1 trouble.1 P.1 V.1
  248. X
  249. XDuMb:
  250. X    @echo Make what?
  251. X
  252. Xfollowup:    $(BIN)/followup
  253. X$(BIN)/followup:    followup.sh
  254. X    cp followup.sh $(BIN)/followup
  255. X    chmod 755 $(BIN)/followup
  256. X
  257. Xopentr:    $(BIN)/opentr
  258. X$(BIN)/opentr:    opentr.sh
  259. X    cp opentr.sh $(BIN)/opentr
  260. X    chmod 755 $(BIN)/opentr
  261. X
  262. Xprint:    $(BIN)/print
  263. X$(BIN)/print:    print.c
  264. X    cc print.c -o $(BIN)/print
  265. X    chmod 755 $(BIN)/print
  266. X
  267. Xreport:    $(BIN)/report
  268. X$(BIN)/report:    report.sh
  269. X    cp report.sh $(BIN)/report
  270. X    chmod 755 $(BIN)/report
  271. X
  272. Xrmthread:    $(BIN)/rmthread
  273. X$(BIN)/rmthread:    rmthread.sh
  274. X    cp rmthread.sh $(BIN)/rmthread
  275. X    chmod 755 $(BIN)/rmthread
  276. X
  277. Xsoundex:    $(BIN)/soundex
  278. X$(BIN)/soundex:    soundex.c
  279. X    cc soundex.c -o $(BIN)/soundex
  280. X    chmod 755 $(BIN)/soundex
  281. X
  282. Xtrouble:    $(BIN)/trouble
  283. X$(BIN)/trouble:    trouble.sh
  284. X    cp trouble.sh $(BIN)/trouble
  285. X    chmod 755 $(BIN)/trouble
  286. X
  287. XP:    $(BIN)/P
  288. X$(BIN)/P:    P.c lockp.c
  289. X    cc P.c lockp.c -o $(BIN)/P
  290. X    chmod 755 $(BIN)/P
  291. X
  292. XV:    $(BIN)/V
  293. X$(BIN)/V:    V.c lockp.c
  294. X    cc V.c lockp.c -o $(BIN)/V
  295. X    chmod 755 $(BIN)/V
  296. X
  297. X#
  298. X# Housekeeping
  299. X#
  300. X
  301. Xall:    followup opentr print report rmthread soundex trouble P V
  302. X    @echo "Don't forget 'make install' to setup sequence file"
  303. X
  304. Xbackout:    clean
  305. X    rm -rf $(ROOT)
  306. X    rm -if $(BIN)/followup $(BIN)/opentr $(BIN)/report $(BIN)/rmthread \
  307. X        $(BIN)/trouble $(BIN)/print $(BIN)/soundex $(BIN)/P $(BIN)/V
  308. X    cd $(MANDIR) ; rm -f $(MANPAGES)
  309. X
  310. Xclean:
  311. X    rm -f *.o a.out core
  312. X
  313. Xinstall:
  314. X    -mkdir $(ROOT) $(ROOT)/Entry $(ROOT)/Xref
  315. X    chmod 777 $(ROOT) $(ROOT)/Entry $(ROOT)/Xref
  316. X    echo "0" > $(ROOT)/sequence
  317. X    cp $(MANPAGES) $(MANDIR)
  318. X
  319. Xrub:
  320. X    rm -f $(ROOT)/Entry/* $(ROOT)/Xref/*
  321. X    echo "0" > $(ROOT)/sequence
  322. X
  323. Xshar:
  324. X    shar README Localize Makefile [PVa-z]* > Trs.shar
  325. !FUNKY!STUFF!
  326. echo x - P.1
  327. sed '1,$s/^X//' <<\!FUNKY!STUFF! > P.1
  328. X'\" @(#) P.1 1.2 89/10/30
  329. X.TH P 1 L
  330. X.SH NAME
  331. XP - Performs binary semaphore operations using lock files.
  332. X.sp 1
  333. X.SH SYNTAX
  334. XP [ -w ] [[ -e ] / [ -f <fixed> ]] -l <lockfile>
  335. X.sp 1
  336. X.SH DESCRIPTION
  337. X.I P
  338. XAttempts to generate the named
  339. X.I <lockfile>
  340. Xusing the
  341. X.I lockp(3L)
  342. Xprocedure.  This attempts to provide a binary semaphore operation
  343. Xfrom the shell.  One of the parameters
  344. X.I -e
  345. Xor
  346. X.I "-f <fixed>"
  347. Xmust be specified.  If the user specifies the
  348. X.I -w
  349. Xoption, then a warning message appears on stderr for every attempt to get the
  350. Xlock file installed.  If the user specifies the
  351. X.I -e
  352. Xoption, an exponential decay is applyed to the time waited between
  353. Xattempts to get the semaphore file in place.  If the user specifies the
  354. X.I "-f <fixed>"
  355. Xoption, then the fixed period of time
  356. X.I <fixed>
  357. Xis waited between each attempt to get the semaphore file in place.
  358. XThe option
  359. X.I "-l <lockfile>"
  360. Xmust be present and implies that the named
  361. X.I <lockfile>
  362. Xis the name of the binary semaphore to be used.
  363. X.sp 1
  364. X.SH "INTERNALS"
  365. XThis program uses the
  366. X.I lockp(3L)
  367. Xcode to generate the semaphore file.  It is fairly fool proof, but may be
  368. Xgoofed up upon systems with more than one processor accessing the disk
  369. Xdrive system at once.
  370. X.sp 1
  371. X.SH RETURN VALUE
  372. XIf there is an error in the command line arguments, a
  373. X.I -1
  374. Xis returned.  Otherwise, the exit status is
  375. X.I 0
  376. Xand the 
  377. X.I "<lockfile>"
  378. XPID is returned on stdout.
  379. X.SH SEE ALSO
  380. XV(1L), lockp(3L), unlockp(3L)
  381. X.sp 1
  382. X.SH VERSION
  383. X1.2
  384. X.sp 1
  385. X.SH AUTHOR
  386. XRoland J. Stolfa
  387. X.br
  388. XDepartment of Computing and Information Sciences
  389. X.br
  390. XOklahoma State University
  391. X.br
  392. Xrjs@a.cs.okstate.edu
  393. !FUNKY!STUFF!
  394. echo x - P.c
  395. sed '1,$s/^X//' <<\!FUNKY!STUFF! > P.c
  396. X/*
  397. X * Program    : LIBRARY (lockp)
  398. X * Module    : T_P.c
  399. X * Functions    : main, usage
  400. X * Programmer    : R. Stolfa (rjs@a.cs.okstate.edu)
  401. X * SCCSid    : @(#) P.c 1.2 89/10/30
  402. X *
  403. X * Purpose :    To provide a process locking facility to the shell.
  404. X *
  405. X * Modification History:
  406. X *   05/11/89    Created
  407. X *   08/31/89    Modified to work with "T_V.c" by outputing the PID of
  408. X *        the process that made the lockfile (this one) on stdout
  409. X *        for later use by "T_V.c" in removing that lock.
  410. X */
  411. X
  412. X/**
  413. X***    Copyright (c) 1989, Roland J. Stolfa,  Right to copy is
  414. X***    granted so long as it is not for monetary gain and this
  415. X***    message and all headers in all files remain in tact.
  416. X***
  417. X***    THE AUTHOR DOES NOT MAKE ANY WARRANTIES, EITHER EXPRESS
  418. X***    OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
  419. X***    LIMITATION, THE CONDITION OF THIS DISTRIBUTION, ITS
  420. X***    MERCHANTABILITY OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  421. X**/
  422. X
  423. Xstatic char    *sccsid = "@(#) P.c 1.2 89/10/30";
  424. X
  425. X#include    <stdio.h>
  426. X
  427. X#define        FALSE        0
  428. X#define        TRUE        1
  429. X
  430. Xmain (argc, argv)
  431. X    int    argc;
  432. X    char    *argv[];
  433. X{
  434. X    extern int    optind;
  435. X    extern char    *optarg;
  436. X    int        c;
  437. X
  438. X    int    exponential,
  439. X        fixed,
  440. X        delay,
  441. X        warn;
  442. X    char    *fnptr;
  443. X
  444. X    /*
  445. X     * Parse those command line arguments.
  446. X     */
  447. X    exponential = fixed = FALSE;
  448. X    fnptr = NULL;
  449. X    warn = FALSE;
  450. X    while ((c = getopt (argc, argv, "ef:l:w")) != EOF) {
  451. X        switch (c) {
  452. X        case 'e':
  453. X            exponential = TRUE;
  454. X            delay = 1;
  455. X#ifdef DEBUG
  456. X            printf ("exponential delay set to %d\n", delay);
  457. X#endif
  458. X            break;
  459. X        case 'f':
  460. X            fixed = atoi (optarg);
  461. X            if (fixed > 101)
  462. X                fixed = 101;
  463. X            delay = fixed;
  464. X#ifdef DEBUG
  465. X            printf ("fixed delay set to %d\n", delay);
  466. X#endif
  467. X            break;
  468. X        case 'l':
  469. X            fnptr = optarg;
  470. X#ifdef DEBUG
  471. X            printf ("got >%s< as lock file name\n", fnptr);
  472. X#endif
  473. X            break;
  474. X        case 'w':
  475. X            warn = TRUE;
  476. X            break;
  477. X        default:
  478. X            usage();
  479. X            /*NOTREACHED*/
  480. X        }
  481. X    }
  482. X    if ((exponential == fixed) || (fnptr == NULL))
  483. X        usage();
  484. X        /*NOTREACHED*/
  485. X
  486. X    while (lockp (fnptr) < 0) {
  487. X        if (warn == TRUE)
  488. X            fprintf (stderr,
  489. X                "Waiting on lock file >%s<...\n", fnptr);
  490. X        sleep (delay);
  491. X        if (exponential == TRUE) {
  492. X            if (delay != 100)
  493. X                delay = delay * 10;
  494. X#ifdef DEBUG
  495. X            printf ("Adjusting exponential delay to %d\n", delay);
  496. X#endif
  497. X        }
  498. X    }
  499. X#ifdef DEBUG
  500. X    printf ("P: exiting\n");
  501. X#endif
  502. X    printf ("%d\n", getpid());
  503. X}
  504. X
  505. Xusage ()
  506. X{
  507. X    fprintf (stderr, "Usage: P { -e / -f<fixed> } [-w] -l <fn>\n");
  508. X    exit (-1);
  509. X}
  510. !FUNKY!STUFF!
  511. echo x - V.1
  512. sed '1,$s/^X//' <<\!FUNKY!STUFF! > V.1
  513. X'\" @(#) V.1 1.2 89/10/30
  514. X.TH V 1 L
  515. X.SH NAME
  516. XV - Performs binary semaphore operations using lock files.
  517. X.sp 1
  518. X.SH SYNTAX
  519. XV -i <pid> -l <lockfile>
  520. X.sp 1
  521. X.SH DESCRIPTION
  522. X.I V
  523. Xattempts to remove the named
  524. X.I <lockfile>
  525. Xusing the
  526. X.I unlockp(3L)
  527. Xprocedure.  This attempts to provide a binary semaphore operation
  528. Xfrom the shell.  The user must specify both the
  529. X.I "-i <pid>"
  530. Xand the
  531. X.I "-l <lockfile>"
  532. Xparameters.
  533. XThe
  534. X.I "-i <pid>"
  535. Xparameter is what is looked for in the named lock file.  This is the
  536. XPID returned by
  537. X.I "P(1L)"
  538. Xon stdout that it put in the named
  539. X.I "<lockfile>"
  540. Xupon creation.
  541. X.I "-l <lockfile>"
  542. Xmust be present and implies that the named
  543. X.I <lockfile>
  544. Xis the name of the binary semaphore to be used.
  545. X.sp 1
  546. X.SH "INTERNALS"
  547. XThis program uses the
  548. X.I unlockp(3L)
  549. Xcode to generate the semaphore file.  It is fairly fool proof, but may be
  550. Xgoofed up upon systems with more than one processor accessing the disk
  551. Xdrive system at once.
  552. X.sp 1
  553. X.SH RETURN VALUE
  554. XIf there is an error in the command line arguments or the named
  555. X.I "<lockfile>"
  556. Xdoes not contain the named
  557. X.I "<pid>"
  558. X, a
  559. X.I -1
  560. Xis returned.  Otherwise, 
  561. X.I 0
  562. Xis returned.
  563. X.SH SEE ALSO
  564. XP(1L), unlockp(3L), lockp(3L)
  565. X.sp 1
  566. X.SH VERSION
  567. X1.2
  568. X.sp 1
  569. X.SH AUTHOR
  570. XRoland J. Stolfa
  571. X.br
  572. XDepartment of Computing and Information Sciences
  573. X.br
  574. XOklahoma State University
  575. X.br
  576. Xrjs@a.cs.okstate.edu
  577. !FUNKY!STUFF!
  578. echo x - V.c
  579. sed '1,$s/^X//' <<\!FUNKY!STUFF! > V.c
  580. X/*
  581. X * Package    : LIBRARY (lockp)
  582. X * Module    : T_V.c
  583. X * Functions    : main, usage
  584. X * Programmer    : R. Stolfa (rjs@a.cs.okstate.edu)
  585. X * SCCSid    : @(#) V.c 1.2 89/10/30
  586. X *
  587. X * Purpose :    This program remove a lock file as generated in
  588. X *        "T_P.c" if the associated PID matches
  589. X *
  590. X * Modification History:
  591. X *   08/31/89    Created
  592. X *   10/30/89    Changed to reflect changes in "unlockp(3L)" code.
  593. X */
  594. X
  595. X/**
  596. X***    Copyright (c) 1989, Roland J. Stolfa,  Right to copy is
  597. X***    granted so long as it is not for monetary gain and this
  598. X***    message and all headers in all files remain in tact.
  599. X***
  600. X***    THE AUTHOR DOES NOT MAKE ANY WARRANTIES, EITHER EXPRESS
  601. X***    OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
  602. X***    LIMITATION, THE CONDITION OF THIS DISTRIBUTION, ITS
  603. X***    MERCHANTABILITY OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  604. X**/
  605. X
  606. Xstatic char    *sccsid = "@(#) V.c 1.2 89/10/30";
  607. X
  608. X#include    <stdio.h>
  609. X
  610. X#include    "lockp.h"
  611. X
  612. X#define        BUFSZ        80
  613. X
  614. Xmain (argc, argv)
  615. X    int    argc;
  616. X    char    *argv[];
  617. X{
  618. X    extern int    optind;
  619. X    extern char    *optarg;
  620. X    int        c;
  621. X
  622. X    char    *lockfn;    /* The name of the lockfile */
  623. X    int    pid;        /* Pid of original parent */
  624. X
  625. X    /*
  626. X     * Parse those comand line parameters.
  627. X     */
  628. X    if (argc < 5)
  629. X        usage ();
  630. X        /*NOTREACHED*/
  631. X    pid = 0;
  632. X    lockfn = NULL;
  633. X    while ((c = getopt (argc, argv, "i:l:")) != EOF)
  634. X        switch (c) {
  635. X        case 'i':    pid = atoi(optarg);    break;
  636. X        case 'l':    lockfn = optarg;    break;
  637. X        default:    usage(); /*NOTREACHED*/    break;
  638. X        }
  639. X    if ((pid == 0) || (lockfn == NULL))
  640. X        usage();
  641. X        /*NOTREACHED*/
  642. X
  643. X    /*
  644. X     * Call "unlockp(3L)" to check on sanity and do all the right
  645. X     * things about getting rid of the lock file.  If it returns
  646. X     * an error condition, bitch about it.
  647. X     */
  648. X    switch (unlockpp(lockfn,pid)) {
  649. X    case LOCKP_BADF:
  650. X        fprintf (stderr, "V: bad lock file name\n");
  651. X        exit (-1);
  652. X        /*NOTREACHED*/
  653. X    break;
  654. X
  655. X    case LOCKP_EMPTY:
  656. X        fprintf (stderr, "V: lock file is empty\n");
  657. X        exit (-1);
  658. X        /*NOTREACHED*/
  659. X    break;
  660. X
  661. X    case LOCKP_BADPID:
  662. X        fprintf (stderr, "V: lock file is not owned by given pid\n");
  663. X        exit (-1);
  664. X        /*NOTREACHED*/
  665. X    break;
  666. X
  667. X    default:
  668. X        exit (0);
  669. X        /*NOTREACHED*/
  670. X    break;
  671. X    }
  672. X}
  673. X
  674. Xusage ()
  675. X{
  676. X    fprintf (stderr,
  677. X        "Usage: V -i <pid> -l <fn>\n");
  678. X    exit (-1);
  679. X}
  680. !FUNKY!STUFF!
  681. echo x - followup.1
  682. sed '1,$s/^X//' <<\!FUNKY!STUFF! > followup.1
  683. X'\" @(#) followup.1 1.2 89/12/19
  684. X.TH FOLLOWUP L
  685. X.SH NAME
  686. Xfollowup - post a followup trouble report
  687. X.SH SYNOPSIS
  688. X.B followup [ ticket number ]
  689. X.br
  690. X.SH DESCRIPTION
  691. X.I followup
  692. Xis intended to be the method of posting a new report in a "thread" of
  693. Xreports associated with a reported problem in hardware/software.
  694. X.PP
  695. XIf 
  696. X.I followup
  697. Xis invoked without a ticket number, it prompts for one.  Then an entire
  698. Xnew trouble report is attached to a thread of reports associated together.
  699. XThis list of reports is doubly linked in the trouble report file and then
  700. Xadded to all soundex encoded search files relating to the keywords specified.
  701. X.PP
  702. XAll of the files and directories contained in the system are all plain
  703. Xtext files, with an easy format that can be used to your advantage.
  704. X.sp 1
  705. X.SH "INTERNALS"
  706. X.I followup
  707. Xuses a tree structured file data-base to store all trouble reports.  Each
  708. Xreport occupies one file in the "../Trs/Entry" directory with the name
  709. Xbeing equal to that of the date (in YYMMDD format) and a sequence number
  710. Xappended (i.e. 881025.1).  This file is then referenced in
  711. X"../Trs/Xref/<soundex>" for each keyword specified in the
  712. X.I followup
  713. Xkeyword prompt.  Each keyword is encoded via the
  714. X.I soundex
  715. Xalgorithm to be the "link" directory.  This allows fast searches of
  716. Xrecurring problems (see "report(L)").
  717. X.SH "FILES"
  718. X"/usr/local/lib/trs/...."    - Root directory for help
  719. X.br
  720. X"/usr/local/lib/trs/Entry/..."    - Directory where ALL trouble reports reside
  721. X.br
  722. X"/usr/local/lib/trs/Xref/..."   - Directory of soundex encoded cross references
  723. X.br
  724. X"/usr/local/lib/trs/sequence"    - Sequence file
  725. X.PP
  726. X.SH DIAGNOSTICS
  727. XThere are no real diagnostics.
  728. X.SH AUTHOR
  729. XRoland J. Stolfa
  730. X.br
  731. XDepartment of Computing and Information Sciences
  732. X.br
  733. XOklahoma State University
  734. X.br
  735. Xrjs@a.cs.okstate.edu
  736. !FUNKY!STUFF!
  737. echo x - followup.sh
  738. sed '1,$s/^X//' <<\!FUNKY!STUFF! > followup.sh
  739. X:
  740. X#
  741. X# Package    : (Trs2)
  742. X# Module    : followup.sh
  743. X# Programmer    : R. Stolfa (rjs@a.cs.okstate.edu)
  744. X# SCCSid    : @(#) followup.sh 1.2 89/12/19
  745. X#
  746. X# Purpose :    To 'needle & thread' TRS records together.
  747. X#
  748. X# Modification History:
  749. X#   04/12/88    Created
  750. X#   10/25/88    Added user configurable "ROOT" to allow more than
  751. X#        one TRS to exist on a particular system.
  752. X#
  753. X#   10/16/89    Release 2 started.
  754. X#
  755. X
  756. X###
  757. X###    Copyright (c) 1989, Roland J. Stolfa,  Right to copy is
  758. X###    granted so long as it is not for monetary gain and this
  759. X###    message and all headers in all files remain in tact.
  760. X###
  761. X###    THE AUTHOR DOES NOT MAKE ANY WARRANTIES, EITHER EXPRESS
  762. X###    OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
  763. X###    LIMITATION, THE CONDITION OF THIS DISTRIBUTION, ITS
  764. X###    MERCHANTABILITY OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  765. X###
  766. X
  767. X#
  768. X# Get configured.
  769. X#
  770. Xif [ "${TRSROOT}" != "" ]
  771. Xthen
  772. X    ROOT = ${TRSROOT}
  773. Xelse
  774. XROOT=/u/rjs/lib/Trs
  775. Xfi
  776. XEntry=${ROOT}/Entry
  777. X
  778. XBIN=/u/rjs/bin
  779. XPATH=${BIN}:/bin:/usr/bin
  780. Xexport PATH
  781. Xumask 022
  782. XPager=${PAGER:-pg}
  783. X
  784. X#
  785. X# Ok.  Get the 'trouble ticket' number.
  786. X#
  787. Xnum="$*"
  788. Xif test ! -s ${Entry}/${num}
  789. Xthen
  790. X    echo "Invalid trouble ticket number.  Try again."
  791. X    num=""
  792. Xfi
  793. Xwhile [ "${num}" = "" ]
  794. Xdo
  795. X    ${BIN}/print "Enter trouble ticket number? "
  796. X    read num
  797. X
  798. X    if test ! -s ${Entry}/${num}
  799. X    then
  800. X        echo "Invalid trouble ticket number.  Try again."
  801. X        num=""
  802. X    fi
  803. Xdone
  804. X
  805. X#
  806. X# Follow it's threads until you reach the last one.
  807. X#
  808. Xthread="+"
  809. Xwhile [ "${thread}" != "" ]
  810. Xdo
  811. X    thread="`grep '^thread=' ${Entry}/${num} | awk -F= '{print $2}'`"
  812. X    if [ "${thread}" != "" ]
  813. X    then
  814. X        num="${thread}"
  815. X    fi
  816. Xdone
  817. X
  818. X#
  819. X# Display last entry.
  820. X#
  821. Xecho "Last entry as follows:"
  822. Xecho ""
  823. Xecho "ticket=${num}"
  824. Xecho "reporter=`ls -l ${Entry}/${num} | awk '{print $3}'`"
  825. X${Pager} ${Entry}/${num}
  826. Xecho ""
  827. Xyesno=""
  828. Xwhile [ "${yesno}" = "" ]
  829. Xdo
  830. X    ${BIN}/print "Is this the correct one? (Y/N) "
  831. X    read yesno
  832. Xdone
  833. X
  834. X#
  835. X# If incorrect, try again.
  836. X#
  837. Xif [ "${yesno}" = "N" -o "${yesno}" = "n" ]
  838. Xthen
  839. X    exec ${BIN}/followup
  840. Xfi
  841. X
  842. X#
  843. X# Ok.  Generate a new trouble report and then fix the threading.
  844. X# Do this by 'including' the trouble ticket generator.
  845. X#
  846. Xnumber=${num}
  847. X. ${BIN}/trouble
  848. Xecho "thread=${NTN}" >> ${Entry}/${number}
  849. Xecho "needle=${num}" >> ${Entry}/${NTN}
  850. !FUNKY!STUFF!
  851. echo x - lockp.c
  852. sed '1,$s/^X//' <<\!FUNKY!STUFF! > lockp.c
  853. X/*
  854. X * Package    : LIBRARY (lockp)
  855. X * Module    : lockp.c
  856. X * Functions    : lockp, unlockp
  857. X * Programmer    : R. Stolfa (rjs@a.cs.okstate.edu)
  858. X * SCCSid    : @(#) lockp.c 1.3 89/10/30
  859. X *
  860. X * Purpose :    To provide a system portable way of binary semaphores
  861. X *        (via linked files in the file system) for Un*x.
  862. X *
  863. X * Modification History:
  864. X *   05/08/89    Created
  865. X *   10/03/89    Ported to ULTRIX
  866. X *   10/30/89    Optimized generation of temporary file name.
  867. X *      -    Rewrote "unlockp" to do more of the job.
  868. X */
  869. X
  870. X/**
  871. X***    Copyright (c) 1989, Roland J. Stolfa,  Right to copy is
  872. X***    granted so long as it is not for monetary gain and this
  873. X***    message and all headers in all files remain in tact.
  874. X***
  875. X***    THE AUTHOR DOES NOT MAKE ANY WARRANTIES, EITHER EXPRESS
  876. X***    OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
  877. X***    LIMITATION, THE CONDITION OF THIS DISTRIBUTION, ITS
  878. X***    MERCHANTABILITY OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  879. X**/
  880. X
  881. Xstatic char    *sccsid = "@(#) lockp.c 1.3 89/10/30";
  882. X
  883. X#include    <stdio.h>
  884. X#ifdef ULTRIX
  885. X#include    <sys/file.h>
  886. X#else
  887. X#include    <fcntl.h>
  888. X#endif
  889. X
  890. Xextern char    *strrchr();
  891. X
  892. X#include    "lockp.h"
  893. X
  894. X/* #define        DEBUG /* */
  895. X
  896. X#define        BIGBUFSZ    512
  897. X#define        SMLBUFSZ    80
  898. X
  899. Xint lockp (final)
  900. X    char    *final;
  901. X{
  902. X    int    len,
  903. X        pidlen,
  904. X        fd;
  905. X    char    *ptr,
  906. X        fn[BIGBUFSZ],
  907. X        pidbuf[SMLBUFSZ];
  908. X
  909. X    /*
  910. X     * Generate the temporary file name.
  911. X     */
  912. X    fn[0] = '\0';
  913. X    if ((ptr = strrchr (final, '/')) != NULL) {
  914. X        len = ptr - final + 1;
  915. X        strncpy (fn, final, len);
  916. X        fn[len] = '\0';
  917. X    }
  918. X    strcat (fn, "LCK.XXXXXX");
  919. X#ifdef DEBUG
  920. X    fprintf (stderr, "lockp:  generated >%s< as lock fn pattern\n", fn);
  921. X#endif
  922. X    mktemp (fn);
  923. X#ifdef DEBUG
  924. X    fprintf (stderr, "lockp:  generated >%s< as lock fn\n", fn);
  925. X#endif
  926. X
  927. X    /*
  928. X     * Attempt to create the lock temporary file.  If anything
  929. X     * goes wrong, return -1.
  930. X     */
  931. X    sprintf (pidbuf, "%d\n", getpid());
  932. X    pidlen = strlen (pidbuf) + 1;
  933. X    if ((fd = open (fn, O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0) {
  934. X#ifdef DEBUG
  935. X        fprintf (stderr, "lockp:  open(2) failed on >%s<\n", fn);
  936. X        perror (fn);
  937. X#endif
  938. X        return (-1);
  939. X    }
  940. X    if (write (fd, pidbuf, pidlen) != pidlen) {
  941. X#ifdef DEBUG
  942. X        fprintf (stderr, "lockp:  write(2) failed\n");
  943. X#endif
  944. X        close (fd);
  945. X        unlink (fn);
  946. X        return (-1);
  947. X    }
  948. X    close (fd);
  949. X
  950. X    /*
  951. X     * Now comes the real locking.  If the "link(2)" function fails,
  952. X     * someone else already has the lock.  Else we have it.
  953. X     */
  954. X    if (link (fn, final) < 0) {
  955. X#ifdef DEBUG
  956. X        fprintf (stderr, "lockp:  link(2) failed\n");
  957. X#endif
  958. X        unlink (fn);
  959. X        return (-1);
  960. X    }
  961. X
  962. X    /*
  963. X     * Now let's clean up the directory by removing the temp file.
  964. X     */
  965. X    unlink (fn);
  966. X    return (0);
  967. X}
  968. X
  969. Xint unlockpp (final, pid)
  970. X    char    *final;
  971. X    int    pid;
  972. X{
  973. X    FILE    *fp;        /* File pointer for lockfile */
  974. X    char    buff[SMLBUFSZ];
  975. X
  976. X    /*
  977. X     * Get the lock file open and read it's id.
  978. X     */
  979. X    if ((fp = fopen (final, "r")) == NULL) {
  980. X#ifdef DEBUG
  981. X        fprintf (stderr, "unlockp:  fopen(3) failed\n");
  982. X        perror (lockfn);
  983. X#endif
  984. X        return (LOCKP_BADF);
  985. X    }
  986. X    if (fgets (buff, SMLBUFSZ, fp) == NULL) {
  987. X#ifdef DEBUG
  988. X        fprintf (stderr, "unlockp:  lock file empty\n");
  989. X#endif
  990. X        fclose (fp);
  991. X        return (LOCKP_EMPTY);
  992. X    }
  993. X    fclose (fp);
  994. X    if (atoi (buff) != pid) {
  995. X#ifdef DEBUG
  996. X        fprintf (stderr,
  997. X            "unlockp:  lock file not owned by this process\n");
  998. X#endif
  999. X        return (LOCKP_BADPID);
  1000. X    }
  1001. X
  1002. X    /*
  1003. X     * If we get to here, we have found the correct lock that we
  1004. X     * are looking for, it has the stated PID in it, so we may
  1005. X     * unlock it.
  1006. X     *
  1007. X     * NOTE:  This assumes that the lock file is owned by us.  If
  1008. X     *      this is not the case, chaos may reign...
  1009. X     */
  1010. X    unlink (final);
  1011. X    return (0);
  1012. X}
  1013. !FUNKY!STUFF!
  1014. echo x - lockp.h
  1015. sed '1,$s/^X//' <<\!FUNKY!STUFF! > lockp.h
  1016. X/*
  1017. X * Package    : LIBRARY (lockp)
  1018. X * Module    : lockp.h
  1019. X * Programmer    : R. Stolfa (rjs@a.cs.okstate.edu)
  1020. X * SCCSid    : @(#) lockp.h 1.1 89/10/30
  1021. X *
  1022. X * Modification History:
  1023. X *   10/30/89    Created
  1024. X */
  1025. X
  1026. X/**
  1027. X***    Copyright (c) 1989, Roland J. Stolfa,  Right to copy is
  1028. X***    granted so long as it is not for monetary gain and this
  1029. X***    message and all headers in all files remain in tact.
  1030. X***
  1031. X***    THE AUTHOR DOES NOT MAKE ANY WARRANTIES, EITHER EXPRESS
  1032. X***    OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
  1033. X***    LIMITATION, THE CONDITION OF THIS DISTRIBUTION, ITS
  1034. X***    MERCHANTABILITY OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  1035. X**/
  1036. X
  1037. X#define        LOCKP_BADF    -1
  1038. X#define        LOCKP_EMPTY    -2
  1039. X#define        LOCKP_BADPID    -3
  1040. X
  1041. X#define        unlockp(fn)    unlockpp((fn),getpid())
  1042. !FUNKY!STUFF!
  1043. echo x - opentr.1
  1044. sed '1,$s/^X//' <<\!FUNKY!STUFF! > opentr.1
  1045. X'\" @(#) opentr.1 1.2 89/12/19
  1046. X.TH OPENTR L
  1047. X.SH NAME
  1048. Xopentr - report all open trouble reports
  1049. X.SH SYNOPSIS
  1050. X.B opentr
  1051. X.br
  1052. X.SH DESCRIPTION
  1053. X.I opentr
  1054. Xis intended to be used to find all open trouble reports to give
  1055. Xthe trouble manager something to do in their spare time :-).
  1056. X.SH AUTHOR
  1057. XRoland J. Stolfa
  1058. X.br
  1059. XDepartment of Computing and Information Sciences
  1060. X.br
  1061. XOklahoma State University
  1062. X.br
  1063. Xrjs@a.cs.okstate.edu
  1064. !FUNKY!STUFF!
  1065. echo x - opentr.sh
  1066. sed '1,$s/^X//' <<\!FUNKY!STUFF! > opentr.sh
  1067. X:
  1068. X#
  1069. X# Package    : (Trs2)
  1070. X# Module    : opentr
  1071. X# Programmer    : R. Stolfa (rjs@a.cs.okstate.edu)
  1072. X# SCCSid    : @(#) opentr.sh 1.2 89/12/19
  1073. X#
  1074. X# Purpose :    To list all open trouble report ticket numbers
  1075. X#        in the TRS database.
  1076. X#
  1077. X# Modification History:
  1078. X#   04/15/88    Created
  1079. X#   10/25/88    Added a user configurable "ROOT" to allow more than
  1080. X#        one TRS on a system.
  1081. X#
  1082. X#   10/16/89    Release 2 started.
  1083. X#
  1084. X
  1085. X###
  1086. X###    Copyright (c) 1989, Roland J. Stolfa,  Right to copy is
  1087. X###    granted so long as it is not for monetary gain and this
  1088. X###    message and all headers in all files remain in tact.
  1089. X###
  1090. X###    THE AUTHOR DOES NOT MAKE ANY WARRANTIES, EITHER EXPRESS
  1091. X###    OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
  1092. X###    LIMITATION, THE CONDITION OF THIS DISTRIBUTION, ITS
  1093. X###    MERCHANTABILITY OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  1094. X###
  1095. X
  1096. X#
  1097. X# Get configured.
  1098. X#
  1099. Xif [ "${TRSROOT}" != "" ]
  1100. Xthen
  1101. X    ROOT = ${TRSROOT}
  1102. Xelse
  1103. XROOT=/u/rjs/lib/Trs
  1104. Xfi
  1105. XEntry=${ROOT}/Entry
  1106. X
  1107. XBIN=/u/rjs/bin
  1108. XPATH=${BIN}:/bin:/usr/bin
  1109. Xexport PATH
  1110. Xumask 022
  1111. X
  1112. Xif [ `ls ${Entry} | wc -l` -gt 0 ]
  1113. Xthen
  1114. X    for i in ${Entry}/*
  1115. X    do
  1116. X        if [ `grep "^needle=" $i | wc -l` -eq 0 ]
  1117. X        then
  1118. X            echo `basename $i`
  1119. X        fi
  1120. X    done
  1121. Xfi
  1122. !FUNKY!STUFF!
  1123. echo x - print.c
  1124. sed '1,$s/^X//' <<\!FUNKY!STUFF! > print.c
  1125. X/*
  1126. X * Package    : (Trs2)
  1127. X * Module    : print.c
  1128. X * Functions    : main
  1129. X * Programmer    : R. Stolfa (rjs@a.cs.okstate.edu)
  1130. X * SCCSid    : @(#) print.c 1.2 89/12/19
  1131. X *
  1132. X * Purpose :    To provide a portable way of printing a string
  1133. X *        of text on stdout without having a newline at the
  1134. X *        end.
  1135. X *
  1136. X * Modification History:
  1137. X *   04/01/88    Created
  1138. X *
  1139. X *   10/16/89    Rewrote for release 2
  1140. X *        Added check to make sure no newlines ever get out.
  1141. X */
  1142. X
  1143. X/**
  1144. X***    Copyright (c) 1989, Roland J. Stolfa,  Right to copy is
  1145. X***    granted so long as it is not for monetary gain and this
  1146. X***    message and all headers in all files remain in tact.
  1147. X***
  1148. X***    THE AUTHOR DOES NOT MAKE ANY WARRANTIES, EITHER EXPRESS
  1149. X***    OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
  1150. X***    LIMITATION, THE CONDITION OF THIS DISTRIBUTION, ITS
  1151. X***    MERCHANTABILITY OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  1152. X**/
  1153. X
  1154. Xstatic char    *sccsid = "@(#) print.c 1.2 89/12/19";
  1155. X
  1156. X#include    <stdio.h>
  1157. X
  1158. Xmain (argc, argv)
  1159. Xint    argc;
  1160. Xchar    *argv[];
  1161. X{
  1162. X    int    i;
  1163. X
  1164. X    if (argc > 1) {
  1165. X        for (i = 1; i < argc - 1 ; i ++) {
  1166. X            p (argv[i]);
  1167. X            p (' ');
  1168. X        }
  1169. X
  1170. X        p (argv[argc-1]);
  1171. X    }
  1172. X}
  1173. X
  1174. Xp (s)
  1175. X    char    *s;
  1176. X{
  1177. X    while ((*s != '\n') && (*s != '\0')) {
  1178. X        putchar (*s);
  1179. X        s ++;
  1180. X    }
  1181. X}
  1182. !FUNKY!STUFF!
  1183. echo x - report.1
  1184. sed '1,$s/^X//' <<\!FUNKY!STUFF! > report.1
  1185. X'\" @(#) report.1 1.2 89/12/19
  1186. X.TH REPORT L
  1187. X.SH NAME
  1188. Xreport - extract all requested trouble reports by selection criteria
  1189. X.SH SYNOPSIS
  1190. X.B report [ t=<thread> ] [ k=<keyword> ] [ d=<date> ] [ r=<reporter> ] [ e=<equipment> ]
  1191. X.br
  1192. X.SH DESCRIPTION
  1193. X.I report
  1194. Xis intended to extract the utmost information from the (T)rouble (R)eport
  1195. X(S)ystem.  With this shell script, you can extract an entire thread
  1196. Xusing the
  1197. X.B [ t=<thread id> ]
  1198. Xoption, or you may select all reports with a particular keyword
  1199. Xusing the
  1200. X.B [ k=<keyword> ]
  1201. Xoption.  In addition, you may select all reports on a particular day
  1202. Xusing the
  1203. X.B [ d=<date> ]
  1204. Xoption.  If that isn't enough, you can select a particular reporter (read that
  1205. Xas UN*X user login id) by using the
  1206. X.B [ r=<reporter> ]
  1207. Xoption.  Lastly, you can use the
  1208. X.B [ e=<equipment id string> ]
  1209. Xoption to extract all info about a particular piece of equipment and or a class
  1210. Xof equipment, depending on what you use for the
  1211. X.B <equipment id string>.
  1212. X.PP
  1213. XIn addition, you can use the different options of 
  1214. X.I report
  1215. Xadditively.  Several examples follow.
  1216. X.PP
  1217. Xreport t=881025.1 e="terminal"
  1218. X.br
  1219. Xextracts all trouble report entries in the thread associated with the head
  1220. Xof the thread pointed to by 881025.1 that deal with the "terminal" class
  1221. Xof devices.
  1222. X.PP
  1223. Xreport d=881025 r=joe e="terminal"
  1224. X.br
  1225. Xextracts all trouble reports on 10/25/88 by user "joe" involving a
  1226. X"terminal".
  1227. X.PP
  1228. Xreport k=broken e="terminal"
  1229. X.br
  1230. Xextracts all trouble reports about "broken" "terminal"s.
  1231. X.sp 1
  1232. X.SH "INTERNALS"
  1233. X.I report
  1234. Xuses a single pass over the arguments above
  1235. X.B IN THE LISTED ORDER
  1236. Xto refine the eventual list of trouble report tickets to be printed
  1237. Xas the "report".  Note that any misordering of the arguments will be
  1238. Xhandled by re-ordering them as listed above BEFORE selection occurs.
  1239. X.sp 1
  1240. X.SH DIAGNOSTICS
  1241. XThere are no real diagnostics.  You are expected to be able to fathom the
  1242. Xdeep-dark recesses of shell programming to do ANY debugging of this system.
  1243. X.sp 1
  1244. X.SH AUTHOR
  1245. XRoland J. Stolfa
  1246. X.br
  1247. XDepartment of Computing and Information Sciences
  1248. X.br
  1249. XOklahoma State University
  1250. X.br
  1251. Xrjs@a.cs.okstate.edu
  1252. !FUNKY!STUFF!
  1253. echo x - report.sh
  1254. sed '1,$s/^X//' <<\!FUNKY!STUFF! > report.sh
  1255. X:
  1256. X#
  1257. X# Package    : (Trs2)
  1258. X# Module    : report.sh
  1259. X# Programmer    : R. Stolfa (rjs@a.cs.okstate.edu)
  1260. X# SCCSid    : @(#) report.sh 1.2 89/12/19
  1261. X#
  1262. X# Purpose :    To scan the TRS database and extract "reasonable"
  1263. X#        information.  This information will be presented
  1264. X#        on the screen in a format suitable for printing
  1265. X#
  1266. X# Command line syntax:
  1267. X#        report <flags>
  1268. X#        where <flags> are some set of the following
  1269. X#
  1270. X#        t=<thread id>
  1271. X#        k=<keyword to search on>
  1272. X#        d=<date in YYMMDD format>
  1273. X#        r=<reporter (userid)>
  1274. X#        e=<equipment id string (inventory number?)>
  1275. X#
  1276. X# Modification History:
  1277. X#   04/12/88    Created
  1278. X#   10/25/88    Added a user configurable "ROOT" to allow more than
  1279. X#        one TRS on a system
  1280. X#
  1281. X#   10/16/89    Release 2 started.
  1282. X#
  1283. X
  1284. X###
  1285. X###    Copyright (c) 1989, Roland J. Stolfa,  Right to copy is
  1286. X###    granted so long as it is not for monetary gain and this
  1287. X###    message and all headers in all files remain in tact.
  1288. X###
  1289. X###    THE AUTHOR DOES NOT MAKE ANY WARRANTIES, EITHER EXPRESS
  1290. X###    OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
  1291. X###    LIMITATION, THE CONDITION OF THIS DISTRIBUTION, ITS
  1292. X###    MERCHANTABILITY OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  1293. X###
  1294. X
  1295. X#
  1296. X# Get configured.
  1297. X#
  1298. Xif [ "${TRSROOT}" != "" ]
  1299. Xthen
  1300. X    ROOT = ${TRSROOT}
  1301. Xelse
  1302. XROOT=/u/rjs/lib/Trs
  1303. Xfi
  1304. XEntry=${ROOT}/Entry
  1305. XXref=${ROOT}/Xref
  1306. X
  1307. XBIN=/u/rjs/bin
  1308. XPATH=${BIN}:/bin:/usr/bin
  1309. Xexport PATH
  1310. Xumask 022
  1311. XPager=${PAGER:-pg}
  1312. X
  1313. XAwkprog=/tmp/trs1.$$
  1314. XTemp=/tmp/trs2.$$
  1315. XTemp2=/tmp/trs3.$$
  1316. Xtrap "rm -f /tmp/trs*$$ ; exit 1" 1 2 15
  1317. X
  1318. X#
  1319. X# Parse the command line
  1320. X#
  1321. Xthread=""
  1322. Xkey=""
  1323. Xdate=""
  1324. Xreporter=""
  1325. Xequip=""
  1326. Xcat > ${Awkprog} << 'EOF'
  1327. XBEGIN    { FS = "="; }
  1328. X{
  1329. X    if (NF == 2) {
  1330. X        char = substr ($1, 0, 1);
  1331. X        if ((char == "t") || (char == "T"))
  1332. X            printf "T\n";
  1333. X        else if ((char == "k") || (char == "K"))
  1334. X            printf "K\n";
  1335. X        else if ((char == "d") || (char == "D"))
  1336. X            printf "D\n";
  1337. X        else if ((char == "r") || (char == "R"))
  1338. X            printf "R\n";
  1339. X        else if ((char == "e") || (char == "E"))
  1340. X            printf "E\n";
  1341. X    }
  1342. X}
  1343. XEOF
  1344. Xfor i in $*
  1345. Xdo
  1346. X    case `echo $i | awk -f ${Awkprog}` in
  1347. X    T)
  1348. X        thread="`echo $i | awk -F= '{print $2}'`"
  1349. X        continue;;
  1350. X    K)
  1351. X        item=`echo $i | awk -F= '{print $2}'`
  1352. X        key=`soundex ${item}`
  1353. X        continue;;
  1354. X    D)
  1355. X        date="`echo $i | awk -F= '{print $2}'`"
  1356. X        continue;;
  1357. X    R)
  1358. X        reporter="`echo $i | awk -F= '{print $2}'`"
  1359. X        continue;;
  1360. X    E)
  1361. X        equip="`echo $i | awk -F= '{print $2}'`"
  1362. X        continue;;
  1363. X    esac
  1364. Xdone
  1365. Xrm -f ${Awkprog}
  1366. X
  1367. X#
  1368. X# Separate out a thread (if required).
  1369. X#
  1370. Xif [ "${thread}" != "" ]
  1371. Xthen
  1372. X    #
  1373. X    # Ok.  Let's generate a thread list.
  1374. X    #
  1375. X    if test ! -s ${Entry}/${thread}
  1376. X    then
  1377. X        echo "Invalid thread id.  Try again."
  1378. X        exit
  1379. X    fi
  1380. X    rm -f ${Temp}
  1381. X    #
  1382. X    # Find head of thread
  1383. X    #
  1384. X    needle=${thread}
  1385. X    while [ "${needle}" != "" ]
  1386. X    do
  1387. X        thread=${needle}
  1388. X        needle="`grep '^needle=' ${Entry}/${needle} | awk -F= '{print $2}'`"
  1389. X    done
  1390. X    #
  1391. X    # List the members of the thread
  1392. X    #
  1393. X    while [ "${thread}" != "" ]
  1394. X    do
  1395. X        echo "${thread}" >> ${Temp}
  1396. X        thread="`grep '^thread=' ${Entry}/${thread} | awk -F= '{print $2}'`"
  1397. X    done
  1398. Xelse
  1399. X    #
  1400. X    # Get all trouble tickets, system wide
  1401. X    #
  1402. X    cat ${Xref}/Entry > ${Temp}
  1403. Xfi
  1404. Xsort -u ${Temp} > ${Temp2}
  1405. Xmv ${Temp2} ${Temp}
  1406. X
  1407. X#
  1408. X# Now lets get the key field taken care of.
  1409. X#
  1410. Xif [ "${key}" != "" ]
  1411. Xthen
  1412. X    if test -s ${Xref}/${key}
  1413. X    then
  1414. X        comm -12 ${Temp} ${Xref}/${key} | sort -u > ${Temp2}
  1415. X        mv ${Temp2} ${Temp}
  1416. X    else
  1417. X        echo "Key >${key}< doesn't exist.  Continuing..."
  1418. X    fi
  1419. Xfi
  1420. X
  1421. X#
  1422. X# Ok.  Now let's generate the subset of the list that has occured on
  1423. X# the date in question.
  1424. X#
  1425. Xif [ "${date}" != "" ]
  1426. Xthen
  1427. X    grep "${date}" < ${Temp} | sort -u > ${Temp2}
  1428. X    mv ${Temp2} ${Temp}
  1429. Xfi
  1430. X
  1431. X#
  1432. X# Do the awking for a particular reporter (if necessary).
  1433. X#
  1434. Xif [ "${reporter}" != "" ]
  1435. Xthen
  1436. X
  1437. X    cat > ${Awkprog} << 'EOF'
  1438. X{
  1439. X    if (NR == 1) {
  1440. X        reporter = $1;
  1441. X    } else if (substr($3, 0, length(reporter)) == reporter) {
  1442. X        printf "%s\n", $NF;
  1443. X    }
  1444. X}
  1445. XEOF
  1446. X
  1447. X    echo "${reporter}" > ${Temp2}
  1448. X    ls -l `cat ${Temp}` >> ${Temp2}
  1449. X    awk -f ${Awkprog} < ${Temp2} > ${Temp}
  1450. X    rm -f ${Temp2} ${Awkprog}
  1451. Xfi
  1452. X
  1453. X#
  1454. X# Do the greping for a particular piece of equipment (if necessary).
  1455. X#
  1456. Xif [ "${equip}" != "" ]
  1457. Xthen
  1458. X    cat ${Temp} | while read x
  1459. X    do
  1460. X        grep -l "^equipment=${equip}*" $x > ${Temp2}
  1461. X    done
  1462. X    sort -u ${Temp2} > ${Temp}
  1463. Xfi
  1464. X
  1465. X#
  1466. X# Ok.  More the junk to the screen...
  1467. X#
  1468. Xfor i in `cat ${Temp}`
  1469. Xdo
  1470. X    fn=${Entry}/$i
  1471. X    if test -s ${fn}
  1472. X    then
  1473. X        echo "ticket=$i"
  1474. X        echo "reporter=`ls -l ${fn} | awk '{print $3}'`"
  1475. X        cat ${fn}
  1476. X        echo ""
  1477. X    fi
  1478. Xdone | ${Pager}
  1479. X
  1480. X#
  1481. X# Now clean up and exit.
  1482. X#
  1483. Xrm -f ${Temp} ${Temp2}
  1484. !FUNKY!STUFF!
  1485. echo x - rmthread.1
  1486. sed '1,$s/^X//' <<\!FUNKY!STUFF! > rmthread.1
  1487. X'\" @(#) rmthread.1 1.2 89/12/19
  1488. X.TH RMTHREAD L
  1489. X.SH NAME
  1490. Xrmthread - remove a trouble report system thread from anywhere on the thread
  1491. X.SH SYNOPSIS
  1492. X.B rmthread [threadid]
  1493. X.br
  1494. X.SH DESCRIPTION
  1495. X.I rmthread
  1496. Xis to be used when an entire thread of trouble reports have been dealt with
  1497. Xand the amassed information is no longer of any use.  This program finds
  1498. Xthe head of the list of trouble reports (on the thread given) and then builds
  1499. Xa list of thread files to remove.  It then displays the entire thread and
  1500. Xasks you if you really want to remove it.  If so, it then gets rid of all
  1501. Xoccurrences of the associated thread from the trouble report system.
  1502. X.sp 1
  1503. X.SH "INTERNALS"
  1504. X.I rmthread
  1505. Xuses an text line in the thread file to provide both a forward link to the
  1506. Xnext trouble report and another text line to provide the backward link to
  1507. Xthe previous trouble report.  This is why it is so slow at times.
  1508. X.sp 1
  1509. X.SH AUTHOR
  1510. XRoland J. Stolfa
  1511. X.br
  1512. XDepartment of Computing and Information Sciences
  1513. X.br
  1514. XOklahoma State University
  1515. X.br
  1516. Xrjs@a.cs.okstate.edu
  1517. !FUNKY!STUFF!
  1518. echo x - rmthread.sh
  1519. sed '1,$s/^X//' <<\!FUNKY!STUFF! > rmthread.sh
  1520. X:
  1521. X#
  1522. X# Package    : (Trs2)
  1523. X# Module    : rmthread.sh
  1524. X# Programmer    : R. Stolfa (rjs@a.cs.okstate.edu)
  1525. X# SCCSid    : @(#) rmthread.sh 1.2 89/12/19
  1526. X#
  1527. X# Purpose :    To delete a thread of trouble reports in the TRS
  1528. X#        database system.
  1529. X#
  1530. X# Modification History:
  1531. X#   04/12/88    Created
  1532. X#   10/25/88    Added a user configurable "ROOT" to allow more than
  1533. X#        one TRS on a system
  1534. X#
  1535. X#   10/16/89    Release 2 started.
  1536. X#   12/19/89    Fixed minor bug in invocation of "V"
  1537. X#
  1538. X
  1539. X###
  1540. X###    Copyright (c) 1989, Roland J. Stolfa,  Right to copy is
  1541. X###    granted so long as it is not for monetary gain and this
  1542. X###    message and all headers in all files remain in tact.
  1543. X###
  1544. X###    THE AUTHOR DOES NOT MAKE ANY WARRANTIES, EITHER EXPRESS
  1545. X###    OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
  1546. X###    LIMITATION, THE CONDITION OF THIS DISTRIBUTION, ITS
  1547. X###    MERCHANTABILITY OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  1548. X###
  1549. X
  1550. X#
  1551. X# Get configured.
  1552. X#
  1553. Xif [ "${TRSROOT}" != "" ]
  1554. Xthen
  1555. X    ROOT = ${TRSROOT}
  1556. Xelse
  1557. XROOT=/u/rjs/lib/Trs
  1558. Xfi
  1559. XEntry=${ROOT}/Entry
  1560. XXref=${ROOT}/Xref
  1561. XPlock=${ROOT}/LCK.TRS
  1562. X
  1563. XBIN=/u/rjs/bin
  1564. XPATH=${BIN}:/bin:/usr/bin
  1565. Xexport PATH
  1566. Xumask 022
  1567. XPager=${PAGER:-pg}
  1568. X
  1569. XTemp=/tmp/trs1.$$
  1570. XTemp2=/tmp/trs2.$$
  1571. Xtrap "rm -f /tmp/trs*$$ ; exit 1" 1 2 15
  1572. X
  1573. X#
  1574. X# Get the tread to delete.
  1575. X#
  1576. Xthread="$*"
  1577. Xwhile [ "${thread}" = "" ]
  1578. Xdo
  1579. X    ${BIN}/print "Enter thread to delete? "
  1580. X    read thread
  1581. X
  1582. X    if test \! -s ${Entry}/${thread}
  1583. X    then
  1584. X        echo "Invalid thread.  Try again"
  1585. X        thread=""
  1586. X    fi
  1587. Xdone
  1588. X
  1589. X#
  1590. X# Search backwards (if possible) for head of thread.
  1591. X#
  1592. Xneedle="+"
  1593. Xwhile [ "${needle}" != "" ]
  1594. Xdo
  1595. X    needle="`grep '^needle=' ${Entry}/${thread} | awk -F= '{print $2}'`"
  1596. X    if [ "${needle}" != "" ]
  1597. X    then
  1598. X        thread="${needle}"
  1599. X    fi
  1600. Xdone
  1601. X
  1602. X#
  1603. X# ASSERT:
  1604. X#    At this point, thread is the original trouble report ticket
  1605. X#    number.  Now let's keep that number safe and display the thread
  1606. X#    to assure that it is the one that needs to be removed.
  1607. X#
  1608. X
  1609. Xptr="${thread}"
  1610. Xecho "The following is the listing of this thread."
  1611. Xecho ""
  1612. Xwhile [ "${ptr}" != "" ]
  1613. Xdo
  1614. X    echo "ticket=${ptr}"
  1615. X    echo "reporter=`ls -l ${Entry}/${ptr} | awk '{print $3}'`"
  1616. X    cat ${Entry}/${ptr}
  1617. X    echo ""
  1618. X    ptr="`grep '^thread=' ${Entry}/${ptr} | awk -F= '{print $2}'`"
  1619. Xdone | ${Pager}
  1620. X
  1621. X#
  1622. X# Prompt for removal.
  1623. X#
  1624. Xyesno=""
  1625. Xwhile [ "${yesno}" = "" ]
  1626. Xdo
  1627. X    ${BIN}/print "Is this the thread you want to delete? (Y/N) "
  1628. X    read yesno
  1629. Xdone
  1630. X
  1631. Xif [ "${yesno}" = "n" -o "${yesno}" = "N" ]
  1632. Xthen
  1633. X    exit
  1634. Xfi
  1635. X
  1636. X#
  1637. X# Ok.  We have permission.  Just remove the whole stupid thing...
  1638. X#
  1639. Xrm -f ${Temp}
  1640. Xptr=${thread}
  1641. Xwhile [ "${ptr}" != "" ]
  1642. Xdo
  1643. X    echo "Removing ticket ${ptr}"
  1644. X    echo ${ptr} >> ${Temp}
  1645. X    thread="`grep '^thread=' ${Entry}/${ptr} | awk -F= '{print $2}'`"
  1646. X    rm -f ${Entry}/${ptr}
  1647. X    ptr="${thread}"
  1648. Xdone
  1649. Xsort -u ${Temp} > ${Temp2}
  1650. Xpid=`P -wel ${Plock}`
  1651. Xfor i in ${Xref}/*
  1652. Xdo
  1653. X    comm -23 $i ${Temp2} | sort -u > ${Temp}
  1654. X    cp ${Temp} $i
  1655. Xdone
  1656. XV -i ${pid} -l ${Plock}
  1657. X
  1658. Xrm -f ${Temp} ${Temp2}
  1659. !FUNKY!STUFF!
  1660. echo x - soundex.c
  1661. sed '1,$s/^X//' <<\!FUNKY!STUFF! > soundex.c
  1662. X/*
  1663. X * Package    : (Trs2)
  1664. X * Module    : soundex.c
  1665. X * Functions    : main, soundex
  1666. X * Programmer    : R. Stolfa (rjs@a.cs.okstate.edu)
  1667. X * SCCSid    : @(#) soundex.c 1.2 89/12/19
  1668. X *
  1669. X * Purpose :    This program implements the SOUNDEX procedure as
  1670. X *        outlined on page 655 of "Database Design" by
  1671. X *        Gio Wiederhold.  This procedure was originally
  1672. X *        introduced by Odell & Russel (1918) and was
  1673. X *        described by McEwen (1974).
  1674. X *
  1675. X * Usage :    soundex <string1> <string2> ... <stringN>
  1676. X *
  1677. X * Modification History:
  1678. X *   00/00/00    Created
  1679. X */
  1680. X
  1681. X/**
  1682. X***    Copyright (c) 1989, Roland J. Stolfa,  Right to copy is
  1683. X***    granted so long as it is not for monetary gain and this
  1684. X***    message and all headers in all files remain in tact.
  1685. X***
  1686. X***    THE AUTHOR DOES NOT MAKE ANY WARRANTIES, EITHER EXPRESS
  1687. X***    OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
  1688. X***    LIMITATION, THE CONDITION OF THIS DISTRIBUTION, ITS
  1689. X***    MERCHANTABILITY OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  1690. X**/
  1691. X
  1692. Xstatic char    *sccsid = "@(#) soundex.c 1.2 89/12/19";
  1693. X
  1694. X#include    <stdio.h>
  1695. X
  1696. X#define        BS        200
  1697. X
  1698. Xmain (argc, argv)
  1699. Xint    argc;
  1700. Xchar    *argv[];
  1701. X{
  1702. X    char    sound[BS];
  1703. X    int    i;
  1704. X
  1705. X    if (argc == 1) {
  1706. X        fprintf (stderr,
  1707. X            "Usage: soundex <string1> <string2> ... <stringN>\n");
  1708. X        exit (-1);
  1709. X    }
  1710. X
  1711. X    for (i = 1; i < argc; i ++) {
  1712. X        soundex (argv[i], sound);
  1713. X        printf ("%s\n", sound);
  1714. X    }
  1715. X}
  1716. X
  1717. Xsoundex (word, sound)
  1718. Xchar    word[],        /* String to convert to SOUNDEX */
  1719. X    sound[];    /* Output SOUNDEX */
  1720. X{
  1721. X    int    outpos,        /* Current output position in SOUNDEX */
  1722. X        j;        /* Index into word */
  1723. X
  1724. X    /* Initialize return word */
  1725. X    outpos = 0;
  1726. X    sound[outpos] = '\0';
  1727. X
  1728. X    /* If the word is null, then the output should be null */
  1729. X    if (strlen(word) == 0)
  1730. X        return;
  1731. X
  1732. X    /* Copy first character of word to SOUNDEX */
  1733. X    sound[outpos] = toupper (word[0]);
  1734. X
  1735. X    for (j = 1; j < strlen (word); j ++) {
  1736. X
  1737. X        /* Convert each character to uppercase */
  1738. X        word[j] = toupper(word[j]);
  1739. X
  1740. X        switch (word[j]) {
  1741. X
  1742. X        /* Replace Labials with "1" */
  1743. X        case 'B':
  1744. X        case 'F':
  1745. X        case 'P':
  1746. X        case 'V':
  1747. X            if (sound[outpos] != '1') {
  1748. X                outpos ++;
  1749. X                sound[outpos] = '1';
  1750. X            }
  1751. X            break;
  1752. X
  1753. X        /* Replace Gutterals & sibilants with "2" */
  1754. X        case 'C':
  1755. X        case 'G':
  1756. X        case 'J':
  1757. X        case 'K':
  1758. X        case 'Q':
  1759. X        case 'S':
  1760. X        case 'X':
  1761. X        case 'Z':
  1762. X            if (sound[outpos] != '2') {
  1763. X                outpos ++;
  1764. X                sound[outpos] = '2';
  1765. X            }
  1766. X            break;
  1767. X
  1768. X        /* Replace Dentals with "3" */
  1769. X        case 'D':
  1770. X        case 'T':
  1771. X            if (sound[outpos] != '3') {
  1772. X                outpos ++;
  1773. X                sound[outpos] = '3';
  1774. X            }
  1775. X            break;
  1776. X
  1777. X        /* Replace Longliquids with "4" */
  1778. X        case 'L':
  1779. X            if (sound[outpos] != '4') {
  1780. X                outpos ++;
  1781. X                sound[outpos] = '4';
  1782. X            }
  1783. X            break;
  1784. X
  1785. X        /* Replace Nasals with "5" */
  1786. X        case 'M':
  1787. X        case 'N':
  1788. X            if (sound[outpos] != '5') {
  1789. X                outpos ++;
  1790. X                sound[outpos] = '5';
  1791. X            }
  1792. X            break;
  1793. X
  1794. X        /* Replace Shortliquids with "6" */
  1795. X        case 'R':
  1796. X            if (sound[outpos] != '6') {
  1797. X                outpos ++;
  1798. X                sound[outpos] = '6';
  1799. X            }
  1800. X            break;
  1801. X        }
  1802. X    }
  1803. X
  1804. X    /* Terminate the soundex string */
  1805. X    outpos ++;
  1806. X    sound[outpos] = '\0';
  1807. X
  1808. X    /* Forcably trunicate soundex to 4 characters */
  1809. X    sound[4] = '\0';
  1810. X}
  1811. !FUNKY!STUFF!
  1812. echo x - trouble.1
  1813. sed '1,$s/^X//' <<\!FUNKY!STUFF! > trouble.1
  1814. X'\" @(#) trouble.1 1.2 89/12/19
  1815. X.TH TROUBLE L
  1816. X.SH NAME
  1817. Xtrouble - enter an initial trouble report
  1818. X.SH SYNOPSIS
  1819. X.B trouble
  1820. X.br
  1821. X.SH DESCRIPTION
  1822. X.I trouble
  1823. Xenters the initial trouble report in the trouble report system.  It is
  1824. Xused also by
  1825. X.I followup
  1826. Xto enter all followup trouble reports in the current thread.
  1827. X.PP
  1828. XThis program is self prompting and fairly self explanatory.
  1829. X.sp 1
  1830. X.SH AUTHOR
  1831. XRoland J. Stolfa
  1832. X.br
  1833. XDepartment of Computing and Information Sciences
  1834. X.br
  1835. XOklahoma State University
  1836. X.br
  1837. Xrjs@a.cs.okstate.edu
  1838. !FUNKY!STUFF!
  1839. echo x - trouble.sh
  1840. sed '1,$s/^X//' <<\!FUNKY!STUFF! > trouble.sh
  1841. X:
  1842. X#
  1843. X# Package    : (Trs2)
  1844. X# Module    : trouble.sh
  1845. X# Programmer    : R. Stolfa (rjs@a.cs.okstate.edu)
  1846. X# SCCSid    : @(#) trouble.sh 1.2 89/12/19
  1847. X#
  1848. X# Purpose :    To enter trouble reports into the TRS database system.
  1849. X#
  1850. X# Modification History:
  1851. X#   04/11/88    Created
  1852. X#   04/12/88    Added hooks for recording the new trouble number in the
  1853. X#        environment variable NTN for use in "followup"
  1854. X#   10/25/88    Added user configurable "ROOT" to allow more than
  1855. X#        one TRS on a system
  1856. X#
  1857. X#   10/16/89    Release 2 started.
  1858. X#
  1859. X
  1860. X###
  1861. X###    Copyright (c) 1989, Roland J. Stolfa,  Right to copy is
  1862. X###    granted so long as it is not for monetary gain and this
  1863. X###    message and all headers in all files remain in tact.
  1864. X###
  1865. X###    THE AUTHOR DOES NOT MAKE ANY WARRANTIES, EITHER EXPRESS
  1866. X###    OR IMPLIED, AS TO ANY MATTER WHATSOEVER, INCLUDING WITHOUT
  1867. X###    LIMITATION, THE CONDITION OF THIS DISTRIBUTION, ITS
  1868. X###    MERCHANTABILITY OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  1869. X###
  1870. X
  1871. X#
  1872. X# Get configured.
  1873. X#
  1874. Xif [ "${TRSROOT}" != "" ]
  1875. Xthen
  1876. X    ROOT = ${TRSROOT}
  1877. Xelse
  1878. XROOT=/u/rjs/lib/Trs
  1879. Xfi
  1880. XEntry_dir=${ROOT}/Entry
  1881. XSeq=${ROOT}/sequence
  1882. XXref=${ROOT}/Xref
  1883. XPlock=${ROOT}/LCK.TRS
  1884. X
  1885. XBIN=/u/rjs/bin
  1886. XPATH=${BIN}:/bin:/usr/bin
  1887. Xexport PATH
  1888. Xumask 000
  1889. XPager=${PAGER:-pg}
  1890. X
  1891. XTemp=/tmp/trs.$$
  1892. Xtrap "rm -f /tmp/trs*$$ ; exit 1" 1 2 15
  1893. Xrm -f ${Temp}
  1894. X
  1895. X#
  1896. X# Prompt for what piece of equipment is down.
  1897. X#
  1898. Xequipment=""
  1899. Xwhile [ "${equipment}" = "" ]
  1900. Xdo
  1901. X    ${BIN}/print "Enter equipment ID string? "
  1902. X    read equipment
  1903. Xdone
  1904. Xecho "equipment=${equipment}" >> ${Temp}
  1905. X
  1906. X#
  1907. X# Get the keywords to link the file in "Entry" to in each
  1908. X# of their respective "SOUNDEX" equivalents files.
  1909. X#
  1910. Xecho "Enter the keywords that are to be associated with this"
  1911. Xecho "report one per line, ending with a blank line."
  1912. X${BIN}/print "keywords=" >> ${Temp}
  1913. Xkeywords=""
  1914. Xdummy="+"
  1915. Xwhile [ "${dummy}" != "" ]
  1916. Xdo
  1917. X    read dummy
  1918. X    if [ "${dummy}" != "" ]
  1919. X    then
  1920. X        ${BIN}/print "${dummy} " >> ${Temp}
  1921. X        keywords="${keywords}`soundex ${dummy}` "
  1922. X    fi
  1923. Xdone
  1924. Xecho "" >> ${Temp}
  1925. X
  1926. X#
  1927. X# Enter the report.
  1928. X#
  1929. Xecho "Enter report, ending with a blank line"
  1930. Xdummy="+"
  1931. Xwhile [ "${dummy}" != "" ]
  1932. Xdo
  1933. X    read dummy
  1934. X    if [ "${dummy}" != "" ]
  1935. X    then
  1936. X        echo "desc=${dummy}" >> ${Temp}
  1937. X    fi
  1938. Xdone
  1939. X
  1940. X#
  1941. X# Handle the process locking on the Entry spool to allow us to copy
  1942. X# into that area safe from race conditions.
  1943. X#
  1944. Xpid=`P -ewl ${Plock}`
  1945. Xseqence=`cat ${Seq}`
  1946. Xentry="`date '+%y%m%d'`.${seqence}"
  1947. Xexpr ${seqence} + 1 > ${Seq}
  1948. Xmv ${Temp} ${Entry_dir}/${entry}
  1949. XV -i ${pid} -l ${Plock}
  1950. X
  1951. X#
  1952. X# Report the "trouble ticket" number for future 'threading'.
  1953. X#
  1954. Xecho " "
  1955. Xecho "Your trouble ticket number is ${entry}"
  1956. Xecho "save this number for future reference."
  1957. X
  1958. X#
  1959. X# Record the new trouble number in the environment variable NTN.
  1960. X#
  1961. XNTN=${entry}
  1962. X
  1963. X#
  1964. X# Now enter the "Entry" into a file for each of the "SOUNDEX"'ed
  1965. X# keywords.  This is an attempt to make the system easier to search.
  1966. X#
  1967. Xecho ${entry} >> ${Xref}/Entry
  1968. Xfor i in ${keywords}
  1969. Xdo
  1970. X    echo ${entry} >> ${Xref}/$i
  1971. Xdone
  1972. X
  1973. X#
  1974. X# Ok.  Let's be clean...
  1975. X#
  1976. Xrm -f ${Temp}
  1977. !FUNKY!STUFF!
  1978.  
  1979.