home *** CD-ROM | disk | FTP | other *** search
- From decwrl!labrea!rutgers!mailrus!cwjcc!hal!ncoast!allbery Wed Dec 28 05:49:41 PST 1988
- Article 767 of comp.sources.misc:
- Path: granite!decwrl!labrea!rutgers!mailrus!cwjcc!hal!ncoast!allbery
- From: allbery@ncoast.UUCP (Brandon S. Allbery)
- Newsgroups: comp.sources.misc
- Subject: v05i091: peerssa -- a checker script in perl
- Message-ID: <13273@ncoast.UUCP>
- Date: 23 Dec 88 01:26:17 GMT
- Sender: allbery@ncoast.UUCP
- Reply-To: allbery@ncoast.UUCP (Brandon S. Allbery)
- Organization: Cleveland Public Access UN*X, Cleveland, Oh
- Lines: 151
- Approved: allbery@ncoast.UUCP
-
- Posting-number: Volume 5, Issue 91
- Submitted-by: "Brandon S. Allbery" <allbery@ncoast.UUCP>
- Archive-name: peerssa
-
- This is a perl script I whipped up to check the status of ncoast when I log
- in. It may not be in the best form it could be; it suffers from having been
- written when perl wasn't working right on ncoast (courtesy of a botched C
- compiler). However, it's useful as it is.
-
- It can be invoked with the name of a checker script, or will default to the
- file ~/.checklist if a script is not specified. An example checker script is
- below:
-
- #
- # Checklist for Peerssa: The Checker
- #
-
- "df|" /([^ ]+).*[ ][ ]*(([0-9]?[0-9])?[0-9]) blocks/ + "WARNING: $2 BLOCKS FREE ON $1"
- | /([^ ]+).*[ ][ ]*(([0-9]?[0-9])?[0-9]) inodes/ + "WARNING: $2 INODES FREE ON $1"
- "ps -e|" /expire/ "Expire is running."
- "/bin/who|" /^rhg / "The Boss is on the system."
- | /^hal / "We are receiving news and mail."
- /etc/inittab /^2:13:c:/ "The system is in Night/Weekend mode."
-
- The format of the file is:
-
- source pattern [opcode] message
-
- The source may be quoted, the message must be quoted. Escaped quotes are
- handled in all quoted strings. At present, the pattern must be enclosed in
- slashes, although I intend to change this. A source followed by a pipe
- character is considered to be a program or pipeline to be run to produce
- input, just as in perl itself. A source consisting of a single pipe
- character signifies an additional pattern for use with the preceding source.
- When the message is printed, variables $0-$9 are substituted from the pattern
- by the same rules as for perl's $0-$9 variables.
-
- The opcodes are:
-
- = (default) print message for first matching line
- + print message for all matching lines
- - print message if NO matching lines
-
- In the latter case, $0-$9 are not substituted.
-
- #! /bin/sh
- # This file was wrapped with "dummyshar". "sh" this file to extract.
- # Contents: peerssa
- echo extracting 'peerssa'
- if test -f 'peerssa' -a -z "$1"; then echo Not overwriting 'peerssa'; else
- sed 's/^X//' << \EOF > 'peerssa'
- Xeval "exec perl -S $0 $*"
- X if $execed_by_shell;
- X
- X#
- X# Peerssa: The Checker
- X# A perl script by Brandon S. Allbery
- X# I hereby place this program in the public domain
- X#
- X# Scan a list of files or processes for specified patterns, and print messages
- X# based on those patterns. This is in some ways similar to "file" under
- X# System V, but using patterns instead of fixed offsets and values. I use it
- X# to monitor certain critical system values, and certain things important to
- X# me.
- X#
- X# If you don't understand the name, read Larry Niven's short story "Rammer".
- X#
- X
- X# The file containing things to check for
- X$checklist = $ENV{"HOME"} . "/.checklist";
- X
- X$npat = 0;
- X$l = 0;
- X$program = $0;
- Xopen checklist;
- Xwhile (<checklist>) {
- X $l++;
- X chop;
- X# skip blank lines or comments
- X next if /^#/ || /^[ \t]*$/;
- X $line = $_;
- X do check() if $npat != 0 && $_ !~ /[ ]*\|[ ]/;
- X# file-or-process /pattern/ [op] "message"
- X# "file or process" /pattern/ [op] "message"
- X# | /pattern/ [op] "message" -- continue command
- X# op is: "=" match once, "+" match multiple, "!" print on no match
- X if ($line !~ m#^[ \t]*"(([^"]*\\")*[^"]*)"[ \t]+/(([^/]*\\/)*[^/]*)/[ \t]*([=!+]?)[ \t]*"(([^"]*\\")*[^"]*)"[ \t]*$#) {
- X if ($line !~ m#^[ \t]*([^ \t]+)[ \t]+/(([^/]*\\/)*[^/]*)/[ \t]*([=!+]?)[ \t]*"(([^"]*\\")*[^"]*)"[ \t]*$#) {
- X print "$program: syntax error on line $l of \"$checklist\"\n";
- X exit;
- X }
- X else {
- X $cf = $1;
- X $pat = $2;
- X $opr = $4;
- X $msg = $5;
- X die "$program: no previous pattern on line $l of \"$checklist\"\n" if $cf eq '|' & $npat == 0;
- X $checkfile = $cf if $cf ne '|';
- X }
- X }
- X else {
- X $checkfile = $1;
- X# remove escaped quotes on filename
- X $checkfile =~ s/\\"/"/g;
- X $pat = $3;
- X $opr = $5;
- X $msg = $6;
- X }
- X# default op is "="
- X $opr = "=" if $opr eq "";
- X# remove escaped quotes on pattern and message
- X $pat =~ s#\\/#/#g;
- X $msg =~ s/\\"/"/g;
- X# assign into array of [op, pat, message]
- X $pattern[$npat] = $pat;
- X $op[$npat] = $opr;
- X $message[$npat] = $msg;
- X $npat++;
- X}
- Xexit if $npat == 0;
- Xdo check();
- Xexit(0);
- X
- Xsub check {
- X local ($matched, $cnt);
- X
- X open checkfile;
- X $matched = 0;
- X while (<checkfile>) {
- X for ($cnt = 0; $cnt < $npat; $cnt++) {
- X if ($_ =~ $pattern[$cnt]) {
- X $matched = 1;
- X# the "eval" lets us print $1-$9 from the pattern, for customized messages
- X eval 'print "' . $message[$cnt] . "\n" . '"' if $op[$cnt] ne '!';
- X last if $op[$cnt] ne '+';
- X }
- X }
- X }
- X close checkfile;
- X print $message[0] . "\n" if !$matched & $op[0] eq '!';
- X}
- EOF
- chars=`wc -c < 'peerssa'`
- if test $chars != 2544; then echo 'peerssa' is $chars characters, should be 2544 characters!; fi
- fi
- exit 0
- --
- Brandon S. Allbery, comp.sources.misc moderator and one admin of ncoast PA UN*X
- uunet!hal.cwru.edu!ncoast!allbery ncoast!allbery@hal.cwru.edu
- comp.sources.misc is moving off ncoast -- please do NOT send submissions direct
- Send comp.sources.misc submissions to comp-sources-misc@<backbone>.
-
-
-