home *** CD-ROM | disk | FTP | other *** search
/ Telecom / 1996-04-telecom-walnutcreek.iso / technical / ixo.program.scripts / tpage.pl < prev    next >
Perl Script  |  1993-02-14  |  10KB  |  334 lines

  1. #! /usr/local/bin/perl4.035
  2.  
  3. # tpage.pl -- front-end to tpage system.
  4. #   by Tom Limoncelli, tal@warren.mentorg.com
  5. #   Copyright (c) 1992, Tom Limoncelli
  6. #   The sources can be freely copied for non-commercial use only
  7. #   and only if they are unmodified.
  8.  
  9. # $Header: /home/tal/work/beep2/RCS/tpage.pl,v 1.2 1992/09/21 20:11:51 root Exp $
  10.  
  11. # Version 2.0 -- See file HISTORY for details.
  12.  
  13. # $Log: tpage.pl,v $
  14. # Revision 1.2  1992/09/21  20:11:51  root
  15. # new tr's to remove high bits
  16. #
  17. # Revision 1.2  1992/09/21  20:11:51  root
  18. # new tr's to remove high bits
  19. #
  20. # Revision 1.1  1992/09/21  20:09:37  root
  21. # Initial revision
  22.  
  23. ####################################################################
  24. #
  25. # Parameters that the user can set:
  26. #
  27. ####################################################################
  28.  
  29. $debug = 0;
  30. # leave that off
  31.  
  32. $MAX_WINDOW = 16;
  33. #This is the number of charactors at a time do you see on your
  34. # pager.  This is used when word-wrapping.
  35.  
  36. $MAX_MESSAGE = 110;
  37. # How many bytes can one message be.  This must be less than 250
  38. # minus the length of your PIN.  This is because each packet in the ixo
  39. # protocol must be less than 250 chars.  If you have a pager that can
  40. # receive longer messages, you'll have to modify the ixocico.c program
  41. # to handle the "packet continuation" feature.  No biggie, just 
  42.  
  43. # something that I didn't feel like implementing since I can't even 
  44.  
  45. # test it with my pager.
  46.  
  47. $DEFAULT_S = '/home/adm/lib/tpage/schedule';
  48. # (default: '/home/adm/lib/tpage/schedule')
  49. # If you plan on using the schedule feature, this is the file
  50. # name where beep2.pl will look for the schedule.  It must be accessable
  51. # on the machine that runs tpage.pl, not the machine that runs the
  52. # daemon (tpaged.pl).
  53.  
  54. $DEFAULT_T = '/home/adm/lib/tpage/table';
  55. # (default: '/home/adm/lib/tpage/table')
  56. # If you plan on using the table feature (that is, store a list
  57. # of people and their paging info), this is the file name where tpage.pl
  58. # will look for the data.  It must be accessable on the machine that
  59. # runs tpage.pl, not the machine that runs the daemon (tpaged.pl).
  60.  
  61. $QUEUE_DIR = '/home/adm/lib/tpage/pqueue/';
  62. # (default: '/home/adm/lib/tpage/pqueue/'
  63. # This is the directory where messages will be queued.  The trailing "/"
  64. # is required.
  65.  
  66. ####################################################################
  67. # some helping functions
  68.  
  69. require("getopts.pl");
  70.  
  71. sub strip_string {
  72.     local($s) = @_;
  73. print "DEBUG: REMOVE_CONTROLS :", $s, ":\n" if $debug;
  74.     $s =~ tr/\200-\377/\000-\177/;    # remove high-bit
  75.     $s =~ tr/\000-\037\177//d;    # delete unprintables
  76.     $s =~ s/\s+/ /g;            # change groups of white space into  
  77. " "
  78.     $s =~ s/^ //;                # remove spaces from the front
  79.     $s =~ s/ $//;                # remove spaces from the end
  80.     
  81. print "DEBUG: REMOVE_DONE :", $s, ":\n" if $debug;
  82.     return $s;
  83. }
  84.  
  85. ####################################################################
  86. # Here's the actual program
  87.  
  88. ####################################################################
  89. # Get the command line options.
  90.  
  91. # set the defaults
  92.  
  93. print "\n";
  94.  
  95. # -S  schedule file
  96. $opt_S = $DEFAULT_S;
  97. # -T  pager table
  98. $opt_T = $DEFAULT_T;
  99. # -U  use urgent schedule if no one is scheduled for that time.
  100. $opt_U = 0;
  101. # -d  number to dial. (first name in list only)
  102. $opt_d = "";
  103. # -p  pager id to use. (first name in list only)
  104. $opt_p = "";
  105. # -t  tee all stdin into stdout.
  106. $opt_t = 0;
  107. # -v  verbose mode.
  108. $opt_v = 0;
  109. # -m  input will be in RFC822, skip boring stuff.
  110. $opt_m = 0;
  111. # -M  like -m but also skip >-quoted text.
  112. $opt_M = 0;
  113. # -e  if it errors, send email to this person.
  114. $opt_e = "";
  115.  
  116. $line_from = "";
  117. $line_subj = "";
  118. $line_prio = "";
  119.  
  120. do Getopts('S:T:Ud:p:tvmMe:');
  121.  
  122. # get the wholist
  123. $opt_wholist = shift (@ARGV);
  124. $opt_wholist = "special" if $opt_d && $opt_p;
  125.  
  126. ####################################################################
  127. # Get the message (either on the command line or stdin; handle -t -m -M
  128.  
  129. # bunch up all the rest
  130. $opt_message = join(' ', @ARGV);
  131. print "opt_message = :$opt_message:\n" if $debug;
  132. $opt_message = &strip_string( $opt_message ) if $opt_message;
  133. print "opt_message = :$opt_message:\n" if $debug;
  134. die "$0: No message.  Cat got your tongue?" if ( $opt_message eq "" );
  135.  
  136. die "$0: Can't use -m/-M and have message on the command line"
  137.         if ($opt_m || $opt_M) && $opt_message ne '-';
  138.  
  139. # maybe get message from stdin, echoing to stdout if $opt_t;
  140. if ($opt_message eq '-') {
  141.     $opt_message = '';
  142.     # handle -m headers first
  143.     if ($opt_m) {
  144.         print "DEBUG: Doing -m work\n" if $debug;
  145.         local($line) = "";
  146.         while (<>) {
  147.             if ( /^\S/ || /^$/ ) {    # start of new header, do previous  
  148. one
  149.                 $line_from = substr($line, 6) if $line =~ /^From/;
  150.                 $line_subj = substr($line, 9) if $line =~  
  151. /^Subject: /;
  152.                 $line_prio = substr($line, 10) if $line =~  
  153. /^Priority: /;
  154.                 $line = $_;
  155.             } else {
  156.                 $line .= $_;
  157.             }
  158.             last if /^$/;            # end of headers, start  
  159. processing
  160.         }
  161.     }
  162.     $line_from = &strip_string( $line_from ) if $line_from;
  163.     $line_subj = &strip_string( $line_subj ) if $line_subj;
  164.     $line_prio = &strip_string( $line_prio ) if $line_prio;
  165.  
  166.     while (<>) {
  167. # -M means skip if the line is news quoted email.
  168. # a line is news quoted if it begins with one of the following:
  169. #      [white] [word] quote
  170. # where "white" is any amount of whitespace (zero or one times)
  171. # where word is any letters/numbers (userid) (zero or one times)
  172. # where quote is any of >, <, }, or {.
  173.         next if $opt_M && /^\s*\S*[\>\}\<\{]/;
  174.         print if $opt_t;
  175.         $_ = &strip_string( $_ );
  176.         $opt_message .= $_;
  177.         $opt_message .= " ";
  178.         # once we've got quite a bunch, screw the rest.
  179.         if ( length($opt_message) > ($MAX_MESSAGE * 8)) {
  180.              while (<>) { print if $opt_t; }
  181.         }
  182.     }
  183. }
  184.  
  185. ####################################################################
  186. # massage the message
  187.  
  188. if ($debug) {
  189.     print "DEBUG: pre-processed messages\n";
  190.     print "FROM=:$line_from:\n";
  191.     print "PRIO=:$line_prio:\n";
  192.     print "SUBJ=:$line_subj:\n";
  193.     print "MESS=:$opt_message:\n";
  194. }
  195.  
  196. $line_from = substr( "F: " . $line_from . ' ' x $MAX_WINDOW,
  197.         0, $MAX_WINDOW) if $line_from;        # pad to display size
  198.  
  199. $line_prio = substr( "P: " . $line_prio . ' ' x $MAX_WINDOW,
  200.         0, $MAX_WINDOW) if $line_prio;        # pad to display size
  201.  
  202. $l = $MAX_WINDOW * int ((length($line_subj)+$MAX_WINDOW+2) / $MAX_WINDOW);
  203. $line_subj = substr( "S: " . $line_subj . ' ' x $MAX_WINDOW,
  204.         0, $l) if $line_subj;        # pad to display size
  205.  
  206. $opt_message = &strip_string( $opt_message );
  207. # put it all together
  208. $the_message = substr( $line_prio . $line_from . $line_subj . $opt_message, 0,  
  209. $MAX_MESSAGE - 1);
  210.  
  211. if ($debug) {
  212.     print "DEBUG: post-processed messages\n";
  213.     print "FROM=:$line_from:\n";
  214.     print "PRIO=:$line_prio:\n";
  215.     print "SUBJ=:$line_subj:\n";
  216.     print "MESS=:$opt_message:\n";
  217.     print "COMPLETE=:$the_message:\n";
  218. }
  219.  
  220. ####################################################################
  221. # At this point we can do some more of the sanity checking.
  222.  
  223. #die "$0: Conflicting verbosity levels" if ($opt_s && ($opt_v || $opt_V));
  224. die "$0: Schedule file $opt_S can't be read/found"
  225.         unless ( ($opt_wholist eq '-') || (-r $opt_S && -r $opt_T) );
  226. die "$0: Pager table $opt_T can't be read"
  227.         unless ($opt_d && $opt_p) || ( -r $opt_T );
  228.  
  229. ####################################################################
  230. # use the schedule to fill in "who" if we need.
  231.  
  232. if ($opt_wholist eq '-') {
  233.     local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =  
  234. localtime(time);
  235.     local($l) = $wday;
  236.     local($h) = $hour * 2 + int ($hour / 30) + 1;
  237.     local($w,$found1) = 0;
  238.  
  239. print "L = $l\n" if $debug;
  240. print "H = $h\n" if $debug;
  241. print "U = $opt_U\n" if $debug;
  242.  
  243.     # Read from schedule until you hit a line beginning with $l.
  244.     # At that point, get the char $h bytes in.  If that byte is "-",
  245.     # and $opt_U, keep going.
  246.     print "\nChecking schedule:\n\n";
  247.     open(SCHED, "<$opt_S") || die "Can't open $opt_S: $!";
  248.     while (1) {
  249.         $w = '';
  250.         while (<SCHED>) {
  251.             last if /^${l}/;
  252.         }
  253.         $w = substr($_, $h, 1);
  254.         $found1 = 1 if $w;                # we found one!
  255.         next if $opt_U && $w eq '-';
  256.         last;
  257.     }
  258.  
  259.     die "$0: Schedule doesn't have a line for this day of the week.\n" unless  
  260. $found1;
  261.     die "$0: No one is assigned to be on duty at this time.\n" if $w eq '-';
  262.  
  263.     # Now search until a line begins with $w= and assign line to wholist
  264.     $opt_wholist = '';
  265.     while (<SCHED>) {
  266.         next unless /^${w}\=/;
  267.         chop( $opt_wholist = substr($_, 2) );
  268.     }
  269.     die "$0: Schedule error: No people assigned to '" . $w . "'\n" unless  
  270. $opt_wholist;
  271.     close SCHED;
  272. }
  273.  
  274. ####################################################################
  275. # we we still don't know who to call, bail out.
  276.  
  277. die "$0: The schedule didn't specify anyone to call!"
  278.         unless ($opt_wholist) || ($opt_d && $opt_p);
  279. die "$0: There isn't anyone scheduled for this time of day."
  280.         if $opt_wholist eq '-';
  281.  
  282. ####################################################################
  283. # rotate through "$opt_wholist" and queue each person
  284.  
  285. $cnt = 0;
  286. foreach $who ( split(',', $opt_wholist) ) {
  287.     $cnt++;
  288.  
  289.     # look up "who"'s information
  290.     open(TABL, "<$opt_T") || die "Can't open $opt_T: $!";
  291.     while (<TABL>) {
  292.         next if /^#/;
  293.         chop;
  294.         local($name,$phonen,$phonea,$pin) = split;
  295.         if ($name eq $who) {
  296.             $opt_d = $phonea unless $opt_d;    # might have it from ARGV
  297.             $opt_p = $pin unless $opt_p;    # might have it from ARGV
  298.             print "Got $who is :$opt_d:$opt_p:\n" if $debug;
  299.             last;
  300.         }
  301.     }
  302.     close TABL;
  303.  
  304.     die "$0: We were not able to find a phone number for $who.\n" unless  
  305. $opt_d;
  306.     die "$0: We were not able to find a PIN for $who.\n" unless $opt_p;
  307.  
  308.     # write into the queue the proper information.
  309.     chop( $thishost = `hostname` );
  310.     $qname = $QUEUE_DIR . "P" . $thishost . time . $cnt;
  311.     print "QUEUE=$qname\n" if $debug;
  312.     local($um) = umask 2;
  313.     open(QU, ">$qname" ) || die "Can't open $qname for writing: $!";
  314.     umask $um;
  315.     print QU "A\n";
  316.     print QU $opt_d, "\n";
  317.     print QU $opt_p, "\n";
  318.     if ($opt_e eq '-') {     # '-' means send errors to $who,
  319.         print QU $who, "\n";
  320.     } else {
  321.         print QU $opt_e, "\n";
  322.     }
  323.     print QU $the_message, "\n";
  324.     print QU "X\n";
  325.     close QU;
  326.     print "Message queued for $who: $the_message\n";
  327.     
  328.     # zap the phone# and PIN so that ARGV's info only effects us once.
  329.     $opt_d = "";
  330.     $opt_p = "";
  331. }
  332.  
  333. print "\n";
  334.