Skip to content

Instantly share code, notes, and snippets.

@kentfredric
Created August 13, 2011 20:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kentfredric/1144231 to your computer and use it in GitHub Desktop.
Save kentfredric/1144231 to your computer and use it in GitHub Desktop.
diff --git a/psmon-1.29/Changes b/psmon-1.29/Changes
new file mode 100644
index 0000000..623d5b8
--- /dev/null
+++ b/psmon-1.29/Changes
@@ -0,0 +1,604 @@
+2005-04-14 16:43 nicolaw
+
+ * bin/psmon: Re-ordered some POD
+
+2005-04-14 16:37 nicolaw
+
+ * bin/psmon: Fixed daemonise() so that it will work on non-Linux
+ platforms. Fixed LOG_PERROR being used on platforms which do not
+ support it. Fixed use of /usr/sbin/sendmail to check for
+ existance of /lib/sendmail also. Added some more recent
+ performance values in the POD.
+
+2005-04-13 22:57 nicolaw
+
+ * etc/psmon.conf: Fixed bug with legacy config option NotifyEmail
+ not getting translated to AdminEmail option, and calling of
+ alert() method.
+
+2005-04-13 22:57 nicolaw
+
+ * bin/psmon: Fixed bug with legacy config option NotifyEmail not
+ getting translated to AdminEmail option, and calling of alert()
+ method. Removed depreciated dump of various /proc information in
+ alert emails in favor of spawn and kill command stdout and stderr
+ and exit values etc.
+
+2005-04-13 18:32 nicolaw
+
+ * Changes: Commited new log items from CVS
+
+2005-04-13 18:29 nicolaw
+
+ * bin/psmon: Abstracted syslog and email logging to a seperate OO
+ module so that Unix::Syslog and Net::SMTP can be made optional
+ modules in the next release instead of mandatory. Added the
+ defaultemailmethod configuration directive.
+
+2005-03-31 15:47 nicolaw
+
+ * META.yml: Updating
+
+2005-03-02 12:35 nicolaw
+
+ * META.yml: [no log message]
+
+2005-03-02 12:34 nicolaw
+
+ * bin/psmon: Fixed some typos in the POD
+
+2005-03-02 12:34 nicolaw
+
+ * bin/psmon-config: Fixed some more defaults
+
+2005-03-02 12:15 nicolaw
+
+ * bin/psmon-config: Fixed a default value
+
+2005-03-02 12:10 nicolaw
+
+ * bin/psmon-config: Fixed a directive
+
+2005-03-02 12:08 nicolaw
+
+ * bin/psmon: Removed some old commented out code, fixed some
+ space/tabbing and corrected some POD and a directive
+ mismatch/error
+
+2005-03-02 11:49 nicolaw
+
+ * bin/recent/: psmon, psmon.pod: Adding
+
+2005-03-02 11:48 nicolaw
+
+ * Makefile.PL: Added psmon-config
+
+2005-03-02 11:48 nicolaw
+
+ * support/commit.sh: Changed hostname and not to update readme on
+ the fly
+
+2005-03-02 11:47 nicolaw
+
+ * support/README.old: Moved from the old ../README
+
+2005-03-02 11:47 nicolaw
+
+ * README: Shortened
+
+2005-03-02 11:44 nicolaw
+
+ * support/install.sh: Updated to handle psmon-config
+
+2005-03-02 11:32 nicolaw
+
+ * bin/strip_pod.pl: [no log message]
+
+2005-03-02 11:22 nicolaw
+
+ * MANIFEST: Typo
+
+2005-03-02 11:20 nicolaw
+
+ * MANIFEST: Added psmon-config
+
+2005-03-02 01:27 nicolaw
+
+ * Makefile.PL: Added psmon-config
+
+2005-03-02 01:25 nicolaw
+
+ * bin/psmon-config: Adding
+
+2005-02-17 17:42 nicolaw
+
+ * bin/strip_pod.pl: Output pod to STDERR and code to STDOUT
+
+2005-02-17 17:35 nicolaw
+
+ * bin/strip_pod.pl: Adding for development aid
+
+2005-01-14 01:56 nicolaw
+
+ * support/psmon.html: Updated HTML from new POD
+
+2005-01-14 01:56 nicolaw
+
+ * bin/psmon: Typo - missing eol ;
+
+2004-11-11 23:08 nicolaw
+
+ * bin/psmon: Interim update migrating to cleaner OO syntax
+
+2004-10-12 13:55 nicolaw
+
+ * bin/psmon: Added better handling for figuring out where to write
+ a valid pid file so that multiple instances can be run at once on
+ a multiuser system. Added better handling to figure out which
+ config file to use, and when to only scan for the local user's
+ processes instead of everyones
+
+2004-10-12 11:47 nicolaw
+
+ * META.yml, install.sh, support/install.sh, support/psmon.html:
+ Fixed typo
+
+2004-08-02 04:56 nicolaw
+
+ * bin/psmon: Corrected some problems with imported symbols and
+ module loading on some systems and versions of perl.
+
+2004-08-02 04:55 nicolaw
+
+ * META.yml: [no log message]
+
+2004-08-01 13:19 nicolaw
+
+ * bin/psmon: [no log message]
+
+2004-08-01 13:09 nicolaw
+
+ * bin/psmon: Added OSNAME and SCRIPT CATEGORIES for CPAN script
+ archive indexing
+
+2004-08-01 11:43 nicolaw
+
+ * COPYING, Changes, INSTALL, MANIFEST, META.yml, Makefile.PL,
+ README, TODO, install.sh, bin/psmon, etc/psmon.conf,
+ support/commit.sh, support/install.sh, support/perldoc.css,
+ support/psmon.html: [no log message]
+
+2004-08-01 11:31 nicolaw
+
+ * install.sh: Symlink
+
+2004-08-01 11:29 nicolaw
+
+ * COPYING, Changes, INSTALL, MANIFEST, META.yml, Makefile.PL,
+ README, TODO, bin/psmon, etc/psmon.conf, support/commit.sh,
+ support/install.sh, support/perldoc.css, support/psmon.html:
+ Initial import in to new CVS repository after the old one was
+ lost
+
+2004-08-01 11:29 nicolaw
+
+ * COPYING, Changes, INSTALL, MANIFEST, META.yml, Makefile.PL,
+ README, TODO, bin/psmon, etc/psmon.conf, support/commit.sh,
+ support/install.sh, support/perldoc.css, support/psmon.html:
+ Initial revision
+
+2003-03-26 14:17 nicolaw
+
+ * psmon (1.58), psmon.html (1.4): First commit to try and get
+ cmndline =~ regex checking based process scope rules. This is
+ currently only working to respawn dead process, and does not yet
+ know how to describe what it is restarting when logging and
+ notifying.
+
+2003-03-26 09:22 nicolaw
+
+ * README (1.2), psmon.1 (1.2), psmon.html (1.3): Updated docs
+
+2003-03-25 14:22 tag rel-1-0-4
+
+2003-03-25 14:22 nicolaw
+
+ * psmon.conf (1.17, rel-1-0-4): Updated default config to include
+ some more daemons and additional help.
+
+2003-03-25 13:32 nicolaw
+
+ * psmon (1.57, rel-1-0-4): Small fixes
+
+2003-03-25 11:01 nicolaw
+
+ * psmon (1.56): Removed an old DEBUG line
+
+2003-03-25 11:00 nicolaw
+
+ * psmon (1.55): Mar 24 17:53:21 nicolaw psmon[11657]: Removing stale
+ PID file. Mar 24 17:53:21 nicolaw psmon[11657]: Forking background
+ daemon, process 11658. Mar 24 17:53:21 nicolaw psmon[11658]: Forking
+ second background daemon, process 11659. Mar 24 17:53:21 nicolaw
+ psmon[11659]: Terminating.
+
+ This bug was reported by Jordan Lederman <jlederma@advance.net> on
+ Mon 24 Mar 2003. Daemon spawned psmon instances seem to die
+ immediatelty after forking for the second time. The while PID file
+ exists loop was checking against the old $O{pidfile} variable
+ container which is now moved to a locally scoped lexical withing
+ the main look and daemonize function.
+
+2003-03-24 18:00 nicolaw
+
+ * psmon (1.54), psmon.html (1.2, rel-1-0-4): Interim commit to fix
+ a --daemon spawn bug
+
+2003-03-20 16:21 tag rel-1-0-3
+
+2003-03-20 16:21 nicolaw
+
+ * README (1.1, rel-1-0-4), psmon.1 (1.1, rel-1-0-4), psmon.html
+ (1.1) (utags: rel-1-0-3): Updating refreshed documentation
+
+2003-03-20 16:14 nicolaw
+
+ * psmon (1.53, rel-1-0-3): Added the KillCmd directive to kill
+ processes using a user defined command insted of or in addition to
+ just sending a regular SIGKILL signal to the process.
+
+ Moved the printing of sysvinit style statuses to a seperate
+ subroutine which decides what to print and when to surpress output.
+
+ Changed the way that dryruns are detected at spawn and kill time so
+ that only one set of log and status messages have to be maintained.
+
+2003-03-20 13:37 nicolaw
+
+ * psmon (1.52): Added the NeverKillPID and NeverKillProcessName
+ directives.
+
+2003-03-20 12:56 nicolaw
+
+ * psmon (1.51): Got rid of the following global variables in to the
+ %O hash: $PIDFILE, $DEFAULT_CONFIG_FILE, $CONFIG_FILE, $DAEMON,
+ $CRON, $DRYRUN, $USER, $ADMINEMAIL
+
+2003-03-19 17:22 tag rel-1-0-2
+
+2003-03-19 17:22 nicolaw
+
+ * psmon (1.50, rel-1-0-2): Fixed major bug whereby the --user
+ option code somehow appeared to be complete rubbish, and therefore
+ would have either always scanned all or none of the process table
+ instead of just those processes owned by the specified user. This
+ is now fixed and will be tested shortly.
+
+ Moved the killing and spawning actions out in to two seperate
+ subroutines that are called by the main check_processtable()
+ routine. This makes the code slightly easier to read, and will
+ make adding the new killcmd and related commands slightly easier to
+ insert.
+
+ Added validation for the lastsafepid configuration directive to
+ ensure it's value is always numeric.
+
+ Changed the loglevel of reporting of saving protected PIDs from
+ death from INFO to whatever the defined loglevel for that process
+ is. If there is none defined then the default loglevel will be
+ applied.
+
+2003-03-17 15:06 tag rel-1-0-1
+
+2003-03-17 15:06 nicolaw
+
+ * psmon (1.49, rel-1-0-1): I completely missed the fix meant for
+ the last commit!
+
+2003-03-17 13:44 nicolaw
+
+ * psmon (1.48): Added isnumeric() function to cope with potentially
+ non-numeric output from config and process table scan when numeric
+ is expected. In response to bug reported by Andy Brown
+ <andybrown21@hotmail.com>
+
+2003-03-14 14:25 nicolaw
+
+ * commit.sh (1.4, rel-1-0-4, rel-1-0-3, rel-1-0-2, rel-1-0-1):
+ Added README and updated commit.sh to automatically regenerate it.
+
+2003-03-14 12:28 nicolaw
+
+ * COPYING (1.1, rel-1-0-4, rel-1-0-3, rel-1-0-2, rel-1-0-1),
+ commit.sh (1.3), install.sh (1.6, rel-1-0-4, rel-1-0-3, rel-1-0-2,
+ rel-1-0-1), perldoc.css (1.2, rel-1-0-4, rel-1-0-3, rel-1-0-2,
+ rel-1-0-1), psmon (1.47), psmon.conf (1.16, rel-1-0-3, rel-1-0-2,
+ rel-1-0-1): Added GPL license details to the header of all relevant
+ files, and added http://www.gnu.org/licenses/gpl.txt to the file
+ COPYING in order to be compliant with GPL practices.
+
+2003-03-13 11:53 nicolaw
+
+ * install.sh (1.5): Updated man page installation
+
+2003-03-12 12:13 tag rel-1-0-0
+
+2003-03-12 12:13 nicolaw
+
+ * commit.sh (1.2, rel-1-0-0): Minor change for my benefit again
+
+2003-03-12 12:08 nicolaw
+
+ * commit.sh (1.1): Adding commit.sh for my own ease of development
+ purposes
+
+2003-03-07 15:12 nicolaw
+
+ * install.sh (1.4), perldoc.css (1.1) (utags: rel-1-0-0): Added
+ .css for psmon.html docs properly
+
+2003-03-07 14:55 nicolaw
+
+ * psmon (1.46, rel-1-0-0): Updated documentation
+
+2003-03-07 00:08 nicolaw
+
+ * psmon (1.45): Smalled fixes in parts of POD documentation and
+ supporting versions
+
+2003-03-06 18:01 nicolaw
+
+ * psmon (1.44): Updated POD documentation.
+
+2003-03-04 17:44 nicolaw
+
+ * psmon (1.43): Added scalar to instances clause - might be broken
+ otherwise, maybe?
+
+2003-03-04 16:32 nicolaw
+
+ * psmon (1.41): Updated sendmail() I think
+
+2003-03-03 14:12 nicolaw
+
+ * psmon (1.40): Changed the syslog code so that the inital testing
+ and daemonizing uses syslog with PERROR so that erorrs get logged
+ to the connected terminal too. Once it's been daemonized or started
+ to do an actual process check, it reopens the syslog connection
+ without PERROR so that log entries only end up in syslog.
+
+2003-02-28 17:53 nicolaw
+
+ * psmon (1.39), psmon.conf (1.15, rel-1-0-0): LOG_CRIT or worse
+ errors no longer cause a die from log(). All orrurances of
+ LOG_CRIT logging which relied on this fucntionality have been
+ changed to manually force an exit with a unit exit return value.
+
+2003-02-28 17:18 nicolaw
+
+ * psmon (1.38): Added support to change the syslog facility logged
+ to, and set different loglevels for different kill and spawn
+ actions.
+
+2003-02-27 16:28 nicolaw
+
+ * psmon (1.37): Fixed some missing "unless $DAEMON" items
+
+2003-02-27 16:13 nicolaw
+
+ * psmon (1.36): Made changes to bring in to line with new features
+ of newapp_template. Includes double forking to detach from
+ interactive tty's properly.
+
+2003-02-12 18:47 nicolaw
+
+ * psmon (1.35): Serious fek up with pctmem and pctcpu values passed
+ in to sprintf was the problem - fixed
+
+2003-02-12 18:44 nicolaw
+
+ * psmon (1.34): Changes %.2f to %s for the moment - much
+ strangeness when tested on mdk
+
+2003-02-12 18:40 nicolaw
+
+ * psmon (1.33): Fixed some formatting and $slay hash reference
+ syntax errors
+
+2003-02-12 18:27 nicolaw
+
+ * psmon (1.32): I think I have fixed the safe PIDFile code which
+ protects named parent processes. The code was accidentally only
+ implemeneted for one slaying critera (oops). This needs to be
+ tested though.
+
+ Also added support for additional description of why each process
+ was actually slayed,.. including some figures.
+
+2003-02-12 15:49 nicolaw
+
+ * psmon (1.31): Now uses $PIDFILE to support config file
+ indepentant PID files to allow many psmon instances using different
+ configs to run as daemons
+
+2003-02-12 15:08 nicolaw
+
+ * psmon (1.30): $PIDFILE is added - need to change the code to use
+ the variable
+
+2003-02-11 15:58 nicolaw
+
+ * psmon (1.29): Exporting POSIX stuff explicitly
+
+2003-02-07 15:40 nicolaw
+
+ * psmon (1.28): Fixed handling of process scope * so that it now
+ works properly
+
+2003-02-07 14:49 nicolaw
+
+ * psmon (1.27), psmon.conf (1.14): Added the DryRun directive to
+ force the dryrun mode to be applied to specific config files no
+ matter what. Added a little more documentation, and lots of
+ comments to the config file
+
+2003-02-05 17:24 nicolaw
+
+ * psmon (1.26): Fixed a =over4 pod tag to be =over 4
+
+2003-01-30 14:02 nicolaw
+
+ * psmon (1.24): Added comment to what syslog facility in the log
+ docs
+
+2003-01-30 13:59 nicolaw
+
+ * install.sh (1.3), psmon (1.23): Updated docs, getting ahead of
+ myself with planned features/fixes/improvements. :)
+
+2003-01-30 10:58 nicolaw
+
+ * psmon (1.22), psmon.conf (1.13): Added email override
+ functionality
+
+2003-01-28 10:47 nicolaw
+
+ * psmon (1.21): Removed Sys::Load from dependencies since it's not
+ currently being used anywhere in the code! :-)
+
+2003-01-28 10:47 nicolaw
+
+ * install.sh (1.2): Removed Sys::Load from dependencies since it's
+ not currently being used anywhere in the code! :-)
+
+2003-01-26 22:20 nicolaw
+
+ * psmon (1.20): Yet more typos.
+
+2003-01-26 22:19 nicolaw
+
+ * psmon (1.19): Added a couple of lines of docs for the install
+
+2003-01-26 22:12 nicolaw
+
+ * psmon (1.18): Removed 2 debug lines which weren't taken out
+
+2003-01-26 22:10 nicolaw
+
+ * psmon (1.17): Added support for pctmem directive. Any process
+ using in excess of X percent of total system memory will be killed.
+
+2003-01-26 22:03 nicolaw
+
+ * psmon (1.16): Reformatted subroutine pod docs
+
+2003-01-26 21:54 nicolaw
+
+ * psmon.conf (1.12): Added lastsafepid functionality so save any
+ processes less than or equal to lastsafepid from death
+
+2003-01-26 21:54 nicolaw
+
+ * psmon (1.15): Added lastsafepid functionality so save any
+ processes less than or equal to lastsafepid from death
+
+2003-01-26 21:17 nicolaw
+
+ * psmon.conf (1.11): Expanded default psmon.conf, and added
+ LastSafePID option to protect all PIDs from 1 to X. Functionality
+ being added to psmon for this now.
+
+2003-01-26 21:07 nicolaw
+
+ * libnet-1.12.tar.gz (1.1, rel-1-0-4, rel-1-0-3, rel-1-0-2,
+ rel-1-0-1, rel-1-0-0): Added libnet for Net::SMTP module
+ dependancy.
+
+2003-01-25 15:45 nicolaw
+
+ * psmon.conf (1.9): Changed the default distribution psmon.conf a
+ little to be a little more sensible
+
+2003-01-25 15:41 nicolaw
+
+ * Config-General-2.15.tar.gz (1.1, rel-1-0-4, rel-1-0-3, rel-1-0-2,
+ rel-1-0-1, rel-1-0-0), Getopt-Long-2.32.tar.gz (1.1, rel-1-0-4,
+ rel-1-0-3, rel-1-0-2, rel-1-0-1, rel-1-0-0),
+ Proc-ProcessTable-0.38.tar.gz (1.1, rel-1-0-4, rel-1-0-3,
+ rel-1-0-2, rel-1-0-1, rel-1-0-0), Sys-Load-0.2.tar.gz (1.1,
+ rel-1-0-4, rel-1-0-3, rel-1-0-2, rel-1-0-1, rel-1-0-0),
+ Unix-Syslog-0.99.tar.gz (1.1, rel-1-0-4, rel-1-0-3, rel-1-0-2,
+ rel-1-0-1, rel-1-0-0), install.sh (1.1), psmon (1.14): Removed old
+ redundant ChangeLog file. Added shell script install.sh
+ installation wrapper, which will attempt to install any missing
+ perl modules, move old psmon versions out of the way and symlink
+ appropriately, install man pages etc etc
+
+2003-01-24 18:31 nicolaw
+
+ * psmon (1.13): Added the --dryrun command line option, so that
+ actual killing and spawning of processes can be disabled, but all
+ the other motions and alerts will happen. This is useful for
+ testing a new config file before using it in a live environment.
+
+2003-01-24 18:21 nicolaw
+
+ * psmon (1.12): Fixed =head2 pod syntax error
+
+2003-01-24 18:18 nicolaw
+
+ * psmon (1.11): Added some more docs
+
+2003-01-24 18:06 nicolaw
+
+ * psmon (1.10), psmon.conf (1.8): Added small docs for the pctcpu
+ config scope directive
+
+2003-01-24 17:58 nicolaw
+
+ * psmon (1.9), psmon.conf (1.7): Added more documentation
+
+2003-01-24 17:45 nicolaw
+
+ * psmon (1.8), psmon.conf (1.6): Fixed lots of variable references
+ to they they will now run with warnings enabled under Perl 5.8.x.
+ Also catches smtp failures and logs as such to syslog.
+
+2003-01-24 16:57 nicolaw
+
+ * psmon (1.7): Typo of $revision instead of $1 in display_version()
+
+2003-01-24 16:56 nicolaw
+
+ * psmon (1.6): Split sparse first line version information and then
+ detailed second line version information, plus author, copyright
+ and GPL license notice.
+
+2003-01-24 16:47 nicolaw
+
+ * psmon (1.5): Added --version command line option to print full
+ version information
+
+2003-01-23 17:00 nicolaw
+
+ * psmon (1.4): next part major update
+
+2003-01-13 11:20 nicolaw
+
+ * psmon.conf (1.2): changed notification email address
+
+2003-01-06 12:23 nicolaw
+
+ * psmon (1.2): Added POD documentation
+
+2002-11-23 16:24 tag start
+
+2002-11-23 16:24 nicolaw
+
+ * psmon (1.1), psmon.conf (1.1): Initial revision
+
+2002-11-23 16:24 nicolaw
+
+ * psmon (1.1.1.1), psmon.conf (1.1.1.1) (utags: start): Imported
+ sources for module psmon
+
diff --git a/psmon-1.0.4/Config-General-2.15.tar.gz b/psmon-1.0.4/Config-General-2.15.tar.gz
deleted file mode 100644
index cc9b7e65108c37f9f6daebc40df39578231351b0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 32447
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%0Dld2<+;?Q$#<YmqQ)+V=jMYh{C
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%0ALM7Y+ObxDUbO7<^X<xR?@(;Yf+e4$YRTuu
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%0D#cG(a7><rW)O0Y
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
K8~_9m!2bYNvMulc
diff --git a/psmon-1.0.4/Getopt-Long-2.32.tar.gz b/psmon-1.0.4/Getopt-Long-2.32.tar.gz
deleted file mode 100644
index 1562f8c4318bc6ebceac41fa1a2695a93ff2009a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 29823
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
diff --git a/psmon-1.29/INSTALL b/psmon-1.29/INSTALL
new file mode 100644
index 0000000..b7bd362
--- /dev/null
+++ b/psmon-1.29/INSTALL
@@ -0,0 +1,18 @@
+$ tar -zxvf psmon-1.nn.tar.gz
+$ cd psmon-1.nn
+$ su
+Password:
+$ support/install.sh
+$ vi /etc/psmon.conf
+
+-or-
+
+$ tar -zxvf psmon-1.nn.tar.gz
+$ cd psmon-1.nn
+$ perl Makefile.PL
+$ make
+$ su
+Password:
+$ make install
+$ vi /etc/psmon.conf
+
diff --git a/psmon-1.29/MANIFEST b/psmon-1.29/MANIFEST
new file mode 100644
index 0000000..4c3144f
--- /dev/null
+++ b/psmon-1.29/MANIFEST
@@ -0,0 +1,15 @@
+author.jpg
+COPYING
+Changes
+Makefile.PL
+bin/psmon
+bin/psmon-config
+etc/psmon.conf
+README
+INSTALL
+MANIFEST
+support/perldoc.css
+support/install.sh
+support/psmon.html
+TODO
+META.yml
diff --git a/psmon-1.29/META.yml b/psmon-1.29/META.yml
new file mode 100644
index 0000000..3cea2ce
--- /dev/null
+++ b/psmon-1.29/META.yml
@@ -0,0 +1,16 @@
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#
+name: psmon
+version: 1.29
+version_from: bin/psmon
+installdirs: site
+requires:
+ Config::General: 0
+ Getopt::Long: 0
+ Net::SMTP: 0
+ POSIX: 0
+ Proc::ProcessTable: 0
+ Unix::Syslog: 0
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.25
diff --git a/psmon-1.29/Makefile.PL b/psmon-1.29/Makefile.PL
new file mode 100644
index 0000000..653bfa1
--- /dev/null
+++ b/psmon-1.29/Makefile.PL
@@ -0,0 +1,59 @@
+############################################################
+# $Id: Makefile.PL,v 1.8 2005/03/02 11:48:42 nicolaw Exp $
+# psmon - Process Table Monitor Script
+# Copyright: (c)2002,2003,2004 Nicola Worthington. All rights reserved.
+############################################################
+# This file is part of psmon.
+#
+# psmon is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# psmon is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with psmon; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+############################################################
+
+require 5.005;
+use strict;
+use ExtUtils::MakeMaker qw(WriteMakefile);
+
+WriteMakefile(
+ NAME => 'psmon',
+ VERSION_FROM => 'bin/psmon',
+ AUTHOR => 'Nicola Worthington <nicolaworthington@msn.com>',
+ ABSTRACT_FROM => 'bin/psmon',
+ EXE_FILES => [ ('bin/psmon','bin/psmon-config') ],
+
+ dist => {
+ 'COMPRESS' => 'gzip -9f',
+ 'SUFFIX' => 'gz',
+ 'ZIP' => '/usr/bin/zip',
+ 'ZIPFLAGS' => '-rl',
+ },
+
+ PREREQ_PM => {
+ 'Getopt::Long' => 0,
+ 'Config::General' => 0,
+ 'POSIX' => 0,
+ 'Proc::ProcessTable' => 0,
+ 'Net::SMTP' => 0,
+ 'Unix::Syslog' => 0,
+ },
+);
+
+#sub MY::postamble {
+# my $postamble = <<END;
+#psmon-config:
+# \$(INST_SCRIPT)/psmon-config
+#END
+# return $postamble;
+#}
+
+
diff --git a/psmon-1.0.4/Proc-ProcessTable-0.38.tar.gz b/psmon-1.0.4/Proc-ProcessTable-0.38.tar.gz
deleted file mode 100644
index 2532192f138d7401f3ba9171ffbc09a8e7672d76..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 48137
zcmV(;K-<3`iwFp|YVkb)15k2rV=Yi}Z)0V1b5vnsY-KGlE;BeTbYXG;>^=K;+D5ba
z)%q*;;@o3sLA;@{Kj(|<N9t22_!zs7b8{~h(gLa_t*VtEeEo9&_B%7X0)a7h5|=i&
zY)@m@$L#F9c6N3oE+b)=F5w?8<+auKc&TF6zbQX^%2KH`D(z+y{!&@~t3J1z?MAKD
zthHLtD%E<URe8pmPm0AoC6TceG4?DHB3{?;q4qDdT(0K-W#{Vp{O#+fnWIvzR9cM&
z@w?q>F8qbkYB$=z|5~k8Yqnc;_*`w)o7HEm@-)-0FDd_R-@dh`_xF3K{R=Ic(ffvR
z<atcUk_@@+4qThr!r?69(sj6GZorP26iH-rW(5u#am(Qm8@Qfoj7J;>8#3uTZp7_a
zL{pPpL!};r9oaxc%wnMx#jc%rKy?9QCG*_imOCsKEZ6CpcFxf7Vi9_L%sn;($;5zK
z99PDX+fQOw1gt+*sKO|VjocuXG+WV_j9h!fYzyi=DVXFjpgv_`#6u<TfX>P3+4<Yk
zE(<t!00)4TMbH@YNa7rNUJ>%hirrwy<W$Do$2o0Fa%xml``jK`fh&FH2rh%Y*ce%3
zTz|kB4@5E?v0-Ed2;Gf=M(2#$VL6HfKx}uY)_-()P9%#*t~7k%BtSw-GU@uEHzh8F
zB8ow0r&t{dDP7QC0O@ec^QJ}3lo>}2B9k16#DkT>C+-bOwg_SikaGwipfPrFFiRvy
zYrqDP@QG}m6$}$=$W4%xU_nqcYDhwfOF;a%&x4r76Tt>aU?ZO-o4D}^agy8s2E-zs
zhFtD5!vKm!U$IWN=LT*J)4TuT`NDxQ7OsP}Lmu~VnN(>kbz{I1Ad)W$NfGc;?D{AS
zx{F0Jf|SUjX&|LVk;w!k1Zm1+V(ZWoeamBGU=B_wi$oO^A$!E_TVe-~A`t;C1IJbC
z%5!sQA|AdgCDj0Q%SH)fWrvT;w?6latc+3zSR_Hr9fQZVSpZ%Qm>UDrV-Rpy0vlK{
z%uiFW*%U?Wqxlx`IEg@_jZlERfePYW3~U&PEHMuL5w-<WXeg*D!LZ1bHh{W?mXy$n
zR1wA{kGws}>_}L*K+Kd`ChGvnqKPZ{s>vD1ug5e7<|0dQ3dDq_uwgjp6p|nJnEn0i
zPP4xs@Ci)n^LQj2lUO_Bbq35D09q_G2wadGql$vukC8SoOzS$Mt|mJ}4no^BZ742@
z81rFAFmP%bo>GLNI7nD$EP6OHU&xTu;R8}3H!!mJneU~^?hXWMb3hT<4FoV&txJDn
zqW>!hhPDFpwd7|ihI$Ktz{to^frQm^KnsCoAQw2qiXsc?XT^x9Vj$6U<-D2(<_e@?
z21O770yY7WnkzBtFe&TuD5cn_o>p9B^bNkc+;f2JrfC)o1NVrW>X8FvhY1-DSCUYp
z<SN{?nUWe9)5ZtPGu9Z~0!C;ft>ByN2<!oUo~=F*xB~!}Vn#cWCtwvydk3DdV#Rwj
zjW8X^NUW`*));G!6tMNj5f1<&*b2{e4EQ(UY+@nHv^`b39br(^lq1xU43>?mOClb+
zG3kwxUeI_{UWM{(HB5n@n{L=5M5I*Xu3YMkZ{mUo1Ib_=xawRIfSBeqDD1CxEf5?n
zUoa!h28#o(80m(xg5*}j!C}bBoL(ex*2r}izM}-rQ8jX|YDMZBx%2s#rEZ>TA>QOJ
z=3kck{h*q_?0QUsx`I2QmX`P2TabH@^#PAKm>@EdfzkvmaY{y(<ZZ#Cdf;N9L{U#8
zuzW6+LzC_e^TE`0CZJ19gHdmVW~ia3Rr~=WF0M&QpNx@j<P-o(o@Miq@EnEKE$5+u
z6X2BOcgbmBgXKJr*(8;Xz*S530UbmMTri&`TEZZp$29fVG&ZSCF!JG|)v;pbWN`_W
z1$GE*S#p5n0dtkNL9-Y>>;pb*VCZY5#FKN>WD=swk}3x}oXY?~deKdo0J+diGlBaM
zV621?4KeTvoRdM~k#2HJPI0wE3p;{+pYsbAz&vP=Gm0}K1K1<n_f-Q@Lk%I3Qe-f2
zQ$;9H3&OSFVqIRG9(7NF#J9@#>st~WA;oq*w>0K+We2BjkdTUvv~3WO+|}vP$(vIX
z{Ndz%PPxpmqug<LrBKQ$?Z^#dsT6%8qT749WHJ(aIpaBr7s&-_wS@u~I56=L^g52G
zLE`W1ptQqh*xkk`Qc%}N3X|bOpESFn6pfvoB}<g?%s_#~Z4%DhcMT8-#b6xmS}X@s
zK|@Yc5jD~Qms}~GZ-pVQ2LZ%W7?S}(?v_H1P;$TtMAk36fZ!H_rVvwicG3-&zM>Z%
zlDR-oGbcyyKcLhxoOW<-M3#&jc#bYv7ChlVC*TxTGc7WJ!d|R(7{+7-!RK%|0HB&v
zo$j7gJ_#|s2#A1e!;oB*1i2#1Ne@&WKO_^&jq$_3gx`00j)Xra;f$1nRdqRtkC5dH
zgaSt>rC$N#?=AEcOymCZ-#zDlRr54)ppTFLG%M}aHvY4T@&NzefQ3UtWL{o;`Wz3$
ze=7Ahd~P+HtxCIHtt0>2tyXOt|Jg(VbHh&G$2Z`0$o+j}H~t?T7`qIOis$yrX>)nj
zYKA^p7&y0D(150KBqntB4+h}$fN6yBXdKZk;usgvrazUZnNL26+!%V8#*grUr_FhT
zLD_qI^yYML=kO)lTXRU-E2_>voL+U$J8yeuSDiO|EFA<L0NcGH+r=0RY<<slKcjGP
zzg7JEln3;GPQuTaW4-=YtF0>Pf4f<4S8I)?*8loe|2I)W3zjup9bM7i4h#dW1iC|Z
zd_bS!5G2`elYFX7?A3Yqh`l=f3B$?h-(Kf?_WbDPx^vMvI>FFg#D7cN2<;7>0>H?m
zHAhJ-E(C^@p&P+EMDS_HOnU(>(>Xe|Xl^)lP^Vdn76Dr16T-4Mo{r(jYb9Q+4q^M?
zm{AZw4Ff>Rf1LLt=UgP<urrDg4TZp{mnAVIc7vvJwleJ&ngHcQLDhj-jT4@3rXqpk
zMAG;0aFE79%PLqU%jg!y78pm<NGV6FHg?c9%}9I5_9|wjwg;4fxh^B_At4+c^OArg
zgOd;Vc*vMzD+(2h&Rk^Sx0d9%NEj@WK1;d5eg~WBPuX*f0mBS(<PLzfst!XsPzMfi
zp4tm!UojwwQ9_negXZxRbzIEha1DVx`@=c&u}N3{FOy~StNn8MU}tBSWGV#GzyY%K
zTLRAd0K?!&KcJL?mjoV#y!d-M^U~y{m%kIZ53E2dVJT|I7CPQK_WBF;*-H-;0kb^|
zs%d?M?FTi3J7D=&y%dsm|Ci>;kmv*B9?*A9Zw31Uu<H{G@cDZ<)E%&2F(P2WCJE;s
zyl&9}k3Gq5@zAGZM83c{#HY`Ol0opaR4BF=VO8!hu)G4S{#6ebrB<7#&UxKhOcx)z
zPJw~oe%`uY^SDemHMY8;Nsr{N!21#vj?-tiVI<&831jjU(1jx@9IS{pAe)+ULk<Uh
zI55-kR$uUdEkPA3d@`E5sEFVBzHgdzJeBC@U>qUQS3wk%nqPcicmkFLaz<t%reKf0
zl~Bq<ESN2FnGI>foDuFIp9Y=tndX8LN}yj_m#<{`lZACaT@ldmzV0yJ;d}%@XW&Ks
zoY=Pq*)i!wSN7m+#fc>NY^EA%chsdBOohY;t&2;_G#f!OMHCuF;a%!L<$aW)rVLf!
zdw!7|*kh3ti+wZ=aAH_L*m`hRMG9+qiBP4MH$*GEZfV$)mIab@6oys=3JiOPzJ^4R
z_l46#IiiK1oOZ9TIzO}DKhOXz!Pzaq8sI*8XeY6{v%=`2R+RY_3W~lAJvYXtVPyHH
zVN?%{UhnknNv~%Zhj^`9W$1PrYwsmW3@?t@V!%+&0CazT+qvwXcMStsO?^r)$!NSl
zV$bVla#vk$KrS>Z6{<~KM+uE?gzr!d$~T)3=yQB^etC_4y>YE$Qz(c)JALm5Tmt}O
z*Ws+wnPEPQai*IF-X`2#xw+0iN|%o`r=VXPB{s(O)V(#Z707>g`~k8g;%XyhvvDxL
zVrvmh1m5SRhH$>xH>cO%bxwe~hjh!;fDbO-Mk9qW7KFzfSUj2M^d3krINee}O}T{n
z7(A1^yNiL4z_h_>OzIdH!OGJf4&79^tw2{I!7LJPvMUmEsoM=W^rbQ=H4HGqW{Pjh
zeZyF``Uhw%_4OacOYzFl=iq?OCMzQExQ_u)3fjSNBePK0B4-9F)&Wz66<BH9DD*!1
zk8fXQ%%w5E08N*Yy?0By%~ya%z~~}XkQ99}=65dZXq%diprAL!w6*e*7^Ak5`^YmJ
zAK?s!BXaqeFMym!=4m#%Pr$`bN$rtIj>(RbNL!V8*j-)RfKvq;m6n_H6E<fQG!8S3
zua_HnW+)#FK)zi-ZV?8XmwZ=Xrh_C|Mn{qlSB-!D=<#6&xwQNF2{vR}ls#Q+mzj16
zEe=$(`%C`(>innqtZ4t2W+lEN;0(t28H3F<qaDs^b$ofl7S;%Ci;{q1!O(xjjH&Rl
z%;yD8s4%?(k70T(-3xsNo;6I7Q=b=_eGJ#csu@0`{^MDYjzU>3q%@)M@(e{gGu$4z
z;Qy?Ju{7GZex1*4{rb^!&xh-|*TGmColuU5D&VuxX3Ob@faR;@YNbMSk{mNIWMO%<
z%#6O}QNX>-_=hpiOs+6b?isjpv|Ju7KVo#YE3NzMG?8f~5S%a5ps~F(P6G~rUUvZp
zRv<JXDY0tju1edP(W~ajf?z95!f#m|6F>1RvMHc`E0?vXXA)CZbQ!x*42Mv#%swWY
zQB%G@#S2h$;WCCvrNx1X!A)za-vkrDbU({+BJvPmH&f;~T@)plpoY?xstN^0@jD3_
z5KGsq&q_Q~Ld@@<cqr@<nG8F|HB*7z&BocVB0&#O^-paVLFA5_C+72cFmonrApj;&
zV-cnz&(6*c35ZYkh6Do7@!-h#K02UOxoof;KGv|Tc$8^{jTrCs0Gv0chqOl=TsJh4
z>g1jw)e2tHC0O<zRY)9=TTD`1xJgxhHh67GSc*l-!R2SJn(^B7uy5J7GtcYj20X7T
z!#FY74TvB(Ax?sSUrj{hIi`#q6V^ZXgHKP{(M7kj%9%Dpzer9<zFI)<0PMn_5s$tn
z{!7V>Pn8A!@%Mj?R;9VU|Jy`a%YQkJnr7&I?i>%@|20uI+O<XtxDNk8|5mF}*~b4j
zQFhreWwxdX9XEmd{zp7Tv?)gpPc)|SOM;g47mVJP(+*|!?|*|e1#|lr!@!wCM)!xS
z=DQ$wfT4=>fr8xWvNV@kcT^{<fKPN{ELmyV8;cZ2bK`VgRvN3R|0n-n@0@q$e}7$g
zUOq5XU^vg7SJ}%$Kv#!(2&J1~jt)%ygPM9D`VwLoPMZ3dcTQOo>5@zv6D%kPeYUt`
z3hZIrj=C@O#)BnP-~a-fMt4+FIYxqVrIX(GZ%*IbbWg8xf64pCwfZ0MxG$a0wg3<5
zf3;Ro_kYk0b^*Nqt5q9Y{oh2%>cLwcf7?BIoED^gmv!LJUeC6CTv@CCqcC~Df&IS<
z%3f);>h)H$S;Jg_YO7t_-v4i;WcB~M%bTAbr~RtuR`<XBvR41?>2Tr(o7w-{%~q{h
ztvBjb+W%|qt^RMKWc6RO`%xAk?Yp%BUv^om|Cal{*XY$h*8pVoe^vaaiax)J|I{1R
z8t(t~W^2Rx|2K{QWc44}O^F@CmXEUnizAk8!R$bMasF*r9fv*P_^jmFgW=Xz{3Xiz
z_@BCIc}o3XvH!!i-%R)aYNJj0zm3}V{J)Ws)qj1l_Bhp_b-ttZyX-p`licuuboKCK
zKE&tnFiS4Nj2MOw=nrNg$4MlD;eQnN4b1;LQcpsa=poMK$RIsn3z8WLC$ZDikn}pR
zX10n{15na?uIzJz*4T1A^=Ns(Ldg?Hl+@J_J{cRORq4wnTrPEju#<f%khu=sB@t?v
z7R1M{NGJyd5SSrDcWxE{7+GKe`xd_7!WDMx!DnnzE5jQupD#ios^q&#(CHSLZ%zC7
zD20#jDd1M*xqzq+q|&XTp6{Q9l}o1QkppiE5az3oM-jb-BJ*kj^+2jl#&#HPb!k3S
zJ|rGV9w)8?Z~!XdRw}V+V&4`_c0^CgN1W^BP##n^=LECSvb0A=0i-^rS*K5EVk~$C
zeH0Kv06$9gj*LEMLqSi`O)SjC`Mfam0j7|O^mPZbOmKXdg%HAFvq*H5Mxx(2U%xZq
zpF;V-z|296LbImXOvBK3W5LTcCd;wX$>mk&xOdi7LFrw36j0@xOLnfGBP8*}OmPP|
z#r69_Ku|EDPz=;_H6R5;^_CR?!h^93Iz<mBtE>;8x`^~c#J2E5^=RqR$m}>{w^}LJ
zzA4whJn!SPK%<!fz$@?L<BPMS*Ii1%_d|S-N!o*Q)*|i;m9m5hu@k|-%JhYYa^~SB
zG*m}pN_|1HOOq)0OF5BIx$g#L@F;8%4A{k4w|9JY0TU^zmri;YM^~?beix^`Zs+Fe
z_!KDEqpzK_v+n72@7we1?qRD@UgE;B0z+&#2GH*CciSe?d^otLBPObU#DryJ;Gb>G
zKcPJ2|35+a@8R=*vxd+AwX3ami(-M*R&%@mZ>B8y|BrV2x8DB$kMiL8{|OQRKH>ad
ztv9#l|4o$b`Ty@-9?Jh|Y&!p^wax$8WZCBbZ1aEa)qe`bJnjC!`u@L#{(qy<hJILI
zZC5MX_rGqWWc46@d(b14KzH5V{(b3Xt^T{wlLP=B(*IViiur%FX0_62RO^)gQ`w&X
zH&U|tj}KEkPW@F+)c$PP{|}GC?ye2P?k>k+cUK2ubJ?itE`?psG3bhKF&v4IV~}-1
zk=G%{nx`Ug7(Hk5;>8OS{$CjkF1$1I8jrg($}j?b8sN+bsHb1;aaei(pOw0U{{zvV
zSBuYU8#keA^}jD2cVqc~`2HWLuG9G+4gg#I-$cpkKe78!`mcI!cmFTHtkr*q+dUx%
zfAIZ3=)Zpd7l!>P{@1S8xA}h?DOvqL;dZBc_BacW_FeD+{_MqU%SV^B`ag&`e}V^q
z9?t*8`#<Q>0Jp!^CjD=2-~YLhlGXn+VE3aR0Gf5)dI4W@Ss(vT0`b||e~-|A`u(SR
zz1nKD>U9<Wt8SnF*+^N)|HH(tM`r)2uJ=X2GZ%ihV}END{<`H6`Tw;)CI5eW|G$y4
zz5oAvmwWVIJlV@%o_*5$U+DgC`~H_dzTD4$^^EUR%<;hc-z#-|<^!MqXu&D4Lcjls
z-M9YV21@xWgMG!0ML3Pz;V5Q#yTGb1UVMY^EPaE|U|b1&t>BR5S)@L_8c5F!gk_mS
zF=hoEPH$YL6ms91VtW4UEnD2tPgl@eMDf-n=Jb<5lHMR|!sr<Q`W++KO8WGZmXt_N
zziOlapg5MQ70gQUEc)3&HT0WutyO;Uf*s+n1+m;9ediax^LwCvMRE4SSM<Dydiy5+
z@(wGp^hI6@SlKXk-N5z|hqHgk*zw%HIeM9`o62%%;fr(cR^!{#u-e#F?;mEp%kK5j
zb*sV3Ur}EFi8Xc|_F9PlWAEv|)3}xW8U6}|bK>qg#0LD;ggCv_#xb`T`vGp8=j*d)
z4U5?Z*uA?8*iHSvzxj~%i?t!`ZQkv@a9T$zjYiT)8jVKMOdpEg-+g^+2h=K2E^n34
zB3f_ARgn3Ayli*6VyA@pPn|i?7QL5ZF@jCShL)w#dMng{Y|0@9>mCR+5x>tTUzMFC
zp$AxWX|#F5?%xhYzA#GteE82-fpjAMI-O4VPhkNwm3n;xxWD8JQ@dX%<_oU;NB-MK
z>v|XnRKQmObaX~3WC#<)6`&KezJSI$3593lKWKvw|LwU`{D-V95}qhvdI1LTL4b@1
zD1}V<F)F7=WdIs!@QyOjU@HP;6t12N&HL=ff`Jp5BLem*nyvI<$O~KI%eGI^cpf)|
zDFm(Yhhqgc4ntEFupJeeg#?;~G@JQRC_*!f@XSI)vj`Je@njpCT$d^N-^0p~k<IL+
zi9a{p#Yi&xyNJiX^Ln$4Sbx%AEc4!D()mm!vJ2=sBfIxN-H%irSp(`quWx(NNa!WL
z0+<%j*AUp9<p%>oX~_;i>$FVP-jL~RdA)}oOra<vpIfJ6$#tMNb%S(*#5kJcfX+Xr
z=Rk)%hVdMLag^}+rF?*)lds70SKJvG@v?#-w3%LX=}KI}RYB{r*;Ka4vs~=Paxj-c
zmSeC<cMM(=Te_*{*=RaCPb{MO`$<rZV*2;co)Sk;J8!3h!F6SC|E5ZvD<5)6&yp|E
zN@eIwm8{|;^CzF2Tg1>14?iB#G%5?w6DL%=56wkmj5vaw0fw(jH+qpdXc4QU>*BpA
z>3L;1@=F-PHA1tgy22LkWK)Fw>Qw}t%t55#6MYTa1^w`H0KI|5+BaKBE@_H$Q<T|+
zdF+?w$0w2#GcznEV1>|d8t8G<FjAKTxhny!1VzkbIash7n7<krvi2vS(C1>`nrZQ}
zL8O2{-yrss=!hr@nVP-=QDE^{0m`$N1L4B6916zC3Z0JY%L>$86$}=<<zToRrlBOe
zN+JtxmLsF3bQQwVLYoGR(`&piXrE8bB6+kjqqXOib9^1@6)5a4pd^N}G^4lTJn}QR
zMSNJHys-inmK~M@j#q@6t_H>;$#S^aip*!WA}^b*NZr}Wgqf{Mnc0e@nXO8jm@u~j
za3tQXz@t&%TLp|oz!gd-p>QQQ5EEBv4GNAc4DVHz!I;pw!eXdI(ljW@cfTWMv4Bu`
zT@GrkBru@hyUK*@4gahrtyBS$qEiCZWBA2lCxVj@_qr@=4biVeIm-2@#NV|B`WgM7
zvhelC%UGiS+biuHr0l=#@9eJce|?i5?8fr>T&-`q<d)rY#xQ}ldOg(t{av)3TgwYX
z+k6o3e(^l>;cxVJ%kl2s=V@C;z!Zvfh~+nL_KW!Ufc}0@f8P{E1$vwQmg#Rrw4umT
z-261ii+!X<wAon%S~xl4VJK65XAsOy_L^kEUQHH>wqQ_I2<#a>NyL?otZ!uZvw23Q
zz_x_AP=;wHK3z8-N>dnxqfZ|`Hd;oraa3=0>f}&6FWud4Eh-9aC#evGLi*0!Pezgl
z@<a@5UL7|`#!V+Sx)Dg~7c*3m?mP|j5YE|Tv7@0ia(61J?7r#RtgcjXF%y8pLOzdf
z68qLb{CIxe6dDktcF_=<_15JX-kz^_I%ns{m(6-dM`yjKwbpU7E{2km6q(U(Z%fB}
zDKAu*fpfzadE^ey$VFF?GMG5P*rij?vZdoA>BEbWVfN#X=j~(ByDcUb49HH-IHa>-
zLIuFh3kDy#z1tRhSYu#WgnXS4`p+R(9-(V{bjBGHgAs+)_)zb1JJ2Kux=qU@My$E2
zsZ^_Or`v`~`GJSdI$I|1-MENJ2O5$nT4D{$K5Ex%-FgQ;I;ZDdon0n#=KlNyZJQKh
zQNeJhBJ0yQCcM!8kM`uvUgW6oi7uDj{jt{kNtU7-*qNBFKXjy+)4Y(7^;Wn2X{Q2B
zbCXSw3ME!gn<K+TV@0V?0ACzqV*F5t{*et}8v51z0{H>%gB5VPqG|oUnorUSppHBX
zHnLsEk&{EUq?(Vl7T{!wJCzgL^Pf&_K^r2?9;v`4Hf(zBiQ!qqSq{ZXt=XwZKty9n
z;{J3zevos6hq^ER<7ZVKHELlsuS=)`)no&7u^FL7!7cU)VCBdeDTW_IqH>KSRWn8c
zjP`%o1eGmNxT;}_OYRCa`p^|ZOioP?>^4%P4gvh>At|)(=}zUSW8m<WD2jsBis-ub
z#ZZsycT0qltdsTU$VBk{5$Q#RhOuG3^x)QpMX^B;jIZxVf!UThw-P)A{bHgpp3i;B
z=V0|8Ilgtu!%`bUAvw|?_uK~%;}aC*y7|A>@2O)LH0sRUV_e&tnqwkXNo>bLsc|yE
zuz;DES2Iy)++pV(`TVNUIyo1PZ^*Z526La-P#{W<tub1>(l%0%&;?52oJK<RNX0>C
zK*1c*fbUe#Bq~MuVf0Gy`u$?*I@Jw(X0e=$kr|+7z0t=$0=&jWv(`O1Z=V@3Gj=LQ
zs~gwy^Y}yW+D-e`Gd<|A0!s(|(Wnq^w$xC|MFi%AEY^(UKSNT$Mj>ELy2ZlYEG*`Z
z3e9Bah<tJ3&BUFNyOwHFX7zvjO}xk~JEQ&4(3QJNCTN(Mho@HfsorkYn;?fBH=A6C
zXXZRKF}1#DHSekH3Vm{dBhvU<o`o@)V*wA%!LP!DISLW4dZx)t^Hh~nk%%pW+dVM^
zGnQ3uPxhe7TrZwlY54RmPpWi-U9+XcnoaU$$2<oC3_P}nVkr9c`zU8M0>E@ehR1Y7
zws?7@-@o3arSi*n|0sP&*6S!~;><CD$N}7TLX4Ns1Edo_ZNm?A@k;E%c5F|gX8sI$
zBOr!}_=^^Z*8+3C6Ix{#B#WK>Qb|vA0+$2X4s=;QR&yU~iIt={3F>o$AER3iC$*#Q
zd0S|u`|_LqZ5bB$y&cOuD3_r9AyBJx0qn7Ugy(7WYc@fE#d|B08E#Nb6lGyarFwvr
zQ@Ct3t_t#ek@jnJoNO4dlfqjP`M@zG$u;C4-3G{xn{ME7cLC-a?*j>;ofc)F78B)y
z?-vtBhA8is%FGY^U^*C}wa*DkXLCnT$*?=^`&$fAQ@y=_H|g9@Vt#W_f{iMlf)Xyz
z8dp`A{t!ph!f#zbLtek{&re}%e2kL~8}aU)*r{OOYTA@^vQ}T0a7|~fz-V0Di`R#;
zU#eo^2gFHJ;?@f0mNg+NkiAc=G*%h=eGIj`7cUbvRQ)Me?6G(SEeJb#TU2B{whu+T
zT?(SQq&_xzAtz#TE$*p+7$yx1-4>~O&=9?+;fW{X`P9ic4vq9ACqLgP@Uv5D!5e7I
zhUo_Ge0=fGsRhgGp*Z?zz`}KbYrJtH&*5qI_J#_LE71^pp(Ac9{C4rW$@N+7%DAX?
zPj3>k%J>?m#!U!IPt>o=mG7gdO}^z*RStj;@$L`?G@iB^wpmv#pbHJ;^cia1JU{x$
zpn4Z+3P$WfHf^zOVq-(RNbQ1{Yh+M^(9uae3(w)=3K2NC(^Su>C1EX+@ckR2Zq=^<
z_pu&niy5`cZru|C5YrhiD2qZ|I6zolJ`9G~5P;I?bk8p?>c=1pL>cjt25fS}?AFM)
zp2N}YermK57=qxzo_tOI^UHL8XBrgb#f&E#pkeO+JwN-gQ3pcdNByeNh1NvZ9n`u&
z;|&(`cff^FNANxpof6fHZ3B3q`6Scxa4kj4KrWmfFf(Tc-hgm?``#dDpt7!aTqfm}
zy9gAMp+-Y5tP!HqVOiQG0IY^D-g6!tb_i|4^dGyB0QKLp?yZ83gS4b$2H>WCRH?^w
zlb#&Xs*!R7NQH;1M=vM}3;zEM|4#!-Q(HqQ>)f>_Qa%ZVC*yxE>+MelqHmwo(04s{
zh)nzW%s@A$MZ|-yR#|;e#Ni7PzTAZM^^gE0nqxD7w7`0%7Ntyhz{he#88U??6yAp8
zaATtl$2x4dCb~pE;kl_$Or92$B_`;8*_lP57?(np9%h@Ho4~d{gETS`5H3WGlM*H#
zQP^Wy%MB#>22y+jNxm@+6kazjT%kY}t@V(Ju`X^`AM@e(k6-mscc4t)pTlC}&a3%Y
zDhWvLoLQ+mCuR!8E9)ok4+U@`ko#**=AO#(hXK2=9~)iq1J`)*2S@-JNHlL{P}h^!
zkreT!a=y%A_RI}AYa%cl)X99(6p6}McsVT;MI;iWD)hCj$vs*9`0-ml_xwDA9?0c*
zwL;Ej<Ijix3fNCPQL`W#5(4n2Z&|4euJV=@o_XZHs%eW&Dl!T;3dMqVVK6rLD2B++
zNzo{k5k27H6eMPy&*^foJwCrWU$&z4Stsd*?gHl1cL9NBi)u*~Lqb3<aY^uTeL(sj
z|66+gJN)BiEPemGzq5G$`>p-|{Fk2pK7AoSCvW8E<dyuKx|0uqI~jlhqT=LTcnGQc
z^tte6K1b4>`p5ONzkjRW)AK(x@bHJrSTg_j_b_}=t^fnruh9Fi{mQ}G{_i*WC6E7A
zpX2%e_NMq?&n#4>&;~7VAVlW-wy&<Pw&jZe(vp#j7vVZ2l`tSZ2?mgSC_@(!cEk_C
zSg79I&MWa+LT{oRZKyAepC?iAMX><tdOq3w#Vy#T7`Rd=p$Tn(N`rv|doE38E_el@
z>*B>Bi8ez2B1o_r_&swn0C<oHQFJZ5^u^15{J$dp^;IDL*N?*#U*ZcDM6m(Y0!a=p
z){0mJ%7%$=78axLyX3c@f)D!E4DV-VMB0-?B)K(7#K`;JsR+o}i$}^k=BbD@lvF9F
zV+brBEAM+p5qu9Z`u5V_DFRrj?>o<#x;{n7y~Lo0n>gq^`OUJchQk6QP-w=jLj3hh
zq*i}K=@y3gnfV!=6?w|pl<kW#ULKT=iz4}1_zvtQ??%ooNZm8j^KtlQzPb4lYV~fX
zgX?msvU^h%D()8Jb}Aerhcpi7fiL`lFV*MalDsJ<yn(?@4p$KNZOWNap(+PFBhVNE
zwsRYRiu4_?%gQXa6znBBra(URC@A|u5avH_v|;ZH8T+<ZjVg}5vL->8Lb_0#jbd})
zMp{dlfY@l<`Wt7pD?X#xrZ<S`*D$QDP0e(i=#pHKtir1O>l33{>vT^V_2#j7B`T4!
zQ$5qWuC+hNQl)~`vmMV49wKfbYY!wwjsYP>NS$aX8AgnXA@!gU4d8gFSW{lLOv&Pu
zJ1(FPx)Ku_2tt-;_jGwRZ98f%9d$?bK;Gq9W*;jeqY|8pw}epiIX;paInHNvqZLGV
z=LW(KzVjsy7Iwc1i6)*l6sdNsEcdx=HGaIn`5aaNHm!!#4wTB3o!!0tgYVxI7KlNW
z_|@_p;Y?MBD6C3Bp{a+a$86A*KlM<FqTW%-L4x`SA6cm!?b`*uE)cI(lzE$$3qEmy
zI?#1N&PMiK8^>yq3M<8j`5JPR*!exNj8H*A+QUE-QI#Z`g3#m2;lxT60we0Mw@8se
zw}Gnp9INH&Xsm*Y`dr_cqDM4lvjYX;FGBc9h(&-j2H@^#49M_9h)od8Vd<!H<ycC`
z-M_2~Dh)k<YbsCm!Z0%VZFvF*dHn>mAA|NYpd~Ost5ROY8YU|k;=;?HucB}g7l6xQ
z!)um&e<$&xGEb%Z@pOMNJ)WGE8`sS+H`S1|Bup{9wWA)RK}Dk#I{LCFh>xj_2h!FI
zN3h2Ei=tyRPL5972!kU^!KuL$<}3X01M2m2%LjaKOk58~d@g%#Ety@ICXp1lUK#Qf
zV_OudP+Jc(%0SD>fz;kY_B*=JFhHiJDZU)eJsgmFQAjooLZZuWHId7(nwT-#RsIAH
z5`V6V1<_;8FG_QXMTXqpzCm)LreEmESn-|sPNIC2nsb#5IKx8=I$pGpm7Ctf4@6gl
z4eP>-(9v1zxY=mcZ%Exda^{w&Ehe(+nM#YxE~K#B-sYG5a&^k*EYF)bQr)g%rJh-S
zX&3Frxe?w7!%@etBWN(aAOxh(4QqlK+Kuj~%xZ>-G{n;iRAn(BkB1TJtty7GSSib?
zue<n{oA^k6B>?^S2Me+EspL`!`cW_nA-Iw@35JDTnPMfXW+h7G*KZj(c;ba&dXR|W
zaPZ1Zs;}T9TpHBl68@jMIlhwryJ=OI@Bja}0&toC-~GMP!v244|NGnglJ5uTy28pP
zPiUjG7_AJUq);!se!y7I@<Dj)rBZrWk7N{YHIi|};TB#>q~Bs>+HnD)d~!$6AJUtR
zX!i!(0WVt|ou4)9tykq}2f<e~C>RglMPWY*DzPB>ZBN3T3bDG#Hp11_70auH2bozl
z{(+KEc;!Uh9t%I>seU}wkEc?x#O|Ib)|y83_u}DL6Ro@0O%>jpFJMEn6!7&CT|cnJ
z2RujR>p4Bsr5&JsH*q`=2WT~-81x;DCLn}!`-{bDB1Y0PC*l{FuVU0=-?A@Qg%s@y
z6T1x3WAo9V?bDC`wL6VMRqp+v|IiEVK-vq!8(T2)Qdl=dLN6|aRE&o=*o@1@F$gTU
zEs^FvqNERyRHhU+m2v?o6;4@5!n7SuV`Db4v=8kIu}f*bMRrl5v<?UYVvo{jR3#G0
zv8~vrRAmGw)&#o5aKLyMQahCTJ*6%rQra6zQwDRQ#E(a(wU#KCBw{`ph$F7GyQ0h#
zveI;|BVo%-Br8qXI+2#Cqz)fqt)=H6<y}>7kZw?|3&~6?Uhb1^>V7(||18S;3V_cs
z5&*5sGf`%W#f$<)AWH5NWhR`G7Ygy-ltPy%zX6a~LZsG!lt1y%<mvUlWd;8l_5V`+
z|4wP2?EmkTcgi~lJM8~+?f>hW{F3^A+2?EZ|62XOR{yWn|9>&{fB9MU|61L@R`;*f
z{cCmqTHU`^_y51E``7CAXVmL|X@&Y<?6-9P|L5QTt?VA`sr`Scw6os-f6L!D(f_Zg
z&tEI=*UI~4%6osUyI<?>{~X=@Q>yz+rTq8*Auk!8UjLK6o&HD}&-?!>qvMyf|F46c
zZ|(o{ztsOvmj4&D%~%v&)5G28k>k0JXQF|)Eg@>7k!T~JFWSJvy_wbDN_v37e?7|z
zEj3ofgEJ-W?^%&s7-0vfVBLllW9;<p!2=?JxaXY3Ksx#pQ;uJ1(_rX$Z^hqDd=h+O
z2fu!>Z*O7cdG`y(Yz-jhj$-~6P*ZS2@?K`XHPK2W0K+KX>LvWukdqjk5pUnd=Y^QT
z#Mmpcp8~3_pW!yAD80N~nE#wYi5YHXa6XZtro|f)i^7-FAKMvL9tU@jkceM!-!?47
z68UXwGR{T!J9yB8t7$K^qar0LTqtJd2v=2Ql!P7i{9J2Z8hH3(`O`7kctdUE%$Ncg
zY0vGR=g2H7L+iN=6LX^A(U43e&mocacXgtlWWhNuzIzU<<&k!;=W^Qp7T`iuXxN0+
zUpmDR{%vJ2W(!T$#Idw~4;F<;D$02iPnFH6x!5eCtc4mRC6SN;lCd>*yoYMsSfFd(
zS*Z6&L{56{)DL5%W^dxmrOlw{wc#Z3@;hL$nL3~VIS4gyRNtd%E!Y$=nhYtg9m>N1
zQWe6&X$-6YO<%|KQAwLMQuFP2K6>p?$|$Nl8g6*-p=$@4(K#|&@~Yx_yJMWUnk}Vo
zlCXSSA-?3W9GOp8p68GsoLq>qtZqz3wL$u^jY5!4+0GzlQDl|ZCgm4DbdKdVX&*yv
z89w-S4~9MW5h1}Emauk6q}X{7KT=1&)HpY!>P>#ZrUmM)=|vDO%nABSjO9B&KEqlr
zGMKk-6a6H#TH{K8@sA1V<zlbi6P=~S`%#A$nL*%b=%c1Y9%L+Y1Z^ph_Io4Norp6h
zTX`sIfiuz~yszKG)Sp^9`7f!Ukqs&onXx?qX-rdEti<sV>S3}DkmAEFF+J!bIpAzy
z|I&2~eaqU)m=tfKxc~v#o#trd^zdv(HVatS(7}y?Jf87+FOmz3wdPuhHKKlz>~3_B
zC!Ex~N2kf-X32@F>R>@($ei^0m@1-4eP;$9AZxNTIT1*&idGd7_N#_hy6I1kudrX#
zz{;sJuK1klO+7l<BOO1?i@wQo0n#wa89;=#q3F-XD07N60bvqsT7ju)_t~;sTzT(2
z^Y#|EaJ}Jl^4X8^5}3X)A?=Y+tC>8A!$U3~$!mF1HwY})>3zmEWg_M<ll{*Ydws*&
zs)M#@5Gj0`?DVJmC~b;<;fI~Yvx>%SdH^M@b-X`JC)1?J#TO7+rP%zG9YR1fibp1F
zpSi`7Sj^|1MMF3|i|t&K)z^r(b<BZ<!W!p_8Gwk-=4Gp#ED@(GncYV_6S3K>4xutm
zWOI?KCLQVa0;uQp#ZlL2)>|LQ+EthW3qe*2?G&$RcbHDv>_vPgs|_&V<uQAV8L_`D
z`O$YK7^D?k9z!YXdh+xC+I!Q6Hm;;?`2MQ?6(@=vBu5BIYzf$oF<_gCZFmvRGMPL)
zjnqIJZKIaJOm08F{jIC2&gs)qOW<XkS?HM<b)S8&s#A4UOJz1e0e2SZR)!chcP?~O
z!%|;Uc>VU<sfgc7Je@2&jDRAQBVVvj_+->;&h)OO<}O(5KF{H-l#(AN{mr3i&rU>u
zr=r;rxc52S9|4|Ie4t;%1D&!=V23hXn8>g9iP7eU@Li7d0aRubvx>IFCdZLIvEU&b
z@fs;G0Xw)B^me(IX7oL%Y>dva#axN}iKsa#=%(9h&QnQN-dKha`#lbIQb;cPn-3>#
zWrR5GC}|Dj!3a3Zj7fzZ$=4E)c1caBH(KX;&DLQr0LscVn=f~F4>s`bYOg)cAv_ZF
zoY0AXvFW8deDgXt6@8zXW^d<ZZW{W&J2Md=#d1>#)|gG_`m8=HBcQA0H<SWq7QeN9
zwD;3)ZaN9dN!gZR*F=tp#{A_A!REqL8aLm<PHXNykWOfAu}<Ex9+Ccdt0<T&J{_9a
zP>%+5*<@H5Kh<zt9gZdEawh8=QY2}L){TX<rb=nuSWIiOoJ^Nm$9cRo?1i>&J;nRW
z)due7OC_tTAi0R2J+pMvnN3g0aZqM)a?KI{TP_o`Cya*M25h}(pGybTlFpBCb1g%X
z8d7Z^z1n@{%^-i^yhibcn>Na?O?ybY#J8CWj_4Cw>X;gBG|@NklUSA-WqPz73CSMu
z8Ed|AXK>n%OsOn)rfAI{L9MU?ko>ewoZO!oQPJyyLekUb$ywuW`HL5Pu9e_2Y7h;}
zMO}?)e0O%;l*aGO8_T<&l#7*2l@aj+3ZIw3`^ll5RT<X7$j<{k3a)K<me`?~OO~3c
zx&oLtZvb-IG^ZY!US&#S&<R@+$RVaT!qx~%WW-n?4OAm}9`RA03@E0OBD4cw`_jUt
zpFuh)2S<-m<zF#H<?78H0V>UDZ|HXkD7C(=mvaJb-u5ubwu7Drt#7||${!LV$csqP
zG=hY`cLQus_OJ&7Od_gV7aNm$iwQL*N_q<;>Xi%Jmz{-t_)~-=pR#EUqjt45JRZvm
z63Itq7s34r?;(2&x*N|(Egkzlrx4tY%*b7?KxXAH3Fl_q9lV>J^{azl=48!D)6AuR
z&$z!v;M!T%%e^**;y2+dbs}$QzX;_Pw{<#Zg46K)2#F2H<y>9{@C_;%(65{bW1GP^
zKYtgV<VUdM+Tn;4uQNZMjTX(1#u`J?$@8MwSW$j7_&im*Sgnz#<FMaWj)Y%15k}|C
z^Kd!(TVn~aHW^<Ol{iN^ou;$o?+q_bBPUYW=3R=*)!#X>y5ZZ?&PcM7-+7T}FLsgm
zw?-0obxNCv>t8N!oYI3fPBIxMnU2$%%BYo-Q)?<KpZ?5FKUUq6`Nz~w-U|4Kj-QYi
z)8m)M7|n_@y4F>KU-=Q*E&>!QbED8M;UZzjn2rP@Nun^hl#`2#Fv^e6zU*oSm$nv4
zmlgCJ^y$8W5~5z1qg4xh=Gzb^xAeOng*GHZfvJ?|Jzv7$wq$qz8Q*t&x%<Dl_rIUR
z`0Iae^#8ZAzDi;14YvPYX8kYvd*}b}i#$sYKIgL}P8n{v73Evxq1+-5?JaU1w<h_0
z^4&5%c=_Gtj`?Oz(&hJg`)}$>SMF$YEsa>ADK(gpyF7mSCr)K8`<xT^OXT}CLZSWA
zyiU68p`oT`IpComz!eI25blpGugly0WgOxLi(>`S1I`gq=6<ZCc<TzLO%<ATTV-Zl
zSJ}F%Ca|k&$hTD|Z|yae1W(;isnL#-`G}&dQSs^CbI9Xg?!Gd54I;Y5et+l>djrOS
ze(xO3xCHfkhW^!^^|i#j@jlc@S578#bT*ISWS-)A=zWkkfYUdl*$UGC4=74A_m-4{
zCr!j=T=C^iHnc`A*p7QAp52&LfsiPJ;W3<^i(d=elKk#P9n<cRMjcxhT`U5hd>jYz
z4A<aUd$7qz6e#PfK&O`rg?0IfTL=7<%Y=Gub{1R2v!l|)U%!NgX$4<8v<qcFZmTA$
z{gS^f=?RBtavzYk-rjV|liqh4s}7KT=E)-~NUlQ~Oqpvv8+STR`ppq^)Y40{l8%$&
z_+y~*Bo*wO%w{s{zL2rZ&4aQt$D|-^52|@#BYH|18e;sQNevGzlr2Uc!CvH{oqB9B
zqRU6E;AoNAi3i`(@iEVc)V#$x0k8r)v0pI7`vW$knM$hL(EGWCu#$4-K0^vguQVp|
z;D6+fz?7!*Qqw%|iok4S4e}-~2_#JA*=f?lH?L<TlzW01$@X?$&Pb+L1vAp&N?=Ap
zcUv$cDJ}tKwNdT|W+aqbfEh{M6~R<ucSj&0`IiJTXcHsvF0a(tN>G5e47l8(Jq<RA
zb}(lyBXGmW?wheV9F&S@;@bVOY*IO(#IsGAG&K5azk8Az8|lu0kEu{aKW3+!nil1U
z%?nKCC4@v}R^WJErt<<JshAbU5{g-Y;O^2e7IjRnxQcLY#?B%YTI6O2X@nQ(ETD2D
zUqStEW~h~4%nDb@#mr!lS<LKdYwnfb*YiW=F2Yd}ZV}~gZQiyfw2EQ%Q%|N0S-2&r
z;@+8!qkorVnepLU%XpZ}-Ec7k?nc8~9XV06ml?W0pqv?35gKEgh5dOkq@;{{p+8bH
z&1}wc&%o=vI!*=iHgdL*{K$TB@~=nwI;Vh|RVFbX=}e!vY%)|!+RbU_*-MLC?PHcQ
z@(RLkRnF-TzN47ew6rH_eIBNILE{!r7+9XLqiLEtiAkaX+v~UC&ORi9z0>h83DcX6
zifM3Y;_m7rnvbP~m`!b|L7kRpnlepY=54@|Yz74SrfM9S(zoBbfQMd-*<@AuV-sCQ
z!)sAaAfDCTx7d=MujMmUm&o32rUFbE4NH02a(@RQBVMx9P?i@=8vMviB}uJSZ3oLD
zHG7G`4LB7fN>agFkJ!n9HB9Evet+O>X7lPr^sl|eaW&&Ijx6V9n?3GE_VPp`O*O#z
z6vLw@wr}4{xi)q9y$r4LiPwR7d8@JT`_w&{zp(Q6Fj1jq;VUzyiE5!(W$3(pjQ_Fs
z>~7k7*Xk(^oS6ZRAfA;bk2tpEWPWkUM--RLE>1|Vsiw6)rfrjn<}|J~)w<TlG;cD|
zjP|9&PZO<06AbJ&6b8l}wwRb2bX%gxBZTwhV@z4k+V9p7U80FFc>t-_{q2J{;NqLF
z4rq(GjEDVRm*H2I(vj7@)L4}XT^?4+Kwl^HCrmljC16f$G3^IWEg~y+D0_X*hpCmE
zJjzg^9=hzS333_#W=|-u_K?9lS7Z~_rv|wCsiK5?w^|a89I-7+(~7!;R@ZTDljHeZ
z?;{!DMeZbRPzl;(IjbEC$Kzgm7`17Op&ik>Ahqcbft6or5R>a(OZFn{cQ1)RdS|RN
zvT|m&@IQ0l0yr-C_X+xaHuXM-cArhT&!O9AQ|)tT_SqEs9D03<BIil&QRF)BXU3nT
z;Is7m9O^wwyU(NC=hN+TsrI=vdufvW&(hsxf7SBUTzLtiOPAgScKl&*Uvod6<$ZJr
z5K=Amrz<;(y@#9(P3DGXZ#t(!lf2MuTW2(tuOjol<}^#M9MkT;^&T_P(WOkp+40i+
zFT4JXb>9cWZY49dWmA+_CgZb2p?yHj(8lJd6y~{Rp=8|B{_~SiAm-bD)>g&;Q`Y`-
z<xBg2y0icMueJX?|L5C(G9|a;>4j_7ril|M@oXG<35zIKo?_A=qM?`x|9NZg$S(Kd
zRTz)5!4T)V;NiHJ4TWshg~shplnqvKr39<z=WGm?!MfUw`V*CV<JGP>p01rrVkMl|
zZ|V*;Lw!NSCvN;aLm;A=U?>F4yO60Z9YE^<wR2q&?zGDeh-vhIc^5@(MEU?5EJW9f
zPT}H-NLzfY_gfX3&2Acl5;%*bP$KVW`{<3hMyDJFrUE0L6ObfGmUbHWy^t+ldIRi*
z^u)`kcP3OM*1}~tjQit6#TuUNM<zpOmZ5#WJ~3#iRfZkBx|a4#j3zYu+ro0_lhA)}
z-*)JE`}QsWehat`;B?Fa>VVsCY$)jD(>Y~Np?6p)4r33?SoFuT$Q-pmqo#3lqaIj%
z4~NGwGcKcZG;F?%>oGfDpnNQA-0}SC0wiO_R$)B1x=qAg)wrGcabF_tn#PUh$7P_7
zb&Y#Azq)|!_|9f~Ha}a${oeMNg}$!j_n1S$wnGQ9e@^DF_qKNxc?1w2qDYANd6AD^
zZ12B$eWYL{3MrD!eDSe20kcRW3R9B8vdpTJV6@a%{MZeSJ~MVhQB1H83ZtNHU^BB!
z{H>kl!4?{AM^$(SoBwozS6hF1_VP$UP7t5ji8=B2UUPgqyb3d8X2loKnfmvxPv=J$
z6q<$|-&UG^ZuD)*zF~*BmD~_t^Y?~$IGS4>VAnM4(Bhy-XGBi)y}wfCc4$Xw^xW7-
z65S3hxR5z>`RM4^1JhVbBQsph?8tzwX{@KwiEEh`{nf!QreOyatjxT2?i^y9vtv5C
zA@&hsFWVs{HpbgJa`OJ^m07mqDcp>$H;ZIuEkZG;G0TlKDe?HXO$wpevK?kzC!`I^
zOR>HGii)xWox=LhjBkO0mRECeg6OjXY5h6soi{%7^*=uY_}~BBi2t{`y0V(;f3AxD
z=gOV`pD*%!PW?sJuG|y##l(E#^O<!kZ-K!x?hzN*o`p5&#T#`8*)RFNjld4y3gw3(
z7O6_JohE$@B#`~yX86S5GxsL5v)JxFd7%FZBQ3kFWwBYvo1{=ox=kyOJ;`1x^D11m
z*3bniW1Z!xm7ktqrIn4I=Ae~(o?x7nX`bYll~=ZGGFRqKW&2-DWm~4(*6<`A4a4EJ
zlL{~ZmP|To!*hr+7=R;u7k9^9cPVW;!t8^v$SmGY+@-e3`q%m3bT12#B|`<`U>Fe*
zX!@7b75%UswW-TtiAWvzgHNkiJ%obVgF2g&CLCLIsQ0_!@FFqQYISO<C?_P(_gVT<
zzc$u=y6f<jekQ7Ig1C~;%UM>ad1OET6ZWa+?6l)wai8*G!Q?_Rg8=4k4ko_(7qOc`
zMp%<7^8WTa>iozQJNhI^C+XxoBCGK;NmT@=GU=q56g^-w5!R$ygelyrz@w%>sVVen
z3XtkhS)C9h$jA%=ClClc`af`-eBfcGdO)W5iPKhoItDxNnCHM_i~|o_)dNzs+@X0t
z)!y{h_20C;v^b2%>Wd};m?{?3U51@l(3Awif&t#HD+WqYJ_#i^)tXoGIr36|JaB@p
zAVrvUIK3Vw?aYyDd7oR}_fcAaaOZ)K6zlQTfn%Bj#}EgW*$q5KHgN1^kinGYS@UNT
z`E#Dx{9kk2+i!jr3&0!rzm=60_<vnquCJ}EEw8Zu*V@`0{`(hsX59bPp)lDz53hP=
zt7^78@hPp{HjyRxR1K>w{qm&KZT0QNnn(6^!)tRAW$xAH(Qx)o?-hu@xW%`P=0yxJ
z@#_r@`}w?I`1w5Q6$<Vi4GLBd%;Mr=VbML_&zm2nf3~&@%eB9ZJJ)D;VW0XT?u8wq
z;@Z&!cx%xu3mE0)+2p~n#cDs@>|D!>?cGtC2kbq|H-Rz_#+gqr**C4B|BW#V@DG0!
z)UyXfV*0O9?=pQ=w=cgPAM7{xemPDN*lYv_=C;9}`z{K<xa=N}%!7-zn5+Totzw+@
zlJVUPS?Vc}<6wUf^>`9oM8jUx;UfW_VpOtbM4PO10sIM+!d_?uY|sC9|M+kKXF!<0
zXaDufU*$dZ+?8sc4H!DKRJ56FfaxH*7{9gfR7pE}7mrHyvKrF4+HxqJYcHYK3JROm
z!QADf1TS%9RsAguwBEhwotRBsw96R>QLZzjKdhnNc#)W+P_>U^rvPsNsSoJ1%txn4
z$bB`|B4JuW#Z}C}?~hdfe!9@sgx<aC$j+>UEB6F`z)Gj$K}c^|`7QOUg{o<-Xr@WM
zDrQ_U->~}dH#8TW61XF=tqP##tlHp<kH=X}a4)9L;@NTEXO#?R6+)Hzt@gWLg0#`)
zZ~Yg^d)bc(YqRuCX96;ef1et8eXQE}M6PBL%bEB=|4V%{lav+t!%<o@F6rBEf7caQ
z&PK;LOx8txo~3<fihioB%5&aqwG#vT5KWmF>{Vt`V&vHY6p#Dj;{l_L(6G0LlV$?E
znU!@e%$u!=>i4rfs4H!{B*YuQ3nKlUEDYb$u}d9$#XZ_95LiuEKP)qiiF%$0RoiBl
ze$kClTJ0wE_$hh+^wdYS(aANb(5ZLu41nUp+YA}N#d=xN*R#xPHqeG~R}3;Q**8_;
z)HhMUlozY{SSayp8(sLVbS*0uK3GZP4*8S+#cFKIn{y;3t4$y=WZJnnEjr3u7l~IJ
zr^Z<j{g~fMK+={f(1+hSNC(6^wwid=v9Wu)9zWY~ALXAv*#5Bl>(F2}iLb7UHoKPk
zv+1*c_Hz^c|2b}eZo2;gvG3^r)rQdjU)uk}9sPet|KCLa=Xt229V7eUwACARZtX)W
z|LQ3JHVB+Rj=L>67IOlwlWqua4AViWWI6p#^m1>aZ31Pk7f`1(ey2)SW2<C#MyYJ!
zFKEO38Xk2|)7VUDS(d<(Y#g})N%M3Hrn+4AN`q+v@uo15K*^z$%W?FPrn)KhWa7!R
zUb6xs>gm`p9xirzgbO=p5f%7NrC*6{YevfYK(+3s^y!jL2Re1dsrXa6a89v{5gTdF
zDh}M&J^^TaWwSz|CP~jGlb+2@`W#8?_OoQ+^vZx4cX}G}71a$@*hM}KO@Ee`ettc6
zxgyJ|3F5WEQlxWJA0Y9HCLW}v)7p&0H{86$oO)GLTNOaBX!fIKIz)@oK35umwV#vQ
z^TUHeVNG*$qF)bQuj1iICgz-W=Xu$w23?`BE?GKdHLrpWL2pJTtdmwKd?z_LB`4sc
zg`<$o#lqHwAzIA*_!L+&^BM>ps6yd;$;&Ac@oXa!4c!f}Y_?*#U51BEs#{&BuhS2-
zP=nxEfyOpYV1hS07ibPrHg(CyS1PkkXk7hfX98U_%0%a}IxtgdcSkY5`=@3&?)4zo
zh`aOa#Qx4GKb_X8))5v4@k7H2PJMPxRvn2l(`l}>HRr{@P%(6rfWn~LQXIQkxgH$t
zZU2bgx3k}>U{R)}cGL>5iGwruk;|0qV9uOn?JUYwSAlwZ<9@UrD5wh+NTU>;RSn<O
zR}AjRv8T?Rf6#ZP%ym6D{aye-UW9P+I4|)oPd2v_(tXA;p>vb-ZmDx$uN62o^O^7q
zjVY_}QP$vmB#4@`rW`B&(cW2`6~if=A<p~B!$bKfK0J8;E&^~%bRR0J?NAZLhKi~(
z&|kT%;h3zg@SoxH?(RvS+5F#|Ui|K7Iv79w3g|}uZyEmo8Y`>IYpXTf1=ZJx0lee?
zzQmKg+;C%#`wceUxFB|IOa~CNB<$b~GRBB^zg$p4kfv7HMtjcXX<`!khXs0>+w-2#
z&7glJ^Kmb{4C4+aVUbbNPD?h6l0+#&sz<M73yGJxXweKE^4}D49V}h;etESEj~>Z+
zf81%aw<Fq=Ss#bxiVWaw&#t{4mJju>deJaBj|b*-*zcl9KIT!k#YKkxmLu<~KfK`W
zd~bjI=;b1E`N8ZUI2LQ5XHEUM$1De@q_d<0^Kar1nAyyM*F!6J_726>PCFiY2yx;@
z*@X<8KjQ=>o5QXfgroD5F=OoEBIo7qYae89z*bT8hoazf=W2kq9fM;NXCw{)kxh|M
ztHk-&f|nI*0*^*c@I@k6^BnXvYQJwP3LSeO(5llsz|{;~yX%A~n)DvSl#TUF#3`+B
zC);jH4I!}a7`~i>xp~NMxPt0+t^rkY0i&`}s;PEL!?XY_8JX(sP4QJ26Z?j1A33g_
zoLgq+aMZtWl~{b-KGr*hTD`HnvbwhZ-S<Vm9;tjgD_mz4yq+D7Ftz*wJ1J{#Nx<xc
zX3#n)1d$!yigw&m(OUm1JDWzBtf~b-n2Ja_@vJCL06NK#@$AwO^Ag!xIUP6#t@OP0
z=wc1qnn4N#XujdeH-#XSD7Kjbxv^kY(v}?phZzmSUeW=LXxFXtuY(wN4g+KZg;ePS
z&G4!}w=KqADUEF%csYnZ&kc_WX8GXpkmEdTy^YEE>U}3CwtBzG_k5ERUwrlC`{~Jv
zzR#eeQz_*0R2s#!o4Tyfy9$pAbwCtZ5DI6!ZaW@#6<)F>4=O(!@oXyMS$@R9RK&rI
zh}oD+z8ipvm}gTl1@C{lJ;_w*sqcVnOr3JLXt9~5IQn^Ar3v^t#iWdGPS)ZByW&;C
z2UgF<<-46sg*{yTiELBA9IZeKET12<HxX5RyXGZP_=*hTtmCm*C~)Eg0+VUw&M7A~
zqzlyhHtC#UP&7|YBFLY4qpLT>erNHfnb#huqNTmHl)>2NsJhgq9*H{2%~fmL@6o!G
zT!~y@3-lCnIClmo3|ZzC;Q`OvcBT+MIE#35_0P}$hTE^ZXEy)0cewY<=WzgV1OK<a
zy3Y6?^sTYH3|tU#34h1`eSs&-|M8gnZo=(FQohG>pj~Fn6PiD79UMP>`6CN|SL+S-
zUmA@@M6wcjO>9^6ZUn?drftQODR1S>SF!gD%61fWfuYu6V8lK6iCP$$3jmXy(|>AB
zamShd+jFK_&*$?vRgYC2PBN<+0QgAyEPwF5e|ky`tQldBZe~u~QGXP648AicK4zhE
zbz=c$rwE*?FcI70=yRnx#pmXUeGj+mDfGO<rQfv97KjI%;oQ7zA^1{$`4+tP(m<KL
zJdPW^e4TU$rB?^X&8_FVM-}txpt*H?2+V+en)%Y}j(d|=QL{qFwMLy%bNiSQVt+W=
zr}W=&4<p7MGk*g!&m;2@EdA$V*pWfp#~50!{eX6ngQku>FT|YGCiqC6{c9RKIZoQ8
z<SZ_mZ@w`l98AYQ?H)Gw_Fu!DcI_RJ6t&uFIm^5|YFs)ZkA+`oE==>+v)T8B8lq!=
z-g^1+=*8jwo98c5H9m=QIGy8627lqN(~(mTxjFHVa;iI19I)`qbnIWA9{!la*?$eS
z*crWtgnyF!L){49zJvbR5)*Xa?fX>JM0AoLokt1OR*9aWgW)7H4ROIzF?Bd{zaB+;
z1`bCR)9AJ3(<um~xDOR1ooBG}g!U+`W{Fj8^9c{T^lP_|`8!O#x+<7sCI=DL`J1&^
zumXn)&Gj6<Uy)$}|5_?BPhS!Z;>CQ<*Fwpb?NZmHly)BZ`yfLiQno$;Fbx4q)m_b2
z*FyDX1PSFO`&rMP>foHsDZkb7%MVbg&HqkuRx%YcnJM@h4nDi!D`DwHtCGf~i74ey
zS3sp>UIpe0$^LZFS1TJ8t(z6~?^99#J}auqx9sAu8Y;Jyi>2vqArW(;FxM?sAT~Wd
za|B`^A`zQ_>ot?lQr5X5fBO*enQk8W**brY6H|{xX8ugd5t(`8-r<J((K}h$;J=4>
z?H2d{pR59YgZ!saYpm-1|9Y*){vX%YYIpcQU*yT?Hh1EaN%)&7ediqYW?}Vj2F`)V
zXc#5^@vt?a^PCI4qk7P%Ir_^ge7QBc4kK9RYDh!SG)Gzc_J|J*HIadwab8H6^Sp|z
z*ylrVB$mDuTunYIjob^Gq8#CT-B2_vu4?u>;gGm(`ahi&)QOAz;bN~Z9!=U2yu2}V
zJ~;AZG(J6r3L}I{;w=PQBV4x&mpmRu46#amB+@<rxPoSG$1P&)hy8J{oucI{VrX~V
zVvX1g{6!8(X$o8sGbrg&J|-z<&O~+-@S}l`+u$$=asVGvm<NS^2<E^$_^1OOsDok^
z*q^vr)7KQbz@ZUX1c)HjMwO_Fj}WBVmH5e{nF~~)&!4?1-92CIx#9ljvj70zbp9^`
z^L=fdPW|=zdZQutKX?A0zsU2ifBpj%2Fed~Bt!xslNA{{w5@3Xtq&y=Sjuh9otzL7
zN8s_ZW_bcYQ1fLm+DxiN1wxb^tc~L3@798^$834jJV?*p1LDYC-2WDe;{yTmAacXk
zcj98NUHtbXLzob;_~`$9QY4v8l(2D#WHL>k%%@6_H2wMa38btKr%fgyu2STy6kEv|
z#qb;R+IK|Dr$4jLe|Ads1@NDiS8A~NUWd*{ZEdx|`v3KnJN=I@@?`ZtWXz%bKkg;*
z8J&ItPWU1kj{dQk>UsQS@7c4xU3OpbYH#~+zqz};|9YocdWVYy`nSBqDIj&Pm3{C+
z=wlpn*fC#^3j~sEg>bpn!;LMjOlcbo^{(`nUw+|}TyA!u_CRs^>;Ocfv15;snDNR^
zUP0WB7@NyIEN`c&8xV@k>VwDjt)$y53a^-{sDoir4*m!V&-PyKJ}{?)&7gqh5H&OI
zjHvp!Aw2JPyU>*|y}ndcEBV6@KN#Ev_0(Od+#f?u$ak}+xE(o7FJ@tdmA!}$3Wbcu
zNKlY+kuGV4y;I5qHzb8Z@qXLfPt5(6!4Loc<Lv+2Ga_`xQ&Dr%V6&$3zM+0ue9ZR?
z4Bmk^_9$CGhX~9RJjtTlVB{zWQX(VO#46YIa&y_~J6}q83B&@=|1^TNtoJ&wASm+A
z2blMsdREg9t*I~Sna%idran2h$*w8c_ts>D)>I5uSsMC%X{~>~=1>}<SG+Ir2qxRS
zfHK9?i8@ihC0_%i?{qBtZ=JY1nE_xAyl+I5PJH25YzgdryhuhDQ8JkP68m4Up%6iq
zeqhy`sGW^Mk@~|Z`>hp@TIb#;rYW#%6i!9I;B-*dMYz0b;!)I1*vTT+#zJD?f))#N
zk2OMQUmzaB(ugPF$+fOUQ_^Mi)g#I#XVs;HPAhNL7MMnY#zrBX7&oO!vT0hkDyTJ4
zQtMVlwUWvD>C7=pkL+Gw@aNu58EQ1-7}#E;09J0BudIjdJXO*Y#i=s}?1frYGE<ok
zo3ZRK&=vz2G8`Ct+q0+X2Sq>D^DBIanqR?c`DK;-JRQGuhByU3o`V3aI_dYNN1>Rf
z2N@q?m}^gUkZPMbXFxHHTy$rFr*%Z7io(=arwqFWw6{O7HYlg`I4GWQ8TUIdUH*m(
z<a*c3tY>NcB^P+!pVCQ~lv=D3#6AkC3sVTWi3A1u=RN)BFFpF;TCNInqQ|K&wY*NC
zFRZDDfp=b1`>9S{!8($i+dG;|P6wG=_t2}TyTK=!`9{jr4&tb`8cP%Eb(<5t@&04_
zFt_`rNFxMHX^Q4)VPY+0wJ-}al`sn#ElUs8(O)o3zTih@N%08hXfsy8Fn6)U8|<!a
z91cTT+mT2ioJhiX_{Jbl5LnnOeyjg(t0%~lDZvmFvg9c5S2nU}P%bxIYRfAA<{&MN
zZMNu9dT~|P(ogO0Cq7f}Tp6d{UA{G_Gex7Rahxi%PO4<G%_2H)oQNm-=pC-a!**L<
zla^pBGD#`QFj5!9OIs0S@@QSP^RkdOjE6MZvr@8;d1CyR0Kg(rky({#kGtJ#kYf>R
zy08adbISiltkRP3zo-0fjB;kEnd%0bOVw)i_D15XeRMwTkI&9kZj&kq(nKBtIJ(pu
zccWq4Dl4MYlGUg!e3%|7#3)Rre!2>2q3|&Zq>P1^;vI5bfOlm2V>{a<bJabw&_Wr9
zd}W&w`r@otgN+pguxz?qcW#elr3zN5lIi_~@h`3A=(Ij5Z+Z4C^mIqRv73b9HnH|6
zZ=G(TyxH4<xN6kz^sk~}Df6931z%e#P4s+5qUSD=)0}#*P5(Jspz-jih%M?~yYHMw
z!-%=EtMlt0n0Rl6v=T79@HA-^=g>o#EDZZ)b?{G#8W4hibgr<q11RG01}HWP>~He*
z{*f8cF-N-}=W!MePiXa5k#djI(IHrYu00g%Az7q0(R8O;y`WYCSoZBW0e8$whj76_
zDW#FQPU3+a%G)0QWQXwqfE9J)<FB%b@=xAJvQcG+@V=$9NaUm{A(d&tBJjPPl!7Tx
zJ(6ey>aSvIQ+B($t(ST3<k%K7abw)v-4pW;E49Y|!yc0bt$wEyQI6=NYoXZTeLd`9
zNYP18-yBucwnSvMXhA9xaPj~z0|uvIrx`R4cqDn8h*p6fl*=fBG(vNW;q0W@X9E;y
zVe&3<5+Q@rapwo5Z}w3o*l#$vUPzXyYP~*=H=s-=BX7INNFO|H?j*ZMPHho<((2}z
zMAjLo0PJ(-v}8&qrh#R^t4;d(5Wj!kezEnM-oE`-^3|0U=d8B)cQ-Vk=!TTDt`kPe
zN~#cN45I}``5_L9_RrAT`CNt9YA}*+T#6HH_eU!vFvU{2D09RubH+l--2fy+wg6x2
z%qo^Ky$dnF;y5L7uN5&JzUdR1<6ivE)8@lS2s!?hm`(5&CYoxG%mjDztwi0-Y*_3{
zFt^4MA~p7`LG89h`$uamI`E#d+iZ<pPgOT%M87p2^SD&cRn?WU%Vwgh1%C-OpRT%w
zN!`=xX~nfSL2HC947%Jtfg<Ed-#_Iutk^$2ja#%Q7kOI*v8tV`E|2NA=$@yNAWY3a
zWS4fT^@T#d`uM~s9Ocg&32~!fH3fYl-ZKoCD$A+1f9BG5a!X@3Q2&I|{+e4_s#pJ+
zi#y8iN>$4LT!rN>B&Xhqm90#iEbTv7f4GpNV?MdStf)+s*=a>7e^}10eDO?~TX_v~
z>qly3yh;Z+;Q4%EdYn$^F|%_<OsO*TxWwg?$sG6kqhnfnQR@PS3ld{-(Yb#i6bXnH
zKy9ByOz60@EhcG_xI3Wjnldrx;U&{E-IxWci6dW-C-T#zY;Mj3kR}!}8H?EHER4DX
zI!cRZK~YYlDkqfGO`)W?tdofHP^N@yVA)SE{#GZk2dT7C8pvEQv&9Uorwx{ZX4ADd
zP__u8Y8RElrF~PmH=BQ&op5Zn?u({QoW$ctf?iKkf(a}n_GzqiqU`>%yPZ2tIH2s!
z<%wD0I4!2?6YQ>8!tCBXrlrP-9jj<4@YW563gj`80lbRXH96l%5ZMktVLg1=kd(iz
z{%+pH?G4=CuhN{K@mC|S{cfJ$HuCgLmhbH7EtU&*5agjuuL#nKVFE&p_&}n3A|k!y
zEEm~Lh5LfVEvUa_=I9X40&Wbnfk_f|@x9dNd`E056VoDR-YyAGBfdjQ5@ITCR!ke7
z_4^EO%VR~Qe}=gxBb83K>AN4vE+f&hqAL}M%@S>8Wm~4mW9ePlK+5H~`EO)meIxw*
zH(=<Q=v=Xxc~f^56Spf|+(h)|tmw_$=+9<Ff96Lgl2w0swux5uHrep!^BaC94VOQV
zTg+_uEJk$qd2YjJMQ`Rte>N-nv*)*JIRAmE2D84zu7VsJ4_o6{MHs>o@wR&^dMlQ>
z3aycRK_!<lcCv<uDDB~D^XI&VQMZ4|rsS0Tyx)lghLi;)K1WNt43&X1=)n?;iEk|#
zofN2MgroU;W9zCt^Qio!RZ1D(=0p$<dd``kEcWbEVf*L&DS+>OyKiF3)t|zrHd}Hj
zI&sf!HYY1?w-V5^{zxwsC_TL(0|xxEqKVXx3h@qQ*LyrA-~z-6kqQjsO|)a0QrSpN
zqHAPQ*o$#+-OW{V4qystJ!40OmSkfElgzaTf2?y7jd0n6O_p4Z1{X46X2C4zvT@%j
zzlo}3$6vvE^Cy7~RGKqyL3sCSp2(0EENCk%!*>fwMUVe;D9!Z}IY30s!XjoT<|6KN
zu!JJYB2od1kb*Ijd8d7@KF(bV6q(3LCnSoqfASXM8E*LEA~Dwy@`MvqB|lSniV|^@
zvnCq%Sojiy5)~OtA%rv3Fj1L{SzN?dp4UqcRKz+s8D3aXXfcV2x6JM(sR6p<SD(`X
ze~#9m0V2C&Ry7o9o>qs8nX(PFLf7;`A)bd8D+R44Bj<_5|E8)4seXj>!s3)2(l_Um
z#aDDlgMHlqr}*GrQZ<K3Er%&32Vcj*i!kvaRbQA;Z<y3>m{e|<A)jD#M8P=`+J4-_
z{JL67REv{AyonQui9YSMuJw@eufsLF$+A*42ak12tsq^1*g6I>8mUJb7LZ8t)borm
zt@;s+V&JXqilzGH$K>q@f1JD^Ne>13CAWTsT(iI+2%O_1z7P~is0dx&#;2#TK#f>Q
z*8}yx`Eu{s(e93UcDVnFSN9+>jcTphFrHHH)2*H3{e#`t$FFvq!19<jsLX%<78G~k
z>S06gTe^@}pG5W^|8KqGEpjmCs4pormryRs*(WqB+tTi^6pdO-r_}o=LS_K>W`pzR
z9Pmiu^soMb#x`z7l9{#P97H0|;$E4RevRbcMUi1sJ|4Ew(bmy1ZbOlge@XA_w=r(&
zX<J=FIp^L7K#bSKnshv1wOK#0e40-Fa(`=Q>!;_EUX#Pub9i}{Nw43gGkCSjNG+KR
z><zk~fqqLf$Y?ct7o*O{H#->NTRyop6X<(fs6p`U4g=<1qv(RCZH*XNI9`$K;c*L*
z;N<|)3y#1SGSCTUsRX#zF3zQhrHQaKK<YglafwJQgfz97@i+n4kDY(F!y7){RJjCZ
zyn(+k&^J(SdHUvA$+m<RF7XHL{vUIvHU9NFv9~!V_Us&(Qf{ki2_R2+5SaQ(t7Gw6
zEL;o7FP8(JQzieBQ9BwEbvn7+%QGsM=AeW|dsfW(t-zxPeeL7=;r$1un$DqvnMN(B
znA*#VY3}a+c--7Qx?OwHu_*PF?B|?3a9aFUYG2$J=H-A#edE~CyLE?t&atp7`NPux
zD~%?0onA^te_#&pMOsoT2RFz5sOPh}glAV&9&A|Lvu7l>zITHmT#m9#OQ<HAi1nox
zf3-wFMP+|4{)&v^#P@O6VxT>E|1i+7sG5Dbqmc_l$u5@rY#hN%Vq90np%-#g!RuJd
z_i~1tuS?$GTdn?(owx!5Eo@OZoyJK#j5wbyKNw2p2~h$=$`%zDd4+H-qv4q9_d=|?
z;x_avP@MD$x6E}5E@1gO7h=rTc|3~Pf@iTELFWYb$I>!BW>^r?!)eh8t=}*`5N37K
z?z@l`mf-C}PZEtP7Hrl*80C2x!2u>0)E~q>q@e0u#mV{Un2nEm7choXM`n9H);z#X
z312shm67zcHD*J4+uvdZXG$vS@3;{`W*C7sjaM|RFkYf#w^}rB%5qQ3Qz*d=I3>Oc
zuaopT0KD9bzgib-^(s|PtO2~{o{L8#>|+$pLLZRPX8<x9((LOFaKQ2?cH)yEO$Q$H
zM%BDgUyHD_@ApniWp}Js4P3c#i}SLI%(l(zE9A9YHCxGrSE;IyAGl;cxs3bcgeVT0
zVw49oeYH8+iDs_2Upf(7DpUXZ*}2;ia~{cfB`FjmvclX{9ffp7&_aS-z0>iu26&>4
z`mA#dl@VGEakpw0H`|(Z$7g3)Xb|RPv)foKYt^}RzAB0!II<js6%*))lIESp@1o3V
zry@lbM_C{%=3~IzQ`Lxn<hy&xn&~uL7bRBn1QR`EIeE+;@W67gb2+KjQgE{^hY9|$
z=8m)%6@-6zWJ(zgzVeH|@>Wh{<ijxOI=lrY$k?KCQsoc6?~dPA7y}!BX-eTwpBhfz
zH#sZI8kN$utUx(}4n+j^alL|n8x^~6PU#kECKYoIaSqXb#H{(Wp-0PC9KntQIuRkX
z3f(%mQ2Yi3vcv|uP8_-PjZ}i=6>16LXYaU-in0=-LgVL+yLdL#NdM!qw1>X2UG$Ci
z(Kp&joYSW?rIFK=My4t670a>2gIuCfrx=Ue3v3Hitu5gNng|RuB)c?rms+)c-!Q=>
zavM9Ak96dT^OttP4H?=+f9>E01<MIP;u7l=#?>`Tra__S)ANt2rifu$(2~spZB(s<
z^K!tt2)r_kS^3VeBAHojm<?m>%*IvMrf~vnjl60juT4Z=%ZdE`szk2WRx^>Q%WPye
zfrc!q!|VQ?%p6HyZ>(tg<!oW~#&=VN)oo#o+DayJBe$@JkjZ*wHCC53`C2WTe06QA
ztmW@D@=EQyOyreWWi|Y=*1xYw^6w^+e>W@nvY-5WO<u3nGgZYzoUAIvS=GqPtJ%nn
z6~C;l&fq+hQdHW23skqusdSs?*rP}K2G5ga^8*Tg^O7=0o^M{VF3tqIR(#XLDbsUj
z!dIqrzeAhq7GF?8oxl1wc<4H>NDW1dB&Or29;HLwQlee-emm?68}xy<{#ooAS^}R=
z0P%wSKFG87zq7CX&wOUv|L#Ps{pPdJVF2vg|JH!-p7~3g-uepcf7e$UYb&eEtHA#N
zB*>Sw{~h-Gqj~Xe3ja5KQuE*4UygPUUuV$Yi?|=je)*;O=4tjzI#oX2X;|<@vDpKQ
zYWtrK&(7V-g5B_)SnA;4-nc72PUz(O5QkxM%b>6*I4}fD1!XDi?gnvm(&0W;taf_+
z4cFD%ua9Qt<4{vF8O;QI9}HVVN<B#Mhl7GI4#sYTWf%;P!!u&c=;X$?aoj$J%~iq<
zffL)qF@9|QWFGM6<8U|(ukoqrJ`JN&1$Za&REG?A!#tSg=;_O2^r7Hx*M#n_c!Vv;
z44U5+=sNmy-S|N6)I*(qe_;ABI=~&VPFV%Cck@Co0E}U6a-BAERc>D%+G&-3!ri%D
zT-F>A95pL8S_2*rbG_t>V^Qk={;zyNR*xTfq2C&vJ=8F1l7*%A>Z>U&95eFI?K+#J
zA``P>^TxfPmGPEx=CRkQo<0tWdhZ~gn^9!7GM(L$)BCrzlJ#I4df%4+dvy>Wi;fry
zI@mkjeRXj3tAjE33<0#XkAj(Z>aP<x^Q<a0uWGoFw;0NwfGY3Oe-x<v?8MuLyE~jz
zH-x##OLlcq?ZwM|$t7g3TN?VnO^ER^lkvWB#^kWfuG{m&{Wk|qbg$%_U7mI>pAMtQ
zRm`FI=T5Z`gVnFVXk^$=a`#-f<IYEd&&PqcV(@&Oc^jGos}4Q)jTy;R2Yya!#+1)b
zEVco2(h9<SeqyH(KPSE5&Ch7KXt>Ww&FJ&_i4}xCH?a;oB#@6h;|>Xy^M?WuJOi11
z(>im&uFBDgv1eVYn+;BC)tV}@XOOW$*wyURaavZkX}2+B$${HW0q3Qf<?`efORE$U
zTo))GqqY*>$%@{HuC{(EX?h&|zOGl^YFFhif3}C0$AfWlUh;CTAmipw@ugd;u$OYx
z<ic_mvOD6XW`{o=_xeObmr6MQ%YM~A1gGBQJyts@KXg8LeMQNan02I5PZzT?$pyBr
z;Gaw;4nEuK^(d_XC5v(k&rNrhNq2VJbV;VX<ksaSnevi(<+(wg03S!U@MNfn${D5s
z6wv(1JG+l_eF9YQ&j$=tzQ2GE&L!7Fz*H_XCgu&^13tJiGra{=m@u!X(}4N8%yJ=6
zq0{p618OtFy#URXW9AZW%pl+CfHdXi)UzCF=J*YmpV2JunmMinZm7|02LLzp<ZLek
z`3Z01Mj$ukZJY|suj>t-Hgl57_Wu4~1OER;{J+lu0DJ@f?<)UZU#&G(@N<pv|JLvD
z|G&sH7ueUonhib}DYyk3)9feS;%-F#{d7EG3;sL(^+Vu*bDGW)x1~<pjYr9Um4AQ_
zMC*Mc<rc?YxgXG3v-+=@g$GkX-<7H|Sh!xuX8SN0bkB!$X>Qqk2CMPE6S#?0@aAV|
zmss~u7Y;p@pQU&2-U;GHOw)s<&L@#L0cR0YoJhOORVcQ&7Ie!~*kR$PXogKcpWG{x
zC{9+~Ok|uBm*(I<X2h*d0IiAm_gU&MRIMQFE74}|Cs1x!;A#hi39if+v3baRYUO+r
z%ZG_*?i=f7%h+q3{FhcHsFe*9d`H(VB~LR2DRy4wn+Nci`OecYg}cavU0OG4?hBD?
z*>~EvG9Mh^W9F+uK2FDE(8tVYg?*g<7N_IKsE_tdAs@X!!F%*RFxX=zN4DD7WUyyO
z`*90>5GFeFTj79Nd_|8mY)!>qcu}$4v@`ROOkm^0s5_mOXhME93FDmsS`swxz1*ky
zvWZ7uJ_*^|0ed^WbigH<8oSd}sP8oBIR(`PLVF_QfI=D)G8KfdWeF2da4+on;elBZ
zfNp^aPs5tK&8AtM1Pk}l9`5ZQ?j8MV*2Hazg%D3;93B1o`pqk|E@0paE1m{Fd%5+z
zX};r7S)`d@*f6|2GT(D}D<{IX#;DgM3tqt4EVll_5$c-9bc}5qMLKV+*yi47KxfL-
zmlec(GPo(h(uJ+*<lCBF`mr^g!M5hG=6t_oyO0B=2V2vLCHOnvQH)nNxLmAD{|zSw
z_mIZ6A^m0%+tWaX4l<2;2E^SPH*D>u(a7Ms`(3hicw`#OS*Uk!-Z0jTX{==Y)MU~h
zQTD4gy<oy;(!bh$Wg2Tbs17LJA62oYG!5xF2CMKR0Eodfq~D^+1qf4j(~y2kIMDdj
zL+G+}-RWe~XB;RU7oANeg(<mN)_$7`ZE~n|+v()Wf5w42&92%-zp+14$ZFtyNf8U_
zJ8h#L{ePqW$7f&wZ}k7N0{(A#t-jV+T@(Lr^~RUh|M;)x|NaC0zc|%|FXTTab^P*y
z9$x?hNJMDw+PjWdMkZ8VhS3~Vufw-n(;Hf|wsOaeey|t29il&hRt#U4|MEU$e)7H9
zeX0kUTn93d`xLoviTjqgZ*rG$d;fPI?p`Lxk&GoQJQ8HK>zJ%xyFYuA{TF^_pa1Gw
z=`$#R&OiU_wUtI){J*TPtgqDTIR97H?#}-&@?;e`?U;YOCg&Gb<owUm;+#Qd<mh&y
z?OD)wtDpE=7K~S@vogTSVZ3iV9m+{~c(!2329=#4=QbLm*(!Ce2D1yJz`<l@^ld`p
zG~W?lssx(R4He6=nX02oZt;ciKUq<faRA2M(YZG)zS?NusXu0c(seat9RN86PEM&X
z=L&6p?65;pTqoaO1TT?5?<PMT>Kqw;4A}V}o)+GFy%x2#`Y1I<QJtF7Vl0+b%Wn#G
zda|n4LHk5bGzTm8w->|9ienU)=nqPBJyJ?1wm+U}qO2be?E{%50`4bYCQ$6LPNsqE
z>Fey=fEp+7wx=gyW{})hSaP+{AB(V?v!gU)3FdS$jRCJXKzkd{J7c4|#>Petatf=G
zFD2OCQ<tTi5}%-4T9{p1#&WPqnQW^Hy(>{QodPiDW|T2S?56SwI;&m_KTK~^PJ~&#
zKdG!qgX(lPP1&pXEVa%|&*$rR&H_W8rIVQt)I3uQb0!|~Oufq)kixSxEep9SmU+>I
zNt{X{pQqBK>WD`SqL4&U7w5<ckXKnlref+qNV*nWY__Scm<9mI@aYu5*>S%YcI<`*
zh8(J4xRy94vZG^J@@u#K`Ws`tx;m}VZS`P^_gAZp)B8}iv}UfU!U{(!FV)_CN5nU*
za*f*wCy|kF$_SXqeny%P|8pDdMb(;1(bO`Z=PN2^wDsmGBj!bn#*@l$(Tpskv#FRf
z^32uJ%Z-?;i8phtPbHtK5%_J^Hj*VjoghzVPZRJCFqtA>J@3{v)Q!lh=XrX0s*pD$
z0j{=HWsPsS9T>n=i)JeR%_zX;oF+&M$nAkyN`ZOfIYaR;FKWJuUtY{sHY)VWY}8wg
zflc0<D5@9s`mAO>r^wz!nRC*ps-VESnp|ze$s|s{P!r|o70#F+g5D>k@b5X3{^VMq
z|GX)DL%mL}rDmzB?@iTm^>Ha|t(<6gYOc&yZJg@b+3J%v>TUEMHSTRR9Y17ovn*Ar
z)wdAiPP&@2u<VJFTUCeIpDjvsEB!Id=vHcUC0X;b)}S<UdO(5h%>`flvjs9=__<mB
z_vsgaH{JiOuC81E&&w27<bQYipI_wpkG}uA`Tj0{&r2hxH+pi+%)0Nh`~8Pq``z8v
zeb8;46({`p7j?O_X8!G+y}IMSNry-c`hU^N7jBnUQ`&^?_W0wj0B?T>c$+)E=}SJ4
z*tfjyvzkn^q#Ya;WT_WjUu`$!Um99nCjZvZzf7EUg*dAoJSo#seTAf~?h)G0)Q8+a
z+UL*S?x&vF=l@C4jz0(b%Z>Mc%Z)nD|K;WNwe_{yD)3*{h$^@{|G&iZiSVU-G;Q|>
z*TeYid}K<kvZ;Un{r45xlFn$?Y4%S?S3sZKi7ul~e*nik6<|zO^*jM-4pgo2=p5MM
zrWw)Bei&Yx-Q*&Mqrry>eR*;gcfy47s?vu3I7{YB6^_!ojD*c^O`=6_GF~O+%3$T{
zawzPzm-<6LgCQ{jI8;x@xZM;?I)<(UcLv|ZfQ%FgT|7#n&S^DUgHP;5?;4iZ9WG#_
zcT{fAu%voYnkL)1bxy!<57ZT81vqAqE$80Pikw%-1#3h8J{LTOV_sZ#fn{=$>hnj#
zA+G(75B8gTzch}aRq3?)ReFBGAmVam#<l?-Y%g`SSiRC&H32>16y|56{PIAd>WK<P
zXJivs%-hs}Kml^Qac|6mS^Cn6PPLdN@o9|{1s8g09^JUZoHsky>B5A5vMNYNv0@7y
z2>EQ9jS@`GY(b$(d<WLrr4K~fw3%L!GZy2B0cG;~K=j%vi>RH}*&>z@D?J+IccHCw
zzc)HxYKPZL=R}JyQNJv0y;?eWWqpbEPp5N7BbvM0&4b;;7yEAxiGWz9O?opMva|Io
z1vFNG*s7so(MyAqT6c7!-r49pH4w4xQfL-!9X@~g`rCSHBJu#!<?PZz*UY??y_KWx
z&wKOh>OUCUQTHudZ1<(##E>QX4RZ?t@>Qz0KTu!8wD`nd+i3{#rTATGM@efK4@P~x
z3T3SF3&4D1t@34=00a5|)+)Mg(_3ZT38oO^i#D4Lb3b9MK}{*5ljvPMD%JVrJ^C}q
z0Q~^<HnSwFUL|=e(0anQ7_U_GiurN(@HOM}9B*l5zu|o#TiF8A$^F?y+oC$;Ro>?9
z8lWF322$oUL_2=c1G$IdBY@oL#)eI#$AH#yV~z_=>xKi@Koj!^b1Di|L?#ghkm8ZT
zQRu!0{0SWwozd<>l3o)dXi}4bI<xS%6NT-}we~Eh;RSo?#QwB+|FQQ;vR6IgKKw2I
zy?QY?j+harElIa2qe&jof1s*M)?~hUy!UMT#i6?vHzm#64WxZH#UFksrZ=G0t(UO3
z)4RI8#guz-TQ9EGfbTQQ*4R3Gk@=B$E1wQCBR8lsQr`j~=hI+j_<D5~JkNZT8wYEe
zpZLw|A7AhPJhSodr$!WVXud|s9aK3wALR_{(7OSV+~q``8+Ys?yJPziv+}gqB{}eo
z12;SE(f!b@)yi(_WJBtn_W*lEs+&I4T{dd>+f@e7a+HQE+x3#Wi=UOrjd_ToMh0X@
z37SWmW@*jokSK*?Ll#RKl@4ZV=VrE<h<Rf(@3+%-P7+cd(O}B%_PI^ZDY*%mm{q34
zp3U^^bx0Q=8)9*nZnsh0H^=N{6sH6GI&<1hreweI@l+B3kMfL-hiYCDTBZCA0A5s+
zWRS@5<-gj2<0?KHB$7jl(WJqn!J|&U6?Oz<n`30g>?@)R)3FlRb%~1rKc)qQnka}y
zn~5}!pi3(^K}>Z;5_NpMz5jZ9>!?(`-`RjdK=IZ6LDAa<q#D$-r(6{s1y8X?M`h8}
zE6BA%&2-7%8*kd&Q1kV);zVzLK)pk*_TE3M+8>u?@qTpw<o<Qh%Qt7b>jA&FLnK4A
z;ob**CJ*Vmo9%X~S?6(7z`J7p9JYr#qOyk>&OoU1M^t_KWwY@?wBCYdc}oMKbi8?+
z5-oO55lXi%J`?K;W$z?%6z|*LAK8d+mE@n^IPzmRG`9Bt)H1jI(-A{>DDg7k_37*0
z?=x@RE9I4rvAkz?fb^TU4frG;YA7|{G+uA!)=4v~CdZP(tBd_$p~(3)Qxo^eTRLFS
z9!UT#IoRSG*R}TWf!j&pz=v^kDSkSLI~#W+y?setU)DUAr(obxvLA2K6u!90lNprF
zH;&3H8)67Ruc9lEmRSK|B;Tq}WYw9JaGEJ_pQZEHR;X+qJ~EcU6c?kay_otJ)zso}
zVKT62#53w!cFBvrD5UE&YzflmWi-5&+X&vra4*&x!N&&MZh78Dz&t42x@N)t$#U7w
z991eM>fPvN9;;228<;nj2f#W55yhShKRnslt&-`9Iry+LJ}~-+RmJKIEt-SB?jG*X
zNa^;VS>aeZGr}yvbNeP-b))3$_H6*V#;kgY|H@fmd?w|Gs`As!KyZ5E1J?;}^5ZIZ
zt@~IzpNj_)79#&^-jDpJKR4X}d=B`poAf`{#Qsa~f7X}f{%7s({^v_P9}9$q&uj~J
zTi`8K<(Q0nowO#^NpdtyXw#U);j#!^H!G3AfzXY}WI38H`3f=9YAw^CW^_28D>|5Y
zJ`7L9-)#7f?aVC2r1W!+*2;C_0gO2xu1dTV)Y17Tp-z3uwcV#(*?rP=-6vhuecCnM
z(yjVCM^gvl(Zo~Hxn(`3v~x_6e-tM*a7>YYOsU`ypG!ZcRBb2|`Z1-NV~X;_!*3HQ
zpDF5(qJ>_<tWf?brP!TD4YOLl44zSLg*ukbNhN^OMDdg|j>_K|TP!WZW)vk6d!Z9Z
zU79T8j$YreV=x#F4T-_RbsOWNCBi&k*&NUm`1O<ev2)6dz@ICqCUHW__lMVIO}v$H
zoq(()8^+2ShP<riwotOMN=IGv&>W>Baq;o7^EbuLle?qDYSU54QfB{@0f|Tbff-#v
z2kH#2GqsZaQ{XYVd(I*^M7&+Xo=|)&4~dualBQkE0tqRLx514hss83=_q)jPL~)6V
zl9WzU>4Y|*tE#!p^9d__N$i6MfDJ1#P#HUjV9TBURoN^qno)Scw?L!lj3yWRoB#wF
z1C0$(Mf^`U$9WGXC_GK_Fk9KQ_*3Mp%QDtlbbfWfxV!6exXw(*0#(N!9<k#N`6$1Y
zKju(y!Y&gR4Fx<%^U<8dlJI@tGzKIFbOwy{nAZUAC4Pq`>B?fotkQqf+O<WV6!yxV
zdJQw=oYqK`*o82~X3$g`bi$TiAxeMb^%gfnFI{mq|5mR#6WsKsnGJHIE4_nP*gl%{
z&bYaMRcGnBlb>;BEU7M5Tw#2HpB0dCJPwc?AL+5qCX_}pek21~uT?Y>$Cvs%(!7^k
z6|}1*80M_#|KQKZz7tJE=q=*ud>;IfoCShe1#2wcKGmtIcOFgy;?2n8Y+fG!Oys;&
z4bq46a`1Sov*Gpj_FpS{o`~Wy5nk?Y?d%>ZdR{&-+;`btm<#9jy{{CR(|-^x;5cXd
zloEC;=+VL=qnzzZMt`%Qd$Zu%6mm}m57YQ?yE_(gPoxi%xPd#nKUvVd*}#JJl^}!t
zk^=x&p8<?kUsXNLKbs-@!p{u;|B&X|tKBL?Q+#q6H}L<<jk@FiSL@IPt*<TD>UaGA
zmw1|Q4i5Ht`E4B?9qv7SbF|wG9_2g%J2rD01oq(c>XibaH!cQQX7}`zPMi2LnvRvE
zv6|r}on%un0HJ6!$}><cQ!&oGYCNB+##v4^reY;$6V;fC0l>vfHKt+=ylSL~F$nNN
z1|fr<WW!;7JCTqPwE`n{w)&*Een@16)yDgssgD|{@<YF;6(rFrHcXXAerJLOQ&ocL
zH%x8dDTpb7)W?AwEye;V^J|L;%=YXw$eXcNHSh54jd`chHSbwzFfo~fkO$HpFoTh>
z6{T+68updd5agINt`Y{bVyCt73Xs~2^D}QHlM$2rh+ZY6#@|}-?im?-3A6^cNW~_v
z`dr4t(Kw{WMqOfKGuE)6In!wejv#JFtT{WHj3)-J@`Ua75Yv^WP-{Hod9Jl-!3+n}
zjcEs+ZdgQk5A^!M&hk{1!|B`*Gv1Qx#c0rPougniXyu3a`W8yVhcR>99N#kw1C0^r
z6-Zi6MzJigMyc66rF(b=s;MdJKBo3qdWb(}_ndc8%XVIPlJq-cAUsfeg>(|(9_tE*
zqw_M-A_YsYG}FLdx@ct-21konNDzuTU8P%&?Q$oX@aq&jee+zl@!;rObQ$BW$|;~(
zLEU^A4V5eRXH5mYe$DY%1}QPbM|uF;J!%{6NyLwD=~qbbfc+pYuxY#M_KB|`){S`w
zz+luGD`_bE&#ub7^5Ox_<al77UtRb9+vu);m1hS12jn-*;OfE4PcP#J`mfHIe{1w*
zWv#v@_dku5JNoa7Jdi}~z8k$6#hqkh1H+F0hMU3H?8~$hpDfwnB^O#9bXmU8jz%E`
zVCOlfT?K+2q6o$j?Z%Xzl|TEv5o?Dic8#4^7GKO<5g|h{szH#9Pt2=dH#S<weU=Xl
zLh5ij?O*-6X})$6$08A|yN5*v+e-{zUx2u{HuvJ*c{Jo5>yb&$<I~aNV~)!?mYy85
z%*BuO|4g#<w|jqk@V9CUe@olPa8uFzTX~7~Z_=o2A@ehS+Ul2h|5^a&yHI%a*eqZL
zZEX1KXhH7J7k=731Y3Xn>~R0pg0XRJEb7UH3N?@TQ9AeTX=F+Ha_?!AbN_8&;dgN8
zUz@0UR;`$Y#ZGrYw$O#0-DkwsN+lMAjZdTPyx96__qe(LYWL{H-s|T!&ED(n84325
z#>sF=Z=;r2jBXRX+>sX0gQWLL`_f%y+tB@|f7#tWauG7E?3?{&wQpk{9PS?O{(r{@
zF1J6-0%+`wjc3#i+(|X6O_NSF?n(Y&-fQYsCklI<Qj&5lxJW9awcz66l4wDqZ12CK
zGMmjukBevjhzG@rX})>(Z0{F-FPis3dGo*Z{F%@HpAS9*`+w8^Ut6!O@%~?5uB|Mu
zt_c479sa`?d79(FpwE<`7=LX90Wsjg0RQ2iHW+|l#Q!opP5`s+K$y({tZYE+XaHUy
zAbLDt#wbYiUn0Z<@R=+KjsoT$0uZT4-0HRi;Sd6j-WrVJ)<t6fj{2jp6Pyw?E3|(g
z@H_!T2*DVHbC8^O`BPW^jQQWV&wnnZ&X>}F%S8WZic3v$DQPY>5i_vDUIxr?>hE51
z6%I_$6K6Jw3A)MIuyx6Q6XFRd@;j<tK#Wt6w9cdUpx=pG*8w*KO6|cAFrNW~eFmfG
z-N*!b|8d$5AUX*kxS+bX&I53Et?L#pGXr6$<Sk%j-{E*L(s!ijTw#<xe*9;w|L9%V
z9pHHCe1<uO^}oKlI&=L4?4`C|Z@~RSqapO)>Ye@f7kR$^ijVx0xVMCB^Z>KZOj9$P
zL2%FcF3t}pf{;zz?(v0r>B%2Ru=tp*iQns$<!R~3*5UJ??A>Dz3t`;rhy*Mem_P0v
zLr<BrSbY2kP3`yZ4JUDSdVD`;ii<Zqf9o-bw5ya{O_iihvehYSs$?h;DyFz$4ABR+
z2J-nmeb)^CRs42-u4l&jpP*4ct&AJ+A855N1OI7#rLnfMT!Z|7y-{DjTmN6;v0PT}
zk{(8XAIHPUtX650-juxo7v8PWCjZ_J;inJ3F2iAB{(e=m9E^Fg*W5Bsc7MU;g8h5E
z|D(CL_2y{*<^I-A*~@?T9n&Dhb=ogG*S+v%pKT$6fb)8U>}^CZ91y**-0iZiQN$5M
zn;ud~z^1YW7PT`nC)d`xv1(rTN7069_gMu<l2JyYt(C?z?%vZtx!;`i`)wczCy;@?
z0q^Wu7We3=4%=1AWk+&NVmd>wZJi(!z3z{PW-vY>;=nK%Qrzz)OWladXeUb!$*LOI
zp5s;r1u!VCYaf{ftkH!{;hAlR>Yn<wDA&2K^qXa*)FBJuc+~GuuPu0>Sx!mGekzqU
zpI@4;j#Xp!PN8a`agZxoc*@E{BbeQR(;xOb2!Uz>%U_X;s{N$(=|Od{FN0SV6AG~J
zoHe>%)K5z32WoISYlLmDKG@h;TH17pFT)PSaxF;HR?L%Q^Mko}42zTvV{IRykACkf
z;AgYdXF=a7@1?ySWfr%W)Xv0E*{-@98?G5%oi-)jS)ZEvO<v?p*oqX?bhA)s4g2AR
zDgKJNa2fU5{UL*6qdygLC}%aAZb<38ZYpxFC|E5+(Fa9Lh<oXbke+#8lvYa(y?WDu
zdeZNYps+T`E7MLnnrUBCc!aqFZ<#V*DL)4BuFjwt+?#9>DThzl(V*RzTm9xHUhe4&
zn0a;yG3pMM^ji_~pPv~n9G)9krv+0=gVA~CvJ^m@1b>J;sB{lFU=?#;G!`DwMA%eG
zQL6*p8DOfPO02T^-~ToI%SM6PDD+g`;{)5@$hV57X2bRFm?-&UDpYX<FpGdIkkGQa
zhhqO|5$zEHOg4EBqonDNMC{ZJ7Tg~qX5m7J?#RTUD3<!+x)ComM*TH%3h%O+sZ>oX
zRnin(jOu)`Dk`Vnv}l-Wc$bO62zHk2;Vw=K^LiTj*e(vR=q(;ZH`NWI(c&Gt9bE!?
zml(i=qr$X}qAWoWXmv2T_2|wkQ8>jrg-L62`$*cRRhJ{gijOv}wRg!Z4zm+Yb~<YX
z2inu6+SssWZY4j7GyS}uH{b1yd}Qw5JDxP#&Xy%@5WJny^)Y}mY}Od#ey4pr?uN+)
z<;8z(pnR+~8umk4VO|-fzs;*z#pE_dGEECjt3EX`W>x&X4E%PeCYb$XF&RXy_%v>%
zb0)-D5~P`=lj*oGOG@WmoweSAuRrVwF!6eV;Sut-;3goo+QF!^^4#b=!AZ?$WtX*e
zPjIoEfViL|N(kR~NrmE^j7QczMu+z3F7_Xs=)6T@Tl(O7Vj*REaK>6PvH<5!Hs*3@
zQ!V{ru0mF{ee~Fw+fqR|#qOnh@5aVpIPOKfsn7yjY-8Hf*7TKGd}lCe3sjBLJ=lNU
zi+labJzS1g?)5rx@1k-K7J~O+WOr}KF&HmdkI9fN-R^bePfPxsbS^l~J$C%d`!F`6
zQl>^Y&R|?=?#*fEA6z7M!>P1f0b1XSt?97T)SH;NUjMjt&i+;&oBDfa;8t9M!kO(f
z0mS;+Yz;(tLmi7N_9%77F*C{-!=2sc(c%8DbW8+6eKR;d-hI7ud>jOi;DNhta6J$N
zIp^x4SSJABtH&xHsg^v}&KTb4>}@trGnZxa*Vp?8&Alep%1ln324gUjQ!kl?bmL_C
zc-@H4lqU-R1peFd$b4raj6Xh(v;?gUwSW6?@8Aem7J(RCShylf_f5B@>XPGHVt<F)
z@~BV5HIyeG#ZVuhiU+|q9SlIM2wgi|_lY)Z6|NVA=7VJbjSaL~p{30zpAb841VP$X
zXeYPAF}qfrNJw>Mr#Kj3T=Ao4L*wqLBokD{JI`3fhPj2zp@to%!kK^r;WnVSAoa7u
zexG0gz?6b1jeJ`epYHM4kaCrGs^FCJg9(J5ancfd0;mZ@)pnzdU=SQCVp{0nnM7kB
z0ugCJ;)K8_qRuZl;l3Vqx2gu=kdEO|#8w!t6rG=kG@^-bKp_F#6GK-4nn|=@_GEeh
z!&RZ+au$hu)8S64W^1HYKYX1Sx{@S95Du-8jWk47R9`tjS-xztZnN1GTqY59R@C8U
zz_T`PXNzEE>2{wc)II&Q_!v^#;D}qS`dAD!0PQYIA%~r$55}*5WzogNM@SL@=EQ2b
z(D918r=#Eu$Eg*(qTnZlty~<_i2gqz-rX&x-Cwp|9lYGd&Om#Yp$SVgJt_pCfPY+r
zedVnNS|UVw&E7ojJ=;HgwFTC*cz<y%G4~hiHT?S>{%Ncvf~rLu!@bcQaiCE>dd;n3
ziU)fEemjB0JHX$d$&EkI3f8}e{9}9n)vK-7JL117l_e5I{p62(BP&N#S4WeX+npTe
z5N%WJU}NH&_2@A1Sy7F=uSqNHgu_ybz@pKHqjGsFxx*Kr7Q@FJ_5IGcJ1~|Ef{he3
z=+X1Bpt{-Bl-=Ox4amHH&i0kxRU%~lSaB)%rx}7$Pe{rV(u{NzsBr!hxCy$w_0#Uw
z5zWs7nvmi$M>itcCgi@+c9FC1L$~p!?6xkqNP;QzuByq)8Df;Z*U!a5!W#|x|9Sr^
z00Lmtp%sgBBX#3Pp)9M}Z>Gl;@y##x4})N*YTgW~Iu+9%<L?tn(P>v<d)n%E)1!KK
z*KECP?&nbe?yWlLR(NF-3yG3i<I$HDFVB$w9_{b!f3`Aixc^<D{}lhfv9iqiKP&4i
zclO_3<XMEJ56hfzR)8p?8IA2J8V*@7#rxaYrZ^15A$4{ZB_lmao{onX=i#s&yozF?
z;2xgnd$o)AC*3gaocEJaHGbDms_p1;#d)w+2b_RfyrQCm=v^xs*oAo-!YMP?VAI6a
zs7gD68qCqgz~4*sZ?9j5r7yn+u%HajA|aGOO0g`BNEEeDJb|s*Npv1w#>iDE6{<`Z
zk(tcfTWE^|P}&qOqG%w3%Y!}Q8+waaq>iO!3&=gS<OJKr)Lv&iqO&>}OTztT$^o~a
zVa)aCY~rM=L?T{^v!v!xpL8SKk5eEVF9ugp2PUI73vjIzxoY+nx*}Z$A$WDJ<HF6e
z>X|}(6TKKGo3yiCpWq-83-i!q8e+}`A}Q6$IuF}g9q6TAg~J|d2H|6(cAxNf*3!|7
z*igF@_RhxC`7YZZh$saZ(*^NiVQ@WeU0lP#X%H+rxOHl6*h9-tnIvR)l<;UkwNJmf
zoqb>3q*jQ44kV@3*xf#OBNA?qe5n#J6Iby_)qyvWulf)0@&HB3nS?|h;Ti<gk(Vz~
z0&EjoO09TN!e!i!l7LT(K};DS89NNDn!|Bd<+<_5+Q<sLtTjT8N7D4bFG#8jVXUw<
zpazsscO51ayDprQC}>9ms(m=pwM+TBFlrVXPquNQ@`<h#J@rw)r&$jpuqCYYq3YGg
zVm7FKGRAtU*dVd2&e6241U!)?)`=I(wWe30c^a|QBuU~ErnMm=Vk>RsQqrmq`h#(Y
zTUAOO^;(~$qGmV{-?@H0ae6MACKoJn8W0QG<<>i&5)Zz{vq_bj*?UAFiqcvvb_m+A
zu2C;>%EvwGYfQ^{*{y_F8Cn{{B(j@|&=hKm0R|PAZbW2tkZDZ&D(u+DT`pv#JJ;3u
zbzps6Fuxjl*6(Nri@;;*T)PEbK&d;k7X)rEpiI#Dn`$x27W1J9vxs)W*qsw8#g(O<
zi0Wjb9#qC*x*N#m5o#4;P0*n>FgpUL8?vv(qaQE;M?B8yV9Lx#pVM%#r)5e&Z8{xy
z*t`HtR?5{Or@%Xd#yu=x?nV&Q`%P!%uO;Y!R?RD}r+EJ0pa3%|lybq!54+U=*q)GG
zkNavNvGk^+5o2bb7uh4N)&V1(ELwebG@EHi%rhvv6LTIf!Vsa$GHNu!u1_6h_B1EF
zCvR}#Vp>cO(v?$TF=ILdBDv(4rgH7%X~(o>ouP9vr8tJybJ$_%6LoXo6TP->h7W0&
zJI>Po-g>?FY`1yzS!j%#^uJe^SKR%7tpWYN)s_04{@)jQwrMpGK^NEo4?NBPU_uKd
z_>s<Zntb->Y1qZjOsscFAiSLZsfO`8`x8JfCrLZ-jZ5uIBKw_vZAY!+esXGGfkkD1
z_o9)P2{csg@7DF%Ron}7H3#5ff>e>s)^jPRg-a<r7SJjkB}?Lzol?oGRxkZP&C0wS
zuN*ffKP+cItfsH1b^50Ll75JXe(u^A=?6yUa&OWf>AUm--uubYOKwIh{dpdEuH9Px
z3x}XtE&IcMacC|sDE-25UL3snMZ%s@Q=T?=vM(HG?{M!I?-xhdiCX*3XPMs|LtM|e
zU;OQLG;$g1Z~m^$ZF#@XgVB<bDAkc2z{}x^H=LKlRqdfSz4+bF;V_aM+}pXGR1jbT
zn25V-+=GsJ`t#i8H}3U$a@g67_kRmLu^Ib+y1YL_88`X=TUl>d|9^El1z7*HcDMh3
zkw>rGbi6k<JSC%g74WS=Rzpl9sxnxrxP>>y#QFQxlKr|QpOf(kbi<Z#;W>!g$x=pT
zY$;DkY%mznUz=Vv&N50-OBYfRisL1m2nn9<KHqz7Z>}X%+<b0&8Z%a1U|L95^mK)u
zusTqh1z=~v8=GRDs!q&sQWenqAkM)FQztC4;V$vD)uO#%SEUNAvDIL}1*~YASIiUi
zn5SEz^^uBjrJyb_fQWdyCX0`I(bXoRl%DW*jf@~qA2=zohF)kXc8tv5B!O0dV)0*!
zQQ{x;os(n`tGS`snp2(M!@dZxVA4owu`9=GvMumpvc=Rw%?xi=MvZn;RAVboUEv3*
z7V<r9w<>c<=do@to9RQ@n34-3Fek%DtNsfZWcofBC+9|+eUI-JT=i|G?@3hd43kyN
zn(POgmamNG-Wls!GmFx*sSsSM0_H*Q8RB7Pg5_Nor}qnP3A=eWHD-DDyH6i#^v8U&
zHW(!->RyTh9m-d}3_cmh#2xjFq<n0Roht#cIu)3Y$6!jp%>crxMQk(iG{o8@5pEiz
zyz4~pQMQ#VphC_Zv5TT1GpkNsiFs8w3rD+$uNEqp1aZ4A<JO>dL#cyDrTjQ;{*SxA
z{=9#P3u+|Cg&lfHrS$(6r~A#%eETmV^*%!xH_89kYs>#rTU%YPv;RNnf3L1Duil;i
zU*Z|4Y$oRz6J*V;y<dXhb#%qTktBtN33Awl3~S`^e?gO(FjK-scyvmOcvLpwV9<$M
zB9|x)<mOJKS)CAw1)Jqu92y^z1_Gr~e}K~7>F<D6dnY^(w2Ee@-{PG~%5hDCkYyOM
z0J1f_hQXQ0P<ymTQC&t6WNWlp5#b{!iEtDEl!mDtNx(2EV=V}v4k7lW4WmpF9~Us{
z;vY}}WwqzMh093t-In_S*2MmaYO-}g+n9M6o<vUu<6(OoRipO!F@#l}q<^}&Qe9rF
zn7@pP$bda{OnE)zw<_MAw31f!G=9wOc|{v()G>dl?pDpKeh0|3`0%6~C1JJK;XJ#2
zblh;UQLR@QflK#Mk@``+iNVD6a{}?L>WI9GTjwEV{B!?pE54v?<BRCYFpQ{oiLdUS
zcK9x|I=*;J`IWYY)W4l*!>ldW*H#!WgnF4dD@>1y*$JVGUt3wC|9`()#y$FPXexX9
zHNG5e)TdUcKL?h=Q|Bp*pSW?NS+>{#a&3^xO%oma9-S>6Xlh)WH?L_PC}K$;V)EhW
zylQ^OtRYH(7sgeXD8^-!WWi=n`_Sr8shb>RG~`rqOs*B`%GE$bq_CY>J+3v7?Vbtc
z?k1#aQwz?9VYkaluhEeHhBOR($HIa<DJkY7Rl8v8<-v<B;F>5{ZdEc>y+4l39VAL7
z<Af(DUyJmpfx~`(#IP~x9og0SwUZ&E>nLyN!Yy4uI63aIsPZRW8#2Xcd5zB!x4eGF
z4UpA}f=X0Y6ACq96{89jBmV0a2574w8?~ce9JLpW-rZ5@G}*1@7+0j)JltMn9kLYX
z<m$XnTg5<teupfbmeIffV3D?mSMTWmi;Igyel?`stl1%BEzfGbVYbF+hW^y+8;v#N
zidw=V;2wgiAnY2#xTo_VG^ex`N`?Ae`c7lfx}b*f?&$8J_MX04NKBK<qs$J~={e-e
zFp}s*GR`p@QqVl_^+nGImv|s?tV9=Pw&*_IFhs_k-ie&VG%C%bo!!Gj^cnY84@fmK
zD<FE8%M5fp+<6tZnIBP2!~ZKX=mou3qNa#m{2XnCBJW!xb*t?xN1VNZ)lPDD43udq
zS*w~C3_a70RIeL*4Q6Pn{iqs<Jn!7S7X;&2G}hI!`9T)aVEm7NbfPx*&Ck#^zlPRR
z?@W|G7TC;UL2!Q<ZyUv!1#oQ(R;QO`;V03EwSJ*)PFY<*)y4|oW4&JXn#_ytMck&z
zi@UUht8*d>??b-#;Y*Kd74r3?^RRbePt9N_r1_5RSQJQT-_Fw@c^ssNfIgFFL6GkL
zHpcV`5Nt<n;+)OP$UN_dXyU_{yNl2Fw}=Klmar$VC8@U0LP{`v96TRJXINoBj)(t{
zTz`CX_}63oJP|nvw)YQyJ=}Z#;>e>4ra;BN!}gwOc9p@CITCg@+K?`36lKXdX~Q%w
z_;r8G7id2GH&&2>gELt8HLiAVg9skXs3@H&<{<q0IQkc<<>F%CS1M@ZWpThSPsTXJ
zqtPePe>3QRy%zX9H0FHzztLD-bM~LB^_4p4|JAiS`QI0L4(Yt+vzVqepRPE5CbZM1
zPXwBowQ8+SXA%YfW!y97JDj4+>l-WUyq1E(qUqD(iJ`fws;8T(56vg!dE;GT>ec#p
zoYS%~%`tN77&?h--*42`H&$ydr?3t6d*?WTHuB5xI1(LeR@~#;n#IAO#oBwE<%%)S
zhOr#+E2h!dSf%>aB}==lF5>nbIA^_(T28+gL%@?6z3s8r%bedT4w<&u0o2>~rv4qZ
zbYuB@SH;u#U1R|eLEXk3;W$(=K(#0Is>R6iYBTKKs2>y<Uk^kmH$<cy_A<A1t(s4g
zcvF>%xl05FI4FQVE3(N&(Vn5uY0t}yHsL`VqYxC@8Qy5(tbW$-wB-Z`Ma$GM4I6Jp
zK|yvSI=*tYqsKBi)-wIoSl(D^Y)~g=hZGk_F7H=3^$+_X9M8<dq5ODqnslnYei&BI
z`j?vZx@7$qAQ7(7=x(g8Z_s$dgGHLPUOu_po1O5IPVB?zA9N%>#C|@C=%lQU#*0)A
zbrtl}B>(TQ%a6^o=){;6Q>$$(uWqa^bN&VeJmaxGp_#?>pUf5JeLX!Yuny2#0U5_C
ztU<w3!M3S<ef8p)tz8#~MVteVO{2QXiZi{S;00M_dR7hMTd1P1+r3&{t!6416l5Bx
z0#FRy2jbo)q5B>DzSu^jP=}CnCypQ$(_SVPEk2^t-;mDx-pIm3@6~zW>Hjl(Pwyuy
z)J5=IT^6J5wllkK^@nu!4*KkCIVha6=O{Xwd5EL#fH)3ogu~YiH0viWtyxM~NM|;p
z&|)?HRx3<c{Fts$UT4<A$E{LYUY!n`cSGw#+@oI}i)B{2XzcYjSK;Nci-G0MLIqvM
zpe~V9TQo3g)q1Var1^sWYSfq)`JN`6o6XWx77$D}P6{KMw{;=B<{%uk&V}=Jlg-+*
zL@`S{{HkF`vcE-TtJ7zwwxBSG`ViQ#SpsYFiI@X>!q85)M78BQ(u_Jc;}s55T9mYf
zuju~xeLCvW3@i_>b=01$x0}kgVYEv*FM5nP$4Z?#+5N_#or>!Xaw`c6=^&ko{T`SI
zCekZTJy5>_Q*6jeLDclLGFK_wzVtFx0d!%~*Zn@~p1_1fyoc~a8~1t<MhFKA!=SQa
zDBPWuQyr?<=^|EJ+;@!vjz9EWgN~>gt(T3}HP?49Xl($3)UH>|SxjMT(Bc|Oi>gDE
zD`&Y<z$zr35yxL`ZDYB%QD040p-d~@9FYy~<b|R8xoQB*30%%sedw7zyc%?$bQAI8
zgZ+duUlw&GN_o~7#;V;`7MNbFE(wnb(ZM5QwM+`7o$-0OI#tL*ViY3*T(PLCwqb9j
zfWmP6O@##os}?7=IwFn(A<i(hjv*CBANr<L*VV$&I1(bIPTjk)yu49gn^<020@5GA
zQ9SW<56}BV)IaHkqfU5I1p|OfiRyqMOQkpX!b!T$PFt(G%6=<U87@+6iW5&W5s89A
zf2<QyhHR|>atag+PE4X$zTa4xtZ6UoS<OY;7hdHL`<+v?08My-oir#s91hN(0B9$|
zIr_LdIr6GqBI%z-!yfB%7n-f}ZrC~RpMq_)pR3;2C#T^*V$tcA1H}y+TjBeM9fW7H
z^z9XmRsz}`S`(Dco}|Q!6xDm$i<A!NdI6_16L#P8Vp;bG^ktt5!!oq0(0k1THr0Tf
zb^r_m-buIKG<W3^jepWPC&K3l+H*$04p^xc!j$vyG7@}CqG5#yrFo`p3<@Ids+u3;
zo*0hxdi`rS3gZfYH@Cv+c~}Zje5f)YKDNu)D?EiIM_bUL63U)Dc_j2?MV>@il;2FW
z)+UXRSi8`Wv}l_L#6gFx&4xrMw1gt*s?s{UC>e%!+l5|YfrpJvA4NN9a$bpAlE0=7
zBbp{Ou!G?fOienBhjBM_WLN!rH~p7upt@)U)EcgvD0PozIqei`(s2aTNf~_3$zG$w
zKsS7DFng@GU<0_NY_r;V)LNvLc$%1uO3ghG6ry*yuAmImmx|l%oaLx21Gn74iO~F_
z6Gg^U7=9sm%+Kf7zP2hxD?K;j1m_5!Nw!<nPe<xug(>F}8dGd_+r_eMk5f#8=vZS=
z5}xWZGFQALZQcO3Ar^$Fp_VCnYIQ{$LC(HOQb$NBwkD_U<=xSYAPiv#M?Hv>S-NKh
zw{gUJtv$9@w>J3#AK*_#nbgUE)@y&P(znDeUw^DvKTyY&C2oE}(%BG+8Zisi$}rVS
zGaE8to^_2{0lY*r8i0qTDc4xvXnZ%Z=@x~jDym&4vz<at^OXZb7TCLa)n_lH)|~d3
z&NZWTqIh5hMS6imT}?!%Nji`|QH3vPV?Co04X;zmg((vu0Ijj1Tu5mh8PsO#>v_ng
z$0rdGdxX?JiB9_|No3gq8WTSq6wHO^5Q|~oh&WM_sHIG;q;`8g_6Xl3QqnA`J#2Ux
z(iU&8_Bm;;fn>$vE1_ty#-&V|C4n9W(_VIw=y}8~O@{%rFmAQH-cMlI!SLuYEmOA?
z%Wl=B+M`8b?Ide=Ct$^QSb6P8&ZkD5DKE^ZI??lujpfEhec8>Zr?kHj@wUm!aB^bt
z5*S(|^D!Hbq+X@52|@8fHj%}>9?o<wvcWXYK5a{8)zlz`*;rjki9IcoySQn^2p%Qj
zdfI`+V;ayDbb~|nXjIqego4h=N&hnXp}c9PR;_0`4z`Dfy`?UwaPI~iF=x_)IU`=m
z#Yh|u@CF0W;e2}0{Ov(OrO&dF3Lk4A^;l^ib#YZ;>m0$XhciGM2fIp?I#(YgP=rUo
zLnN17UPLLbm5$ZG`6@mSbWE4|Y<k_l1QA*L4r98yGMk9p0lBc%!4<*75PzPqOVIv#
z++XBFOm1{}&$gm~A}%<K+^k~1has`D92w&krXnEpAU2Vz0J%hse%ERfRj^kxulvNp
z9E9VJd5E6}Pr7`)Erh&B`q5b~&K1-ep&NB8?ywNX07N(kNL5w~PCl~C94j5x>v>g?
ziae{*45Y5THV;p$C;aP45)Ot#+#_)25HU4h9Z2qL1t&isW@v3=WqD)eyNTRWO(v{q
zE@dkmhA{G?1FsvR-`^%r=s%$xIb$Il!3i|JM-O7FU(T<#$jm@JVP1=;gJjZK0^i89
z5_>_&oYb8GwKVQL8N^Y$+8d`tciJbuIErYZ8S*Huh?Qi8p1{*$J`fKv5G5*|sNXpv
zir7BtyyZIepLzA`k!$BcekEqg#B7;XYRWsi_>nY=SIj#1q<<m$G0bd1GWR_;qUAO0
zec%PD_<G>vu3ja6CZ6StP7X+oq7$035ABz#etFW4l55)?HV>zE?)roeJ5X%8nOY1h
zu{M(PrYa@dOl0D;hcQ)H8Pdc&gmfnAK56&5F<2%mF~TIB^mon+wCXqKXn1{gc1iO$
z#BJ_nL?`vbk$igsGo+9R<7%8B*EExNRvzZ0Y8h%V)yB5lD~hton<F|RC@O4ZAJT48
zd-5^@xNvoM=Z(yK+9yQ7&eE9`Q(N7j|2Nj=4~$$qJqP09!#02qp8zOs6v|z8x{WM1
z7Ej`l&4LNjdc9h6)^?Y1$YZm%f_N!J40W6G5O1uGz2>oAeJ53*`a*&5<+v61LiVfN
zf6{_+FdZV0HCKE8cnpCyF(+;Iyb7E%H&Jnnj6$<f=01>PS>*t-`fD^bceDqX#pw3o
z4C<tRMwDkt!SH}^eNu}Gj}e3961#+e))A@EZpTIGcaiHT=T}?VSfO5D^~+=duFnFW
zhgUtb-HD+jMg5-Oy&6_q`sGQd+v;0pxZqE_^M033VyYb<I-@?#-;mmqZX>C_rA#Z@
zw3K=~aC;sz<Z^h#EjpJH^EB#UGd;l{9AZPBzasrmxsRQ*vI8wIGeHen1mw@^#%gV&
zzV5eK7+x#ApnuO4sv+uK#>0NEtHd80RF;59L(5oDcj&B|5r2F8*~_ix&9BPZ9D4|E
zpQDhicG!hXq16rX>&bb16^7S*TfyySa5`p~GWsi}q-_2X4f{e~?!bvD^&V!cvtze1
zK2|(ZIttqiZ}>q$*(p$q!WM%o4An_0AFGgmE*_;<LW0G{l)>7{ib=I)B)$(21O)@?
z@D-k9EI(d>fNPaj_qtu$4eIc12+>;%ER(tMVK1G7zPRTFwTVj@qK|3vZx6#$*s@cX
z$*=B{ej>a&1QuMCzwAAGwzu0nKH5KiwYPn^-`w5af4zg*3=_nddI~fg(Xe!ko<j34
zz2D-gK8gll2M@6AQqxgbv-+y)-f<G0oYS@!wxCJo&(jp;3qD~-Sf8{G<*KT5GVEU<
z-~Hy^FF%x}uou-=(J+47Gf#&+mJiRX-RcQ`KRIu;cqi#l2~XoQts*acKHJ6v@7xXw
zTRl2lde`Pfd`3G`C~r@azmIAE!VMUf#-`ab4?wbCJWv%bqBF7H-l<Y^dS7Yh`7lZm
zn6hI)qg=o+uNLI8wS)Z&MAr&Vc3oE(=IPzwIW5|M(1}9}IHAdXhBcgw#%-wHEz-op
zjN=W0*D{VFw&><V)QuWWCOdM<t}3S#svtZluo<k*e)c<SbD_kv7+!!&x=vCJ8Dc%~
zo5swR!c8@_Ikpjzc)am|Gf@6)qZAZgi|QWxCW~8PCrj<_P(1T8x`OcJVY`DLPl#RO
zRaL!;PP%Pb?ySm2TiVO2h@}$9?;gJG44$0Q>EG_3$-$=mAq!UrDRa(?OzSeF)Gr_@
zzKy_`CFP6;1w;wRAc6uE^7OVg8KpZ2x||K=c!{quf5+^{Dz4P%D5*F6C7v#gsU_a$
z&mIXOCo3*nx5H$_GU9gFIqSE>C-FOUl4TP76^E5|xl(ON>c2n;5EP!pqklY)Pfn<y
zhi~!eNp#-nyQVT0TiB*P8Y#8{@w^d0b%3g2#XdZX)C#BVPARe529K;{9B)=7*sL$&
zp9(Qf0ycp}#67(&mUAx1Y!mdT>aiX(oq9o`NL&2qd{`8bnDdngScFjbW_v_QlZomd
zoCk$%Vi$X?p!`riRo#~-&t4r?xA$LVI?iq<Pzk_{hyEGcfm;H{Tk0lfx3%X2=qjo;
zgng+LF!gntuQQMl|BaL*&LFsK!&kl8h79vzi`c{d#S_{SB5lUcw8QqV<Z>n`fRNi}
z6HDz9bJ(YD8=1q9Si85ta(lx6R{O&<zY}zWkiK<vp^&(lPW};)1TSNnk@!`889$-v
z82^20HcsPNLibelP>FTtdoaoJ;oE-i$=kOl)SIA&L@PP%R*MM3x1J2Fa4bk+rSgo+
z-M9xn3Fvil|15WUau<{?UnUPlv6k-+LewxL#6r2a3#5+q(RQnoXU7$;U$Ga3(}xB2
zE+)9?)W{xjX2uC;+bs@U65jZMoS>RHAw;LJbCFAfiHq`HbQZEhRdxS@j?SE1s_FL>
z$OJT-+i#)55k2|)6~xWy70&WH)8f3JeFt?Pq7hfua`rQitA5q*@CuRr^vNiC7bdc!
z+pQW~9quRH)v6Zu9T&!mC~GX?UEXNa{KAAF?OvO{RZNzxiZ?xx^UGq@drkiw2nt6r
zQJLe>2#n*~Ve3hP4jwAeBGlz@ytV>(AfU@8)jwP1EAz~^{}F@gPc7pn|4%E+%VPh#
zT3=pShW_6gKHcg6eSzl#{XZ89Q|_1t_-ZA{&H*xg%5{D0M`owT5<s&IiQIYPCt|67
zp)ln@wotgG?^xNb3bULdvp|+J%Q}etvxnx3JTun+#JTrrW!#|uTdOaxTKqq(eD?ox
z=l|`?JYUDBM06Am4)?cro6V!Gr!RMpk6vK=5587)s^jCs-QCwmhg+|Yg0G`qJ3b8p
zNk&1f0Uc}jFMx^(4C1$o<_{b1YYRJ9-2LTf_waS~yy$&n-LcG<Uz%^8%9p9^-%pgC
zUuB!q!+{W+)$_+L-O>YNwwSlHx+!9t#fCEHLW}A3z0;@ykQ**b0}!npv9lsN$5TA3
zng>g^zV@5zI$uF84RrO%d6rO3L9y>xm72ux=iJz7i<1#?0w>&H|6AP8emZUSMxDu6
zpkSv`hC}{_3elE0>VpGIGSYU-)tKabO!WK!^}OuIZIdCS&5NHNR8q2%VaLjw5|LeN
z9K&7DF}B?j@$16}regRnrK(n|HtK#;AoE4=wi!rN`kHzXz-LtV_3qCGb&*_%TToo{
z*Kc0F+%)i`XI_uH7U3Kzw%OxEsM4^Z^)HeY2Z~DpP;|tswk}xnV?5x|p(dImZmwp?
za+32t%Jp*XtMo_B__F}lP&Z^^U$h)3*DcBwJF#d<AlsK<)D&PcHMgsnvltgS`ju)c
z$j^!sH+xu!=tY|*M@REu+~4L;)Ps@)_zUP#4L=#5{s!mXzcYF~4pN0>cEJ@>yx$oY
zE1JOiBT*1#?Js!Y!N8brzLD=Gb%p-OoL?TFMnq|sG-}0oS<|fTM7^}Ia>dljWtW@e
zrO?Hck$A_j?JY_fMVF2JK)Dd*-~1`LEIp7<oNvZUisVV7@j=;s<820#<%1<7yAogG
zj89J|nM(0vg;C|1Ckh=RLF@I=7kURTy9S=C@Y>D-bfHx%Py^4D%M__czsDH#tj;#N
zP6S&t&CH>Ua>1geqL!#AW2kO3gn<UW=Yyr-BfEQWSt=GQHQU$L<4pdp_u<cyTavVe
zBu?|?Is?+`b{8}Ak&FaS&qA}ZS`&~Ld3%Hw!by}-m9H@3q8(B{Bh@2O)d@h|XqLld
zV|FESYDDt~FSLaF)@(6T+y`Wo;N?RT=Vi1vStD$_ACnQAIDTm2yo_E>)`&N|kI0Da
zGCwqNUPgb(tI^^I<ZLr~Yisl&iSsi02`_vpB{=wUZ~nm<sSy&3`kj{tdk!WdvPu0<
z%*)8x*;|kCA&{e>`k7>P?yQG}{ER-+HZq53kzK)(F4_Y^!QjBS48_wADsB(b2j(KW
zPG6E^YQiR;x#mIhC;Nt}AKMom-cI(7|Iu&sF+JBMuLp3uvFQSc-$_HbDe!O~@PYQU
z6SdCKVSG+ox=Bt{JxU!hrR0+ww2qu&2S2>UOMjG|b112jxH5S06On2tP(7pwDz%()
za)?lOF?U}=e^s<F&g|+uh8LR$x(jQys3R%s2boGGS22hOjagQ`0PBLQ1;CMo=E4T*
zA#2cDDDte8b5f?i!nY<|jDp76$`+`qR7tHU(?<{B&1mWnq_pn*qu+TXK~P}T<jqVK
z6RINWsGBm1<e5V4{rIBosmnRJFn%kSvvtW-W=|{g**c77_h;>`*jBK|bZ;Tf>#Exq
z%Ka2ymN*;jn4sWM;whnRX>yNRQbL;RL3Hm|ly$2+C~+}G2`rXPd4e#vwUMgN8i|*m
zdnB-reAc1pXbpLTLUEnEvG{;uc`$mHrOux)7@fI;@t1$bV0``&c{?>CGl%4(#>F2P
zl$zI7KWQDNi40Uoj=jkW;Xu4)T_l6t9Za2RZ3N<iwN!l5gI;^jw8K$osd~O={=fHI
z3#n}`U;g;w2jXKMxZ|xLw&+~b@}_kVB-nozu#jSY`>nzk@(Cqx@AcRf0RVs@{0RYX
zi0X0u@TcP*(N3*Wi4N_u&Pgh4#*-eb$bqZRnOZpnXRee0Kp)Yo^b<_jJoJ}}sb@~@
z<hpwTv>{J@KW1r$6ri*PD1ysleklzxIkn)K)n8JwL?st8SpdNZ;~UEm3r)$v;pH)c
zOIA`+u_c!`m6Aw@2TbMX<SAKFr_P+gT#EO}6ye|&&*vmh16*RT$IVed-1{-41*N1M
z2x&lcrw~6n{qKvhm~VN)9^XJ@dsY(Q+I2mv2w}0#9jS%2`(tP#JMYWlcbWRzmMdPJ
zV>W#`vvpwqErO(qSE1ERi6fVlNPC}&xx4rJr>&Qnicn&1CyPZkvaw(9@4h~ojQxJD
z_*jL;$KpeGWb6-dwKXG@Ay%0&2;@V5P(oYb@Umhi6FuM`<v^WIBN7N~xS^(lY}~^K
z?1P1DLJ25IVt9Tw;!e6iiDo33NZ<+3y}H6ru&pdAHK%h5u65F~Z_@U|2fO6`K9jr1
zYCkc5&LmU9tNoof>?V48vnmu0wzhxVdOj;OppuXFkA6MaZEl#Iy(TIU1W)((k2dDk
zE!(w_IF~Z@s|bs<IX5Qtl#4fGETo?bw##yQb1Fve^5fN4kmXk>h?7)GQYcVB5YQnK
zNN%)QD_;a|5PP@0ZSU{wZs@rQw$XBvMg_twmSw(CKKeDRTc4|Wa`pa%=-Qrk6EfjP
zOdjxwdp_e-vfjZf=GoTE=5E;@^Hgd(N*ztYi<_EkG5}b5y3(T@Y3T({)#l~lPuwA1
zPJ3eKCV-f7=7b%L@3nRG4Q-LMh^t7k1X6`~k0{ObgLq=GhnA}nNK+znB=?evPmh%9
zSS?$ASE|RukP;2FhYzn^PR5RsFG-)wFs0QbM|F(C^=)TJRK;REHU0_AFm?));2Lbi
zE;t>7c;r>ewV3*S%k}#Mt!r8tI@Y->-MMaq<W%q^@lx}B90FHy!sv3T=T$pu{(Xq}
zHFbVubL&Q{aSKuk8{|mO=^mUS&|HnZ-hCf<i=xx<q|MO4;u{|yT-4qPu}v0;ABH#v
z`Qy5oah4~i&*UwcD^$F|rbCEHYYWTdaJYL!$E>3}Q>xP&hv`M{+Nsreb9C_LXv5D@
z_cEb>XKp+P2maQ>qOWw{A<~hU99ukAN>)VWEsldX%@?n>4u32)57IIG1z!_g<1XUS
zQ#vx-JMTNVAUKxGlTy)={Lhc+z}Vh8+?gCw+-<+!p^_?23}&N%DlWy3YMUlD54}rA
z6My@yS6gnEbU909q*=ekzgKF0O;LHGr5jy%AMcbnRoSZzODBV@TlE{Zc>XEkNAb7k
zb#6(Z4<AilvZj}8X$yp;<OFGj{%qxjyXVGdzW$$Dh<;)jH~Iglv;U_?W392ezP1ef
z@3qyH^*jBaFY$b!{+~U2%#<47nHTtcGBEOz?oK6*ytKPhX%jDPb1H4(rEN~7Wer2+
z!rd(ttMV|z8+J5Cz-o-H{!`kFE+AK@aX6Sv$ho3+c+m&Hp>!mPtjloY{mxWfrIq~5
z(p-d(dz-)f&Sn9{NPS>tV!pKy$bN`>P+wT%>vI_oM`P-tZqx-XBnOqmC?2Azv|&I;
zWuqMS=r<8hR5Y~*Zl|uv`kuB`p3<jUsY^$z?@WAP(B&M*luVI|R;MdJtKn%<ds~zR
z>|`JM&W{?1J274f&n(W=KnzYj?~ERt1tPH<DyB!-U<!~`W3;~#B>cy;_*H!G@~5f^
zer6pHfXGrpi*hw>p)wrzdhr?Cc_^8#b^U=D+BeT-6$eMi-Xf3`J%mWc9O)SyhfOCX
zKk1Lo0{{g$UxI8&;;h!J1#+prMBBPeUlt4pQ4VPh#|(z?XYXxy&&|)=^ZzrIG5`Fp
zuQb-`4*$2&r~&`CzH+Dk|3#i@$x6kk$I?Uyg67fI(Hlz=1QxC6>F&{%hkET4XC3Yp
z&{Y6C8IAynO&ix$&kW<_!fcdH5Nr#?4=^z)HVaX%MD@R7{X8euSu=Zx03KDvsH4P+
zfrG?~#V@G@Fk7!E;#kF4k9`ayfNe>9^_c_lF+vrU%}{CFeqy1u;NL`WQAV_jbFBbX
zbs4vD4)#5aCN{22rm{p9*8L=I9svd}urz}0uik?Ndkk1))OhP3S`dC9)X2@&;P??c
zey8>lC&}2FnpvF6lPCz=?V;SfFkDXppyY03t!2N0r(`Xl*B?dJOL1gJK+p)(AXChh
z)#%T+w;%Nbu6=3Z#5*621{+JxD`UUAR2DE9SB&^NQLra2i=DL(<4b$hro{<jV6QE%
zlp#)n_@)JuVYy*J1{${$6FERFDovL!L9F0B>UPljS2@OrtWtS30Y~Mqk_K)-Cj6Ch
zGyn@#;THie2)I|ov{9@t_nQle1wOPn1&T7rew!Jdls#HAEPa<9X;n;WTSqU})R_@A
zSxb;lTD9z?ZaIU%t8*QM12_ebaS2t0^b%9hI;c;^CtYBpN^TYNKq~XVh?hOVq=g`P
z6ulcQ0?JbFE;n^DFAO8igkf<)F24fX#&CE7p_ame^`fgl?B<|xiJDQ%d}m@lU%^|7
zMJG<gSu>C~hGC0cev79UDbJ%y9E=F2B11CpY!`>s((__;8YaBlFbw4h-#wmd<Z1vn
z-n78sswch7Y_WH<6M!QKIPf)1(J|woFu3l>nsEXOFC5ayvS4vM8jN{~UWNi=r>Iv8
zL^4_u(*y6lI*+)*Ruwf!?MSac3o@zKV>5gUFghYa4QK*zjV%}&Kp%%4BlkrT1CRMA
zt&84ngQ6A8t~8^*x`^Lz%1U*PLjsHF#!crqVvsGXfpIPkc2<G%vb79R1Wgl5I`f)V
zGF275fDv#G{}zfP#8OV`J_{nIl}0_;T}}WDG<c4RTQOIewn5rYsoUa~=sfpn0jY;=
znrlA`$?7In#rb7$vBb#;;%o##;cIcRr@YP}rf@dR&$&c`%E>*I5a$M4w#a%Tyf-i<
zI9+r;7ftz(0(=ER#&&P8_*k8RKQ`a5LZZfA1o0hJDt(^{0O@&OD7d%xa4(VtQ~)vq
zZDtBvXT|q?eq^xhBp`4uDzE^|Gd^743C~2d2ljE3?XoISlIM)9Mf*AS!H2rjUR_;@
zC+Ed(cozPHF{75kadH-(L{$K!Rcj44Cu3fS_u$9X0Khg~1|6jxaeVgJZdKwjlXqq*
ztzvMc0oz<z(lVUE&p-dXvGJ6O=$yvM`Bx8@Ci4pl+BxhY2oM9KD|W1;VC8M=N`8ae
z%)5`Og=etE0zV0zIa}e-0~w=fC$1Sg9nbb#92Ds?Uj!$a1YNcm4%JYDHeeV_sSn4Q
z<-=nkpz8%GB@l=wSLUQ0i5?H)4$}D=1qyLuVfm6k$PwD?xu}peeRz52IC(G!{Yl7}
zI0+oiFU<%ri@NCp8ZOv-P2}Rsms^vYe0G;t<Vu>E9*zqWYKm%RYl|ZKL-vy*<VMv`
z5nF|e4g=R}t++9~$@sH7*$iCfaWcuKZy#*EhOzh-gD{MHaPMNbB5(&-Ktyi#?X`qa
z73mDbtPNqTw1U`3(H@ogZoA%Fxe@X80%^CuGuheGh^qjv(Qls5a_ai6?H^z7|NL@y
z=lSld-PcFcGCXxfWN+`f@PMW$?=)Wpq##i&-4riY=?)-4Fd%=x*HGThO7xE6*V5V9
zPm)+~v@Bi4)UB4*2}d}FutEDyZOlV{tIFGx7A+S50~QL_@kDS7&k%)z^Cc173f8Vr
z@I6EXb79X5g#zOsa?B3^2rp!?!MQJkDTr<}fzVxWh>$))C#SVI+~#I<?z8SYZl#6y
zmX1jQwoMMcHZ`;0Ah`n%wAtifHY2iPJahEhL0-;9yOc)GgRLyM_8_5*iOkSoKFFj_
zCI=wWe030HxAF{LWTB7+n3TC5%mjEW6f8vK;$!oM#>^{95F&3kCsTwIyIWNp{No2@
z;jA=sz#4-OL0sfj#WG46otwZC3qDGsrtvV?OdbTA*K85ei@sKXDQ0n$D=BslGv<Kv
z*l#|oN+bvQmWSo`b&Y3>#8jYKMQ>9#0_?<Db0w<zwg`@CwO<Ozj|GREi^y0gOu;z@
zw}4voI!OQ*r;!$e+rT9j-uU7X*%odMI%rb7!eB1qV4)yg64B1oYq88E32w#|EM(A{
z+%&S#guzX4Nrjy$^s8VBXU@!pnUiU96UH4B6C|cZFsl;T9^3|lr;rC@WCXmf8r%k6
zPWyHmqOKZzIPjZWJ{CvEfwyJbC;ns)jDvMcLE(ZFd(F&&Uh^6*uxiZwvX=w~WOI0I
zW(tmNPEv=%W^N6`Hqq!TA{z@s`nvfD0-J}GW@bR8<xD&~B#f12=0K&TM-xS6NHKF8
zkg>^DwA*?$gv%yDo0KRP4~gdIjq7JNZW$hnT}Jhs3;k6n_`qS+Kw-U14yu={p2>j-
zBR(+?y~{P5=R*qoRSj;!it^GCOX-}+&}dbIxj0UKi4$;6Inq>6WRql?*ldH}q8F?8
zrCy8!OD)@rI-hFeBkq>IHWz_tbvu8X!jXNVBg-HjnGbMenW<Kg=leA9qzajUrT-_<
z?=BTT?=xTjM+p2+E#n6LpZapG@jtb-_0^U7^7>kBh4H`YclbYF<oWXYKhfzajGc%;
zo~sCyMw`m*KTuU?>}lk%s!o?(r^JeOmIhwX(GqpiU^Df6l;Y17s5O1n`$JUFx?<7P
z40b(7L+2xueQwatQ5+K;Q4uz3=mJ}G26qR-Cq47`|76_jf4URsoA&?Jm9_t=tuHUr
zw!gN#+`#_7T(95l|6k(am38Yw;N~ar4+(xIcKNf(@QLj`n#>?`UIfu(`ph{I3?_5;
z_W!|T;PesU9}t=34yw{W4K&8|k>GFknQS;9@U<*u<HH9J5G?MQAD@~Mn<amXZ4oA4
zzQ!d#(`uKTE`Ve;6OlhKJ~V4f61^WxodXCG+;^`T-Zn3hR5_BjdtY@@Mxr;0hgs*r
zj-jzxwg#iPb>THcUUAfD1uE9t5Pb-Il}~<3#2JOxQM+vJBf#C$+x-3GM7nnJO!3co
ziE&M=|8<x1TA&_Xpz)cQM3x?i+kt=9O9S!_d{bJiLuW!zy2}5;XVm=tUlp!Cv5cGc
z|CKuS|2p*l*BUj^|6i@$?f+lmxugH@=>LCf`u_uT_-`J|KYKNP`DgzAk4u+NFXN{D
zzfr3*{lC7pzDA@!_W#;i<8J@|5)ZGekEH)Unb!Xj)cRxr(~EwJBJ_;(^&|*7Q3xrw
z7bj*X9`>Y=@Y|8q{$9(^{0(<L8IJecP`zRhmBv7&mfGR<l*yF8<7&TWw_V<KZ$}0@
z9-%PXuIkTT0RQFB4e}qkA^XHKZnFPfU9VgJAN7^xHSGUu^*j6DFY?^c|Nj#7|A$lT
zEiZtTeRI<NQ!IM_G*;oCVgIYD_nADUdp?Y@xWzri5vw*>L%RK*nD|CL(FMp_Bb{8c
zBfQ?3S=`CNqq0i8JG;;JUhhhE;-0ULT%`h97I!;=BeJMs`dVh(yX;@&nKt;|g+(7@
z;Odrmmc{|!^lSU78FS;*Ai;cBTLiF3*a9upiD7zV#eu127ZmzZ<Kr;kc%k)9hqzWt
zgH5T~sz_#7DI9_9O4#uPb%@3b8rAhOYrV4*duts6HNS9VN04>$tun?4^Vy<Ht1H)F
ziH39Of?c6sokIoI={bj{8@`2zGK_mw^P)e1dub{t8TV3OZ33b<3Sdhk^rSP!7{gG!
z`maLw%sBs5@wGbWeugq`IR97ceE!p4inp@D_dj(CzB~WF!1HzRHTwo-6Bf2kpnW3|
z@0)fvrQJvkRu<We#hOO=7A^rYf*KOs%ugB0u*p!?x}idA33_*)!7c41Rv#&&e!Uq4
zYL04l-?6j7;bs6ez3p%~kY9OrSRA9@JB`oeH?){qBl&$94ioeDtJ0I*UqJpC{d>Is
zqj|E|+%orm+C6OU?Y{=rm4-c{=oeBU`kE$~_)e+u#a0v<*vuX+)T_0H%^(?{82x1a
zuz^6Pq-MmIIHLe3%6lN++NiFh@T2UFBQ$W=0uMp#3>O|FV4CwafOO+_l}m_|V~S+{
z2nyY6a}PfsndCe^r5<4DNpVrsE+ME4#LWVKmYDy~Ed8IwA4-2~e_LLXFwUh%dEBdS
z>g$sPc5;;KphJ86f?24Td(z>5P{=WnLGL-L!f&1pqXD(|7-(JhdhaDUA~2X`w(Q@w
z7XSJ?{;4f~|NFQ1ygJ-eD4k6CrAB|}UYIO5lAKeBQ2HMDL0$;^B>7sd&^C+?dI=ik
zKpfUJQl=P^W@Ca9OgIUVB^Vw}jUp@>@np6b;WXP~*^GN^;r8VC(WAzu8`mD=CEKCJ
zM@lmB1zLFCC;MKrS?Xkvh?=G+wH1t3TS=|mhI!LdVugt>RAR%{CatN=!IFM2YsT}8
zCpp5?t=G>f4ue^5vS(E`q~xZVl5a}s&D+7^V@FnC4xtz9yn%I%trJ^Z5})uD&BA-;
zfB)CDS@L1qx_h?sHL_+?uzdpf=0bJ?6>P2VeI;Q!k*Kr3!dDKZ0$fky!>057YIA0Y
zT3TVj@$v5Ko#W#mcyvzmNZq{NdbJw_cGfI@z@}|xZ`wBV=C7~!51M<;z&CnLci)1Y
zlM6529MFPWfUCFeLV44CZJK+}=_A*Kzb0PnANO9qMD+jDi$+N+97OkA8U(QiV;fX-
zmGKS5Gj@ZjEt@bQYq!XX*?wpXEI+o?8eC5&Z1PEbAZ-cI)ZGZ&w#iIM>i4;XZB??N
zJj!a7X?s$;QGK85TYzeX0<RgKg%||?qI)6J&rpYD9EFF2<gw!-n4%1lb3g!$Oi2P`
zv3MSf>mZZ_^TyP1aOhNa#acAjemK31I2&XEv;)^YkB#WUE2u-(6y735D4c}$lW51M
z2Bv}Zt{Ag&CTZV97G_z%+y%5@nip2UihvE<lW~i_DgDevDr^Dl1ySw9oDyXawJX|x
z_r7|}Hub1;AkNYvW>QbW#KKpDF92JBS;B9Ug(*capOVv)%SFLlN^l+y1`$>ztHWP~
zL+&}9k6Uk!UhE$R!Oz6`k0Lh9%q4Qn?!(ULv1dlM`|xb^IB+BMqa6m|3OLp68T683
z834~C)xU1vQrTK7esH*ZxcmRT*=z1Ws55(}IOpr2Hl}I|vk+ZtY1Yl%U9<JFxgP{C
zAHo!t7M}b-RQEz7#lLgP{a4|C{@b7V@?Q(3^J!(=bpN+r2mjYtSzD{E(O>v~rO$W#
z-<Nn&`ET>r=F#q}9N}+pB+x~)J;8SHXSN;W4Qjnwr!C>jh>-7uzW-U$+#3Y5Y!j}*
zQ(fC1elm1p3+LU3;5On4qarsH0AXM_k_p)-Fmv*;76o<VUlD9^#{NHA`iy%_t+rBI
zUv>Na<X`!1@&DFv|F^u}SpFZg`Wfpm^RfFsY(MA4yD9wN^qD#SR=WQg8hyk0zg(li
zw)oHMg8#g{euw|~MV_zCQ^D2yzdk<A0yZb2-~rbHTtRjyD<~4guj)kz@V<D<#GVy=
ztvLX3VxejTN@p@tmz+`Zh;RA7jH81z)j?+=n3B_i^w<oZ?mpjpZT<j)OphZc=Fwxb
zY*-qn5Nd*;hMAnX(X!Zqv!uiZS)dd)rw@XA&AsP;Y`=K9^B&@|@yQ=oVLaM=zZrC|
zP08Fl>yIkto^0w6?cOBLqRjWS2A)Jgfu35#@dXYgjIy4>34_NRCP3(9XddnC9v*T$
zmPu7i(U@XIKb(r!rQ+Xu#m!(MNpbOpM-#cKNc&2tiMlfooPV?yZVIHxKP29J!6$?4
zY#5!E?p>B4YAtRZ9&Y_w6wd?JO8_S>{;gOvRr9t_2V#j{D)e44Pmr$4fs&ti`N%e%
z%cDkaaKlSZly+%;z&{(N_>g6WkKtF^b_Gomo+qa~<@B!H(gtV|e>nyf`G_OYsG%`_
z01X7lpRbj`tVm|gLENC<wzrkp?7cqC9bVftj09%~mgVDq*?t%HFW_GXzrMCQXj8>f
zq0|i)t18V~@#M^;CsdoOzN&u}mTl(6^juO16500^ufAzm^p4g$T!q<e^+(c)qJe2R
zw|rmcv>@GO+K_tn`d1qHrvA*<_U3-g#-D26{1#5NG3~tfnehs|*tK+ibC<YrlpbKr
z!|0OsG8sj$O0F=P&@6bivyxLzPRd#u<hs>L%v7?U^l1aK15(FX4Ds`yeI(sIchB8(
z_uM^q&)swP+&y>C-E;TcJ$KLDbNAdmchB8(_uM^q&)swP+&y>C-Sd&p{||sCaW()*
F0|2o~Rf_-s
diff --git a/psmon-1.0.4/README b/psmon-1.29/README
index d5e2892..d1edece 100644
--- a/psmon-1.0.4/README
+++ b/psmon-1.29/README
@@ -1,123 +1,20 @@
-This file was automatically generated from http://psmon.perlguy.org.uk/index.htm
-at Thu Mar 20 16:20:50 GMT 2003
---------------------------------------------------------------------------------
-
-
- PSMON - Process Monitoring Daemon
-
- psmon is a Perl script which can be run as a stand alone program or a
- fully functional background daemon, capable of logging to syslog with
- customisable email notification facilities.
-
- The user defines a set of rules in an Apache-style plain text
- configuration file. These rules describe what processes should always be
- running on the system, and any limitations on concurrent instances, TTL
- and maximum CPU/memory usage of processes. psmon scans the UNIX process
- table and, using the set of rules defined in the configuration file, will
- respawn any dead processes, and/or slay or "deal with" any aggressive or
- illegal processes.
-
- Originally written and designed for use by a UK ISP, it is designed to be
- as flexible as posible, for use on a per-user, or system-wide server
- basis.
-
- For further detailed information on what psmon can do for you, how
- flexible it is and a list of all its features, please read the
- documentation. Please feel free to email me at nicl@perlguy.org.uk with
- any questions, suggestions or bug reports you may have.
-
-Platforms
-
- psmon is known to work fine on the following Linux distributions:
-
- * Red Hat Linux 6.0, 6.1, 6.2, 7.0, 7.1, 7.2, 7.3, 8.0
- * Mandrake Linux 8.1, 9.0, 9.1 beta
- * Debian Woody, Potato, Sid
- * SuSE Linux 7.2, 7.3
- * Caldera OpenLinux 2.4
-
- Please let me know if you have tested it on any other platforms. Since it
- is written in Perl, using commonly available CPAN modules, it should be
- portable to most *NIX platforms without modification. Unfortunately I have
- not had the oppertunity to put this to the test, (yet).
-
-Downloads
-
- If you use the --user function of psmon, you must upgrade to version 1.0.2
- or better. Earlier versions have a gaping bug whereby the either all or no
- processes in the process table are identified as being owned by the
- specified user.
-
- Recent stable releases:
-
- * Current stable release (http://psmon.perlguy.org.uk/cvs/psmon.tgz)
- * psmon 1.0.2 released 2003/Mar/19
- (http://psmon.perlguy.org.uk/cvs/psmon-1.0.2.tgz 223k)
- * psmon 1.0.1 released 2003/Mar/17
- (http://psmon.perlguy.org.uk/cvs/psmon-1.0.1.tgz 221k)
- * psmon 1.0.0 released 2003/Mar/12
- (http://psmon.perlguy.org.uk/cvs/psmon-1.0.0.tgz 212k)
-
- Development CVS revisions:
-
- * View the development CVS repository at
- http://cvs.perlguy.org.uk/index.cgi/psmon/.
- * Download latest CVS revision in .tar.gz format from
- http://perlguy.org.uk/perl_guy/software/cvstarballs/psmon-cvs.tar.gz.
- * Download latest CVS revision in .tar.bz2 format from
- http://perlguy.org.uk/perl_guy/software/cvstarballs/psmon-cvs.tar.bz2.
- * Download latest CVS revision in .zip format from
- http://perlguy.org.uk/perl_guy/software/cvstarballs/psmon-cvs.zip.
-
-Requirements
-
- psmon is written in Perl, and has been confirmed to work with Perl
- versions 5.005_03, 5.60, 5.61 and 5.80. The following CPAN modules are
- also required:
-
- * POSIX (part of the standard Perl distribution)
- * Getopt::Long (part of the standard Perl distribution)
- * Net::SMTP (download)
- * Proc::ProcessTable (download)
- * Config::General (download)
- * Unix::Syslog (download)
-
- These Perl modules are included in the psmon tarball. The install.sh
- installation script will attempt to install any of these modules if are
- not already installed, with the exception of POSIX, Getopt::Long, and
- Net::SMTP. (The first two will always be present, and the latter can be
- installed manually from the libnet tar.gz file provided). See the CPAN FAQ
- at http://www.cpan.org/misc/cpan-faq.html and psmon documentation for
- further information.
-
-Documentation
-
- o View the current HTML documentation at
- http://psmon.perlguy.org.uk/psmon.html.
- o Download the current man page documentation from
- http://psmon.perlguy.org.uk/psmon.1.
- o View the ChangeLog at http://psmon.perlguy.org.uk/ChangeLog.
- o View the default distribution configuration file at
- http://psmon.perlguy.org.uk/psmon.conf.
-
-Other
-
- Mailing List
- The psmon-general list is a low traffic list for general discussion and
- accouncements relating to psmon.
- * Subscribe to the psmon-general mailing list at
- http://lists.sourceforge.net/lists/listinfo/psmon-general.
- * Search the psmon-general mailing list archive at
- http://sourceforge.net/mailarchive/forum.php?forum=psmon-general.
-
- o View the TODO list at http://psmon.perlguy.org.uk/psmon.html#todo.
- o This project is licensed under the terms of the GNU General Public
- License.
- o Visit the psmon Freshmeat project page at
- http://freshmeat.net/projects/psmon/.
- o Visit the psmon Savannah project page at
- http://savannah.gnu.org/projects/psmon/.
- o Visit the psmon SourceForge project page at
- http://sourceforge.net/projects/psmon/.
- o Please email the author Nic Lawrence at nicl@perlguy.org.uk for help,
- suggestions, bug reports etc.
+psmon is a Perl script which can be run as a stand alone program or a
+fully functional background daemon, capable of logging to syslog with
+customisable email notification facilities.
+
+The user defines a set of rules in an Apache-style plain text
+configuration file. These rules describe what processes should always be
+running on the system, and any limitations on concurrent instances, TTL
+and maximum CPU/memory usage of processes. psmon scans the UNIX process
+table and, using the set of rules defined in the configuration file, will
+respawn any dead processes, and/or slay or "deal with" any aggressive or
+illegal processes.
+
+Originally written and designed for use by a UK ISP, it is designed to be
+as flexible as posible, for use on a per-user, or system-wide server
+basis.
+
+For further detailed information on what psmon can do for you, how
+flexible it is and a list of all its features, please read the
+documentation. Please feel free to email me at nicolaworthington@msn.com
+with any questions, suggestions or bug reports you may have.
diff --git a/psmon-1.0.4/Sys-Load-0.2.tar.gz b/psmon-1.0.4/Sys-Load-0.2.tar.gz
deleted file mode 100644
index 7e94e6b78a88f23f18fef03fae0d4ec6a10e7e1b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1794
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
diff --git a/psmon-1.29/TODO b/psmon-1.29/TODO
new file mode 100644
index 0000000..8c66e46
--- /dev/null
+++ b/psmon-1.29/TODO
@@ -0,0 +1,18 @@
+The following functionality will be added soon:
+
+Code cleanup
+ The code needs to be cleaned up and made more efficient.
+
+killperprocessname directive
+ Will accept a boolean value. If true, only 1 process per process scope will ever be
+ killed, instead of all process IDs matching kill rules. This should be used in conjunc-
+ tion with the new killcmd directive. For example, you may define that a database daemon
+ may never take up more than 90% CPU time, and it runs many children processes. If it
+ exceeds 90% CPU time, you want to issue ONE restart command in order to stop and then
+ start all the database processes in one go.
+
+time period limited rules
+ Functionality to limit validity of process scopes to only be checked between defined time
+ periods. For example, only check that httpd is running between the hours of 8am and 5pm on
+ Mondays and Tuesdays.
+
diff --git a/psmon-1.0.4/Unix-Syslog-0.99.tar.gz b/psmon-1.0.4/Unix-Syslog-0.99.tar.gz
deleted file mode 100644
index 1fcb88631fec07e86cac26a625a617084c09cccc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 12499
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
diff --git a/psmon-1.29/author.jpg b/psmon-1.29/author.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..64820f2352a8ba25110bd5e62c54f6b4b441810e
GIT binary patch
literal 13675
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
JA3|^D{twRzHdz1w
literal 0
HcmV?d00001
diff --git a/psmon-1.29/bin/psmon b/psmon-1.29/bin/psmon
new file mode 100755
index 0000000..eab3192
--- /dev/null
+++ b/psmon-1.29/bin/psmon
@@ -0,0 +1,1716 @@
+#!/usr/bin/perl -w
+
+############################################################
+# $Id: psmon,v 1.29 2005/05/06 16:10:23 nicolaw Exp $
+# psmon - Process Table Monitor Script
+# Copyright: (c)2002,2003,2004,2005 Nicola Worthington. All rights reserved.
+############################################################
+# This file is part of psmon.
+#
+# psmon is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# psmon is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with psmon; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+############################################################
+
+=pod
+
+=head1 NAME
+
+psmon - Process Table Monitoring Script
+
+=head1 VERSION
+
+$Id: psmon,v 1.29 2005/05/06 16:10:23 nicolaw Exp $
+
+=head1 SYNOPSIS
+
+ Syntax: psmon [--help] [--version] [--dryrun] [--daemon] [--cron]
+ [--conf=filename] [--user=user] [--nouser]
+ [--adminemail=emailaddress] [--verbose]
+
+ --help Display this help
+ --version Display full version information
+ --dryrun Dry run (do not actually kill or spawn any processes)
+ --daemon Spawn in to background daemon
+ --cron Disables 'already running' errors with the --daemon option
+ --conf=str Specify alternative config filename
+ --user=str Only scan the process table for processes running as str
+ --nouser Force scanning for all users when not run as superuser
+ --adminemail=str Force all notification emails to be sent to str
+ --verbose Output more verbose information
+
+=head2 crontab
+
+Single user account crontab operation:
+
+ MAILTO="nicolaw@cpan.org"
+ HOME=/home/nicolaw
+ USER=nicolaw
+ */5 * * * * psmon --daemon --cron --conf=$HOME/etc/psmon.conf --user=$USER --adminemail=$MAILTO
+
+Regular system-wide call from cron every 10 minutes to ensure that psmon is still running as a daemon:
+
+ 0,10,20,30,40,50 * * * * psmon --daemon --cron
+
+Only check processes during working office hours:
+
+ * 9-17 * * * psmon
+
+=head1 DESCRIPTION
+
+This script monitors the process table using Proc::ProcessTable, and
+will respawn or kill processes based on a set of rules defined in an
+Apache style configuration file.
+
+Processes will be respawned if a spawn command is defined for a process,
+and no occurrences of that process are running. If the --user command line
+option is specified, then the process will only be spawned if no instances
+are running as the specified userid.
+
+Processes can be killed off if they have been running for too long,
+use too much CPU or memory resources, or have too many concurrent
+versions running. Exceptions can be made to kill rulesets using the
+I<PIDFile> and I<LastSafePID> directives.
+
+If a PID file is declared for a process, psmon will never kill the
+process ID that is contained within the pid file. This is useful if for
+example, you have a script which spawns hundreds of child processes
+which you may need to automatically kill, but you do not want to kill
+the parent process.
+
+Any actions performed will be logged to the DAEMON syslog facility by default.
+There is support to optionally also send notifications emails to an
+administrator on a global or pre-rule basis.
+
+=head1 OPERATION
+
+=over 4
+
+=item --help
+
+Display this help.
+
+=item --version
+
+Display full version information.
+
+=item --dryrun
+
+Execute a dry-run (do not actually kill or spawn and processes).
+
+=item --daemon
+
+Spawn in to background daemon.
+
+=item --cron
+
+Disables already running warnings when trying to launch as another daemon.
+
+=item --conf=I<filename>
+
+Specify alternative config filename. The configuration file defaults
+to /etc/psmon.conf when running as superuser, or ~/etc/psmon.conf when
+running as a non-superuser.
+
+=item --user=I<user>
+
+Only scan the process table for processes running under this username.
+
+=item --nouser
+
+Force scanning for all users when not run as superuser. By default psmon
+will only scan processes belonging to the current user for non-superusers.
+
+=item --adminemail=I<emailaddress>
+
+Force all notification emails to be sent to this email address. This
+option will override all I<AdminEmail> directives within the configuration
+file.
+
+=item --verbose
+
+Output more verbose information.
+
+=back
+
+=head1 INSTALLATION
+
+In addition to Perl 5.005_03 or higher, the following Perl modules are
+required:
+
+ Proc::ProcessTable
+ Config::General
+ Getopt::Long
+ POSIX
+ IO::File
+ File::Basename
+
+These two additional modules are not required, but will provide enhanced
+functionality if present.
+
+ Net::SMTP
+ Unix::Syslog
+
+The POSIX module is usually supplied with Perl as standard, as is
+IO::File and File::Basename. All these modules can be
+obtained from CPAN. Visit http://search.span.org and http://www.cpan.org
+for further details. For the lazy people reading this, you can try the
+following command to install these modules:
+
+ for m in Config::General Proc::ProcessTable Net::SMTP \
+ Unix::Syslog Getopt::Long; do perl -MCPAN -e"install $m";done
+
+Alternatively you can run the install.sh script which comes in the
+distribution tarball. It will attempt to install the right modules,
+install the script and configuration file, and generate UNIX man page
+documentation.
+
+By default psmon will look for its runtime configuration in /etc/psmon.conf,
+although this can be defined as otherwise from the command line. For system
+wide installations it is recommended that you install your psmon in to the
+default location.
+
+=cut
+
+
+
+package PSMon;
+
+use strict;
+use Getopt::Long ();
+use Config::General ();
+use POSIX ();
+use IO::File ();
+use Proc::ProcessTable ();
+use File::Basename ();
+
+# Define constants
+use constant DEBUG => $ENV{'PSMon_DEBUG'} ? 1 : 0;
+use constant PREFIX => ''; # You may want to set this to /home/joeb or something
+
+# Declare global package variables
+use vars qw($VERSION $SELF %OPT %C); # I want to move %OPT, and %C out of global space
+
+$| = 1; # Autoflush output
+($SELF = $0) =~ s|^.*/||;
+$VERSION = sprintf('%d.%02d', q$Revision: 1.29 $ =~ /(\d+)/g);
+
+# Get command line options
+%OPT = ( default_conf => PREFIX.'/etc/psmon.conf' );
+Getopt::Long::GetOptions(\%OPT, qw(help version verbose daemon cron dryrun
+ conf=s config=s user=s nouser adminemail=s));
+
+# Display help or version info and exit if required
+display_help(0) if exists $OPT{help};
+display_version(0) if exists $OPT{version};
+
+# Open syslog with PERROR (output to terminal)
+my $msg = PSMon::Logging->new(options => \%OPT, config => \%C, SELF => $SELF);
+
+# Check the user we should be running as
+parse_user_to_run_as();
+$OPT{conf} ||= $OPT{config};
+$OPT{conf} = get_config_to_read_from($OPT{conf});
+
+
+
+=pod
+
+=head1 CONFIGURATION
+
+The default configuration file location is /etc/psmon.conf. A different
+configuration file can be declared from the command line. You will find
+an example configuration file supplied in the etc/ directory of the
+distribution tarball. It is recommended that you use this as a guide to
+writing your own configuration file by hand. Alternatively you can use
+the B<psmon-config> script which will interactively create a configuration
+for you.
+
+Syntax of the configuration file is based upon that which is used by
+Apache. Each process to be monitored is declared with a Process scope
+directive like this example which monitors the OpenSSH daemon:
+
+ <Process sshd>
+ spawncmd /sbin/service sshd start
+ pidfile /var/run/sshd.pid
+ instances 50
+ pctcpu 90
+ </Process>
+
+There is a special I<*> process scope which applies to I<all> running
+processes. This special scope should be used with extreme care. It does
+not support the use of the I<SpawnCMD>, I<PIDFile>, I<Instances> or I<TTL>
+directives. A typical example of this scope might be as follows:
+
+ <Process *>
+ pctcpu 95
+ pctmem 80
+ </Process>
+
+Global directives which are not specific to any one process should be placed
+outside of any Process scopes.
+
+=head2 DIRECTIVES
+
+Configuration directives are not case sensitive, but the values that they
+define are.
+
+=over 4
+
+=item AdminEmail
+
+Defines the email address where notification emails should be sent to.
+May be also be used in a process scope which will take priority over a
+global declaration. Defaults to root@localhost.
+
+=item DefaultEmailMethod
+
+Defines which method should be used by default to try and send notification
+emails. Legal values are 'SMTP' or 'sendmail'. Defaults to 'sendmail'.
+
+=item Dryrun
+
+Forces psmon to act in the same way as if the --dryrun command line switch
+had specified. This is useful if you want to force a specific configuration
+file to only report and never actually take any automated action.
+
+=item Facility
+
+Defines which syslog facility to log to. Valid options are as follows;
+LOG_KERN, LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_SYSLOG, LOG_LPR,
+LOG_NEWS, LOG_UUCP, LOG_CRON, LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2,
+LOG_LOCAL3, LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6 and LOG_LOCAL7. This
+functionality requires the Unix::Syslog module. Defaults to LOG_DAEMON.
+
+=item Frequency
+
+Defines the frequency of process table queries. Defaults to 60 seconds.
+
+=item KillLogLevel (previously KillPIDLogLevel)
+
+The same as the loglevel directive, but only applies to process kill actions.
+Takes priority over the loglevel directive. May be also be used in a
+Process scope which will take priority over a global declaration.
+Undefined by default.
+
+=item LastSafePID
+
+When defined, psmon will never attempt to kill a process ID which is
+numerically less than or equal to the value defined by lastsafepid. It
+should be noted that psmon will never attempt to kill itself, or a process ID
+less than or equal to 1. Defaults to 100.
+
+=item LogLevel
+
+Defines the loglevel priority that notifications to syslog will be
+marked as. Valid options are as follows; LOG_EMERG, LOG_ALERT, LOG_CRIT,
+LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO and LOG_DEBUG. The log level
+used by a notification for any failed action will automatically be
+raised to the next level in order to highlight the failure. May be also be used
+in a Process scope which will take priority over a global declaration. This
+functionality requires the Unix::Syslog module. Defaults to LOG_NOTICE.
+
+=item NeverKillPID
+
+Accepts a space delimited list of PIDs which will never be killed.
+Defaults to 1.
+
+=item NeverKillProcessName
+
+Accepts a space delimited list of process names which will never be
+killed. Defaults to 'devfsadmd kswapd kupdated mdrecoveryd pageout sched init fsflush'.
+
+=item NotifyEmailFrom
+
+Defines the email address that notification email should be addresses
+from. Defaults to <username>@I<hostname>.
+
+=item SendmailCmd
+
+Defines the sendmail command to use to send notification emails if there
+is a failure with the SMTP connection to the host defined by I<SMTPHost>.
+Defaults to '/lib/sendmail -t' or '/usr/sbin/sendmail -t'.
+
+=item SMTPHost
+
+Defines the IP address or hostname of the SMTP server to used to send
+email notifications. This functionality requires the Net::SMTP module.
+Defaults to localhost.
+
+=item SMTPTimeout
+
+Defines the timeout in seconds to be used during SMTP connections. This
+functionality requires the Net::SMTP module. Defaults to 20 seconds.
+
+=item SpawnLogLevel
+
+The same as the loglevel directive, but only applies to process spawn actions.
+Takes priority over the loglevel directive. May be also be used in a
+Process scope which will take priority over a global declaration.
+Undefined by default.
+
+=item ProtectSafePIDsQuietly
+
+Accepts a boolean value of On or Off. Suppresses all notifications of
+preserved process IDs when used in conjunction with the I<LastSafePID>
+directive. Defaults to Off.
+
+=back
+
+=head2 PROCESS SCOPE DIRECTIVES
+
+=over 4
+
+=item AdminEmail
+
+Defines the email address where notification emails should be sent to.
+Takes priority within the process scope over the global I<AdminEmail> directive,
+but not over the I<AdminEmail> command line option.
+
+=item Instances
+
+Defines a maximum number of instances of a process which may run. The
+process will be killed once there are more than this number of occurrences
+running, and its process ID isn't contained in the defined pid file.
+
+=item KillCmd
+
+Defines the full command line to be executed in order to gracefully
+shutdown or kill a rogue process. If the command returns a boolean true
+exit status then it is assumed that the command failed to execute
+successfully. If no KillCmd is specified or the command fails, the
+process will be killed by sending a SIGKILL signal with the standard
+kill() function. Undefined by default.
+
+=item NoEmail
+
+Accepts a boolean value of True or False. Supresses all notification
+emails for this process scope. Defaults to False.
+
+=item NoEmailOnKill
+
+Accepts a boolean value of True or False. Supresses process killing
+notification emails for this process scope. Defaults to False.
+
+=item NoEmailOnSpawn
+
+Accepts a boolean value of True or False. Supresses process spawning
+notification emails for this process scope. Defaults to False.
+
+=item PctCpu
+
+Defines a maximum allowable percentage of CPU time a process may use.
+The process will be killed once its CPU usage exceeds this threshold
+and its process ID isn't contained in the defined pidfile.
+
+=item PctMem
+
+Defines a maximum allowable percentage of total system memory a process
+may use. The process will be killed once its memory usage exceeds this
+threshold and its process ID isn't contained in the defined pidfile.
+
+=item PIDFile
+
+Defines the full path and filename of a file created by a process which
+contain its main parent process ID. Psmon will not kill the PID number
+which is contained within the I<PIDFile>.
+
+=item SpawnCmd
+
+Defines the full command line to be executed in order to respawn a dead
+process.
+
+=item TTL
+
+Defines a maximum time to live (in seconds) of a process. The process
+will be killed once it has been running longer than this value, and
+its process ID isn't contained in the defined pidfile.
+
+=back
+
+=head2 EXAMPLES
+
+ <Process syslogd>
+ spawncmd /sbin/service syslogd restart
+ pidfile /var/run/syslogd.pid
+ instances 1
+ pctcpu 70
+ pctmem 30
+ </Process>
+
+Syslog is a good example of a process which can get a little full
+of itself under certain circumstances, and excessively hog CPU and
+memory. Here we will kill off syslogd processes if it exceeds 70%
+CPU or 30% memory utilization.
+
+Older running copies of syslogd will be killed if they are running,
+while leaving the most recently spawned copy which will be listed in
+the PID file defined.
+
+ <Process httpd>
+ spawncmd /sbin/service httpd restart
+ pidfile /var/run/httpd.pid
+ loglevel LOG_CRIT
+ adminemail pager@noc.company.com
+ </Process>
+
+Here we are monitoring Apache to ensure that it is restarted if
+it dies. The pidfile directive in this example is actually
+redundant because we have not defined any rule where we should
+consider killing any httpd processes.
+
+All notifications relating to this process will be logged with the
+syslog priority of critical (LOG_CRIT), and all emailed to
+pager@noc.company.com which could typically forward to a pager.
+
+Any failed attempts to kill or restart a process will automatically
+be logged as a syslog priority one level higher than that specified.
+If a restart of Apache were to fail in this example, a wall
+notification would be broadcast to all interactive terminals
+connected to the machine, since the next log priority up from
+LOG_CRIT is LOG_EMERG.
+
+Note that the functionality to log information to syslog requires
+the Unix::Syslog module. In the event that Unix::Syslog is not
+installed, PSMon will write all status messages that would have
+been destined for syslog, to STDERR instead.
+
+ <Process find>
+ noemail True
+ ttl 3600
+ </Process>
+
+Kill old find processes which have been running for over an hour.
+Do not send an email notification since it's not too important.
+
+=cut
+
+
+
+
+# Read the config file and setup signal handlers
+%C = read_config($OPT{conf});
+$OPT{dryrun} = 1 if $C{dryrun};
+if ($C{disabled}) {
+ $msg->Log('LOG_CRIT', "Your configuration file '$OPT{conf}' is disabled. Remove the 'Disabled True' directive from the file.");
+ exit 3;
+}
+
+
+
+=pod
+
+=head1 SIGNALS
+
+=over 4
+
+=item HUP
+
+Forces an immediate reload of the configuration file. You should
+send the HUP signal when you are running psmon as a background
+daemon and have altered the psmon.conf file.
+
+=item USR1
+
+Forces an immediate scan of the process table.
+
+=back
+
+=head1 EXIT CODES
+
+=over 4
+
+=item Value 0: Exited gracefully
+
+The program exited gracefully.
+
+=item Value 2: Failure to lookup UID for username
+
+The username specified by the --user command line option did not resolve to a valid
+UID.
+
+=item Value 3: Configuration file is disabled
+
+The configuration file is disabled. (It contains an active 'Disabled' directive).
+
+=item Value 4: Configuration file does not exist
+
+The specified configuration file, (default or user specified) does not exist.
+
+=item Value 5: Unable to open PID file handle
+
+Failed to open a read-only file handle for the runtime PID file.
+
+=item Value 6: Failed to fork
+
+An error occurred while attempting to fork the child background daemon process.
+
+=item Value 7: Unable to open PID file handle
+
+Failed to open a write file handle for the runtime PID file.
+
+=back
+
+=head1 PERFORMANCE
+
+psmon is not especially fast. Much of its time is spent reading the process table.
+If the process table is particularly large this can take a number of seconds.
+Although is rarely a major problem on todays speedy machines, I have run a few tests
+so you take look at the times and decide if you can afford the wait.
+
+Approximate figures from release 1.0.3:
+
+ CPU OS Open Files/Procs 1m Load Real Time
+ PIII 1.1G Mandrake 9.0 10148 / 267 0.01 0m0.430s
+ PIII 1.2G Mandrake 9.0 16714 / 304 0.44 0m0.640s
+ Celeron 500 Red Hat 6.1 1780 / 81 1.27 0m0.880s
+ PII 450 Red Hat 6.0 300 / 23 0.01 0m1.050s
+ 2x Xeon 1.8G Mandrake 9.0 90530 / 750 0.38 0m1.130s
+ Celeron 500 Red Hat 6.1 1517 / 77 1.00 0m1.450s
+ PIII 866 Red Hat 8.0 3769 / 76 0.63 0m1.662s
+ PIII 750 Red Hat 6.2 754 / 35 3.50 0m2.170s
+
+These production machines were running the latest patched stock distribution kernels.
+I have listed the total number of open file descriptors, processes running and 1 minute
+load average to give you a slightly better context of the performance.
+
+Approximate figures from release 1.17:
+
+ CPU OS 1m Load CPU Time
+ UltraSPARC-IIe 500Mhz SunOS 5.9 0.10 0m0.550s
+ Athlon XP 2400+ 2Ghz RHEL 3.0 1.00 0m0.150s
+
+=cut
+
+# Run a single check
+unless (exists $OPT{daemon}) {
+ print "Reopening syslog facility\n" if $OPT{verbose};
+ # Reopen syslog without PERROR (no output to terminal)
+ $msg->closelog();
+ $msg->openlog($C{facility});
+
+ # Run a single check
+ check_processtable(exists $OPT{user} ? $OPT{user} : '');
+
+# Run as a daemon
+} else {
+ # Read the config file and setup signal handlers
+ $SIG{'HUP'} = sub {
+ $msg->Log('LOG_NOTICE', 'Received SIGHUP; reloading configuration');
+ %C = read_config($OPT{conf});
+ };
+ $SIG{'USR1'} = sub {
+ $msg->Log('LOG_NOTICE', 'Received SIGUSR1; checking process table immediately');
+ check_processtable(exists $OPT{user} ? $OPT{user} : '');
+ };
+
+ # Figure out the PID file name
+ my ($x,$y) = (POSIX::getcwd.$OPT{conf},0);
+ for (0..length($x)-1) { $y += ord substr($x,$_,1); }
+ my @piddirs = qw(/var/run /tmp .);
+ my $pidfile = '/var/run/psmon.pid';
+ for my $piddir (@piddirs) {
+ my $pidfile2 = sprintf("%s%s/%s-%s-%s.pid", PREFIX,
+ $piddir,
+ $SELF,
+ ($OPT{user} ? $OPT{user} : $>),
+ $y
+ );
+ if (-d File::Basename::dirname($pidfile2) && -w File::Basename::dirname($pidfile2)) {
+ $pidfile = $pidfile2;
+ last;
+ }
+ }
+
+ print "Using PID file $pidfile\n" if $OPT{verbose};
+
+ # Debug
+ TRACE("\$OPT{conf} = $OPT{conf}\n");
+ TRACE("\$OPT{default_conf} = $OPT{default_conf}\n");
+ TRACE("\$pidfile = $pidfile\n");
+
+ # Launch in to the background
+ daemonize($pidfile);
+
+ # Reopen syslog without PERROR (no output to terminal)
+ $msg->closelog();
+ $msg->openlog($C{facility});
+
+ # Die if you remove the runtime PID file
+ while (-f $pidfile) {
+ check_processtable(exists $OPT{user} ? $OPT{user} : '');
+ sleep $C{frequency};
+ }
+}
+
+# Finish
+$msg->Log('LOG_NOTICE', "Terminating.\n");
+$msg->closelog();
+exit;
+
+
+
+
+
+########################################
+# User subroutines
+
+=pod
+
+=head1 SUBROUTINES
+
+=over 4
+
+=item check_processtable()
+
+Reads the current process table, checks and then executes any appropriate
+action to be taken. Does not accept any parameters.
+
+=cut
+
+sub check_processtable {
+ my $uid = shift;
+
+ # Slurp in the process table
+ my %proc;
+ print "Scanning process table\n" if $OPT{verbose};
+ my $t = new Proc::ProcessTable;
+ if (!grep(/^fname$/,$t->fields)) {
+ $msg->Log('LOG_CRIT', "Process::Table does not support fname on your platform");
+ print "Process::Table does not support fname on your platform\n" if $OPT{verbose};
+ exit 9;
+ }
+ foreach my $p (@{$t->table}) {
+ # Only grab information on processes we have rules for
+ next unless $C{process}->{'*'} || $C{process}->{$p->{fname}};
+
+ # Skip processes that don't belong to the specified UID if applicable
+ next if $uid && $p->{uid} != $uid;
+
+ my $i = !exists $proc{$p->{fname}} ? 0 : @{$proc{$p->{fname}}};
+ $proc{$p->{fname}}->[$i] = {
+ pid => $p->{pid},
+ ppid => $p->{ppid},
+ fname => $p->{fname},
+ tty => $p->{ttynum},
+ start => $p->{start},
+ pctcpu => isnumeric($p->{pctcpu}) || 0,
+ pctmem => isnumeric($p->{pctmem}) || 0,
+ };
+ }
+ undef $t;
+
+ # Debug
+ DUMP('%proc',\%proc);
+
+ print "Calculating action to take\n" if $OPT{verbose};
+
+ # Build a list of bad naughty processes
+ my %slay;
+ foreach my $process (keys %{$C{process}}) {
+ next unless exists $proc{$process} || $process eq '*';
+
+ # Debug
+ TRACE("Checking $process ... \n");
+ DUMP('$C{process}->{$process}',$C{process}->{$process});
+
+ foreach my $p (@{$proc{$process}}) {
+ # Too many instances running
+ if ($C{process}->{$process}->{instances} && @{$proc{$process}} > $C{process}->{$process}->{instances}) {
+ push @{$slay{$process}}, {
+ pid => $p->{pid},
+ cause => 'instances',
+ reason => sprintf("%d instances exceeds limit of %d",
+ scalar @{$proc{$process}},
+ $C{process}->{$process}->{instances})
+ }
+ }
+
+ # Exceeded TTL
+ if ($C{process}->{$process}->{ttl} && time() - $p->{start} > $C{process}->{$process}->{ttl}) {
+ push @{$slay{$process}}, {
+ pid => $p->{pid},
+ cause => 'ttl',
+ reason => sprintf("%d exceeds TTL of %d",
+ time() - $p->{start},
+ $C{process}->{$process}->{ttl})
+ }
+ }
+
+ # Check CPU and Memory usage
+ pctcheck($process,$p,\%slay);
+ }
+ }
+
+ # Check CPU and Memory usage for *ALL* processes
+ if ($C{process}->{'*'}) {
+ while (my ($process,$proclist) = each %proc) {
+ for my $p (@{$proclist}) {
+ pctcheck($process,$p,\%slay,'*');
+ }
+ }
+ }
+
+ # Check CPU and Memory usage
+ sub pctcheck {
+ my ($process,$p,$slayref,$scope) = @_;
+ $scope ||= $process;
+
+ # Exceeded CPU Percent
+ $C{process}->{$scope}->{pctcpu} = isnumeric($C{process}->{$scope}->{pctcpu});
+ if ($C{process}->{$scope}->{pctcpu} && $p->{pctcpu} > $C{process}->{$scope}->{pctcpu}) {
+ push @{$slayref->{$process}}, {
+ pid => $p->{pid},
+ cause => 'pctcpu',
+ reason => sprintf("%.2f%% CPU usage exceeds limit of %.2f%%",
+ $p->{pctcpu},
+ $C{process}->{$scope}->{pctcpu})
+ }
+ }
+
+ # Exceeded Memory Percent
+ $C{process}->{$scope}->{pctmem} = isnumeric($C{process}->{$scope}->{pctmem});
+ if ($C{process}->{$scope}->{pctmem} && $p->{pctmem} > $C{process}->{$scope}->{pctmem}) {
+ push @{$slayref->{$process}}, {
+ pid => $p->{pid},
+ cause => 'pctmem',
+ reason => sprintf("%.2f%% memory usage exceeds limit of %.2f%%",
+ $p->{pctmem},
+ $C{process}->{$scope}->{pctmem})
+ }
+ }
+ }
+
+ print "Killing bad processes\n" if keys %slay && $OPT{verbose};
+ # Kill naughty processes
+ while (my ($process,$aryref) = each %slay) {
+ # Decide what loglevel we should report the action as
+ my $loglevel = $msg->loglevel($C{process}->{$process}->{killloglevel} ||
+ $C{process}->{$process}->{loglevel} ||
+ $C{killloglevel} || $C{loglevel} || $msg->loglevel('LOG_NOTICE'));
+
+ # Protect safe process IDs
+ if ($C{process}->{$process}->{pidfile} && !$C{process}->{$process}->{ppid}) {
+ if (-e $C{process}->{$process}->{pidfile} && open(FH,$C{process}->{$process}->{pidfile})) {
+ $C{process}->{$process}->{ppid} = <FH>;
+ chomp $C{process}->{$process}->{ppid};
+ close(FH);
+ }
+ }
+ my $ppid = $C{process}->{$process}->{ppid} || 0;
+
+ # See about slaying each of these process instances
+ foreach my $slayref (@{$aryref}) {
+ next if $slayref->{pid} == $ppid
+ || $slayref->{pid} == $$
+ || $slayref->{pid} <= 1
+ || $C{neverkillpid} =~ /\b$slayref->{pid}\b/
+ || $C{neverkillprocessname} =~ /(^|\s+)$process(\s+|$)/;
+
+ # Define who to mail alerts to
+ my $mailto = ($C{process}->{$process}->{noemailonkill} || $C{process}->{$process}->{noemail}) ? '' :
+ $OPT{adminemail} ? $OPT{adminemail} :
+ $C{process}->{$process}->{adminemail} || $C{adminemail};
+
+ # Try to slay the process
+ slay_process($process, $loglevel, $mailto, $slayref,
+ exists $C{process}->{$process}->{killcmd} ? $C{process}->{$process}->{killcmd} : '');
+ }
+ }
+
+ # Spawn any dead processes
+ foreach my $process (keys %{$C{process}}) {
+ # Only attempt to spawn a process if there are no current instances, and there is a spawncmd directive defined
+ if (!exists $proc{$process} && exists $C{process}->{$process}->{spawncmd}) {
+
+ # Decide what loglevel we should report the action as
+ my $loglevel = $msg->loglevel($C{process}->{$process}->{spawnloglevel} ||
+ $C{process}->{$process}->{loglevel} ||
+ $C{spawnloglevel} || $C{loglevel} || $msg->loglevel('LOG_NOTICE'));
+
+ # Define who to mail alerts to
+ my $mailto = ($C{process}->{$process}->{noemailonspawn} || $C{process}->{$process}->{noemail}) ? '' :
+ $OPT{adminemail} ? $OPT{adminemail} :
+ $C{process}->{$process}->{adminemail} || $C{adminemail};
+
+ # Try to spawn the process
+ spawn_process($process, $loglevel, $mailto, $C{process}->{$process}->{spawncmd});
+ }
+ }
+
+ # Explicitly nuke it for the paranoid (yes I know it's a locally scoped lexical!) ;-)
+ undef %proc;
+}
+
+=pod
+
+=item slay_process()
+
+Attempts to kill a process with its killcmd, or failing that using the kill() function.
+Accepts the process name, syslog log level, email notification to address and a reference
+to the %slay hash.
+
+=cut
+
+# Type to slay a process
+sub slay_process {
+ my ($process, $loglevel, $mailto, $slayref, $cmd) = @_;
+
+ # Protect safe processes
+ if ($slayref->{pid} <= $C{lastsafepid} && !$C{protectsafepidsquietly}) {
+ print_init_style("Saving PID $slayref->{pid} ($process) from death",'OK');
+ $msg->alert($loglevel, $mailto, "Saved safe PID $slayref->{pid} ($process) from death");
+
+ # This process is not protected
+ } else {
+ print_init_style("Killing PID $slayref->{pid} ($process)");
+
+ my $tmplog = POSIX::tmpnam();
+ my $cmdrtn = $cmd && !exists $OPT{dryrun} ? system("$cmd >$tmplog 2>&1") : 0;
+ if ($cmd) { # Tried to stop with the killcmd directive
+ my ($exit_value, $signal_num, $dumped_core) = ($? >> 8, $? & 127, $? & 128);
+ if ($cmdrtn) {
+ print_init_style('FAILED');
+ $msg->alert($loglevel-1, $mailto,
+ "Failed to execute '$cmd' to kill PID $slayref->{pid} ($process)",
+ "Command executed: $cmd",
+ "Exit value: $exit_value",
+ "Signal number: $signal_num",
+ "Dumped core?: $dumped_core",'',
+ slurp_tmplog($tmplog),
+ );
+ } else {
+ print_init_style('OK');
+ $msg->alert($loglevel, $mailto, "Executed '$cmd' to kill PID $slayref->{pid} ($process)");
+ }
+ }
+
+ # Don't try if killcmd was tried and succeded
+ unless ($cmd && !$cmdrtn) {
+ my $killrtn = !exists $OPT{dryrun} ? kill(9,$slayref->{pid}) : 1;
+ if ($killrtn) {
+ print_init_style('KILLED');
+ $msg->alert($loglevel, $mailto, "Killed PID $slayref->{pid} ($process) because $slayref->{reason}");
+ } else {
+ print_init_style('FAILED');
+ $msg->alert($loglevel-1, $mailto, "Failed to kill PID $slayref->{pid} ($process)");
+ }
+ }
+ }
+}
+
+=pod
+
+=item slurp_tmplog()
+
+Slurps up the contents of a temporary log file and returns it as a chomped
+array after unlinking the temporary log file.
+
+=cut
+
+sub slurp_tmplog {
+ my $tmplog = shift;
+ my @rtn;
+ if (open(TMPLOG,"<$tmplog")) {
+ while (<TMPLOG>) {
+ chomp;
+ push @rtn, $_;
+ }
+ close(TMPLOG);
+ }
+ unlink $tmplog;
+ return @rtn;
+}
+
+=pod
+
+=item print_init_style()
+
+Prints a Red Hat sysvinit style status message. Accepts an array of messages
+to display in sequence.
+
+=cut
+
+# Print a Red Hat sysinitv style status message
+sub print_init_style {
+ return if $OPT{daemon};
+ foreach my $message (@_) {
+ if (length($message) <= 6) {
+ print "\033[60G\[";
+ if (exists $OPT{dryrun}) { print "\033[1;33mDRYRUN"; }
+ elsif ($message eq 'OK') { print "\033[1;32m OK "; }
+ elsif ($message eq 'FAILED') { print "\033[1;31m$message"; }
+ elsif ($message eq 'KILLED' || $message eq 'DRYRUN') { print "\033[1;33m$message"; }
+ print "\033[0;39m\]\n";
+ } else {
+ print $message;
+ }
+ }
+}
+
+=pod
+
+=item spawn_process()
+
+Attempts to spawn a process. Accepts the process name, syslog log level, mail
+notification to address and spawn command.
+
+=cut
+
+# Spawn a process
+sub spawn_process {
+ my ($process, $loglevel, $mailto, $cmd) = @_;
+
+ print_init_style("Starting $process");
+ my $tmplog = POSIX::tmpnam();
+ my $rtn = !exists $OPT{dryrun} ? system("$cmd >$tmplog 2>&1") : 0;
+ my ($exit_value, $signal_num, $dumped_core) = ($? >> 8, $? & 127, $? & 128);
+ if ($rtn) {
+ print_init_style('FAILED');
+ $msg->alert($loglevel-1, $mailto, "Failed to spawn '$process' with '$cmd'",
+ "Command executed: $cmd",
+ "Exit value: $exit_value",
+ "Signal number: $signal_num",
+ "Dumped core?: $dumped_core",'',
+ slurp_tmplog($tmplog),
+ );
+ } else {
+ print_init_style('OK');
+ $msg->alert($loglevel, $mailto, "Spawned '$process' with '$cmd'",
+ "Command executed: $cmd",
+ "Exit value: $exit_value",
+ "Signal number: $signal_num",
+ "Dumped core?: $dumped_core",'',
+ slurp_tmplog($tmplog),
+ );
+ }
+}
+
+=pod
+
+=item display_help()
+
+Displays command line help.
+
+=cut
+
+# Command line help
+sub display_help {
+ my $rtn = shift;
+ require Pod::Usage;
+ Pod::Usage::pod2usage(-verbose => 2);
+ exit($rtn) if defined $rtn;
+}
+
+sub is_superuser {
+ my $uid = shift;
+ return 1 if $uid == 0;
+}
+
+sub get_config_to_read_from {
+ my $filename = shift || '';
+
+ my $retval = sprintf('%s/etc/psmon.conf',$ENV{HOME});
+ if (-f $filename && -r $filename) {
+ $retval = $filename;
+ } elsif (is_superuser($>)) {
+ $retval = $OPT{default_conf};
+ }
+
+ print "Using $retval configuration file\n" if $OPT{verbose};
+ return $retval;
+}
+
+=pod
+
+=item parse_user_to_run_as()
+
+Determine what UID to scan for in the process table.
+
+=cut
+
+sub parse_user_to_run_as {
+ if (exists $OPT{user}) {
+ my $name = $OPT{user};
+ $OPT{user} = scalar getpwnam($OPT{user}) || '';
+ unless ($OPT{user}) {
+ $msg->Log('LOG_CRIT', "Invalid user specified: '$name'");
+ exit 2;
+ }
+ } elsif (!is_superuser($>) && !exists $OPT{nouser}) {
+ $OPT{user} = $>;
+ }
+ if ($OPT{verbose} && exists $OPT{user} && length($OPT{user} >= 1)) {
+ my $name = scalar getpwuid($OPT{user});
+ print "Scanning for processes owned by UID $OPT{user} ($name)\n";
+ }
+}
+
+
+=pod
+
+=item read_config()
+
+Reads in runtime configuration options.
+
+=cut
+
+# Read in the config
+sub read_config {
+ my $config_file = shift;
+
+ # Barf and die if there's no configuration file!
+ unless (-e $config_file) {
+ $msg->Log('LOG_CRIT', "Configuration file $config_file does not exist\n");
+ exit 4;
+ }
+
+ # Define default configuration values
+ my %default = (
+ facility => 'LOG_DAEMON',
+ loglevel => 'LOG_NOTICE',
+ adminemail => 'root@localhost',
+ notifyemailfrom => sprintf('%s@%s',(getpwuid($>))[0],(POSIX::uname())[1]),
+ smtphost => 'localhost',
+ smtptimeout => 20,
+ sendmailcmd => (-e '/lib/sendmail' ? '/lib/sendmail -t' : '/usr/sbin/sendmail -t'),
+ defaultemailmethod => 'sendmail',
+ frequency => 60,
+ lastsafepid => 100,
+ neverkillpid => 1,
+ neverkillprocessname => 'devfsadmd kswapd kupdated mdrecoveryd pageout sched init fsflush',
+ protectsafepidsquietly => 0,
+ );
+
+ # Read config file
+ my $conf = new Config::General(
+ -ConfigFile => $config_file,
+ -LowerCaseNames => 1,
+ -UseApacheInclude => 1,
+ -IncludeRelative => 1,
+ -DefaultConfig => \%default,
+ -MergeDuplicateBlocks => 1,
+ -AllowMultiOptions => 1,
+ -MergeDuplicateOptions => 1,
+ -AutoTrue => 1,
+ );
+ print "Reading configuration file\n" if $OPT{verbose};
+ my %config = $conf->getall;
+
+ # Force default values for dodgy user configuration options
+ $config{frequency} = $default{frequency} unless $config{frequency} =~ /^\d+$/;
+ $config{lastsafepid} = isnumeric($config{lastsafepid}) || $default{lastsafepid};
+
+ # AdminEmail used to be (incorrectly) defined as NotifyEmail in the config file
+ $config{adminemail} = $config{notifyemail} if $config{notifyemail};
+
+ return %config;
+}
+
+
+
+
+
+########################################
+# Subroutines
+
+=pod
+
+=item isnumeric()
+
+An evil bastard fudge to ensure that we're only dealing with numerics when
+necessary, from the config file and Proc::ProcessTable scan.
+
+=cut
+
+sub isnumeric {
+ local $_ = shift || '';
+ if (/^\s*(\-?[\d\.]+)\s*/) { return $1; }
+ return undef;
+}
+
+=pod
+
+=item daemonize()
+
+Launches the process in to the background. Checks to see if there is already an
+instance running.
+
+=cut
+
+# Daemonize self
+sub daemonize {
+ my $pidfile = shift;
+ # Check that we're not already running, and quit if we are
+ if (-f $pidfile) {
+ unless (open(PID,$pidfile)) {
+ $msg->Log('LOG_CRIT', "Unable to open file handle PID for file '$pidfile': $!\n");
+ exit 5;
+ }
+ my $pid = <PID>;
+ close(PID) || $msg->Log('LOG_WARNING', "Unable to close file handle PID for file '$pidfile': $!\n");
+
+ # This is a good method to check the process is still running (Linux only)
+ if (-f "/proc/$pid/stat") {
+ open(FH,"/proc/$pid/stat") || $msg->Log('LOG_WARNING', "Unable to open file handle FH for file '/proc/$pid/stat': $!\n");
+ my $line = <FH>;
+ close(FH) || $msg->Log('LOG_WARNING', "Unable to close file handle FH for file '/proc/$pid/stat': $!\n");
+ if ($line =~ /\d+[^(]*\((.*)\)\s*/) {
+ my $process = $1;
+ if ($process =~ /^$SELF$/) {
+ $msg->Log('LOG_NOTICE', "$SELF already running at PID $pid; exiting.\n") unless exists $OPT{cron};
+ $msg->closelog();
+ exit 0;
+ }
+ }
+
+ # This will work on other UNIX flavors
+ } elsif (kill(0,$pid)) {
+ $msg->Log('LOG_NOTICE', "$SELF already running at PID $pid; exiting.\n") unless exists $OPT{cron};
+ $msg->closelog();
+ exit 0;
+
+ # Otherwise the PID file is old and stale
+ } else {
+ $msg->Log('LOG_NOTICE', "Removing stale PID file.\n");
+ unlink($pidfile);
+ }
+ }
+
+ # Daemon parent about to spawn
+ if (my $pid = fork) {
+ $msg->Log('LOG_NOTICE', "Forking background daemon, process $pid.\n");
+ $msg->closelog();
+ exit 0;
+
+ # Child daemon process that was spawned
+ } else {
+ # Fork a second time to get rid of any attached terminals
+ if (my $pid = fork) {
+ $msg->Log('LOG_NOTICE', "Forking second background daemon, process $pid.\n");
+ $msg->closelog();
+ exit 0;
+ } else {
+ unless (defined $pid) {
+ $msg->Log('LOG_CRIT', "Cannot fork: $!\n");
+ exit 6;
+ }
+ close(STDOUT); close(STDERR); chdir '/';
+ unless (open(FH,">$pidfile")) {
+ $msg->Log('LOG_CRIT', "Unable to open file handle FH for file '$pidfile': $!\n");
+ exit 7;
+ }
+ print FH $$;
+ close(FH) || $msg->Log('LOG_WARNING', "Unable to close file handle FH for file '$pidfile': $!\n");
+ }
+ }
+}
+
+=pod
+
+=item display_version()
+
+Displays complete version, author and license information.
+
+=item TRACE()
+
+Prints trace information to STDOUT if the DEBUG constant has been set to
+boolean true. The DEBUG constant is set to boolean true in the event that
+the environment variable PSMon_DEBUG is also set to boolean true.
+
+=item DUMP()
+
+See TRACE().
+
+=back
+
+=head2 PSMon::Logging METHODS
+
+=over 4
+
+=item new()
+
+Creates a new PSMon::Logging object.
+
+=item openlog()
+
+Opens a connection to syslog using Unix::Syslog.
+
+=item closelog()
+
+Closes a connection to syslog.
+
+=item loglevel()
+
+Accepts a syslog loglevel keyword and returns the associated constant integer.
+
+=item logfacility()
+
+Accepts a syslog facility keyword and returns the associated constant integer.
+
+=item alert()
+
+Logs a message to syslog using Log() and sends a notification email using
+sendmail().
+
+=item Log()
+
+Logs messages to DAEMON facility in syslog. Accepts a log
+level and message array. Will terminate the process if it is
+asked to log a message of a log level 2 or less (LOG_EMERG,
+LOG_ALERT, LOG_CRIT).
+
+=item sendmail()
+
+Sends email notifications of syslog messages, called by alert().
+Accepts sending email address, recipient email address, short
+message subject and an optional detailed message body array.
+
+=item _sendmail_sendmail()
+
+Called by sendmail(), sends an email using the sendmail command.
+
+=item _sendmail_smtp()
+
+Called by sendmail(), sends an email using the Net::SMTP module.
+
+=back
+
+=head2 Unix::Syslog STUB METHODS
+
+The __DATA__ section of the PSMon code contains a stub version of the
+Unix::Syslog module. It is automatically loaded in the event that the
+real Unix::Syslog module is not present and/or cannot be loaded. This stub
+module provides very basic functionality to output the messages generated
+by the PSMon::Logging module to STDERR, instead of simply dropping them.
+
+=over 4
+
+=item _timestamp()
+
+Retuns a timestamp string which closely resembles timestamps
+used by syslog.
+
+=item syslog()
+
+Outputs a syslog formatted and timestamped message to STDERR.
+
+=item openlog()
+
+Stub.
+
+=item closelog()
+
+Stub.
+
+=item setlogmask()
+
+Stub.
+
+=item priorityname()
+
+Stub.
+
+=item facilityname()
+
+Stub.
+
+=back
+
+
+=cut
+
+# Display version information
+sub display_version {
+ my $rtn = shift;
+ print "$SELF $VERSION\n";
+ print "$VERSION\n";
+ print "Written by Nicola Worthington, <nicolaw\@cpan.org>.\n\n";
+ print "Copyright (C) 2002,2003,2004,2005 Nicola Worthington.\n\n";
+ print <<EOL;
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+EOL
+ exit($rtn) if defined $rtn;
+}
+
+
+
+
+
+=pod
+
+=head1 BUGS
+
+Hopefully none. ;-) Send any bug reports to me at nicolaw@cpan.org
+along with any patches and details of how to replicate the problem.
+Please only send reports for bugs which can be replicated in the
+I<latest> version of the software. The latest version can always be
+found at http://search.cpan.org/~nicolaw/
+
+=head1 TODO
+
+The following functionality will be added soon:
+
+=over 4
+
+=item Code cleanup
+
+The code needs to be cleaned up and made more efficient. The bulk of the
+code will be moved to a separate module, and psmon as you know it now will
+become a much smaller and simpler wrapper script.
+
+=item Apply contributed patches
+
+Users of psmon have sent me various patches for additional functionality.
+These will be incorporated in to the next major release of psmon once the
+code has been properly abstracted.
+
+=item killperprocessname directive
+
+Will accept a boolean value. If true, only 1 process per process scope
+will ever be killed, instead of all process IDs matching kill rules.
+This should be used in conjunction with the new killcmd directive. For
+example, you may define that a database daemon may never take up more
+than 90% CPU time, and it runs many children processes. If it exceeds
+90% CPU time, you want to issue ONE restart command in order to stop and
+then start all the database processes in one go.
+
+=item time period limited rules
+
+Functionality to limit validity of process scopes to only be checked
+between defined time periods. For example, only check that httpd is running
+between the hours of 8am and 5pm on Mondays and Tuesdays.
+
+=back
+
+=head1 SEE ALSO
+
+nsmon
+
+=head1 LICENSE
+
+Written by Nicola Worthington, <nicolaw@cpan.org>.
+Copyright (C) 2002,2003,2004,2005 Nicola Worthington.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+=head1 AUTHOR
+
+Nicola Worthington <nicolaw@cpan.org>
+
+http://search.cpan.org/~nicolaw/
+
+http://www.psmon.com
+
+http://www.nicolaworthington.com
+
+=cut
+
+sub TRACE {
+ return unless PSMon::DEBUG;
+ warn(shift());
+}
+
+sub DUMP {
+ return unless PSMon::DEBUG;
+ eval {
+ require Data::Dumper;
+ warn(shift().': '.Data::Dumper::Dumper(shift()));
+ }
+}
+
+1;
+
+
+
+
+
+
+
+package PSMon::Logging;
+
+use strict;
+use Carp qw(croak);
+use POSIX ();
+
+# Create a new logging object
+sub new {
+ ref(my $class = shift) && croak 'Class name required';
+ croak 'Odd number of elements passed when even number was expected' if @_ % 2;
+ my $self = { @_ };
+ bless($self,$class);
+
+ # Try to load Net::SMTP
+ eval { require Net::SMTP; };
+ $self->{'Net::SMTP'} = $@ ? 0 : 1;
+
+ # Try to load Unix::Syslog
+ eval { require Unix::Syslog; import Unix::Syslog; };
+ $self->{'Unix::Syslog'} = $@ ? 0 : 1;
+
+ # Load stub version of Unix::Syslog in <DATA> if necessary
+ unless ($self->{'Unix::Syslog'}) {
+ eval join '', <DATA>;
+ die $@ if $@;
+ }
+
+ # Debug
+ PSMon::DUMP('$self',$self);
+ PSMon::DUMP('%INC',\%INC);
+
+ # Open default syslog facility with TTY output
+ print "Opening default syslog facility\n" if exists $self->{options}->{verbose};
+
+ # LOG_PERRER isn't available on all systems
+ no strict;
+ my $options = Unix::Syslog::LOG_PID();
+ if (Unix::Syslog::LOG_PERROR() =~ /^\d+$/) {
+ $options = Unix::Syslog::LOG_PID() | Unix::Syslog::LOG_PERROR();
+ } else {
+ $self->{EMULATE_PERROR} = 1;
+ }
+
+ # Open syslog
+ Unix::Syslog::openlog($self->{SELF}, $options, $self->logfacility());
+
+ return $self;
+}
+
+# Close syslog
+sub closelog {
+ my $self = shift;
+ Unix::Syslog::closelog();
+ delete $self->{EMULATE_PERROR};
+}
+
+# Open syslog
+sub openlog {
+ my $self = shift;
+ my $facility = $self->logfacility(shift);
+
+ #delete $self->{EMULATE_PERROR};
+ no strict;
+ Unix::Syslog::openlog($self->{SELF}, Unix::Syslog::LOG_PID(), $facility);
+}
+
+# Get the loglevel value
+sub loglevel {
+ my $self = shift;
+ local $_ = shift || '';
+ return $_ if /^\d+$/;
+ {
+ no strict;
+ return exists &{"Unix::Syslog::$_"} ? &{"Unix::Syslog::$_"} : Unix::Syslog::LOG_NOTICE();
+ }
+}
+
+# Get the logfacility value
+sub logfacility {
+ my $self = shift;
+ local $_ = shift || '';
+ return $_ if /^\d+$/;
+ {
+ no strict;
+ return exists &{"Unix::Syslog::$_"} ? &{"Unix::Syslog::$_"} : Unix::Syslog::LOG_DAEMON();
+ }
+}
+
+# Report something to user and syslog
+sub alert {
+ my $self = shift;
+ my ($LOG_TYPE,$mailto,$subject,@ary) = @_;
+
+ $subject ||= 'undef alert message';
+ $subject .= ' [DRYRUN]' if exists $self->{options}->{dryrun};
+
+ $self->Log($LOG_TYPE, $subject);
+ $self->sendmail(from => $self->{config}->{notifyemailfrom},
+ to => $mailto,
+ subject => $subject,
+ body => \@ary) if $mailto;
+}
+
+# Log something to syslog
+sub Log {
+ my $self = shift;
+ my ($loglevel,@msg) = @_;
+
+ $loglevel = $self->loglevel($loglevel);
+ @msg = '' unless @msg;
+ unshift @msg,'Process exiting!' if $loglevel <= 2;
+ { # Unix::Syslog gets unhappy for its sprintf stuff otherwise :)
+ (my $syslogmsg = "@msg") =~ s/%/%%/g;
+ Unix::Syslog::syslog($loglevel, $syslogmsg);
+ chomp $syslogmsg;
+ print "$syslogmsg\n" if $self->{EMULATE_PERROR};
+ }
+}
+
+# Send an email
+sub sendmail {
+ my $self = shift;
+ my $param = { @_ };
+
+ # Define the email body
+ my @body = ref($param->{body}) eq 'ARRAY' ? @{$param->{body}} : ($param->{subject});
+ $param->{subject} = sprintf("[%s/%s] %s",$self->{SELF},(POSIX::uname())[1],$param->{subject});
+ unshift @body, "Subject: $param->{subject}\n";
+ unshift @body, "To: \"$param->{to}\" <$param->{to}>";
+ unshift @body, "From: \"$param->{from}\" <$param->{from}>";
+
+ # Debug
+ PSMon::DUMP('$param',$param);
+ PSMon::DUMP('@body',\@body);
+
+ # Use sendmail by default with failover to SMTP
+ if (exists $self->{config}->{defaultemailmethod} && $self->{config}->{defaultemailmethod} !~ /smtp/i) {
+ unless ($self->_sendmail_sendmail($param,@body)) {
+ $self->Log('LOG_WARNING', "Unable to send email using sendmail command $self->{config}->{sendmailcmd}; attempting SMTP connection to $self->{config}->{smtphost} instead");
+ $self->_sendmail_smtp($param,@body);
+ }
+
+ # Otherwise SMTP with failover to sendmail
+ } else {
+ unless ($self->_sendmail_smtp($param,@body)) {
+ $self->Log('LOG_WARNING', "Unable to establish SMTP connection with $self->{config}->{smtphost}; attempting sendmail pipe instead");
+ $self->_sendmail_sendmail($param,@body);
+ }
+ }
+}
+
+# Send an email using sendmail
+sub _sendmail_sendmail {
+ my ($self,$param,@body) = @_;
+
+ # Check that the SendMailCmd file is valid to execute
+ (my $executable = $self->{config}->{sendmailcmd}) =~ s/\s.*//;
+ if (!-f $executable) {
+ $self->Log('LOG_WARNING', "Defined SendMailCmd file '$executable' does not exist");
+ return 0;
+ } elsif (!-x $executable) {
+ $self->Log('LOG_WARNING', "Defined SendMailCmd file '$executable' is not executable");
+ return 0;
+ }
+
+ # Open a pipe file handle to the SendMailCmd executable
+ if (open(PH,"|$self->{config}->{sendmailcmd}")) {
+ print PH "$_\n" for @body;
+ if (close(PH)) {
+ return 1;
+ } else {
+ $self->Log('LOG_WARNING', "Unable to close pipe handle PH for command '|$self->{config}->{sendmailcmd}': $!");
+ return 0;
+ }
+ } else {
+ $self->Log('LOG_WARNING', "Unable to open pipe handle PH for command '|$self->{config}->{sendmailcmd}': $!");
+ return 0;
+ }
+}
+
+# Send an email using Net::SMTP
+sub _sendmail_smtp {
+ my ($self,$param,@body) = @_;
+ return 0 unless $self->{'Net::SMTP'};
+
+ # Create a new Net::SMTP object
+ my $smtp = Net::SMTP->new(
+ $self->{config}->{smtphost},
+ Timeout => $self->{config}->{smtptimeout},
+ Hello => (POSIX::uname())[1],
+ );
+
+ if ($smtp) {
+ $smtp->mail($param->{from});
+ $smtp->to($param->{to});
+ $smtp->data(join("\n",@body));
+ $smtp->dataend();
+ return 1;
+ } else {
+ $self->Log('LOG_WARNING', "Unable to establish SMTP connection with $self->{config}->{smtphost}");
+ return 0;
+ }
+}
+
+1;
+
+__DATA__
+
+package Unix::Syslog;
+
+use strict;
+use POSIX ();
+use vars qw($VERSION $IDENT $HOSTNAME);
+$VERSION = '0.01';
+
+use constant LOG_EMERG => 0;
+use constant LOG_ALERT => 1;
+use constant LOG_CRIT => 2;
+use constant LOG_ERR => 3;
+use constant LOG_WARNING => 4;
+use constant LOG_NOTICE => 5;
+use constant LOG_INFO => 6;
+use constant LOG_DEBUG => 7;
+
+sub _timestamp {
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+ my @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
+ return sprintf('%s %2d %2d:%02d:%02d', $months[$mon], $mday, $hour, $min, $sec);
+}
+
+sub syslog {
+ my $message = $_[1]; chomp $message;
+ warn sprintf("%s %s %s[%d]: %s\n",
+ _timestamp(), $HOSTNAME, $IDENT, $$, $message
+ );
+}
+
+sub openlog {
+ $IDENT = shift || 'psmon';
+ $HOSTNAME = (POSIX::uname())[1];
+}
+
+# Stubs which do nothing
+use constant LOG_PERROR => 1;
+use constant LOG_PID => 1;
+
+sub closelog {}
+sub setlogmask {}
+sub priorityname {}
+sub facilityname {}
+
+1;
+
diff --git a/psmon-1.29/bin/psmon-config b/psmon-1.29/bin/psmon-config
new file mode 100755
index 0000000..4b94d57
--- /dev/null
+++ b/psmon-1.29/bin/psmon-config
@@ -0,0 +1,514 @@
+#!/usr/bin/perl -w
+############################################################
+# $Id: psmon-config,v 1.5 2005/05/06 12:50:20 nicolaw Exp $
+# psmon.conf - Example psmon Configuration File
+# Copyright: (c)2002,2003,2004,2005 Nicola Worthington. All rights reserved.
+############################################################
+# This file is part of psmon.
+#
+# psmon is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# psmon is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with psmon; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+############################################################
+
+use strict;
+use warnings;
+use English;
+use Term::ReadLine ();
+use Proc::ProcessTable ();
+use Config::General ();
+use Text::Wrap qw(wrap);
+use POSIX ();
+
+use vars qw($VERSION $SELF);
+
+$OUTPUT_AUTOFLUSH = 1;
+($SELF = $PROGRAM_NAME) =~ s|^.*/||;
+$VERSION = sprintf('%d.%02d', q$Revision: 1.5 $ =~ /(\d+)/g);
+$Text::Wrap::columns = 77;
+
+# Create Term::Realine object
+my $term = new Term::ReadLine $SELF;
+
+
+# Start header of config output
+my $str = sprintf("# Generated by %s, by %s@%s\n", $SELF,
+ (getpwuid($EFFECTIVE_USER_ID))[0], (POSIX::uname())[1]
+ );
+$str .= sprintf("# Created at %s\n\n",scalar localtime);
+
+$str .= "# Please read through your configuration file before using it in production!\n";
+$str .= "Disabled True\n\n";
+
+
+# Print some information
+print <<EOT;
+psmon-config will ask you a series of questions to help you quickly generate a
+valid configuration file. It is reccomended that you then review (and edit) the
+resulting configuration file in a text editor of your choice before allowing it
+to be used in a production environment.
+EOT
+
+
+# Get global directives
+my $directives = get_directives();
+for my $directive (sort keys(%{$directives})) {
+ (my $help = $directives->{$directive}->[1]) =~ s/\s\s+/ /g;
+ printf("\n%-13s%s\n",'Directive:',$directive);
+ print wrap('Description: ',' ',"$help\n");
+ printf("%-13s%s\n",'Defaults to:',$directives->{$directive}->[0]) if $directives->{$directive}->[0];
+
+ my $prompt = "Specify $directive? [".($directives->{$directive}->[0] ? 'y/N' : 'Y/n')."]: ";
+ $_ = $term->readline($prompt);
+ redo unless /^\s*(y|n)?\s*$/i;
+
+ #$str .= sprintf("# %-13s%s\n",'Directive:',$directive);
+ #$str .= wrap('# Description: ','# ',"$help\n");
+ $str .= wrap('# ','# ',"$help\n");
+ $str .= sprintf("# %-13s%s\n",'Defaults to:',$directives->{$directive}->[0]) if $directives->{$directive}->[0];
+
+ if ($_ =~ /y/ || (!length($directives->{$directive}->[0]) && $_ !~ /n/)) {
+ $str .= sprintf("%s %s\n\n",$directive,get_value('Value?: '));
+ } else {
+ $str .= "$directive $directives->{$directive}->[0]\n\n";
+ }
+}
+
+
+# Print some information about process scope directives
+print <<EOT;
+
+psmon-config.pl will now scan your process table for background daemon
+processes. You can then select which of these processes you wish to monitor,
+in order to ensure they are always running and/or do not exceed specified
+resource limits.
+
+EOT
+
+
+# Scan the process table
+print "Scanning your process table ... ";
+my $daemons = {};
+my $p = new Proc::ProcessTable( 'cache_ttys' => 1 );
+for my $process (@{$p->table}) {
+ unless ($process->{ttynum} || $process->{ttydev}) {
+ my ($executable) = $process->{cmndline} =~ /^\s*(\S+)/;
+ if (-f $executable) {
+ my $instances = 1;
+ if (exists $daemons->{$process->{cmndline}}) {
+ $instances += $daemons->{$process->{cmndline}}->{instances};
+ }
+ $daemons->{$process->{cmndline}} = $process;
+ $daemons->{$process->{cmndline}}->{instances} = $instances;
+ }
+ }
+}
+print "done\n";
+
+
+# Get process scope directive information
+$directives = get_process_scope_directives();
+for my $process (values %{$daemons}) {
+ print "\n";
+ print "Process name: $process->{fname}\n";
+ print "Command line: $process->{cmndline}\n";
+ print "Working UID : $process->{uid}\n";
+ print "Instances : $process->{instances}\n";
+
+ $_ = $term->readline("Would you like to monitor '$process->{fname}'? [y/N]: ");
+ redo unless /^\s*(y|n)?\s*$/i;
+ next unless /y/i;
+
+ $str .= "# Process $process->{fname} added by psmon-config\n";
+ $str .= "<Process $process->{fname}>\n";
+
+ for my $directive (sort keys(%{$directives})) {
+ (my $help = $directives->{$directive}->[1]) =~ s/\s\s+/ /g;
+ printf("\n%-13s%s\n",'Directive:',$directive);
+ print wrap('Description: ',' ',"$help\n");
+ printf("%-13s%s\n",'Defaults to:',$directives->{$directive}->[0]) if $directives->{$directive}->[0];
+
+ my $prompt = "Specify $directive? [".($directives->{$directive}->[0] ? 'y/N' : 'Y/n')."]: ";
+ $_ = $term->readline($prompt);
+ redo unless /^\s*(y|n)?\s*$/i;
+
+ if ($_ =~ /y/ || (!length($directives->{$directive}->[0]) && $_ !~ /n/)) {
+ $str .= sprintf("\t%s %s\n",$directive,get_value('Value?: '));
+ }
+ }
+
+ $str .= "</Process>\n\n";
+}
+
+
+# Add this again for those who just do not pay attention
+$str .= "# You need to remove BOTH of these 'Disabled' directives before using this\n";
+$str .= "# configuration file. Please make sure you have read and understood everything\n";
+$str .= "# in this file before using it in a live production environment!\n";
+$str .= "Disabled True\n";
+
+
+# Print the configuration
+open(FH,">psmon-config.conf") || die "Unable to open file handle FH for file 'psmon-config.conf': $!";
+print FH <<__TEXT__;
+##############################################################################
+#
+# Please read through this configuration file in detail. It will NOT function
+# right out of the box without any modifications. This is for good reason,
+# since I don't want to receive snotty emails from you or your system
+# administrator, being accused of killing your server or workstation.
+#
+# There is further documentation supplied with the psmon software. I suggest
+# that you read it thoroughly.
+#
+# - The author, Nicola Worthington
+#
+##############################################################################
+
+__TEXT__
+print FH "$str\n";
+print FH <<__TEXT__;
+
+
+# The <Process *> scope is commented out by default. It should be used with
+# *EXTREME* care. If you do decide to use it, may I suggest that you run psmon
+# in 'DryRun' mode by adding the 'DryRun' directive in this configuration
+# file. READ THE DOCUMENTATION THOROUGHLY BEFORE ENABLING THIS FEATURE!!!
+
+#<Process *>
+# PctCpu 80
+# PctMem 50
+#</Process>
+
+
+
+# I have included a set of commonly required processes. They are all vital
+# services which must be running on all of my workstations and servers. It's
+# a pretty good guess you'll want them to always be running too.
+
+# Secure Shell Daemon
+#<Process sshd>
+# LogLevel LOG_CRITICAL
+# SpawnCmd /sbin/service sshd restart
+# PidFile /var/run/sshd.pid
+# # Instances 30
+# # PctCPU 90
+#</Process>
+
+# Cron Daemon
+#<Process crond>
+# spawncmd /sbin/service crond restart
+# pidfile /var/run/crond.pid
+#</Process>
+
+# System Logger Daemon
+#<Process syslogd>
+# spawncmd /sbin/service syslog restart
+# pidfile /var/run/syslogd.pid
+#</Process>
+
+# Internet Super Daemon
+#<Process xinetd>
+# spawncmd /sbin/service xinetd restart
+# pidfile /var/run/xinetd.pid
+#</Process>
+
+# Remote WHO Daemon
+#<Process rwhod>
+# # rwhod is *EVIL*! There is almost never any real
+# # reason why you would ever want to run such pants!
+# killcmd /sbin/service rwhod stop
+# ttl 1
+#</Process>
+
+# BIND DNS Daemon
+#<Process named>
+# spawncmd /sbin/service named start
+# pidfile /var/run/named.pid
+#</Process>
+
+# Exim SMTP Mail Daemon
+#<Process exim>
+# spawncmd /sbin/service exim restart
+# pidfile /var/run/exim.pid
+# # instamces 30
+# # pctcpu 90
+#</Process>
+
+# Sendmail SMTP Mail Daemon
+#<Process sendmail>
+# spawncmd /sbin/service sendmail start
+# pidfile /var/run/sendmail.pid
+#</Process>
+
+# Samba SMB File Sharing Daemon
+#<Process smbd>
+# spawncmd /sbin/service smbd restart
+# pidfile /var/run/samba/smbd.pid
+#</Process>
+#<Process nmbd>
+# spawncmd /sbin/service smbd restart
+# pidfile /var/run/samba/nmbd.pid
+#</Process>
+
+# Quallcomm QPopper POP3 Daemon
+#<Process popper>
+# spawncmd /sbin/service popper restart
+# pidfile /var/run/popper.pid
+#</Process>
+
+# Apache Group HTTP Daemon
+#<Process httpd>
+# spawncmd /sbin/service httpd restart
+# pidfile /var/run/httpd.pid
+# # instances 200
+# # pctcpu 80
+#</Process>
+
+# MySQL Database
+#<Process mysqld>
+# spawncmd /sbin/service mysqld restart
+# killcmd /sbin/service mysqld stop
+# pidfile /var/run/mysqld/mysqld.pid
+# # pctcpu 90
+# # pctmem 60
+#</Process>
+
+# NTP Time Daemon
+#<Process ntpd>
+# spawncmd /sbin/service ntpd restart
+#</Process>
+
+# SMNP Daemon
+#<Process snmpd>
+#
+#</Process>
+
+# ProFTPD FTP Daemon
+#<Process proftpd>
+# spawncmd /sbin/service proftpd restart
+# pidfile /var/run/proftpd.pid
+#</Processes>
+
+
+
+# These are processes which run frequently on my machines, but I have had
+# experience of either running for too long (for whatever readon), or spawning
+# too many copies.
+#
+# The following is a quick table for your ease of reference:
+# Seconds Minutes Hours Days Weeks
+# 60 1
+# 3600 60 1
+# 43200 720 12 0.5
+# 86400 1440 24 1
+# 604800 10080 168 7 1
+
+# Kill excessive of slothenly rsync processes
+#<Process rsync>
+# ttl 43200
+# instances 5
+#</Process>
+
+# Kill excessive of slothenly updatedb processes
+#<Process updatedb>
+# ttl 43200
+# instances 2
+#</Process>
+
+# Kill excessive of slothenly find processes
+#<Process find>
+# ttl 86400
+# instances 30
+#</Process>
+
+
+
+### END OF FILE
+
+
+__TEXT__
+
+close(FH) || warn "Unable to close file handle FH for file 'psmon-config.conf': $!";
+print "\n\n";
+print "Configuration file written to ./psmon-config.conf\n\n";
+
+
+# Subroutines
+sub get_value {
+ my $prompt = shift || 'Value?: ';
+
+ my $retval = '';
+ until ($retval) {
+ $_ = $term->readline($prompt);
+ chomp;
+ redo unless /\S+/;
+ confirm: {
+ print "You entered: $_\n";
+ my $confirm = $term->readline('Is this correct? [Y/n]: ');
+ redo confirm unless $confirm =~ /^\s*(y|n)?\s*$/i;
+ $retval = $_ if $confirm !~ /n/i;
+ }
+ }
+
+ return $retval;
+}
+
+sub read_config {
+ my $config_file = shift;
+
+ unless (-f $config_file && -r $config_file) {
+ return undef;
+ }
+
+ my $conf = new Config::General(
+ -ConfigFile => $config_file,
+ -LowerCaseNames => 1,
+ -UseApacheInclude => 1,
+ -IncludeRelative => 1,
+ -MergeDuplicateBlocks => 1,
+ -AllowMultiOptions => 1,
+ -MergeDuplicateOptions => 1,
+ -AutoTrue => 1,
+ );
+
+ return $conf->getall;
+}
+
+sub get_process_scope_directives {
+ my $directives = {
+ SpawnCmd => [ ('',
+ 'Defines the full command line to be executed in order to respawn a dead process.') ],
+
+ KillCmd => [ ('*Undefined*',
+ 'Defines the full command line to be executed in order
+ to gracefully shutdown or kill a rogue process. If the command
+ returns a boolean true exit status then it is assumed that the
+ command failed to execute sucessfully. If no KillCmd is specified
+ or the command fails, the process will be killed by sending a
+ SIGKILL signal with the standard kill() function.') ],
+
+ AdminEmail => [ ('*Undefined*',
+ 'Defines the email address where notification emails should be sent to for
+ this process scope. An AdminEmail entry in the process scope will take priority
+ over the global AdminEmail declaration. All AdminEmail values in the
+ configuration file will be ignored and overridden if AdminEmail is specified as
+ a command line option.') ],
+
+ PIDFile => [ ('',
+ 'Defines the full path and filename of a file created by
+ a process which contain it\'s main parent process ID.') ],
+
+ TTL => [ ('*Undefined*',
+ 'Defines a maximum time to live (in seconds) of a process.
+ The process will be killed once it has been running longer than
+ this value, and it\'s process ID isn\'t contained in the defined pidfile.') ],
+
+ PctCpu => [ ('*Undefined*',
+ 'Defines a maximum allowable percentage of CPU time a
+ process may use. The process will be killed once it\'s CPU
+ usage exceeds this threshold and it\'s process ID isn\'t
+ contained in the defined pidfile.') ],
+
+ PctMem => [ ('*Undefined*',
+ 'Defines a maximum allowable percentage of total system
+ memory a process may use. The process will be killed once it\'s
+ memory usage exceeds this threshold and it\'s process ID isn\'t
+ contained in the defined pidfile.') ],
+
+ Instances => [ ('*Undefined*',
+ 'Defines a maximum number of instances of a process which
+ may run. The process will be killed once there are more than
+ this number of occurances running, and it\'s process ID isn\'t
+ contained in the defined pid file.') ],
+
+ NoEmailOnKill => [ ('False',
+ 'Accepts a boolean value of True or False. Surpresses
+ process killing notification emails for this process scope.') ],
+
+ NoEmailOnSpawn => [ ('False',
+ 'Accepts a boolean value of True or False. Surpresses
+ process spawning notification emails for this process scope.') ],
+
+ NoEmail => [ ('False',
+ 'Accepts a boolean value of True or False. Surpresses
+ all notification emails for this process scope.') ],
+ };
+ return $directives;
+}
+
+sub get_directives {
+ my $directives = {
+ Facility => [ ('LOG_DAEMON',
+ 'Defines which syslog facility to log to. Refer
+ to your syslogd and/or operating system documentation for a
+ list of valid facilities.') ],
+
+ LogLevel => [ ('LOG_NOTICE',
+ 'Defines the loglevel priority that notifications
+ to syslog will be marked as. Refer to your operating system\'s
+ kernel.h documentation for a list of valid priorities.') ],
+
+ AdminEmail => [ ('root@localhost',
+ 'Defines the email address where notification emails should be sent to.
+ This may be also be used in a Process scope which will take priority over
+ a global declaration. All AdminEmail entries in the configuration file
+ will be overridden if it is specified on the command line as an option.') ],
+
+ NotifyEmailFrom => [ (sprintf('%s@%s',(getpwuid($EFFECTIVE_USER_ID))[0],(POSIX::uname())[1]),
+ 'Defines the email address that notification email should be
+ addresses from.') ],
+
+ SMTPHost => [ ('localhost',
+ 'Defines the IP address or hostname of the SMTP
+ server to used to send email notifications.') ],
+
+ DefaultEmailMethod => [ ('sendmail',
+ 'Defines which method should be used by default to try and send notification emails.
+ Legal values are "SMTP" or "sendmail".') ],
+
+ SMTPTimeout => [ ('20',
+ 'Defines the timeout in seconds to be used during SMTP
+ connections.') ],
+
+ SendmailCMD => [ ('',
+ 'Defines the sendmail command to use to send notification emails if
+ there is a failure with the SMTP connection to the host defined by SMTPHost.
+ PSMon will attempt to locate the sendmail command for you by looking in
+ common locations.') ],
+
+ Frequency => [ ('60',
+ 'Defines the frequency (in seconds) of process table queries.') ],
+
+ LastSafePID => [ ('100',
+ 'When defined, psmon will never attempt to kill a
+ process ID which is numerically less than or equal to the value
+ defined by lastsafepid. It should be noted that psmon will never
+ attempt to kill itself, or a process ID less than or equal to 1.') ],
+
+ NeverKillPID => [ ('1',
+ 'Accepts a space delimited list of PIDs which will never
+ be killed.') ],
+
+ NeverKillProcessName => [ ('kswapd kupdated mdrecoveryd pageout sched init',
+ 'Accepts a space
+ delimited list of process names which will never be killed. ') ],
+
+ ProtectSafePIDsQuietly => [ ('Off',
+ 'Accepts a boolean value of On or Off.
+ Surpresses all notifications of preserved process IDs when
+ used in conjunction with the lastsafepid directive.') ],
+ };
+ return $directives;
+}
+
diff --git a/psmon-1.0.4/commit.sh b/psmon-1.0.4/commit.sh
deleted file mode 100755
index 52a88dc..0000000
--- a/psmon-1.0.4/commit.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/sh
-############################################################
-# $Id: commit.sh,v 1.4 2003/03/14 14:25:27 nicl Exp $
-# commit.sh - Update and commit changes to CVS
-# Copyright: (c)2002,2003 Nic Lawrence. All rights reserved.
-############################################################
-# This file is part of psmon.
-#
-# psmon is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# psmon is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with psmon; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-############################################################
-
-if [ "`hostname`" = "nicl.tech.ensign.ftech.net" ] || [ "`hostname`" = "bacardi.tfb.net" ]
-then
- if [ $# -ge 1 ]
- then
- pod2html --css=perldoc.css psmon > psmon.html
- rm -f pod2htm?.x~~
- pod2man psmon psmon.1
- echo "This file was automatically generated from http://psmon.perlguy.org.uk/index.htm" > README
- echo "at `date`" >> README
- echo "--------------------------------------------------------------------------------" >> README
- echo >> README; echo >> README
- links -dump http://psmon.perlguy.org.uk/index.htm >> README
- fi
- cvs commit $@
- cvs2cl.pl -r -t -T -P
- killall -9 psmon
- sudo ./install.sh
- rm -f ChangeLog.bak pod2html*
-else
- echo "You're not the author of this software, so this script is"
- echo "of no use to you. Please ignore or delete it. -- Thanks."
- exit 1
-fi
-
diff --git a/psmon-1.29/etc/psmon.conf b/psmon-1.29/etc/psmon.conf
new file mode 100644
index 0000000..5c653e8
--- /dev/null
+++ b/psmon-1.29/etc/psmon.conf
@@ -0,0 +1,253 @@
+##############################################################################
+#
+# Please read through this configuration file in detail. It will NOT function
+# right out of the box without any modifications. This is for good reason,
+# since I don't want to receive snotty emails from you or your system
+# administrator, being accused of killing your server or workstation.
+#
+# There is further documentation supplied with the psmon software. I suggest
+# that you read it thoroughly.
+#
+# - The author, Nicola Worthington
+#
+##############################################################################
+
+# Generated by psmon-config, by nicolaw@lilacup.2x4b.com
+# Created at Fri May 6 13:45:33 2005
+
+# Please read through your configuration file before using it in production!
+Disabled True
+
+# Defines the email address where notification emails should be sent to.
+# This may be also be used in a Process scope which will take priority over
+# a global declaration. All AdminEmail entries in the configuration file
+# will be overridden if it is specified on the command line as an option.
+# Defaults to: root@localhost
+AdminEmail root@localhost
+
+# Defines which method should be used by default to try and send
+# notification emails. Legal values are "SMTP" or "sendmail".
+# Defaults to: sendmail
+DefaultEmailMethod sendmail
+
+# Defines which syslog facility to log to. Refer to your syslogd and/or
+# operating system documentation for a list of valid facilities.
+# Defaults to: LOG_DAEMON
+Facility LOG_DAEMON
+
+# Defines the frequency (in seconds) of process table queries.
+# Defaults to: 60
+Frequency 60
+
+# When defined, psmon will never attempt to kill a process ID which is
+# numerically less than or equal to the value defined by lastsafepid. It
+# should be noted that psmon will never attempt to kill itself, or a process
+# ID less than or equal to 1.
+# Defaults to: 100
+LastSafePID 100
+
+# Defines the loglevel priority that notifications to syslog will be marked
+# as. Refer to your operating system's kernel.h documentation for a list of
+# valid priorities.
+# Defaults to: LOG_NOTICE
+LogLevel LOG_NOTICE
+
+# Accepts a space delimited list of PIDs which will never be killed.
+# Defaults to: 1
+NeverKillPID 1
+
+# Accepts a space delimited list of process names which will never be
+# killed.
+# Defaults to: kswapd kupdated mdrecoveryd pageout sched init
+NeverKillProcessName kswapd kupdated mdrecoveryd pageout sched init
+
+# Defines the email address that notification email should be addresses
+# from.
+# Defaults to: username@hostname
+### NotifyEmailFrom joe.bloggs@foobar.com
+
+# Accepts a boolean value of On or Off. Surpresses all notifications of
+# preserved process IDs when used in conjunction with the lastsafepid
+# directive.
+# Defaults to: Off
+ProtectSafePIDsQuietly Off
+
+# Defines the IP address or hostname of the SMTP server to used to send
+# email notifications.
+# Defaults to: localhost
+SMTPHost localhost
+
+# Defines the timeout in seconds to be used during SMTP connections.
+# Defaults to: 20
+SMTPTimeout 20
+
+# Defines the sendmail command to use to send notification emails if there
+# is a failure with the SMTP connection to the host defined by SMTPHost.
+# PSMon will attempt to locate the sendmail command for you by looking in
+# common locations.
+### SendmailCMD /usr/sbin/sendmail -t
+
+# You need to remove BOTH of these 'Disabled' directives before using this
+# configuration file. Please make sure you have read and understood everything
+# in this file before using it in a live production environment!
+Disabled True
+
+
+
+# The <Process *> scope is commented out by default. It should be used with
+# *EXTREME* care. If you do decide to use it, may I suggest that you run psmon
+# in 'DryRun' mode by adding the 'DryRun' directive in this configuration
+# file. READ THE DOCUMENTATION THOROUGHLY BEFORE ENABLING THIS FEATURE!!!
+
+#<Process *>
+# PctCpu 80
+# PctMem 50
+#</Process>
+
+
+
+# I have included a set of commonly required processes. They are all vital
+# services which must be running on all of my workstations and servers. It's
+# a pretty good guess you'll want them to always be running too.
+
+# Secure Shell Daemon
+#<Process sshd>
+# LogLevel LOG_CRITICAL
+# SpawnCmd /sbin/service sshd restart
+# PidFile /var/run/sshd.pid
+# # Instances 30
+# # PctCPU 90
+#</Process>
+
+# Cron Daemon
+#<Process crond>
+# spawncmd /sbin/service crond restart
+# pidfile /var/run/crond.pid
+#</Process>
+
+# System Logger Daemon
+#<Process syslogd>
+# spawncmd /sbin/service syslog restart
+# pidfile /var/run/syslogd.pid
+#</Process>
+
+# Internet Super Daemon
+#<Process xinetd>
+# spawncmd /sbin/service xinetd restart
+# pidfile /var/run/xinetd.pid
+#</Process>
+
+# Remote WHO Daemon
+#<Process rwhod>
+# # rwhod is *EVIL*! There is almost never any real
+# # reason why you would ever want to run such pants!
+# killcmd /sbin/service rwhod stop
+# ttl 1
+#</Process>
+
+# BIND DNS Daemon
+#<Process named>
+# spawncmd /sbin/service named start
+# pidfile /var/run/named.pid
+#</Process>
+
+# Exim SMTP Mail Daemon
+#<Process exim>
+# spawncmd /sbin/service exim restart
+# pidfile /var/run/exim.pid
+# # instamces 30
+# # pctcpu 90
+#</Process>
+
+# Sendmail SMTP Mail Daemon
+#<Process sendmail>
+# spawncmd /sbin/service sendmail start
+# pidfile /var/run/sendmail.pid
+#</Process>
+
+# Samba SMB File Sharing Daemon
+#<Process smbd>
+# spawncmd /sbin/service smbd restart
+# pidfile /var/run/samba/smbd.pid
+#</Process>
+#<Process nmbd>
+# spawncmd /sbin/service smbd restart
+# pidfile /var/run/samba/nmbd.pid
+#</Process>
+
+# Quallcomm QPopper POP3 Daemon
+#<Process popper>
+# spawncmd /sbin/service popper restart
+# pidfile /var/run/popper.pid
+#</Process>
+
+# Apache Group HTTP Daemon
+#<Process httpd>
+# spawncmd /sbin/service httpd restart
+# pidfile /var/run/httpd.pid
+# # instances 200
+# # pctcpu 80
+#</Process>
+
+# MySQL Database
+#<Process mysqld>
+# spawncmd /sbin/service mysqld restart
+# killcmd /sbin/service mysqld stop
+# pidfile /var/run/mysqld/mysqld.pid
+# # pctcpu 90
+# # pctmem 60
+#</Process>
+
+# NTP Time Daemon
+#<Process ntpd>
+# spawncmd /sbin/service ntpd restart
+#</Process>
+
+# SMNP Daemon
+#<Process snmpd>
+#
+#</Process>
+
+# ProFTPD FTP Daemon
+#<Process proftpd>
+# spawncmd /sbin/service proftpd restart
+# pidfile /var/run/proftpd.pid
+#</Processes>
+
+
+
+# These are processes which run frequently on my machines, but I have had
+# experience of either running for too long (for whatever readon), or spawning
+# too many copies.
+#
+# The following is a quick table for your ease of reference:
+# Seconds Minutes Hours Days Weeks
+# 60 1
+# 3600 60 1
+# 43200 720 12 0.5
+# 86400 1440 24 1
+# 604800 10080 168 7 1
+
+# Kill excessive of slothenly rsync processes
+#<Process rsync>
+# ttl 43200
+# instances 5
+#</Process>
+
+# Kill excessive of slothenly updatedb processes
+#<Process updatedb>
+# ttl 43200
+# instances 2
+#</Process>
+
+# Kill excessive of slothenly find processes
+#<Process find>
+# ttl 86400
+# instances 30
+#</Process>
+
+
+
+### END OF FILE
+
+
diff --git a/psmon-1.0.4/install.sh b/psmon-1.0.4/install.sh
deleted file mode 100755
index ef7798e..0000000
--- a/psmon-1.0.4/install.sh
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/bin/sh
-############################################################
-# $Id: install.sh,v 1.6 2003/03/14 12:28:42 nicl Exp $
-# install.sh - Installation script for psmon
-# Copyright: (c)2002,2003 Nic Lawrence. All rights reserved.
-############################################################
-# This file is part of psmon.
-#
-# psmon is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# psmon is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with psmon; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-############################################################
-
-# Check we have all the right perl modules installed. Try and
-# install them from the tarballs provided if necessary.
-for m in Config-General Proc-ProcessTable Unix-Syslog Getopt-Long
-do
- echo -n "Checking for $m ... "
- if perl -e '($m = shift) =~ s/\-/::/g; eval("use $m;"); exit 1 if $@;' $m
- then
- echo "found"
- else
- echo "missing"
- tar -zxf $m-*.tar.gz
- if cd $m-*
- then
- perl Makefile.PL && make && make test && make install
- cd ..
- fi
- fi
-done
-
-# Install psmon
-if [ -e psmon ]
-then
- # Remove any old version of psmon
- if which psmon > /dev/null 2>&1
- then
- oldpsmon=`which psmon`
- bakpsmon=`date +"$oldpsmon-%Y%m%d%H%M%S"`
- echo -n "Moving old psmon $oldpsmon to $bakpsmon ... "
- mv $oldpsmon `date +"$oldpsmon-%Y%m%d%H%M%S"`
- if [ -e $bakpsmon ]; then echo "done"; else echo "failed"; fi
- fi
-
- # Install the new psmon script
- echo -n "Installing psmon ... "
- cp psmon /sbin
- if [ -e /sbin/psmon ]; then echo "done"; else echo "failed"; fi
-
- # If we removed an old version, symlink it to the new version
- if [ "X$oldpsmon" != "X" ] && [ "$oldpsmon" != "/sbin/psmon" ]
- then
- echo -n "Symlinking old psmon $oldpsmon to /sbin/psmon ... "
- ln -s /sbin/psmon $oldpsmon
- if [ -e $oldpsmon ]; then echo "done"; else echo "failed"; fi
- fi
-
- # Install psmon.conf
- if ! [ -e /etc/psmon.conf ]
- then
- if [ -e psmon.conf ]
- then
- echo -n "Installing psmon.conf ... "
- cp psmon.conf /etc
- if [ -e /etc/psmon.conf ]; then echo "done"; else echo "failed"; fi
- else
- echo -n "Could not find psmon.conf; skipped psmon.conf installation"
- fi
- else
- echo "/etc/psmon.conf already exists; skipped psmon.conf installation"
- fi
-
- # Generate HTML documentation
- if which pod2html > /dev/null 2>&1
- then
- echo -n "Generating HTML documentation psmon.html ... "
- pod2html --css=perldoc.css psmon > psmon.html
- if [ -e psmon.html ]; then echo "done"; else echo "failed"; fi
- fi
-
- # Generate and install man pages
- if which pod2man > /dev/null 2>&1
- then
- mandir=/usr/man/man1
- if ! [ -d $mandir ] && [ -d /usr/share/man/man1 ];then
- mandir=/usr/share/man/man1
- fi
- #if which gzip > /dev/null 2>&1
- #then
- # echo -n "Installing manual psmon.1.gz ... "
- # pod2man psmon | gzip > $mandir/psmon.1.gz
- # if [ -e $mandir/psmon.1.gz ]; then echo "done"; else echo "failed"; fi
- #else
- echo -n "Installing manual psmon.1 ... "
- pod2man psmon > $mandir/psmon.1
- if [ -e $mandir/psmon.1 ]; then echo "done"; else echo "failed"; fi
- #fi
- else
- echo "Could not find pod2man; skipped manual installation"
- fi
-else
- echo "Could not find psmon; skipped psmon installation"
-fi
-
-
-
diff --git a/psmon-1.0.4/libnet-1.12.tar.gz b/psmon-1.0.4/libnet-1.12.tar.gz
deleted file mode 100644
index c633f73d163af99f82c378f712c816d3bca89d2c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 65841
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
diff --git a/psmon-1.0.4/perldoc.css b/psmon-1.0.4/perldoc.css
deleted file mode 100644
index 993d4ff..0000000
--- a/psmon-1.0.4/perldoc.css
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
-############################################################
-# $Id: perldoc.css,v 1.2 2003/03/14 12:28:42 nicl Exp $
-# perldoc.css - Perl Documentation Cascading Style Sheet
-############################################################
-# This file is part of psmon.
-#
-# psmon is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# psmon is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with psmon; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-############################################################
-*/
-
-BODY {
- font-family: Arial,Helvetica;
-}
-
-BLOCKQUOTE { margin: 10pt; }
-
-H1,A { color: #336699; }
-
-/*** Top menu style ****/
-.mmenuon {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #ff6600; font-size: 10pt;
- }
-.mmenuoff {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #ffffff; font-size: 10pt;
-}
-.cpyright {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #ffffff; font-size: xx-small;
-}
-.cpyrightText {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #ffffff; font-size: xx-small;
-}
-.sections {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #336699; font-size: 11pt;
-}
-.dsections {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #336699; font-size: 12pt;
-}
-.slink {
- font-family: Arial,Helvetica; font-weight: normal; text-decoration: none;
- color: #336699; font-size: 9pt;
-}
-
-.slink2 { font-family: Arial,Helvetica; text-decoration: none; color: #336699; }
-
-.maintitle {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #336699; font-size: 18pt;
-}
-.dblArrow {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #336699; font-size: small;
-}
-.menuSec {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #336699; font-size: small;
-}
-
-.newstext {
- font-family: Arial,Helvetica; font-size: small;
-}
-
-.linkmenu {
- font-family: Arial,Helvetica; color: #000000; font-weight: bold;
- text-decoration: none;
-}
-
-P {
- font-family: Arial,Helvetica;
-}
-
-PRE {
- border: 1px solid black;
- background: #e5e5ee;
- padding: 5px 5px 5px 5px;
- font-size: 10pt;
-}
-.quote {
- font-family: Times; text-decoration: none;
- color: #000000; font-size: 9pt; font-style: italic;
-}
-.smstd { font-family: Arial,Helvetica; color: #000000; font-size: x-small; }
-.std { font-family: Arial,Helvetica; color: #000000; }
-.meerkatTitle {
- font-family: sans-serif; font-size: x-small; color: black; }
-
-.meerkatDescription { font-family: sans-serif; font-size: 10pt; color: black }
-.meerkatCategory {
- font-family: sans-serif; font-size: 9pt; font-weight: bold; font-style: italic;
- color: brown; }
-.meerkatChannel {
- font-family: sans-serif; font-size: 9pt; font-style: italic; color: brown; }
-.meerkatDate { font-family: sans-serif; font-size: xx-small; color: #336699; }
-
-.tocTitle {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #333333; font-size: 10pt;
-}
-
-.toc-item {
- font-family: Arial,Helvetica; font-weight: bold;
- color: #336699; font-size: 10pt; text-decoration: underline;
-}
-
-.perlVersion {
- font-family: Arial,Helvetica; font-weight: bold;
- color: #336699; font-size: 10pt; text-decoration: none;
-}
-
-.docTitle {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #000000; font-size: 10pt;
-}
-.dotDot {
- font-family: Arial,Helvetica; font-weight: bold;
- color: #000000; font-size: 9pt;
-}
-
-.docSec {
- font-family: Arial,Helvetica; font-weight: normal;
- color: #333333; font-size: 9pt;
-}
-.docVersion {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #336699; font-size: 10pt;
-}
-
-.docSecs-on {
- font-family: Arial,Helvetica; font-weight: normal; text-decoration: none;
- color: #ff0000; font-size: 10pt;
-}
-.docSecs-off {
- font-family: Arial,Helvetica; font-weight: normal; text-decoration: none;
- color: #333333; font-size: 10pt;
-}
-
-h2 {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #336699; font-size: medium;
-}
-h1 {
- font-family: Verdana,Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #336699; font-size: large;
-}
-
-DL {
- font-family: Arial,Helvetica; font-weight: normal; text-decoration: none;
- color: #333333; font-size: 10pt;
-}
-
-UL > LI > A {
- font-family: Arial,Helvetica; font-weight: bold;
- color: #336699; font-size: 10pt;
-}
-
-.moduleInfo {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #333333; font-size: 11pt;
-}
-
-.moduleInfoSec {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #336699; font-size: 10pt;
-}
-
-.moduleInfoVal {
- font-family: Arial,Helvetica; font-weight: normal; text-decoration: underline;
- color: #000000; font-size: 10pt;
-}
-
-.cpanNavTitle {
- font-family: Arial,Helvetica; font-weight: bold;
- color: #ffffff; font-size: 10pt;
-}
-.cpanNavLetter {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #333333; font-size: 9pt;
-}
-.cpanCat {
- font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
- color: #336699; font-size: 9pt;
-}
-
diff --git a/psmon-1.0.4/psmon b/psmon-1.0.4/psmon
deleted file mode 100755
index dbd8c90..0000000
--- a/psmon-1.0.4/psmon
+++ /dev/null
@@ -1,1390 +0,0 @@
-#!/usr/bin/perl -w
-############################################################
-# $Id: psmon,v 1.57 2003/03/25 13:32:42 nicl Exp $
-# psmon - Process Table Monitor Script
-# Copyright: (c)2002,2003 Nic Lawrence. All rights reserved.
-############################################################
-# This file is part of psmon.
-#
-# psmon is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# psmon is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with psmon; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-############################################################
-
-=pod
-
-=head1 NAME
-
-psmon - Process Table Monitoring Script
-
-=head1 VERSION
-
-$Id: psmon,v 1.57 2003/03/25 13:32:42 nicl Exp $
-
-=head1 SYNOPSIS
-
-Single user account crontab operation.
-
- # DO NOT EDIT THIS FILE - edit the master and reinstall.
- # (/tmp/crontab.28945 installed on Wed Jan 8 16:29:24 2003)
- # (Cron version -- $Id: psmon,v 1.57 2003/03/25 13:32:42 nicl Exp $)
- MAILTO="nicl@perlguy.org.uk"
- USER=nicl
-
- */5 * * * * /sbin/psmon --daemon --cron --conf=~/etc/psmon.conf --user=$USER --adminemail=nicl@perlguy.org.uk
-
-Regular system-wide call from cron:
-
- */5 * * * * /sbin/psmon --daemon --cron
-
-Only check processes during working office hours:
-
- * 9-17 * * * /sbin/psmon
-
-Command line syntax.
-
- [nicl@nicl]$ psmon --help
- Syntax: psmon [--conf=filename] [--daemon] [--cron] [--user=user]
- [--adminemail=emailaddress] [--dryrun] [--help] [--version]
- --help Display this help
- --version Display full version information
- --dryrun Dryrun (do not actually kill or spawn and processes)
- --daemon Spawn in to background daemon
- --cron Disables 'already running' errors with the --daemon option
- --conf=str Specify alternative config filename
- --user=str Only scan the process table for processes running as str
- --adminemail=str Force all notification emails to be sent to str
-
-=head1 DESCRIPTION
-
-This script monitors the process table using Proc::ProcessTable, and
-will respawn or kill processes based on a set of rules defined in an
-Apache style configuration file.
-
-Processes will be respawned if a spawn command is defined for a process,
-and no occurances of that process are running. If the --user command line
-option is specified, then the process will only be spawned if no instances
-are running as the specified userid.
-
-Processes can be killed off if they have been running for too long,
-use too much CPU or memory resources, or have too many concurrent
-versions running. Exceptions can be made to kill rulesets using the
-I<pidfile> and I<lastsafepid> directives.
-
-If a PID file is declared for a process, psmon will never kill the
-process ID that is contained within the pid file. This is useful if for
-example, you have a script which spawns hundreds of child processes
-which you may need to automatically kill, but you do not want to kill
-the parent process.
-
-Any actions performed will be logged to the DAEMON syslog facility by default.
-There is support to optionally also send notifications emails to an
-administrator on a global or pre-rule basis.
-
-=head1 OPERATION
-
-=over 4
-
-=item --dryrun
-
-Execute a dry-run (do not actually kill or spawn and processes).
-
-=item --conf=I<filename>
-
-Specify alternative config filename.
-
-=item --daemon
-
-Spawn in to background daemon.
-
-=item --cron
-
-Disables already running warnings when trying to launch as another daemon.
-
-=item --user=I<user>
-
-Only scan the process table for processes running under this username.
-
-=item --adminemail=I<emailaddress>
-
-Force all notification emails to be sent to this email address.
-
-=back
-
-=head1 INSTALLATION
-
-In addition to Perl 5.005_03 or higher, the following Perl modules are
-required:
-
- Getopt::Long
- Config::General
- POSIX
- Proc::ProcessTable
- Net::SMTP
- Unix::Syslog
-
-The POSIX module is usually supplied with Perl as standard, as is
-Getopt::Long. All these modules can be obtained from CPAN. Visit
-http://search.span.org and http://www.cpan.org for further details.
-For the lazy people reading this, you can try the
-following command to install these modules:
-
- for m in Getopt::Long Config::General POSIX Proc::ProcessTable \
- Net::SMTP Unix::Syslog;do perl -MCPAN -e"install $m";done
-
-Alternatively you can run the install.sh script which comes in the
-distribution tarball. It will attempt to install the right modules,
-install the script and configuration file, and generate UNIX man page
-documentation.
-
-By default psmon will look for its runtime configuration in /etc/psmon.conf,
-although this can be defined as otherwise from the command line. For system
-wide installations it is reccomended that you install your psmon in to the
-default location.
-
-=cut
-
-
-
-BEGIN {
- use strict;
- sub try_to_load {
- my %self = @_;
- my $failure = '';
- while (my ($module,$args) = each %self) {
- eval("use $module $args;");
- $failure .= "Fatal error while trying to load Perl module '$module'\n" if $@;
- }
- (warn $failure) && exit 8 if $failure;
- }
-
- try_to_load( 'English' => '',
- 'Getopt::Long' => '',
- 'Config::General' => '',
- 'POSIX' => 'qw(uname getcwd)',
- 'Net::SMTP' => '',
- 'Unix::Syslog' => 'qw(:subs :macros)',
- 'Proc::ProcessTable' => '', );
-}
-
-# Define constants
-use constant DEBUG => 1; # This should be reset back to 0 for public releases
-use constant PREFIX => ''; # You may want to set this to /home/joeb or something
-use constant HOSTNAME => (POSIX::uname())[1];
-
-# Declare global package variables
-use subs qw(report loglevel logfacility log alert);
-use vars qw($VERSION $SELF %O %C); # I want to move %O, and %C out of global space
-
-# These English variables and globals are okay to stay
-$WARNING = 1;
-$OUTPUT_AUTOFLUSH = 1;
-$ENV{PATH} = '/bin:/usr/bin:/usr/local/bin';
-($SELF = $PROGRAM_NAME) =~ s|^.*/||;
-$VERSION = '$Id: psmon,v 1.57 2003/03/25 13:32:42 nicl Exp $';
-
-# Get command line options
-%O = ( conf => PREFIX.'/etc/psmon.conf',
- default_conf => PREFIX.'/etc/psmon.conf' );
-GetOptions(\%O, 'help', 'version',
- 'daemon', 'cron', 'dryrun',
- 'conf=s', 'user=s', 'adminemail=s' );
-
-# Display help or version info and exit if required
-display_help(0) if exists $O{help};
-display_version(0) if exists $O{version};
-
-# Open syslog with PERROR (output to terminal)
-openlog $SELF, LOG_PID | LOG_PERROR, logfacility;
-
-# Bork if we've been told to query for an invalid user
-if (exists $O{user} && (my $name = $O{user})) { $O{user} = scalar getpwnam($O{user}) || '';
- unless ($O{user}) {
- log LOG_CRIT, "Invalid user specified: '$name'";
- exit 2;
- }
-}
-
-
-
-
-=pod
-
-=head1 CONFIGURATION
-
-The default configuration file location is /etc/psmon.conf. A different
-configuration file can be declared from the command line.
-
-Syntax of the configuration file is based upon that which is used by
-Apache. Each process to be monitored is declared with a Process scope
-directive like this example which monitors the OpenSSH daemon:
-
- <Process sshd>
- spawncmd /sbin/service sshd start
- pidfile /var/run/sshd.pid
- instances 50
- pctcpu 90
- </Process>
-
-There is a special I<*> process scope which applies to I<all> running
-processes. This special scope should be used with extreme care. It does
-not support the use of the I<spawncmd>, I<pidfile>, I<instances> or I<ttl>
-directivers. A typical example of this scope might be as follows:
-
- <Process *>
- pctcpu 95
- pctmem 80
- </Process>
-
-Global directives which are not specific to any one process should be placed
-outside of any Process scopes.
-
-=head2 DIRECTIVES
-
-=over 4
-
-=item Facility
-
-Defines which syslog facility to log to. Valid options are as follows;
-LOG_KERN, LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_SYSLOG, LOG_LPR,
-LOG_NEWS, LOG_UUCP, LOG_CRON, LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2,
-LOG_LOCAL3, LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6 and LOG_LOCAL7. Defaults
-to LOG_DAEMON.
-
-=item LogLevel
-
-Defines the loglevel priority that notifications to syslog will be
-marked as. Valid options are as follows; LOG_EMERG, LOG_ALERT, LOG_CRIT,
-LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO and LOG_DEBUG. The log level
-used by a notification for any failed action will automatically be
-raised to the next level in order to highlight the failure. May be also be used
-in a Process scope which will take priority over a global declaration.
-Defaults to LOG_NOTICE.
-
-=item KillLogLevel (previously KillPIDLogLevel)
-
-The same as the loglevel directive, but only applies to process kill actions.
-Takes priority over the loglevel directive. May be also be used in a
-Process scope which will take priority over a global declaration.
-Undefined by default.
-
-=item SpawnLogLevel
-
-The same as the loglevel directive, but only applies to process spawn actions.
-Takes priority over the loglevel directive. May be also be used in a
-Process scope which will take priority over a global declaration.
-Undefined by default.
-
-=item AdminEmail
-
-Defines the email address where notification emails should be sent to.
-May be also be used in a Process scope which will take priority over a
-global declaration. Defaults to root@localhost.
-
-=item NotifyEmailFrom
-
-Defines the email address that notification email should be addresses
-from. Defaults to <username>@I<hostname>.
-
-=item Frequency
-
-Defines the frequency of process table queries. Defaults to 60 seconds.
-
-=item LastSafePID
-
-When defined, psmon will never attempt to kill a process ID which is
-numerically less than or equal to the value defined by lastsafepid. It
-should be noted that psmon will never attempt to kill itself, or a process ID
-less than or equal to 1. Defaults to 100.
-
-=item ProtectSafePIDsQuietly
-
-Accepts a boolean value of On or Off. Surpresses all notifications of
-preserved process IDs when used in conjunction with the I<lastsafepid>
-directive. Defaults to Off.
-
-=item SMTPHost
-
-Defines the IP address or hostname of the SMTP server to used to send
-email notifications. Defaults to localhost.
-
-=item SMTPTimeout
-
-Defines the timeout in seconds to be used during SMTP connections.
-Defaults to 20 seconds.
-
-=item SendmailCmd
-
-Defines the sendmail command to use to send notification emails if there
-is a failure with the SMTP connection to the host defined by smtphost.
-Defaults to '/usr/sbin/sendmail -t'.
-
-=item Dryrun
-
-Forces this psmon to as if the --dryrun command line switch had specified.
-This is useful if you want to force a specific configuration file to only
-report and never actually take any automated action.
-
-=item NotifyDetail
-
-Defines the verbosity of notification emails which are sent. Can be set
-to 'Simple', 'Verbose' or 'Debug'. Defaults to 'Verbose'. This function
-will be removed soon. It is unnecessary bloat and is not very portable.
-
-=back
-
-=head2 PROCESS SCOPE DIRECTIVES
-
-=over 4
-
-=item SpawnCmd
-
-Defines the full command line to be executed in order to respawn a dead
-process.
-
-=item KillCmd
-
-Defines the full command line to be executed in order to gracefully
-shutdown or kill a rogue process. If the command returns a boolean true
-exit status then it is assumed that the command failed to execute
-sucessfully. If no KillCmd is specified or the command fails, the
-process will be killed by sending a SIGKILL signal with the standard
-kill() function. Undefined by default.
-
-=item PIDFile
-
-Defines the full path and filename of a file created by a process which
-contain it's main parent process ID.
-
-=item TTL
-
-Defines a maximum time to live (in seconds) of a process. The process
-will be killed once it has been running longer than this value, and
-it's process ID isn't contained in the defined pidfile.
-
-=item PctCpu
-
-Defines a maximum allowable percentage of CPU time a process may use.
-The process will be killed once it's CPU usage exceeds this threshold
-and it's process ID isn't contained in the defined pidfile.
-
-=item PctMem
-
-Defines a maximum allowable percentage of total system memory a process
-may use. The process will be killed once it's memory usage exceeds this
-threshold and it's process ID isn't contained in the defined pidfile.
-
-=item Instances
-
-Defines a maximum number of instances of a process which may run. The
-process will be killed once there are more than this number of occurances
-running, and it's process ID isn't contained in the defined pid file.
-
-=item NoEmailOnKill
-
-Accepts a boolean value of True or False. Surpresses process killing
-notification emails for this process scope. Defaults to False.
-
-=item NoEmailOnSpawn
-
-Accepts a boolean value of True or False. Surpresses process spawning
-notification emails for this process scope. Defaults to False.
-
-=item NoEmail
-
-Accepts a boolean value of True or False. Surpresses all notification
-emails for this process scope. Defaults to False.
-
-=item NeverKillPID
-
-Accepts a space delimited list of PIDs which will never be killed.
-Defaults to 1.
-
-=item NeverKillProcessName
-
-Accepts a space deliomited list of process names which will never be
-killed. Defaults to 'kswapd kupdated mdrecoveryd'.
-
-=back
-
-=head2 EXAMPLES
-
- <Process syslogd>
- spawncmd /sbin/service syslogd restart
- pidfile /var/run/syslogd.pid
- instances 1
- pctcpu 70
- pctmem 30
- </Process>
-
-Syslog is a good example of a process which can get a little full
-of itself under certian circumstances, and excessively hog CPU and
-memory. Here we will kill off syslogd processes if it exceeds 70%
-CPU or 30% memory utilization.
-
-Older running copies of syslogd will be killed if they are running,
-while leaving the most recently spawned copy which will be listed in
-the PID file defined.
-
- <Process httpd>
- spawncmd /sbin/service httpd restart
- pidfile /var/run/httpd.pid
- loglevel critical
- adminemail pager@noc.company.com
- </Process>
-
-Here we are monitoring Apache to ensure that it is restarted if
-it dies. The pidfile directive in this example is actually
-redundant because we have not defined any rule where we should
-consider killing any httpd processes.
-
-All notifications relating to this process will be logged with the
-syslog priority of critical (LOG_CRIT), and all emailed to
-pager@noc.company.com which could typically forward to a pager.
-
-Any failed attempts to kill or restart a process will automatically
-be logged as a syslog priority one level higher than that specified.
-If a restart of Apache were to fail in this example, a wall
-notification would be broadcast to all interactive terminals
-connected to the machine, since the next log priority up from
-LOG_CRIT is LOG_EMERG.
-
- <Process find>
- noemail True
- ttl 3600
- </Process>
-
-Kill old find processes which have been running for over an hour.
-Do not send an email notification since it's not too important.
-
-=cut
-
-
-
-
-# Read the config file and setup signal handlers
-%C = read_config($O{conf});
-$O{dryrun} = 1 if $C{dryrun};
-if ($C{disabled}) {
- log LOG_CRIT, "Your configuration file '$O{conf}' is disabled. Remove the 'Disabled True' directive from the file.";
- exit 3;
-}
-
-
-
-=pod
-
-=head1 SIGNALS
-
-=over 4
-
-=item HUP
-
-Forces an immediate reload of the configuration file. You should
-send the HUP signal when you are running psmon as a background
-daemon and have altered the psmon.conf file.
-
-=item USR1
-
-Forces an immediate scan of the process table.
-
-=back
-
-=head1 EXIT CODES
-
-=over 4
-
-=item Value 0: Exited gracefully
-
-The program exited gracefully.
-
-=item Value 2: Failure to lookup UID for username
-
-The username specified by the --user command line option did not resolve to a valid
-UID.
-
-=item Value 3: Configuration file is disabled
-
-The configuration file is disabled. (It contains an active 'Disabled' directive).
-
-=item Value 4: Configuration file does not exist
-
-The specified configuration file, (default or user specified) does not exist.
-
-=item Value 5: Unable to open PID file handle
-
-Failed to open a read-only file handle for the runtime PID file.
-
-=item Value 6: Failed to fork
-
-An error occured while attempting to fork the child background daemon process.
-
-=item Value 7: Unable to open PID file handle
-
-Failed to open a write file handle for the runtime PID file.
-
-=item Value 8: Failure to load Perl module
-
-One or more Perl module could not be loaded. This usually happens when one of the
-required Perl modules which psmon depends upon is not installed or could not be located
-in the Perl LIB search path.
-
-=back
-
-=head1 PERFORMANCE
-
-psmon is not especially fast. Much of it's time is spent reading the process table.
-If the process table is particularly large this can take a number of seconds.
-Although is rarely a major problem on todays speedy machines, I have run a few tests
-so you take look at the times and decide if you can afford the wait.
-
- CPU OS Open Files/Procs 1m Load Real Time
- PIII 1.1G Mandrake 9.0 10148 / 267 0.01 0m0.430s
- PIII 1.2G Mandrake 9.0 16714 / 304 0.44 0m0.640s
- Celeron 500 Red Hat 6.1 1780 / 81 1.27 0m0.880s
- PII 450 Red Hat 6.0 300 / 23 0.01 0m1.050s
- 2x Xeon 1.8G Mandrake 9.0 90530 / 750 0.38 0m1.130s
- Celeron 500 Red Hat 6.1 1517 / 77 1.00 0m1.450s
- PIII 866 Red Hat 8.0 3769 / 76 0.63 0m1.662s
- PIII 750 Red Hat 6.2 754 / 35 3.50 0m2.170s
-
-(Figures are accurate as of release 1.0.3).
-
-These production machines were running the latest patched stock distribution kernels.
-I have listed the total number of open file descriptors, processes running and 1 minute
-load average to give you a slightly better context of the performance.
-
-=cut
-
-# Run a single check
-unless (exists $O{daemon}) {
- # Reopen syslog without PERROR (no output to terminal)
- closelog;
- openlog $SELF, LOG_PID, logfacility $C{facility};
-
- # Run a single check
- check_processtable(exists $O{user} ? $O{user} : '');
-
-# Run as a daemon
-} else {
- # Read the config file and setup signal handlers
- $SIG{'HUP'} = sub {
- log LOG_NOTICE, 'Recieved SIGHUP; reloading configuration';
- %C = read_config($O{conf});
- };
- $SIG{'USR1'} = sub {
- log LOG_NOTICE, 'Recieved SIGUSR1; checking process table immediately';
- check_processtable(exists $O{user} ? $O{user} : '');
- };
-
- # Figure out the PID file name
- my ($x,$y) = (POSIX::getcwd.$O{conf},0);
- for (0..length($x)-1) { $y += ord substr($x,$_,1); }
- my $pidfile = sprintf("%s/var/run/%s%s.pid", PREFIX,
- $SELF,$O{conf} eq $O{default_conf}
- ? '' : ".$y"
- );
-
- #if (DEBUG) {
- # print "\$O{conf} = $O{conf}\n";
- # print "\$O{default_conf} = $O{default_conf}\n";
- # print "\$pidfile = $pidfile\n";
- #}
-
- # Launch in to the background
- daemonize($pidfile);
-
- # Reopen syslog without PERROR (no output to terminal)
- closelog;
- openlog $SELF, LOG_PID, logfacility $C{facility};
-
- # Die if you remove the runtime PID file
- while (-f $pidfile) {
- check_processtable(exists $O{user} ? $O{user} : '');
- sleep $C{frequency};
- }
-}
-
-# Finish
-log LOG_NOTICE, "Terminating.\n";
-closelog;
-exit;
-
-
-
-
-
-########################################
-# User subroutines
-
-=pod
-
-=head1 SUBROUTINES
-
-=over 4
-
-=item check_processtable()
-
-Reads the current process table, checks and then executes any appropriate
-action to be taken. Does not accept any paramaters.
-
-=cut
-
-sub check_processtable {
- my $uid = shift;
-
- # Slurp in the process table
- my %proc;
- my $t = new Proc::ProcessTable;
- foreach my $p (@{$t->table}) {
- ## Be sad and use the process table to find out if we have a
- ## tty attached to this process
- #if ($p->{pid} == $$ && $p->{ttynum}) {
- # %A = (
- # MOVE_TO_COL => "\033[60G",
- # SUCCESS => "\033[1;32m",
- # FAILURE => "\033[1;31m",
- # WARNING => "\033[1;33m",
- # NORMAL => "\033[0;39m"
- # );
- #}
-
- # Only grab information on processes we have rules for
- next unless $C{process}->{'*'} || $C{process}->{$p->{fname}};
-
- # Skip processes that don't belong to the specified UID if applicable
- next if $uid && $p->{uid} != $uid;
-
- my $i = !exists $proc{$p->{fname}} ? 0 : @{$proc{$p->{fname}}};
- $proc{$p->{fname}}->[$i] = {
- pid => $p->{pid},
- ppid => $p->{ppid},
- fname => $p->{fname},
- tty => $p->{ttynum},
- start => $p->{start},
- pctcpu => isnumeric($p->{pctcpu}) || 0,
- pctmem => isnumeric($p->{pctmem}) || 0,
- };
- }
- undef $t;
-
- #if (DEBUG) {
- # use Data::Dumper;
- # print Dumper(\%proc);
- #}
-
- # Build a list of bad naughty processes
- my %slay;
- foreach my $process (keys %{$C{process}}) {
- next unless exists $proc{$process} || $process eq '*';
-
- #if (DEBUG) {
- # print "Checking $process ... \n";
- # use Data::Dumper;
- # print Dumper($C{process}->{$process});
- #}
-
- foreach my $p (@{$proc{$process}}) {
- # Too many instances running
- if ($C{process}->{$process}->{instances} && @{$proc{$process}} > $C{process}->{$process}->{instances}) {
- push @{$slay{$process}}, {
- pid => $p->{pid},
- cause => 'instances',
- reason => sprintf("%d instances exceeds limit of %d",
- scalar @{$proc{$process}},
- $C{process}->{$process}->{instances})
- }
- }
-
- # Exceeded TTL
- if ($C{process}->{$process}->{ttl} && time() - $p->{start} > $C{process}->{$process}->{ttl}) {
- push @{$slay{$process}}, {
- pid => $p->{pid},
- cause => 'ttl',
- reason => sprintf("%d exceeds TTL of %d",
- time() - $p->{start},
- $C{process}->{$process}->{ttl})
- }
- }
-
- # Check CPU and Memory usage
- pctcheck($process,$p,\%slay);
- }
- }
-
- # Check CPU and Memory usage for *ALL* processes
- if ($C{process}->{'*'}) {
- while (my ($process,$proclist) = each %proc) {
- for my $p (@{$proclist}) {
- pctcheck($process,$p,\%slay,'*');
- }
- }
- }
-
- # Check CPU and Memory usage
- sub pctcheck {
- my ($process,$p,$slayref,$scope) = @_;
- $scope ||= $process;
-
- # Exceeded CPU Percent
- $C{process}->{$scope}->{pctcpu} = isnumeric($C{process}->{$scope}->{pctcpu});
- if ($C{process}->{$scope}->{pctcpu} && $p->{pctcpu} > $C{process}->{$scope}->{pctcpu}) {
- push @{$slayref->{$process}}, {
- pid => $p->{pid},
- cause => 'pctcpu',
- reason => sprintf("%.2f%% CPU usage exceeds limit of %.2f%%",
- $p->{pctcpu},
- $C{process}->{$scope}->{pctcpu})
- }
- }
-
- # Exceeded Memory Percent
- $C{process}->{$scope}->{pctmem} = isnumeric($C{process}->{$scope}->{pctmem});
- if ($C{process}->{$scope}->{pctmem} && $p->{pctmem} > $C{process}->{$scope}->{pctmem}) {
- push @{$slayref->{$process}}, {
- pid => $p->{pid},
- cause => 'pctmem',
- reason => sprintf("%.2f%% memory usage exceeds limit of %.2f%%",
- $p->{pctmem},
- $C{process}->{$scope}->{pctmem})
- }
- }
- }
-
- # Kill naughty processes
- while (my ($process,$aryref) = each %slay) {
- # Decide what loglevel we should report the action as
- my $loglevel = loglevel($C{process}->{$process}->{killloglevel} ||
- $C{process}->{$process}->{loglevel} ||
- $C{killloglevel} || $C{loglevel} || LOG_NOTICE);
-
- # Protect safe process IDs
- if ($C{process}->{$process}->{pidfile} && !$C{process}->{$process}->{ppid}) {
- if (-e $C{process}->{$process}->{pidfile} && open(FH,$C{process}->{$process}->{pidfile})) {
- $C{process}->{$process}->{ppid} = <FH>;
- chomp $C{process}->{$process}->{ppid};
- close(FH);
- }
- }
- my $ppid = $C{process}->{$process}->{ppid} || 0;
-
- # See about slaying each of these process instances
- foreach my $slayref (@{$aryref}) {
- next if $slayref->{pid} == $ppid
- || $slayref->{pid} == $$
- || $slayref->{pid} <= 1
- || $C{neverkillpid} =~ /\b$slayref->{pid}\b/
- || $C{neverkillprocessname} =~ /(^|\s+)$process(\s+|$)/;
-
- # Define who to mail alerts to
- my $mailto = ($C{process}->{$process}->{noemailonkill} || $C{process}->{$process}->{noemail}) ? '' :
- $C{process}->{$process}->{adminemail} || $C{notifyemail};
-
- # Try to slay the process
- slay_process($process, $loglevel, $mailto, $slayref,
- exists $C{process}->{$process}->{killcmd} ? $C{process}->{$process}->{killcmd} : '');
- }
- }
-
- # Spawn any dead processes
- foreach my $process (keys %{$C{process}}) {
- # Only attempt to spawn a process if there are no current instances, and there is a spawncmd directive defined
- if (!exists $proc{$process} && exists $C{process}->{$process}->{spawncmd}) {
-
- # Decide what loglevel we should report the action as
- my $loglevel = loglevel($C{process}->{$process}->{spawnloglevel} ||
- $C{process}->{$process}->{loglevel} ||
- $C{spawnloglevel} || $C{loglevel} || LOG_NOTICE);
-
- # Define who to mail alerts to
- my $mailto = ($C{process}->{$process}->{noemailonspawn} || $C{process}->{$process}->{noemail}) ? '' :
- $C{process}->{$process}->{adminemail} || $C{notifyemail};
-
- # Try to spawn the process
- spawn_process($process, $loglevel, $mailto, $C{process}->{$process}->{spawncmd});
- }
- }
-
- # Explicitly nuke it for the paranoid (yes I know it's a locally scoped lexical!) ;-)
- undef %proc;
-}
-
-=pod
-
-=item slay_process()
-
-Attempts to kill a process with it's killcmd, or failing that using the kill() function.
-Accepts the process name, syslog log level, email notification to address and a reference
-to the %slay hash.
-
-=cut
-
-# Type to slay a process
-sub slay_process {
- my ($process, $loglevel, $mailto, $slayref, $cmd) = @_;
-
- # Protect safe processes
- if ($slayref->{pid} <= $C{lastsafepid} && !$C{protectsafepidsquietly}) {
- print_init_style("Saving PID $slayref->{pid} ($process) from death",'OK');
- alert $loglevel, $mailto, "Saved safe PID $slayref->{pid} ($process) from death";
-
- # This process is not protected
- } else {
- print_init_style("Killing PID $slayref->{pid} ($process)");
-
- my $cmdrtn = $cmd && !exists $O{dryrun} ? system("$cmd > /dev/null 2>&1") : 0;
- if ($cmd) { # Tried to stop with the killcmd directive
- if ($cmdrtn) {
- print_init_style('FAILED');
- alert $loglevel-1, $mailto, "Failed to execute '$cmd' to kill PID $slayref->{pid} ($process)";
- } else {
- print_init_style('OK');
- alert $loglevel, $mailto, "Executed '$cmd' to kill PID $slayref->{pid} ($process)";
- }
- }
-
- # Don't try if killcmd was tried and succeded
- unless ($cmd && !$cmdrtn) {
- my $killrtn = !exists $O{dryrun} ? kill(9,$slayref->{pid}) : 1;
- if ($killrtn) {
- print_init_style('KILLED');
- alert $loglevel, $mailto, "Killed PID $slayref->{pid} ($process) because $slayref->{reason}";
- } else {
- print_init_style('FAILED');
- alert $loglevel-1, $mailto, "Failed to kill PID $slayref->{pid} ($process)";
- }
- }
- }
-}
-
-=pod
-
-=item print_init_style()
-
-Prints a Red Hat sysvinit style status message. Accepts an array of messages
-to display in sequence.
-
-=cut
-
-# Print a Red Hat sysinitv style status message
-sub print_init_style {
- return if $O{daemon};
- foreach my $message (@_) {
- if (length($message) <= 6) {
- print "\033[60G\[";
- if (exists $O{dryrun}) { print "\033[1;33mDRYRUN"; }
- elsif ($message eq 'OK') { print "\033[1;32m OK "; }
- elsif ($message eq 'FAILED') { print "\033[1;31m$message"; }
- elsif ($message eq 'KILLED' || $message eq 'DRYRUN') { print "\033[1;33m$message"; }
- print "\033[0;39m\]\n";
- } else {
- print $message;
- }
- }
-}
-
-=pod
-
-=item spawn_process()
-
-Attempts to spawn a process. Accepts the process name, syslog log level, mail
-notification to address and spawn command.
-
-=cut
-
-# Spawn a process
-sub spawn_process {
- my ($process, $loglevel, $mailto, $cmd) = @_;
-
- print_init_style("Starting $process");
- my $rtn = !exists $O{dryrun} ? system("$cmd > /dev/null 2>&1") : 0;
- if ($rtn) {
- print_init_style('FAILED');
- alert $loglevel-1, $mailto, "Failed to spawn '$process' with '$cmd'";
- } else {
- print_init_style('OK');
- alert $loglevel, $mailto, "Spawned '$process' with '$cmd'";
- }
-}
-
-=pod
-
-=item display_help()
-
-Displays command line help.
-
-=cut
-
-# Command line help
-sub display_help {
- my $rtn = shift;
-
- print <<__end__;
-Syntax: $SELF [--conf=filename] [--daemon] [--cron] [--user=user]
- [--adminemail=emailaddress] [--dryrun] [--help] [--version]
- --help Display this help
- --version Display full version information
- --dryrun Dryrun (do not actually kill or spawn and processes)
- --daemon Spawn in to background daemon
- --cron Disables 'already running' errors with the --daemon option
- --conf=str Specify alternative config filename
- --user=str Only scan the process table for processes running as str
- --adminemail=str Force all notification emails to be sent to str
-__end__
-
- exit($rtn) if defined $rtn;
-}
-
-=pod
-
-=item read_config()
-
-Reads in runtime configuration options.
-
-=cut
-
-# Read in the config
-sub read_config {
- my $config_file = shift;
-
- # Barf and die if there's no configuration file!
- unless (-e $config_file) {
- log LOG_CRIT, "Configuration file $config_file does not exist\n";
- exit 4;
- }
-
- # Define default configuration values
- my %default = (
- facility => 'LOG_DAEMON',
- loglevel => 'LOG_NOTICE',
- notifyemail => 'root@localhost',
- #notifyemailfrom => sprintf("\"%s\" <%s\@%s>",$SELF,(getpwuid($EFFECTIVE_USER_ID))[0],HOSTNAME),
- notifyemailfrom => sprintf('%s@%s',(getpwuid($EFFECTIVE_USER_ID))[0],HOSTNAME),
- smtphost => 'localhost',
- smtptimeout => 20,
- sendmailcmd => '/usr/sbin/sendmail -t',
- frequency => 10,
- lastsafepid => 100,
- neverkillpid => 1,
- neverkillprocessname => 'kswapd kupdated mdrecoveryd',
- protectsafepidsquietly => 0,
- notifydetail => 'verbose',
- );
-
- # Read config file
- my $conf = new Config::General(
- -ConfigFile => $config_file,
- -LowerCaseNames => 1,
- -UseApacheInclude => 1,
- -IncludeRelative => 1,
- -DefaultConfig => \%default,
- -MergeDuplicateBlocks => 1,
- -AllowMultiOptions => 1,
- -MergeDuplicateOptions => 1,
- -AutoTrue => 1,
- );
- my %config = $conf->getall;
-
- # Force default values for dodgy user configuration options
- $config{frequency} = $default{frequency} unless $config{frequency} =~ /^\d+$/;
- $config{lastsafepid} = isnumeric($config{lastsafepid}) || $default{lastsafepid};
-
- return %config;
-}
-
-
-
-
-
-########################################
-# Subroutines
-
-=pod
-
-=item isnumeric()
-
-An evil bastard fudge to ensure that we're only dealing with numerics when
-necessary, from the config file and Proc::ProcessTable scan.
-
-=cut
-
-sub isnumeric {
- local $_ = shift || '';
- if (/^\s*(\-?[\d\.]+)\s*/) { return $1; }
- return undef;
-}
-
-=pod
-
-=item loglevel()
-
-Accepts a syslog loglevel keyword and returns the associated constant integer.
-
-=cut
-
-sub loglevel {
- local $_ = shift || '';
- return $_ if /^\d+$/;
- return LOG_EMERG if /^\s*([a-z]+_)?EMERG((A|E)NCY)?\s*$/i;
- return LOG_ALERT if /^\s*([a-z]+_)?ALERT\s*$/i;
- return LOG_CRIT if /^\s*([a-z]+_)?CRIT(ICAL)?\s*$/i;
- return LOG_ERR if /^\s*([a-z]+_)?ERR(OR)?\s*$/i;
- return LOG_WARNING if /^\s*([a-z]+_)?WARN(ING)?\s*$/i;
- #return LOG_NOTICE if /^\s*([a-z]+_)?NOTICE\s*$/i;
- return LOG_INFO if /^\s*([a-z]+_)?INFO(MATION(AL)?)?\s*$/i;
- return LOG_DEBUG if /^\s*([a-z]+_)?DEBUG\s*$/i;
- return LOG_NOTICE;
-}
-
-=pod
-
-=item logfacility()
-
-Accepts a syslog facility keyword and returns the associated constant integer.
-
-=cut
-
-sub logfacility {
- local $_ = shift || '';
- return $_ if /^\d+$/;
- return LOG_KERN if /^\s*([a-z]+_)?KERN((A|E)L)?\s*$/i;
- return LOG_USER if /^\s*([a-z]+_)?USER\s*$/i;
- return LOG_MAIL if /^\s*([a-z]+_)?MAIL\s*$/i;
- #return LOG_DAEMON if /^\s*([a-z]+_)?DAEMON\s*$/i;
- return LOG_AUTH if /^\s*([a-z]+_)?AUTH\s*$/i;
- return LOG_SYSLOG if /^\s*([a-z]+_)?SYSLOGD?\s*$/i;
- return LOG_LPR if /^\s*([a-z]+_)?LPR\s*$/i;
- return LOG_NEWS if /^\s*([a-z]+_)?NEWS\s*$/i;
- return LOG_UUCP if /^\s*([a-z]+_)?UUCP\s*$/i;
- return LOG_CRON if /^\s*([a-z]+_)?CRON\s*$/i;
- return LOG_AUTHPRIV if /^\s*([a-z]+_)?AUTHPRIV\s*$/i;
- return LOG_FTP if /^\s*([a-z]+_)?FTPD?\s*$/i;
- return LOG_LOCAL0 if /^\s*([a-z]+_)?LOCAL0\s*$/i;
- return LOG_LOCAL1 if /^\s*([a-z]+_)?LOCAL1\s*$/i;
- return LOG_LOCAL2 if /^\s*([a-z]+_)?LOCAL2\s*$/i;
- return LOG_LOCAL3 if /^\s*([a-z]+_)?LOCAL3\s*$/i;
- return LOG_LOCAL4 if /^\s*([a-z]+_)?LOCAL4\s*$/i;
- return LOG_LOCAL5 if /^\s*([a-z]+_)?LOCAL5\s*$/i;
- return LOG_LOCAL6 if /^\s*([a-z]+_)?LOCAL6\s*$/i;
- return LOG_LOCAL7 if /^\s*([a-z]+_)?LOCAL7\s*$/i;
- return LOG_DAEMON;
-}
-
-=pod
-
-=item alert()
-
-Logs a message to syslog using log() and sends a notification email using
-sendmail().
-
-=cut
-
-# Report something to user and syslog
-sub alert {
- my ($LOG_TYPE,$mailto,$subject,@ary) = @_;
- $subject ||= 'undef alert message';
- $subject .= ' [DRYRUN]' if exists $O{dryrun};
- log $LOG_TYPE, $subject;
- sendmail($C{notifyemailfrom},$mailto,$subject,@ary) if $mailto;
-}
-
-=pod
-
-=item log()
-
-Logs messages to DAEMON facility in syslog. Accepts a log
-level and message array. Will terminate the process if it is
-asked to log a message of a log level 2 or less (LOG_EMERG,
-LOG_ALERT, LOG_CRIT).
-
-=cut
-
-sub log {
- my ($loglevel,@msg) = @_;
- $loglevel = LOG_INFO if !defined $loglevel || $loglevel !~ /^[0-7]$/;
- @msg = '' unless @msg;
- unshift @msg,'Process exiting!' if $loglevel <= 2;
- { # Unix::Syslog gets unhappy for it's sprintf stuff otherwise :)
- (my $syslogmsg = "@msg") =~ s/%/%%/g;
- syslog $loglevel, $syslogmsg;
- }
- #if ($loglevel <= 2) {
- # warn "@msg\n";
- # exit(1);
- #}
-}
-
-=pod
-
-=item sendmail()
-
-Sends email notifications of syslog messages, called by alert().
-Accepts sending email address, recipient email address, short
-message subject and an optional detailed message body array.
-
-=cut
-
-# Send an email
-sub sendmail {
- my ($mail,$to,$subject,@ary) = @_;
-
- $to = $O{adminemail} if exists $O{adminemail};
- @ary = $subject unless @ary;
- $subject = sprintf("[%s/%s] %s",$SELF,HOSTNAME,$subject);
- unshift @ary,"Subject: $subject\n";
- unshift @ary,"To: \"$to\" <$to>";
- unshift @ary,"From: \"$mail\" <$mail>";
-
-
-
-#################################################
-# I may remove this code in the future. I think
-# it's probably overkill, and it's not especially
-# portable.
-
- # Append /proc file information to @ary if necessary
- my @debugfiles = $C{notifydetail} =~ /^\s*verbose\s*$/i ? qw/version loadavg meminfo/ :
- $C{notifydetail} =~ /^\s*debug\s*$/i ? qw/version loadavg meminfo swaps mounts filesystems partition smodules/ :
- $C{notifydetail} =~ /^[a-z0-9\s]+$/i ? $C{notifydetail} :
- undef;
- for my $file (@debugfiles) {
- next unless $file && -e "/proc/$file";
- if (open(PFH,"/proc/$file")) {
- push @ary, ("\n/proc/$file", '=' x length("/proc/$file"));
- while (local $_ = <PFH>) { chomp; push @ary, $_; }
- close(PFH) || log LOG_WARNING, "Unable to close file handle PFH for file '/proc/$file': $!\n";
- } else {log LOG_WARNING, "Unable to open file handle PFH for file '/proc/$file': $!\n"; }
- }
-#################################################
-
-
-
- # Open the SMTP connection
- my $smtp = Net::SMTP->new(
- $C{smtphost},
- Timeout => $C{smtptimeout},
- Hello => HOSTNAME,
- );
-
- # If the SMTP connection was established then send the email
- if ($smtp) {
- $smtp->mail($mail);
- $smtp->to($to);
- $smtp->data(join("\n",@ary));
- $smtp->dataend();
-
- # Otherwise try using the local sendmail binary
- } else {
- log LOG_WARNING, "Unable to establish SMTP connection with $C{smtphost}; attempting sendmail pipe instead";
- if (open(PH,"|$C{sendmailcmd}")) {
- print PH $_ for @ary;
- close(PH) || log LOG_WARNING, "Unable to close pipe handle PH for command '|$C{sendmailcmd}': $!";
- } else {
- log LOG_WARNING, "Unable to open pipe handle PH for command '|$C{sendmailcmd}': $!";
- }
- }
-}
-
-=pod
-
-=item daemonize()
-
-Launches the process in to the background. Checks to see if there is already an
-instance running.
-
-=cut
-
-# Daemonize self
-sub daemonize {
- my $pidfile = shift;
- # Check that we're not already running, and quit if we are
- if (-f $pidfile) {
- unless (open(PID,$pidfile)) {
- log LOG_CRIT, "Unable to open file handle PID for file '$pidfile': $!\n";
- exit 5;
- }
- my $pid = <PID>;
- close(PID) || log LOG_WARNING, "Unable to close file handle PID for file '$pidfile': $!\n";
- #print `ls -al /proc/$pid/stat` if DEBUG;
- if (-f "/proc/$pid/stat") {
- open(FH,"/proc/$pid/stat") || log LOG_WARNING, "Unable to open file handle FH for file '/proc/$pid/stat': $!\n";
- my $line = <FH>;
- close(FH) || log LOG_WARNING, "Unable to close file handle FH for file '/proc/$pid/stat': $!\n";
- if ($line =~ /\d+[^(]*\((.*)\)\s*/) {
- #if ($line =~ /\d+\s+\((.+?)\)\s+/) {
- my $process = $1;
- if ($process =~ /^$SELF$/) {
- log LOG_NOTICE, "$SELF already running at PID $pid; exiting.\n" unless exists $O{cron};
- closelog;
- exit 0;
- }
- }
- } else {
- log LOG_NOTICE, "Removing stale PID file.\n";
- unlink($pidfile);
- }
- }
-
- # Daemon parent about to spawn
- if (my $pid = fork) {
- log LOG_NOTICE, "Forking background daemon, process $pid.\n";
- closelog;
- exit 0;
-
- # Child daemon process that was spawned
- } else {
- # Fork a second time to get rid of any attached terminals
- if (my $pid = fork) {
- log LOG_NOTICE, "Forking second background daemon, process $pid.\n";
- closelog;
- exit 0;
- } else {
- unless (defined $pid) {
- log LOG_CRIT, "Cannot fork: $!\n";
- exit 6;
- }
- close(STDOUT); close(STDERR); chdir '/';
- unless (open(FH,">$pidfile")) {
- log LOG_CRIT, "Unable to open file handle FH for file '$pidfile': $!\n";
- exit 7;
- }
- print FH $$;
- close(FH) || log LOG_WARNING, "Unable to close file handle FH for file '$pidfile': $!\n";
- }
- }
-}
-
-=pod
-
-=item display_version()
-
-Displays complete version, author and license information.
-
-=back
-
-=cut
-
-# Display version information
-sub display_version {
- my $rtn = shift;
- if ('$Revision: 1.57 $' =~ /Revision: (\S+)/) {
- print "$SELF $1\n";
- }
- print "$VERSION\n";
- print "Written by Nicholas P Lawrence, <nicl\@perlguy.org.uk>.\n\n";
- print "Copyright (C) 2002,2003 Nicholas P Lawrence.\n\n";
- print <<EOL;
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-EOL
- exit($rtn) if defined $rtn;
-}
-
-
-
-
-
-=pod
-
-=head1 BUGS
-
-Hopefully none. ;-) Send any bug reports to me at nicl@perlguy.org.uk
-along with any patches and details of how to replicate the problem.
-Please only send reports for bugs which can be replicated in the
-I<latest> version of the software. The latest version can always be
-found at http://psmon.perlguy.org.uk
-
-=head1 TODO
-
-The following functionality will be added soon:
-
-=over 4
-
-=item Code cleanup
-
-The code needs to be cleaned up and made more efficient.
-
-=item killperprocessname directive
-
-Will accept a boolean value. If true, only 1 process per process scope
-will ever be killed, instead of all process IDs matching kill rules.
-This should be used in conjunction with the new killcmd directive. For
-example, you may define that a database daemon may never take up more
-than 90% CPU time, and it runs many children processes. If it exceeds
-90% CPU time, you want to issue ONE restart command in order to stop and
-then start all the database processes in one go.
-
-=item time period limited rules
-
-Functionality to limit validity of process scopes to only be checked
-between defined time periods. For example, only check that httpd is running
-between the hours of 8am and 5pm on Mondays and Tuesdays.
-
-=back
-
-=head1 SEE ALSO
-
-nsmon
-
-=head1 LICENSE
-
-Written by Nicholas P Lawrence, <nicl@perlguy.org.uk>.
-Copyright (C) 2002,2003 Nicholas P Lawrence.
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-=head1 AUTHOR
-
-PerlGuy <nicl@perlguy.org.uk>
-
-http://perlguy.org.uk/perl_guy/
-
-=cut
-
-
-__END__
-
-#define KERN_EMERG "<0>" /* system is unusable */
-#define KERN_ALERT "<1>" /* action must be taken immediately */
-#define KERN_CRIT "<2>" /* critical conditions */
-#define KERN_ERR "<3>" /* error conditions */
-#define KERN_WARNING "<4>" /* warning conditions */
-#define KERN_NOTICE "<5>" /* normal but significant condition */
-#define KERN_INFO "<6>" /* informational */
-#define KERN_DEBUG "<7>" /* debug-level messages */
-
-
-
diff --git a/psmon-1.0.4/psmon.1 b/psmon-1.0.4/psmon.1
deleted file mode 100644
index d5e024a..0000000
--- a/psmon-1.0.4/psmon.1
+++ /dev/null
@@ -1,651 +0,0 @@
-.\" Automatically generated by Pod::Man v1.34, Pod::Parser v1.13
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sh \" Subsection heading
-.br
-.if t .Sp
-.ne 5
-.PP
-\fB\\$1\fR
-.PP
-..
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. | will give a
-.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to
-.\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C'
-.\" expand to `' in nroff, nothing in troff, for use with C<>.
-.tr \(*W-|\(bv\*(Tr
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-. ds -- \(*W-
-. ds PI pi
-. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
-. ds L" ""
-. ds R" ""
-. ds C` ""
-. ds C' ""
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
-.\" entries marked with X<> in POD. Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.if \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-..
-. nr % 0
-. rr F
-.\}
-.\"
-.\" For nroff, turn off justification. Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.hy 0
-.if n .na
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-. \" fudge factors for nroff and troff
-.if n \{\
-. ds #H 0
-. ds #V .8m
-. ds #F .3m
-. ds #[ \f1
-. ds #] \fP
-.\}
-.if t \{\
-. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-. ds #V .6m
-. ds #F 0
-. ds #[ \&
-. ds #] \&
-.\}
-. \" simple accents for nroff and troff
-.if n \{\
-. ds ' \&
-. ds ` \&
-. ds ^ \&
-. ds , \&
-. ds ~ ~
-. ds /
-.\}
-.if t \{\
-. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-. \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-. \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-. ds : e
-. ds 8 ss
-. ds o a
-. ds d- d\h'-1'\(ga
-. ds D- D\h'-1'\(hy
-. ds th \o'bp'
-. ds Th \o'LP'
-. ds ae ae
-. ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "PSMON 1"
-.TH PSMON 1 "2003-03-20" "perl v5.8.0" "User Contributed Perl Documentation"
-.SH "NAME"
-psmon \- Process Table Monitoring Script
-.SH "VERSION"
-.IX Header "VERSION"
-$Id: psmon.1,v 1.1 2003/03/20 16:21:14 nicl Exp $
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-Single user account crontab operation.
-.PP
-.Vb 5
-\& # DO NOT EDIT THIS FILE - edit the master and reinstall.
-\& # (/tmp/crontab.28945 installed on Wed Jan 8 16:29:24 2003)
-\& # (Cron version -- $Id: psmon.1,v 1.1 2003/03/20 16:21:14 nicl Exp $)
-\& MAILTO="nicl@perlguy.org.uk"
-\& USER=nicl
-.Ve
-.PP
-.Vb 1
-\& */5 * * * * /sbin/psmon --daemon --cron --conf=~/etc/psmon.conf --user=$USER --adminemail=nicl@perlguy.org.uk
-.Ve
-.PP
-Regular system-wide call from cron:
-.PP
-.Vb 1
-\& */5 * * * * /sbin/psmon --daemon --cron
-.Ve
-.PP
-Only check processes during working office hours:
-.PP
-.Vb 1
-\& * 9-17 * * * /sbin/psmon
-.Ve
-.PP
-Command line syntax.
-.PP
-.Vb 11
-\& [nicl@nicl]$ psmon --help
-\& Syntax: psmon [--conf=filename] [--daemon] [--cron] [--user=user]
-\& [--adminemail=emailaddress] [--dryrun] [--help] [--version]
-\& --help Display this help
-\& --version Display full version information
-\& --dryrun Dryrun (do not actually kill or spawn and processes)
-\& --daemon Spawn in to background daemon
-\& --cron Disables 'already running' errors with the --daemon option
-\& --conf=str Specify alternative config filename
-\& --user=str Only scan the process table for processes running as str
-\& --adminemail=str Force all notification emails to be sent to str
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-This script monitors the process table using Proc::ProcessTable, and
-will respawn or kill processes based on a set of rules defined in an
-Apache style configuration file.
-.PP
-Processes will be respawned if a spawn command is defined for a process,
-and no occurances of that process are running. If the \-\-user command line
-option is specified, then the process will only be spawned if no instances
-are running as the specified userid.
-.PP
-Processes can be killed off if they have been running for too long,
-use too much \s-1CPU\s0 or memory resources, or have too many concurrent
-versions running. Exceptions can be made to kill rulesets using the
-\&\fIpidfile\fR and \fIlastsafepid\fR directives.
-.PP
-If a \s-1PID\s0 file is declared for a process, psmon will never kill the
-process \s-1ID\s0 that is contained within the pid file. This is useful if for
-example, you have a script which spawns hundreds of child processes
-which you may need to automatically kill, but you do not want to kill
-the parent process.
-.PP
-Any actions performed will be logged to the \s-1DAEMON\s0 syslog facility by default.
-There is support to optionally also send notifications emails to an
-administrator on a global or pre-rule basis.
-.SH "OPERATION"
-.IX Header "OPERATION"
-.IP "\-\-dryrun" 4
-.IX Item "--dryrun"
-Execute a dry-run (do not actually kill or spawn and processes).
-.IP "\-\-conf=\fIfilename\fR" 4
-.IX Item "--conf=filename"
-Specify alternative config filename.
-.IP "\-\-daemon" 4
-.IX Item "--daemon"
-Spawn in to background daemon.
-.IP "\-\-cron" 4
-.IX Item "--cron"
-Disables already running warnings when trying to launch as another daemon.
-.IP "\-\-user=\fIuser\fR" 4
-.IX Item "--user=user"
-Only scan the process table for processes running under this username.
-.IP "\-\-adminemail=\fIemailaddress\fR" 4
-.IX Item "--adminemail=emailaddress"
-Force all notification emails to be sent to this email address.
-.SH "INSTALLATION"
-.IX Header "INSTALLATION"
-In addition to Perl 5.005_03 or higher, the following Perl modules are
-required:
-.PP
-.Vb 6
-\& Getopt::Long
-\& Config::General
-\& POSIX
-\& Proc::ProcessTable
-\& Net::SMTP
-\& Unix::Syslog
-.Ve
-.PP
-The \s-1POSIX\s0 module is usually supplied with Perl as standard, as is
-Getopt::Long. All these modules can be obtained from \s-1CPAN\s0. Visit
-http://search.span.org and http://www.cpan.org for further details.
-For the lazy people reading this, you can try the
-following command to install these modules:
-.PP
-.Vb 2
-\& for m in Getopt::Long Config::General POSIX Proc::ProcessTable \e
-\& Net::SMTP Unix::Syslog;do perl -MCPAN -e"install $m";done
-.Ve
-.PP
-Alternatively you can run the install.sh script which comes in the
-distribution tarball. It will attempt to install the right modules,
-install the script and configuration file, and generate \s-1UNIX\s0 man page
-documentation.
-.PP
-By default psmon will look for its runtime configuration in /etc/psmon.conf,
-although this can be defined as otherwise from the command line. For system
-wide installations it is reccomended that you install your psmon in to the
-default location.
-.SH "CONFIGURATION"
-.IX Header "CONFIGURATION"
-The default configuration file location is /etc/psmon.conf. A different
-configuration file can be declared from the command line.
-.PP
-Syntax of the configuration file is based upon that which is used by
-Apache. Each process to be monitored is declared with a Process scope
-directive like this example which monitors the OpenSSH daemon:
-.PP
-.Vb 6
-\& <Process sshd>
-\& spawncmd /sbin/service sshd start
-\& pidfile /var/run/sshd.pid
-\& instances 50
-\& pctcpu 90
-\& </Process>
-.Ve
-.PP
-There is a special \fI*\fR process scope which applies to \fIall\fR running
-processes. This special scope should be used with extreme care. It does
-not support the use of the \fIspawncmd\fR, \fIpidfile\fR, \fIinstances\fR or \fIttl\fR
-directivers. A typical example of this scope might be as follows:
-.PP
-.Vb 4
-\& <Process *>
-\& pctcpu 95
-\& pctmem 80
-\& </Process>
-.Ve
-.PP
-Global directives which are not specific to any one process should be placed
-outside of any Process scopes.
-.Sh "\s-1DIRECTIVES\s0"
-.IX Subsection "DIRECTIVES"
-.IP "Facility" 4
-.IX Item "Facility"
-Defines which syslog facility to log to. Valid options are as follows;
-\&\s-1LOG_KERN\s0, \s-1LOG_USER\s0, \s-1LOG_MAIL\s0, \s-1LOG_DAEMON\s0, \s-1LOG_AUTH\s0, \s-1LOG_SYSLOG\s0, \s-1LOG_LPR\s0,
-\&\s-1LOG_NEWS\s0, \s-1LOG_UUCP\s0, \s-1LOG_CRON\s0, \s-1LOG_LOCAL0\s0, \s-1LOG_LOCAL1\s0, \s-1LOG_LOCAL2\s0,
-\&\s-1LOG_LOCAL3\s0, \s-1LOG_LOCAL4\s0, \s-1LOG_LOCAL5\s0, \s-1LOG_LOCAL6\s0 and \s-1LOG_LOCAL7\s0. Defaults
-to \s-1LOG_DAEMON\s0.
-.IP "LogLevel" 4
-.IX Item "LogLevel"
-Defines the loglevel priority that notifications to syslog will be
-marked as. Valid options are as follows; \s-1LOG_EMERG\s0, \s-1LOG_ALERT\s0, \s-1LOG_CRIT\s0,
-\&\s-1LOG_ERR\s0, \s-1LOG_WARNING\s0, \s-1LOG_NOTICE\s0, \s-1LOG_INFO\s0 and \s-1LOG_DEBUG\s0. The log level
-used by a notification for any failed action will automatically be
-raised to the next level in order to highlight the failure. May be also be used
-in a Process scope which will take priority over a global declaration.
-Defaults to \s-1LOG_NOTICE\s0.
-.IP "KillLogLevel (previously KillPIDLogLevel)" 4
-.IX Item "KillLogLevel (previously KillPIDLogLevel)"
-The same as the loglevel directive, but only applies to process kill actions.
-Takes priority over the loglevel directive. May be also be used in a
-Process scope which will take priority over a global declaration.
-Undefined by default.
-.IP "SpawnLogLevel" 4
-.IX Item "SpawnLogLevel"
-The same as the loglevel directive, but only applies to process spawn actions.
-Takes priority over the loglevel directive. May be also be used in a
-Process scope which will take priority over a global declaration.
-Undefined by default.
-.IP "AdminEmail" 4
-.IX Item "AdminEmail"
-Defines the email address where notification emails should be sent to.
-May be also be used in a Process scope which will take priority over a
-global declaration. Defaults to root@localhost.
-.IP "NotifyEmailFrom" 4
-.IX Item "NotifyEmailFrom"
-Defines the email address that notification email should be addresses
-from. Defaults to <username>@\fIhostname\fR.
-.IP "Frequency" 4
-.IX Item "Frequency"
-Defines the frequency of process table queries. Defaults to 60 seconds.
-.IP "LastSafePID" 4
-.IX Item "LastSafePID"
-When defined, psmon will never attempt to kill a process \s-1ID\s0 which is
-numerically less than or equal to the value defined by lastsafepid. It
-should be noted that psmon will never attempt to kill itself, or a process \s-1ID\s0
-less than or equal to 1. Defaults to 100.
-.IP "ProtectSafePIDsQuietly" 4
-.IX Item "ProtectSafePIDsQuietly"
-Accepts a boolean value of On or Off. Surpresses all notifications of
-preserved process IDs when used in conjunction with the \fIlastsafepid\fR
-directive. Defaults to Off.
-.IP "SMTPHost" 4
-.IX Item "SMTPHost"
-Defines the \s-1IP\s0 address or hostname of the \s-1SMTP\s0 server to used to send
-email notifications. Defaults to localhost.
-.IP "SMTPTimeout" 4
-.IX Item "SMTPTimeout"
-Defines the timeout in seconds to be used during \s-1SMTP\s0 connections.
-Defaults to 20 seconds.
-.IP "SendmailCmd" 4
-.IX Item "SendmailCmd"
-Defines the sendmail command to use to send notification emails if there
-is a failure with the \s-1SMTP\s0 connection to the host defined by smtphost.
-Defaults to '/usr/sbin/sendmail \-t'.
-.IP "Dryrun" 4
-.IX Item "Dryrun"
-Forces this psmon to as if the \-\-dryrun command line switch had specified.
-This is useful if you want to force a specific configuration file to only
-report and never actually take any automated action.
-.IP "NotifyDetail" 4
-.IX Item "NotifyDetail"
-Defines the verbosity of notification emails which are sent. Can be set
-to 'Simple', 'Verbose' or 'Debug'. Defaults to 'Verbose'. This function
-will be removed soon. It is unnecessary bloat and is not very portable.
-.Sh "\s-1PROCESS\s0 \s-1SCOPE\s0 \s-1DIRECTIVES\s0"
-.IX Subsection "PROCESS SCOPE DIRECTIVES"
-.IP "SpawnCmd" 4
-.IX Item "SpawnCmd"
-Defines the full command line to be executed in order to respawn a dead
-process.
-.IP "KillCmd" 4
-.IX Item "KillCmd"
-Defines the full command line to be executed in order to gracefully
-shutdown or kill a rogue process. If the command returns a boolean true
-exit status then it is assumed that the command failed to execute
-sucessfully. If no KillCmd is specified or the command fails, the
-process will be killed by sending a \s-1SIGKILL\s0 signal with the standard
-\&\fIkill()\fR function. Undefined by default.
-.IP "PIDFile" 4
-.IX Item "PIDFile"
-Defines the full path and filename of a file created by a process which
-contain it's main parent process \s-1ID\s0.
-.IP "\s-1TTL\s0" 4
-.IX Item "TTL"
-Defines a maximum time to live (in seconds) of a process. The process
-will be killed once it has been running longer than this value, and
-it's process \s-1ID\s0 isn't contained in the defined pidfile.
-.IP "PctCpu" 4
-.IX Item "PctCpu"
-Defines a maximum allowable percentage of \s-1CPU\s0 time a process may use.
-The process will be killed once it's \s-1CPU\s0 usage exceeds this threshold
-and it's process \s-1ID\s0 isn't contained in the defined pidfile.
-.IP "PctMem" 4
-.IX Item "PctMem"
-Defines a maximum allowable percentage of total system memory a process
-may use. The process will be killed once it's memory usage exceeds this
-threshold and it's process \s-1ID\s0 isn't contained in the defined pidfile.
-.IP "Instances" 4
-.IX Item "Instances"
-Defines a maximum number of instances of a process which may run. The
-process will be killed once there are more than this number of occurances
-running, and it's process \s-1ID\s0 isn't contained in the defined pid file.
-.IP "NoEmailOnKill" 4
-.IX Item "NoEmailOnKill"
-Accepts a boolean value of True or False. Surpresses process killing
-notification emails for this process scope. Defaults to False.
-.IP "NoEmailOnSpawn" 4
-.IX Item "NoEmailOnSpawn"
-Accepts a boolean value of True or False. Surpresses process spawning
-notification emails for this process scope. Defaults to False.
-.IP "NoEmail" 4
-.IX Item "NoEmail"
-Accepts a boolean value of True or False. Surpresses all notification
-emails for this process scope. Defaults to False.
-.IP "NeverKillPID" 4
-.IX Item "NeverKillPID"
-Accepts a space delimited list of PIDs which will never be killed.
-Defaults to 1.
-.IP "NeverKillProcessName" 4
-.IX Item "NeverKillProcessName"
-Accepts a space deliomited list of process names which will never be
-killed. Defaults to 'kswapd kupdated mdrecoveryd'.
-.Sh "\s-1EXAMPLES\s0"
-.IX Subsection "EXAMPLES"
-.Vb 7
-\& <Process syslogd>
-\& spawncmd /sbin/service syslogd restart
-\& pidfile /var/run/syslogd.pid
-\& instances 1
-\& pctcpu 70
-\& pctmem 30
-\& </Process>
-.Ve
-.PP
-Syslog is a good example of a process which can get a little full
-of itself under certian circumstances, and excessively hog \s-1CPU\s0 and
-memory. Here we will kill off syslogd processes if it exceeds 70%
-\&\s-1CPU\s0 or 30% memory utilization.
-.PP
-Older running copies of syslogd will be killed if they are running,
-while leaving the most recently spawned copy which will be listed in
-the \s-1PID\s0 file defined.
-.PP
-.Vb 6
-\& <Process httpd>
-\& spawncmd /sbin/service httpd restart
-\& pidfile /var/run/httpd.pid
-\& loglevel critical
-\& adminemail pager@noc.company.com
-\& </Process>
-.Ve
-.PP
-Here we are monitoring Apache to ensure that it is restarted if
-it dies. The pidfile directive in this example is actually
-redundant because we have not defined any rule where we should
-consider killing any httpd processes.
-.PP
-All notifications relating to this process will be logged with the
-syslog priority of critical (\s-1LOG_CRIT\s0), and all emailed to
-pager@noc.company.com which could typically forward to a pager.
-.PP
-Any failed attempts to kill or restart a process will automatically
-be logged as a syslog priority one level higher than that specified.
-If a restart of Apache were to fail in this example, a wall
-notification would be broadcast to all interactive terminals
-connected to the machine, since the next log priority up from
-\&\s-1LOG_CRIT\s0 is \s-1LOG_EMERG\s0.
-.PP
-.Vb 4
-\& <Process find>
-\& noemail True
-\& ttl 3600
-\& </Process>
-.Ve
-.PP
-Kill old find processes which have been running for over an hour.
-Do not send an email notification since it's not too important.
-.SH "SIGNALS"
-.IX Header "SIGNALS"
-.IP "\s-1HUP\s0" 4
-.IX Item "HUP"
-Forces an immediate reload of the configuration file. You should
-send the \s-1HUP\s0 signal when you are running psmon as a background
-daemon and have altered the psmon.conf file.
-.IP "\s-1USR1\s0" 4
-.IX Item "USR1"
-Forces an immediate scan of the process table.
-.SH "EXIT CODES"
-.IX Header "EXIT CODES"
-.IP "Value 0: Exited gracefully" 4
-.IX Item "Value 0: Exited gracefully"
-The program exited gracefully.
-.IP "Value 2: Failure to lookup \s-1UID\s0 for username" 4
-.IX Item "Value 2: Failure to lookup UID for username"
-The username specified by the \-\-user command line option did not resolve to a valid
-\&\s-1UID\s0.
-.IP "Value 3: Configuration file is disabled" 4
-.IX Item "Value 3: Configuration file is disabled"
-The configuration file is disabled. (It contains an active 'Disabled' directive).
-.IP "Value 4: Configuration file does not exist" 4
-.IX Item "Value 4: Configuration file does not exist"
-The specified configuration file, (default or user specified) does not exist.
-.IP "Value 5: Unable to open \s-1PID\s0 file handle" 4
-.IX Item "Value 5: Unable to open PID file handle"
-Failed to open a read-only file handle for the runtime \s-1PID\s0 file.
-.IP "Value 6: Failed to fork" 4
-.IX Item "Value 6: Failed to fork"
-An error occured while attempting to fork the child background daemon process.
-.IP "Value 7: Unable to open \s-1PID\s0 file handle" 4
-.IX Item "Value 7: Unable to open PID file handle"
-Failed to open a write file handle for the runtime \s-1PID\s0 file.
-.IP "Value 8: Failure to load Perl module" 4
-.IX Item "Value 8: Failure to load Perl module"
-One or more Perl module could not be loaded. This usually happens when one of the
-required Perl modules which psmon depends upon is not installed or could not be located
-in the Perl \s-1LIB\s0 search path.
-.SH "PERFORMANCE"
-.IX Header "PERFORMANCE"
-psmon is not especially fast. Much of it's time is spent reading the process table.
-If the process table is particularly large this can take a number of seconds.
-Although is rarely a major problem on todays speedy machines, I have run a few tests
-so you take look at the times and decide if you can afford the wait.
-.PP
-.Vb 9
-\& CPU OS Open Open Files/Procs 1m Load Real Time
-\& PIII 1.1G Mandrake 9.0 10148 / 267 0.01 0m0.430s
-\& PIII 1.2G Mandrake 9.0 16714 / 304 0.44 0m0.640s
-\& Celeron 500 Red Hat 6,1 1780 / 81 1.27 0m0.880s
-\& PII 450 Red Hat 6.0 300 / 23 0.01 0m1.050s
-\& 2x Xeon 1.8G Mandrake 9.0 90530 / 750 0.38 0m1.130s
-\& Celeron 500 Red Hat 6.1 1517 / 77 1.00 0m1.450s
-\& PIII 866 Red Hat 8.0 3769 / 76 0.63 0m1.662s
-\& PIII 750 Red Hat 6.2 754 / 35 3.50 0m2.170s
-.Ve
-.PP
-These production machines were running the latest patched stock distribution kernels.
-I have listed the total number of open file descriptors, processes running and 1 minute
-load average to give you a slightly better context of the performance.
-.SH "SUBROUTINES"
-.IX Header "SUBROUTINES"
-.IP "check_processtable($)" 4
-.IX Item "check_processtable($)"
-Reads the current process table, checks and then executes any appropriate
-action to be taken. Does not accept any paramaters.
-.IP "\fIslay_process()\fR" 4
-.IX Item "slay_process()"
-Attempts to kill a process with it's killcmd, or failing that using the \fIkill()\fR function.
-Accepts the process name, syslog log level, email notification to address and a reference
-to the \f(CW%slay\fR hash.
-.IP "\fIprint_init_style()\fR" 4
-.IX Item "print_init_style()"
-Prints a Red Hat sysvinit style status message. Accepts an array of messages
-to display in sequence.
-.IP "\fIspawn_process()\fR" 4
-.IX Item "spawn_process()"
-Attempts to spawn a process. Accepts the process name, syslog log level, mail
-notification to address and spawn command.
-.IP "\fIdisplay_help()\fR" 4
-.IX Item "display_help()"
-Displays command line help.
-.IP "\fIread_config()\fR" 4
-.IX Item "read_config()"
-Reads in runtime configuration options.
-.IP "\fIisnumeric()\fR" 4
-.IX Item "isnumeric()"
-An evil bastard fudge to ensure that we're only dealing with numerics when
-necessary, from the config file and Proc::ProcessTable scan.
-.IP "\fIloglevel()\fR" 4
-.IX Item "loglevel()"
-Accepts a syslog loglevel keyword and returns the associated constant integer.
-.IP "\fIlogfacility()\fR" 4
-.IX Item "logfacility()"
-Accepts a syslog facility keyword and returns the associated constant integer.
-.IP "\fIalert()\fR" 4
-.IX Item "alert()"
-Logs a message to syslog using \fIlog()\fR and sends a notification email using
-\&\fIsendmail()\fR.
-.IP "\fIlog()\fR" 4
-.IX Item "log()"
-Logs messages to \s-1DAEMON\s0 facility in syslog. Accepts a log
-level and message array. Will terminate the process if it is
-asked to log a message of a log level 2 or less (\s-1LOG_EMERG\s0,
-\&\s-1LOG_ALERT\s0, \s-1LOG_CRIT\s0).
-.IP "\fIsendmail()\fR" 4
-.IX Item "sendmail()"
-Sends email notifications of syslog messages, called by \fIalert()\fR.
-Accepts sending email address, recipient email address, short
-message subject and an optional detailed message body array.
-.IP "\fIdaemonize()\fR" 4
-.IX Item "daemonize()"
-Launches the process in to the background. Checks to see if there is already an
-instance running.
-.IP "\fIdisplay_version()\fR" 4
-.IX Item "display_version()"
-Displays complete version, author and license information.
-.SH "BUGS"
-.IX Header "BUGS"
-Hopefully none. ;\-) Send any bug reports to me at nicl@perlguy.org.uk
-along with any patches and details of how to replicate the problem.
-Please only send reports for bugs which can be replicated in the
-\&\fIlatest\fR version of the software. The latest version can always be
-found at http://psmon.perlguy.org.uk
-.SH "TODO"
-.IX Header "TODO"
-The following functionality will be added soon:
-.IP "Code cleanup" 4
-.IX Item "Code cleanup"
-The code needs to be cleaned up and made more efficient.
-.IP "killperprocessname directive" 4
-.IX Item "killperprocessname directive"
-Will accept a boolean value. If true, only 1 process per process scope
-will ever be killed, instead of all process IDs matching kill rules.
-This should be used in conjunction with the new killcmd directive. For
-example, you may define that a database daemon may never take up more
-than 90% \s-1CPU\s0 time, and it runs many children processes. If it exceeds
-90% \s-1CPU\s0 time, you want to issue \s-1ONE\s0 restart command in order to stop and
-then start all the database processes in one go.
-.IP "time period limited rules" 4
-.IX Item "time period limited rules"
-Functionality to limit validity of process scopes to only be checked
-between defined time periods. For example, only check that httpd is running
-between the hours of 8am and 5pm on Mondays and Tuesdays.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-nsmon
-.SH "LICENSE"
-.IX Header "LICENSE"
-Written by Nicholas P Lawrence, <nicl@perlguy.org.uk>.
-Copyright (C) 2002,2003 Nicholas P Lawrence.
-.PP
-This program is free software; you can redistribute it and/or
-modify it under the terms of the \s-1GNU\s0 General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-.PP
-This program is distributed in the hope that it will be useful,
-but \s-1WITHOUT\s0 \s-1ANY\s0 \s-1WARRANTY\s0; without even the implied warranty of
-\&\s-1MERCHANTABILITY\s0 or \s-1FITNESS\s0 \s-1FOR\s0 A \s-1PARTICULAR\s0 \s-1PURPOSE\s0. See the
-\&\s-1GNU\s0 General Public License for more details.
-.PP
-You should have received a copy of the \s-1GNU\s0 General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place \- Suite 330, Boston, \s-1MA\s0 02111\-1307, \s-1USA\s0.
-.SH "AUTHOR"
-.IX Header "AUTHOR"
-PerlGuy <nicl@perlguy.org.uk>
-.PP
-http://perlguy.org.uk/perl_guy/
diff --git a/psmon-1.0.4/psmon.conf b/psmon-1.0.4/psmon.conf
deleted file mode 100644
index 827a761..0000000
--- a/psmon-1.0.4/psmon.conf
+++ /dev/null
@@ -1,251 +0,0 @@
-############################################################
-# $Id: psmon.conf,v 1.17 2003/03/25 14:22:33 nicl Exp $
-# psmon.conf - Example psmon Configuration File
-# Copyright: (c)2002,2003 Nic Lawrence. All rights reserved.
-############################################################
-# This file is part of psmon.
-#
-# psmon is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# psmon is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with psmon; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-############################################################
-
-#
-# Please read through this configuration file in detail. It
-# will NOT function right out of the box without any
-# modifications. This is for good reason, since I don't want
-# to receive snotty emails from you or your system
-# administrator, being accused of killing your server or
-# workstation.
-#
-# There is further documentation supplied with the psmon
-# software. I suggest that you read it thoroughly.
-#
-# - The author, Nic Lawrence
-#
-
-
-
-# Defines the email address where notification emails should be sent
-# to. Defaults to root@localhost.
-#
-# Please change this to your own email address. I will not be too
-# appreciative of receiving notifications about your quake server
-# and eggdrops not running!!
-# NotifyEmail nicl@perlguy.org.uk
-
-# Defines the IP address or hostname of the SMTP server to used to
-# send email notifications. Defaults to localhost
-# SmtpHost mail.tfb.net
-
-# Defines the frequency of process table queries. Defaults to 60 seconds.
-Frequency 90
-
-# When defined, psmon will never attempt to kill a process ID which
-# is numerically less than or equal to the value defined by last
-# safepid. It should be noted that psmon will never attempt to kill a
-# process ID less than or equal to 1, or itself. Defaults to 100.
-LastSafePID 800
-
-# Accepts a boolean value of On or Off. Surpresses all notifications
-# from of preserved process IDs when used in conjunction with the
-# lastsafepid directive. Defaults to Off.
-ProtectSafePIDsQuietly Off
-
-# Forces this psmon to as if the --dryrun command line switch had
-# specified. This is useful if you want to force a specific
-# configuration file to only report and never actually take any
-# automated action.
-#
-# This is enabled in this default distribution configuration in
-# order to prevent people from blindly executing psmon "out of the
-# box" and causing damage in live environments. Yes, such stupid
-# people do really exist!
-DryRun True
-
-
-
-# The <Process *> scope is commented out by default. It should
-# be used with *EXTREME* care. If you do decide to use it, may I
-# suggest that you run psmon in 'DryRun' mode by adding the
-# 'DryRun' directive in this configuration file. READ THE
-# DOCUMENTATION THOROUGHLY BEFORE ENABLING THIS FEATURE!!!
-
-#<Process *>
-# PctCpu 80
-# PctMem 50
-#</Process>
-
-
-
-# I have included a set of commonly required processes. They
-# are all vital services which must be running on all of my
-# workstations and servers. It's a pretty good guess you'll
-# want them to always be running too.
-
-# Secure Shell Daemon
-<Process sshd>
- LogLevel LOG_CRITICAL
- SpawnCmd /sbin/service sshd restart
- PidFile /var/run/sshd.pid
- # Instances 30
- # PctCPU 90
-</Process>
-
-# Cron Daemon
-<Process crond>
- spawncmd /sbin/service crond restart
- pidfile /var/run/crond.pid
-</Process>
-
-# System Logger Daemon
-<Process syslogd>
- spawncmd /sbin/service syslog restart
- pidfile /var/run/syslogd.pid
-</Process>
-
-# Internet Super Daemon
-<Process xinetd>
- spawncmd /sbin/service xinetd restart
- pidfile /var/run/xinetd.pid
-</Process>
-
-# Remote WHO Daemon
-<Process rwhod>
- # rwhod is *EVIL*! There is almost never any real
- # reason why you would ever want to run such pants!
- killcmd /sbin/service rwhod stop
- ttl 1
-</Process>
-
-# BIND DNS Daemon
-#<Process named>
-# spawncmd /sbin/service named start
-# pidfile /var/run/named.pid
-#</Process>
-
-# Exim SMTP Mail Daemon
-#<Process exim>
-# spawncmd /sbin/service exim restart
-# pidfile /var/run/exim.pid
-# # instamces 30
-# # pctcpu 90
-#</Process>
-
-# Sendmail SMTP Mail Daemon
-#<Process sendmail>
-# spawncmd /sbin/service sendmail start
-# pidfile /var/run/sendmail.pid
-#</Process>
-
-# Samba SMB File Sharing Daemon
-#<Process smbd>
-# spawncmd /sbin/service smbd restart
-# pidfile /var/run/samba/smbd.pid
-#</Process>
-#<Process nmbd>
-# spawncmd /sbin/service smbd restart
-# pidfile /var/run/samba/nmbd.pid
-#</Process>
-
-# Quallcomm QPopper POP3 Daemon
-#<Process popper>
-# spawncmd /sbin/service popper restart
-# pidfile /var/run/popper.pid
-#</Process>
-
-# Apache Group HTTP Daemon
-#<Process httpd>
-# spawncmd /sbin/service httpd restart
-# pidfile /var/run/httpd.pid
-# # instances 200
-# # pctcpu 80
-#</Process>
-
-# MySQL Database
-#<Process mysqld>
-# spawncmd /sbin/service mysqld restart
-# killcmd /sbin/service mysqld stop
-# pidfile /var/run/mysqld/mysqld.pid
-# # pctcpu 90
-# # pctmem 60
-#</Process>
-
-# NTP Time Daemon
-#<Process ntpd>
-# spawncmd /sbin/service ntpd restart
-#</Process>
-
-# SMNP Daemon
-#<Process snmpd>
-#
-#</Process>
-
-# ProFTPD FTP Daemon
-#<Process proftpd>
-# spawncmd /sbin/service proftpd restart
-# pidfile /var/run/proftpd.pid
-#</Processes>
-
-# wu-ftpd Daemon
-# In RedHat 8.0 (which is what I am developing psmon under),
-# wu-ftpd is spawned from xinetd on demand, and so may not
-# always be running. I have only put this comment in because
-# people have asked me why there isn't an example for wu-ftpd
-# in the distribution psmon.conf. -- Now you know. ;-)
-
-
-
-# These are processes which run frequently on my machines, but
-# I have had experience of either running for too long (for
-# whatever readon), or spawning too many copies.
-
-# The following is a quick table for your ease of reference:
-# Seconds Minutes Hours Days Weeks
-# 60 1
-# 3600 60 1
-# 43200 720 12 0.5
-# 86400 1440 24 1
-# 604800 10080 168 7 1
-
-# Kill excessive of slothenly rsync processes
-<Process rsync>
- ttl 43200
- instances 5
-</Process>
-
-# Kill excessive of slothenly updatedb processes
-<Process updatedb>
- ttl 43200
- instances 2
-</Process>
-
-# Kill excessive of slothenly find processes
-<Process find>
- ttl 86400
- instances 30
-</Process>
-
-
-
-# Remove this line to activate this configuration file.
-Disabled True
-
-# PLEASE READ THE DOCUMENTATION BEFORE USING PSMON!!!!!
-# You can do so by typing "man psmon", or "perldoc /sbin/psmon"
-
-
-
-### the end
-
-
diff --git a/psmon-1.0.4/psmon.html b/psmon-1.0.4/psmon.html
deleted file mode 100644
index f389095..0000000
--- a/psmon-1.0.4/psmon.html
+++ /dev/null
@@ -1,736 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>psmon - Process Table Monitoring Script</title>
-<link rel="stylesheet" href="perldoc.css" type="text/css" />
-<link rev="made" href="mailto:root@localhost" />
-</head>
-
-<body>
-
-<p><a name="__index__"></a></p>
-<!-- INDEX BEGIN -->
-
-<ul>
-
- <li><a href="#name">NAME</a></li>
- <li><a href="#version">VERSION</a></li>
- <li><a href="#synopsis">SYNOPSIS</a></li>
- <li><a href="#description">DESCRIPTION</a></li>
- <li><a href="#operation">OPERATION</a></li>
- <li><a href="#installation">INSTALLATION</a></li>
- <li><a href="#configuration">CONFIGURATION</a></li>
- <ul>
-
- <li><a href="#directives">DIRECTIVES</a></li>
- <li><a href="#process_scope_directives">PROCESS SCOPE DIRECTIVES</a></li>
- <li><a href="#examples">EXAMPLES</a></li>
- </ul>
-
- <li><a href="#signals">SIGNALS</a></li>
- <li><a href="#exit_codes">EXIT CODES</a></li>
- <li><a href="#performance">PERFORMANCE</a></li>
- <li><a href="#subroutines">SUBROUTINES</a></li>
- <li><a href="#bugs">BUGS</a></li>
- <li><a href="#todo">TODO</a></li>
- <li><a href="#see_also">SEE ALSO</a></li>
- <li><a href="#license">LICENSE</a></li>
- <li><a href="#author">AUTHOR</a></li>
-</ul>
-<!-- INDEX END -->
-
-<hr />
-<p>
-</p>
-<hr />
-<h1><a name="name">NAME</a></h1>
-<p>psmon - Process Table Monitoring Script</p>
-<p>
-</p>
-<hr />
-<h1><a name="version">VERSION</a></h1>
-<p>$Id: psmon.html,v 1.2 2003/03/24 18:00:59 nicl Exp $</p>
-<p>
-</p>
-<hr />
-<h1><a name="synopsis">SYNOPSIS</a></h1>
-<p>Single user account crontab operation.</p>
-<pre>
- # DO NOT EDIT THIS FILE - edit the master and reinstall.
- # (/tmp/crontab.28945 installed on Wed Jan 8 16:29:24 2003)
- # (Cron version -- $Id: psmon.html,v 1.2 2003/03/24 18:00:59 nicl Exp $)
- MAILTO=&quot;nicl@perlguy.org.uk&quot;
- USER=nicl
-
- */5 * * * * /sbin/psmon --daemon --cron --conf=~/etc/psmon.conf --user=$USER --adminemail=nicl@perlguy.org.uk</pre>
-<p>Regular system-wide call from cron:</p>
-<pre>
- */5 * * * * /sbin/psmon --daemon --cron</pre>
-<p>Only check processes during working office hours:</p>
-<pre>
- * 9-17 * * * /sbin/psmon</pre>
-<p>Command line syntax.</p>
-<pre>
- [nicl@nicl]$ psmon --help
- Syntax: psmon [--conf=filename] [--daemon] [--cron] [--user=user]
- [--adminemail=emailaddress] [--dryrun] [--help] [--version]
- --help Display this help
- --version Display full version information
- --dryrun Dryrun (do not actually kill or spawn and processes)
- --daemon Spawn in to background daemon
- --cron Disables 'already running' errors with the --daemon option
- --conf=str Specify alternative config filename
- --user=str Only scan the process table for processes running as str
- --adminemail=str Force all notification emails to be sent to str</pre>
-<p>
-</p>
-<hr />
-<h1><a name="description">DESCRIPTION</a></h1>
-<p>This script monitors the process table using Proc::ProcessTable, and
-will respawn or kill processes based on a set of rules defined in an
-Apache style configuration file.</p>
-<p>Processes will be respawned if a spawn command is defined for a process,
-and no occurances of that process are running. If the --user command line
-option is specified, then the process will only be spawned if no instances
-are running as the specified userid.</p>
-<p>Processes can be killed off if they have been running for too long,
-use too much CPU or memory resources, or have too many concurrent
-versions running. Exceptions can be made to kill rulesets using the
-<em>pidfile</em> and <em>lastsafepid</em> directives.</p>
-<p>If a PID file is declared for a process, psmon will never kill the
-process ID that is contained within the pid file. This is useful if for
-example, you have a script which spawns hundreds of child processes
-which you may need to automatically kill, but you do not want to kill
-the parent process.</p>
-<p>Any actions performed will be logged to the DAEMON syslog facility by default.
-There is support to optionally also send notifications emails to an
-administrator on a global or pre-rule basis.</p>
-<p>
-</p>
-<hr />
-<h1><a name="operation">OPERATION</a></h1>
-<dl>
-<dt><strong><a name="item_%2d%2ddryrun">--dryrun</a></strong><br />
-</dt>
-<dd>
-Execute a dry-run (do not actually kill or spawn and processes).
-</dd>
-<p></p>
-<dt><strong><a name="item_%2d%2dconf%3dfilename">--conf=<em>filename</em></a></strong><br />
-</dt>
-<dd>
-Specify alternative config filename.
-</dd>
-<p></p>
-<dt><strong><a name="item_%2d%2ddaemon">--daemon</a></strong><br />
-</dt>
-<dd>
-Spawn in to background daemon.
-</dd>
-<p></p>
-<dt><strong><a name="item_%2d%2dcron">--cron</a></strong><br />
-</dt>
-<dd>
-Disables already running warnings when trying to launch as another daemon.
-</dd>
-<p></p>
-<dt><strong><a name="item_%2d%2duser%3duser">--user=<em>user</em></a></strong><br />
-</dt>
-<dd>
-Only scan the process table for processes running under this username.
-</dd>
-<p></p>
-<dt><strong><a name="item_%2d%2dadminemail%3demailaddress">--adminemail=<em>emailaddress</em></a></strong><br />
-</dt>
-<dd>
-Force all notification emails to be sent to this email address.
-</dd>
-<p></p></dl>
-<p>
-</p>
-<hr />
-<h1><a name="installation">INSTALLATION</a></h1>
-<p>In addition to Perl 5.005_03 or higher, the following Perl modules are
-required:</p>
-<pre>
- Getopt::Long
- Config::General
- POSIX
- Proc::ProcessTable
- Net::SMTP
- Unix::Syslog</pre>
-<p>The POSIX module is usually supplied with Perl as standard, as is
-Getopt::Long. All these modules can be obtained from CPAN. Visit
-<a href="http://search.span.org">http://search.span.org</a> and <a href="http://www.cpan.org">http://www.cpan.org</a> for further details.
-For the lazy people reading this, you can try the
-following command to install these modules:</p>
-<pre>
- for m in Getopt::Long Config::General POSIX Proc::ProcessTable \
- Net::SMTP Unix::Syslog;do perl -MCPAN -e&quot;install $m&quot;;done</pre>
-<p>Alternatively you can run the install.sh script which comes in the
-distribution tarball. It will attempt to install the right modules,
-install the script and configuration file, and generate UNIX man page
-documentation.</p>
-<p>By default psmon will look for its runtime configuration in /etc/psmon.conf,
-although this can be defined as otherwise from the command line. For system
-wide installations it is reccomended that you install your psmon in to the
-default location.</p>
-<p>
-</p>
-<hr />
-<h1><a name="configuration">CONFIGURATION</a></h1>
-<p>The default configuration file location is /etc/psmon.conf. A different
-configuration file can be declared from the command line.</p>
-<p>Syntax of the configuration file is based upon that which is used by
-Apache. Each process to be monitored is declared with a Process scope
-directive like this example which monitors the OpenSSH daemon:</p>
-<pre>
- &lt;Process sshd&gt;
- spawncmd /sbin/service sshd start
- pidfile /var/run/sshd.pid
- instances 50
- pctcpu 90
- &lt;/Process&gt;</pre>
-<p>There is a special <em>*</em> process scope which applies to <em>all</em> running
-processes. This special scope should be used with extreme care. It does
-not support the use of the <em>spawncmd</em>, <em>pidfile</em>, <em>instances</em> or <em>ttl</em>
-directivers. A typical example of this scope might be as follows:</p>
-<pre>
- &lt;Process *&gt;
- pctcpu 95
- pctmem 80
- &lt;/Process&gt;</pre>
-<p>Global directives which are not specific to any one process should be placed
-outside of any Process scopes.</p>
-<p>
-</p>
-<h2><a name="directives">DIRECTIVES</a></h2>
-<dl>
-<dt><strong><a name="item_facility">Facility</a></strong><br />
-</dt>
-<dd>
-Defines which syslog facility to log to. Valid options are as follows;
-LOG_KERN, LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_SYSLOG, LOG_LPR,
-LOG_NEWS, LOG_UUCP, LOG_CRON, LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2,
-LOG_LOCAL3, LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6 and LOG_LOCAL7. Defaults
-to LOG_DAEMON.
-</dd>
-<p></p>
-<dt><strong><a name="item_loglevel">LogLevel</a></strong><br />
-</dt>
-<dd>
-Defines the loglevel priority that notifications to syslog will be
-marked as. Valid options are as follows; LOG_EMERG, LOG_ALERT, LOG_CRIT,
-LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO and LOG_DEBUG. The log level
-used by a notification for any failed action will automatically be
-raised to the next level in order to highlight the failure. May be also be used
-in a Process scope which will take priority over a global declaration.
-Defaults to LOG_NOTICE.
-</dd>
-<p></p>
-<dt><strong><a name="item_killloglevel">KillLogLevel (previously KillPIDLogLevel)</a></strong><br />
-</dt>
-<dd>
-The same as the loglevel directive, but only applies to process kill actions.
-Takes priority over the loglevel directive. May be also be used in a
-Process scope which will take priority over a global declaration.
-Undefined by default.
-</dd>
-<p></p>
-<dt><strong><a name="item_spawnloglevel">SpawnLogLevel</a></strong><br />
-</dt>
-<dd>
-The same as the loglevel directive, but only applies to process spawn actions.
-Takes priority over the loglevel directive. May be also be used in a
-Process scope which will take priority over a global declaration.
-Undefined by default.
-</dd>
-<p></p>
-<dt><strong><a name="item_adminemail">AdminEmail</a></strong><br />
-</dt>
-<dd>
-Defines the email address where notification emails should be sent to.
-May be also be used in a Process scope which will take priority over a
-global declaration. Defaults to root@localhost.
-</dd>
-<p></p>
-<dt><strong><a name="item_notifyemailfrom">NotifyEmailFrom</a></strong><br />
-</dt>
-<dd>
-Defines the email address that notification email should be addresses
-from. Defaults to &lt;username&gt;@<em>hostname</em>.
-</dd>
-<p></p>
-<dt><strong><a name="item_frequency">Frequency</a></strong><br />
-</dt>
-<dd>
-Defines the frequency of process table queries. Defaults to 60 seconds.
-</dd>
-<p></p>
-<dt><strong><a name="item_lastsafepid">LastSafePID</a></strong><br />
-</dt>
-<dd>
-When defined, psmon will never attempt to kill a process ID which is
-numerically less than or equal to the value defined by lastsafepid. It
-should be noted that psmon will never attempt to kill itself, or a process ID
-less than or equal to 1. Defaults to 100.
-</dd>
-<p></p>
-<dt><strong><a name="item_protectsafepidsquietly">ProtectSafePIDsQuietly</a></strong><br />
-</dt>
-<dd>
-Accepts a boolean value of On or Off. Surpresses all notifications of
-preserved process IDs when used in conjunction with the <em>lastsafepid</em>
-directive. Defaults to Off.
-</dd>
-<p></p>
-<dt><strong><a name="item_smtphost">SMTPHost</a></strong><br />
-</dt>
-<dd>
-Defines the IP address or hostname of the SMTP server to used to send
-email notifications. Defaults to localhost.
-</dd>
-<p></p>
-<dt><strong><a name="item_smtptimeout">SMTPTimeout</a></strong><br />
-</dt>
-<dd>
-Defines the timeout in seconds to be used during SMTP connections.
-Defaults to 20 seconds.
-</dd>
-<p></p>
-<dt><strong><a name="item_sendmailcmd">SendmailCmd</a></strong><br />
-</dt>
-<dd>
-Defines the sendmail command to use to send notification emails if there
-is a failure with the SMTP connection to the host defined by smtphost.
-Defaults to '/usr/sbin/sendmail -t'.
-</dd>
-<p></p>
-<dt><strong><a name="item_dryrun">Dryrun</a></strong><br />
-</dt>
-<dd>
-Forces this psmon to as if the --dryrun command line switch had specified.
-This is useful if you want to force a specific configuration file to only
-report and never actually take any automated action.
-</dd>
-<p></p>
-<dt><strong><a name="item_notifydetail">NotifyDetail</a></strong><br />
-</dt>
-<dd>
-Defines the verbosity of notification emails which are sent. Can be set
-to 'Simple', 'Verbose' or 'Debug'. Defaults to 'Verbose'. This function
-will be removed soon. It is unnecessary bloat and is not very portable.
-</dd>
-<p></p></dl>
-<p>
-</p>
-<h2><a name="process_scope_directives">PROCESS SCOPE DIRECTIVES</a></h2>
-<dl>
-<dt><strong><a name="item_spawncmd">SpawnCmd</a></strong><br />
-</dt>
-<dd>
-Defines the full command line to be executed in order to respawn a dead
-process.
-</dd>
-<p></p>
-<dt><strong><a name="item_killcmd">KillCmd</a></strong><br />
-</dt>
-<dd>
-Defines the full command line to be executed in order to gracefully
-shutdown or kill a rogue process. If the command returns a boolean true
-exit status then it is assumed that the command failed to execute
-sucessfully. If no KillCmd is specified or the command fails, the
-process will be killed by sending a SIGKILL signal with the standard
-<code>kill()</code> function. Undefined by default.
-</dd>
-<p></p>
-<dt><strong><a name="item_pidfile">PIDFile</a></strong><br />
-</dt>
-<dd>
-Defines the full path and filename of a file created by a process which
-contain it's main parent process ID.
-</dd>
-<p></p>
-<dt><strong><a name="item_ttl">TTL</a></strong><br />
-</dt>
-<dd>
-Defines a maximum time to live (in seconds) of a process. The process
-will be killed once it has been running longer than this value, and
-it's process ID isn't contained in the defined pidfile.
-</dd>
-<p></p>
-<dt><strong><a name="item_pctcpu">PctCpu</a></strong><br />
-</dt>
-<dd>
-Defines a maximum allowable percentage of CPU time a process may use.
-The process will be killed once it's CPU usage exceeds this threshold
-and it's process ID isn't contained in the defined pidfile.
-</dd>
-<p></p>
-<dt><strong><a name="item_pctmem">PctMem</a></strong><br />
-</dt>
-<dd>
-Defines a maximum allowable percentage of total system memory a process
-may use. The process will be killed once it's memory usage exceeds this
-threshold and it's process ID isn't contained in the defined pidfile.
-</dd>
-<p></p>
-<dt><strong><a name="item_instances">Instances</a></strong><br />
-</dt>
-<dd>
-Defines a maximum number of instances of a process which may run. The
-process will be killed once there are more than this number of occurances
-running, and it's process ID isn't contained in the defined pid file.
-</dd>
-<p></p>
-<dt><strong><a name="item_noemailonkill">NoEmailOnKill</a></strong><br />
-</dt>
-<dd>
-Accepts a boolean value of True or False. Surpresses process killing
-notification emails for this process scope. Defaults to False.
-</dd>
-<p></p>
-<dt><strong><a name="item_noemailonspawn">NoEmailOnSpawn</a></strong><br />
-</dt>
-<dd>
-Accepts a boolean value of True or False. Surpresses process spawning
-notification emails for this process scope. Defaults to False.
-</dd>
-<p></p>
-<dt><strong><a name="item_noemail">NoEmail</a></strong><br />
-</dt>
-<dd>
-Accepts a boolean value of True or False. Surpresses all notification
-emails for this process scope. Defaults to False.
-</dd>
-<p></p>
-<dt><strong><a name="item_neverkillpid">NeverKillPID</a></strong><br />
-</dt>
-<dd>
-Accepts a space delimited list of PIDs which will never be killed.
-Defaults to 1.
-</dd>
-<p></p>
-<dt><strong><a name="item_neverkillprocessname">NeverKillProcessName</a></strong><br />
-</dt>
-<dd>
-Accepts a space deliomited list of process names which will never be
-killed. Defaults to 'kswapd kupdated mdrecoveryd'.
-</dd>
-<p></p></dl>
-<p>
-</p>
-<h2><a name="examples">EXAMPLES</a></h2>
-<pre>
- &lt;Process syslogd&gt;
- spawncmd /sbin/service syslogd restart
- pidfile /var/run/syslogd.pid
- instances 1
- pctcpu 70
- pctmem 30
- &lt;/Process&gt;</pre>
-<p>Syslog is a good example of a process which can get a little full
-of itself under certian circumstances, and excessively hog CPU and
-memory. Here we will kill off syslogd processes if it exceeds 70%
-CPU or 30% memory utilization.</p>
-<p>Older running copies of syslogd will be killed if they are running,
-while leaving the most recently spawned copy which will be listed in
-the PID file defined.</p>
-<pre>
- &lt;Process httpd&gt;
- spawncmd /sbin/service httpd restart
- pidfile /var/run/httpd.pid
- loglevel critical
- adminemail pager@noc.company.com
- &lt;/Process&gt;</pre>
-<p>Here we are monitoring Apache to ensure that it is restarted if
-it dies. The pidfile directive in this example is actually
-redundant because we have not defined any rule where we should
-consider killing any httpd processes.</p>
-<p>All notifications relating to this process will be logged with the
-syslog priority of critical (LOG_CRIT), and all emailed to
-<a href="mailto:pager@noc.company.com">pager@noc.company.com</a> which could typically forward to a pager.</p>
-<p>Any failed attempts to kill or restart a process will automatically
-be logged as a syslog priority one level higher than that specified.
-If a restart of Apache were to fail in this example, a wall
-notification would be broadcast to all interactive terminals
-connected to the machine, since the next log priority up from
-LOG_CRIT is LOG_EMERG.</p>
-<pre>
- &lt;Process find&gt;
- noemail True
- ttl 3600
- &lt;/Process&gt;</pre>
-<p>Kill old find processes which have been running for over an hour.
-Do not send an email notification since it's not too important.</p>
-<p>
-</p>
-<hr />
-<h1><a name="signals">SIGNALS</a></h1>
-<dl>
-<dt><strong><a name="item_hup">HUP</a></strong><br />
-</dt>
-<dd>
-Forces an immediate reload of the configuration file. You should
-send the HUP signal when you are running psmon as a background
-daemon and have altered the psmon.conf file.
-</dd>
-<p></p>
-<dt><strong><a name="item_usr1">USR1</a></strong><br />
-</dt>
-<dd>
-Forces an immediate scan of the process table.
-</dd>
-<p></p></dl>
-<p>
-</p>
-<hr />
-<h1><a name="exit_codes">EXIT CODES</a></h1>
-<dl>
-<dt><strong><a name="item_value_0%3a_exited_gracefully">Value 0: Exited gracefully</a></strong><br />
-</dt>
-<dd>
-The program exited gracefully.
-</dd>
-<p></p>
-<dt><strong><a name="item_value_2%3a_failure_to_lookup_uid_for_username">Value 2: Failure to lookup UID for username</a></strong><br />
-</dt>
-<dd>
-The username specified by the --user command line option did not resolve to a valid
-UID.
-</dd>
-<p></p>
-<dt><strong><a name="item_value_3%3a_configuration_file_is_disabled">Value 3: Configuration file is disabled</a></strong><br />
-</dt>
-<dd>
-The configuration file is disabled. (It contains an active 'Disabled' directive).
-</dd>
-<p></p>
-<dt><strong><a name="item_value_4%3a_configuration_file_does_not_exist">Value 4: Configuration file does not exist</a></strong><br />
-</dt>
-<dd>
-The specified configuration file, (default or user specified) does not exist.
-</dd>
-<p></p>
-<dt><strong><a name="item_value_5%3a_unable_to_open_pid_file_handle">Value 5: Unable to open PID file handle</a></strong><br />
-</dt>
-<dd>
-Failed to open a read-only file handle for the runtime PID file.
-</dd>
-<p></p>
-<dt><strong><a name="item_value_6%3a_failed_to_fork">Value 6: Failed to fork</a></strong><br />
-</dt>
-<dd>
-An error occured while attempting to fork the child background daemon process.
-</dd>
-<p></p>
-<dt><strong><a name="item_value_7%3a_unable_to_open_pid_file_handle">Value 7: Unable to open PID file handle</a></strong><br />
-</dt>
-<dd>
-Failed to open a write file handle for the runtime PID file.
-</dd>
-<p></p>
-<dt><strong><a name="item_value_8%3a_failure_to_load_perl_module">Value 8: Failure to load Perl module</a></strong><br />
-</dt>
-<dd>
-One or more Perl module could not be loaded. This usually happens when one of the
-required Perl modules which psmon depends upon is not installed or could not be located
-in the Perl LIB search path.
-</dd>
-<p></p></dl>
-<p>
-</p>
-<hr />
-<h1><a name="performance">PERFORMANCE</a></h1>
-<p>psmon is not especially fast. Much of it's time is spent reading the process table.
-If the process table is particularly large this can take a number of seconds.
-Although is rarely a major problem on todays speedy machines, I have run a few tests
-so you take look at the times and decide if you can afford the wait.</p>
-<pre>
- CPU OS Open Open Files/Procs 1m Load Real Time
- PIII 1.1G Mandrake 9.0 10148 / 267 0.01 0m0.430s
- PIII 1.2G Mandrake 9.0 16714 / 304 0.44 0m0.640s
- Celeron 500 Red Hat 6,1 1780 / 81 1.27 0m0.880s
- PII 450 Red Hat 6.0 300 / 23 0.01 0m1.050s
- 2x Xeon 1.8G Mandrake 9.0 90530 / 750 0.38 0m1.130s
- Celeron 500 Red Hat 6.1 1517 / 77 1.00 0m1.450s
- PIII 866 Red Hat 8.0 3769 / 76 0.63 0m1.662s
- PIII 750 Red Hat 6.2 754 / 35 3.50 0m2.170s</pre>
-<p>These production machines were running the latest patched stock distribution kernels.
-I have listed the total number of open file descriptors, processes running and 1 minute
-load average to give you a slightly better context of the performance.</p>
-<p>
-</p>
-<hr />
-<h1><a name="subroutines">SUBROUTINES</a></h1>
-<dl>
-<dt><strong><a name="item_check_processtable"><code>check_processtable($)</code></a></strong><br />
-</dt>
-<dd>
-Reads the current process table, checks and then executes any appropriate
-action to be taken. Does not accept any paramaters.
-</dd>
-<p></p>
-<dt><strong><a name="item_slay_process"><code>slay_process()</code></a></strong><br />
-</dt>
-<dd>
-Attempts to kill a process with it's killcmd, or failing that using the <code>kill()</code> function.
-Accepts the process name, syslog log level, email notification to address and a reference
-to the %slay hash.
-</dd>
-<p></p>
-<dt><strong><a name="item_print_init_style"><code>print_init_style()</code></a></strong><br />
-</dt>
-<dd>
-Prints a Red Hat sysvinit style status message. Accepts an array of messages
-to display in sequence.
-</dd>
-<p></p>
-<dt><strong><a name="item_spawn_process"><code>spawn_process()</code></a></strong><br />
-</dt>
-<dd>
-Attempts to spawn a process. Accepts the process name, syslog log level, mail
-notification to address and spawn command.
-</dd>
-<p></p>
-<dt><strong><a name="item_display_help"><code>display_help()</code></a></strong><br />
-</dt>
-<dd>
-Displays command line help.
-</dd>
-<p></p>
-<dt><strong><a name="item_read_config"><code>read_config()</code></a></strong><br />
-</dt>
-<dd>
-Reads in runtime configuration options.
-</dd>
-<p></p>
-<dt><strong><a name="item_isnumeric"><code>isnumeric()</code></a></strong><br />
-</dt>
-<dd>
-An evil bastard fudge to ensure that we're only dealing with numerics when
-necessary, from the config file and Proc::ProcessTable scan.
-</dd>
-<p></p>
-<dt><strong><a name="item_loglevel"><code>loglevel()</code></a></strong><br />
-</dt>
-<dd>
-Accepts a syslog loglevel keyword and returns the associated constant integer.
-</dd>
-<p></p>
-<dt><strong><a name="item_logfacility"><code>logfacility()</code></a></strong><br />
-</dt>
-<dd>
-Accepts a syslog facility keyword and returns the associated constant integer.
-</dd>
-<p></p>
-<dt><strong><a name="item_alert"><code>alert()</code></a></strong><br />
-</dt>
-<dd>
-Logs a message to syslog using <a href="#item_log"><code>log()</code></a> and sends a notification email using
-sendmail().
-</dd>
-<p></p>
-<dt><strong><a name="item_log"><code>log()</code></a></strong><br />
-</dt>
-<dd>
-Logs messages to DAEMON facility in syslog. Accepts a log
-level and message array. Will terminate the process if it is
-asked to log a message of a log level 2 or less (LOG_EMERG,
-LOG_ALERT, LOG_CRIT).
-</dd>
-<p></p>
-<dt><strong><a name="item_sendmail"><code>sendmail()</code></a></strong><br />
-</dt>
-<dd>
-Sends email notifications of syslog messages, called by alert().
-Accepts sending email address, recipient email address, short
-message subject and an optional detailed message body array.
-</dd>
-<p></p>
-<dt><strong><a name="item_daemonize"><code>daemonize()</code></a></strong><br />
-</dt>
-<dd>
-Launches the process in to the background. Checks to see if there is already an
-instance running.
-</dd>
-<p></p>
-<dt><strong><a name="item_display_version"><code>display_version()</code></a></strong><br />
-</dt>
-<dd>
-Displays complete version, author and license information.
-</dd>
-<p></p></dl>
-<p>
-</p>
-<hr />
-<h1><a name="bugs">BUGS</a></h1>
-<p>Hopefully none. ;-) Send any bug reports to me at <a href="mailto:nicl@perlguy.org.uk">nicl@perlguy.org.uk</a>
-along with any patches and details of how to replicate the problem.
-Please only send reports for bugs which can be replicated in the
-<em>latest</em> version of the software. The latest version can always be
-found at <a href="http://psmon.perlguy.org.uk">http://psmon.perlguy.org.uk</a></p>
-<p>
-</p>
-<hr />
-<h1><a name="todo">TODO</a></h1>
-<p>The following functionality will be added soon:</p>
-<dl>
-<dt><strong><a name="item_code_cleanup">Code cleanup</a></strong><br />
-</dt>
-<dd>
-The code needs to be cleaned up and made more efficient.
-</dd>
-<p></p>
-<dt><strong><a name="item_killperprocessname_directive">killperprocessname directive</a></strong><br />
-</dt>
-<dd>
-Will accept a boolean value. If true, only 1 process per process scope
-will ever be killed, instead of all process IDs matching kill rules.
-This should be used in conjunction with the new killcmd directive. For
-example, you may define that a database daemon may never take up more
-than 90% CPU time, and it runs many children processes. If it exceeds
-90% CPU time, you want to issue ONE restart command in order to stop and
-then start all the database processes in one go.
-</dd>
-<p></p>
-<dt><strong><a name="item_time_period_limited_rules">time period limited rules</a></strong><br />
-</dt>
-<dd>
-Functionality to limit validity of process scopes to only be checked
-between defined time periods. For example, only check that httpd is running
-between the hours of 8am and 5pm on Mondays and Tuesdays.
-</dd>
-<p></p></dl>
-<p>
-</p>
-<hr />
-<h1><a name="see_also">SEE ALSO</a></h1>
-<p>nsmon</p>
-<p>
-</p>
-<hr />
-<h1><a name="license">LICENSE</a></h1>
-<p>Written by Nicholas P Lawrence, &lt;<a href="mailto:nicl@perlguy.org.uk">nicl@perlguy.org.uk</a>&gt;.
-Copyright (C) 2002,2003 Nicholas P Lawrence.</p>
-<p>This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.</p>
-<p>This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.</p>
-<p>You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</p>
-<p>
-</p>
-<hr />
-<h1><a name="author">AUTHOR</a></h1>
-<p>PerlGuy &lt;<a href="mailto:nicl@perlguy.org.uk">nicl@perlguy.org.uk</a>&gt;</p>
-<p><a href="http://perlguy.org.uk/perl_guy/">http://perlguy.org.uk/perl_guy/</a></p>
-
-</body>
-
-</html>
diff --git a/psmon-1.29/support/install.sh b/psmon-1.29/support/install.sh
new file mode 100755
index 0000000..9176df3
--- /dev/null
+++ b/psmon-1.29/support/install.sh
@@ -0,0 +1,150 @@
+#!/bin/sh
+############################################################
+# $Id: install.sh,v 1.9 2005/05/06 14:11:06 nicolaw Exp $
+# install.sh - Installation script for psmon
+# Copyright: (c)2002,2003 Nicola Worthington. All rights reserved.
+############################################################
+# This file is part of psmon.
+#
+# psmon is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# psmon is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with psmon; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+############################################################
+
+Target="/usr/bin"
+
+if ! [ -f support/psmon.html ] && [ -f psmon.html ] && [ -f ../Makefile.PL ]
+then
+ cd ..
+fi
+
+for dm in wget lwp-download ncftpget
+do
+ if which $dm > /dev/null 2>&1
+ then
+ Download=$dm
+ fi
+done
+
+# Check we have all the right perl modules installed. Try and
+# install them from the tarballs provided if necessary.
+echo "Config General 2.27,Proc ProcessTable 0.39,Unix Syslog 0.99,Getopt Long 2.34," | \
+ while read -d',' Group Name Version
+do
+ m="$Group::$Name"
+ mf="$Group-$Name-$Version.tar.gz"
+ md="$Group-$Name"
+ echo -n "Checking for $m ... "
+ if perl -e '$m = shift; eval("use $m;"); exit 1 if $@;' $m
+ then
+ echo "found"
+ else
+ echo "missing"
+ if [ "X$Download" != "X" ]
+ then
+ echo "Attempting to download $mf using $Download ..."
+ $Download ftp://ftp.funet.fi/pub/languages/perl/CPAN/modules/by-module/$Group/$mf
+ if [ -f $mf ]
+ then
+ echo "Attempting to install $m from $mf ..."
+ tar -zxf $mf
+ if cd $md-* > /dev/null 2>&1
+ then
+ perl Makefile.PL && make && make test && make install
+ cd ..
+ else
+ echo "Failed to install $m from $mf; could not file extraction directory"
+ fi
+ else
+ echo "Failed to download $mf"
+ fi
+ fi
+ fi
+done
+
+# Install psmon
+if [ -e bin/psmon ]
+then
+ # Remove any old version of psmon
+ for file in psmon psmon-config
+ do
+ if which $file > /dev/null 2>&1
+ then
+ oldfile=`which $file`
+ bakfile=`date +"$oldfile-%Y%m%d%H%M%S"`
+ echo -n "Moving old $file $oldfile to $bakfile ... "
+ mv $oldfile $bakfile
+ if [ -e $bakfile ]; then echo "done"; else echo "failed"; fi
+ fi
+
+ # Install the new psmon script
+ echo -n "Installing $file ... "
+ cp bin/$file $Target/
+ if [ -e $Target/$file ]; then
+ echo "done"
+ chmod 755 $Target/$file
+ else
+ echo "failed"
+ fi
+
+ # If we removed an old version, symlink it to the new version
+ if [ "X$oldfile" != "X" ] && [ "$oldfile" != "$Target/$file" ]
+ then
+ echo -n "Symlinking old $file $oldfile to $Target/$file ... "
+ ln -s $Target/$file $oldfile
+ if [ -e $oldfile ]; then echo "done"; else echo "failed"; fi
+ fi
+ done
+
+ # Install psmon.conf
+ if ! [ -e /etc/psmon.conf ]
+ then
+ if [ -e etc/psmon.conf ]
+ then
+ echo -n "Installing etc/psmon.conf ... "
+ cp etc/psmon.conf /etc
+ if [ -e /etc/psmon.conf ]; then echo "done"; else echo "failed"; fi
+ else
+ echo -n "Could not find etc/psmon.conf; skipped etc/psmon.conf installation"
+ fi
+ else
+ echo "/etc/psmon.conf already exists; skipped etc/psmon.conf installation"
+ fi
+
+ # Generate HTML documentation
+ if which pod2html > /dev/null 2>&1
+ then
+ echo -n "Generating HTML documentation support/psmon.html ... "
+ pod2html --css=support/perldoc.css bin/psmon > support/psmon.html
+ if [ -e support/psmon.html ]; then echo "done"; else echo "failed"; fi
+ fi
+
+ # Generate and install man pages
+ if which pod2man > /dev/null 2>&1
+ then
+ mandir=/usr/man/man1
+ if ! [ -d $mandir ] && [ -d /usr/share/man/man1 ];then
+ mandir=/usr/share/man/man1
+ fi
+ echo -n "Installing manual psmon.1 ... "
+ pod2man bin/psmon > $mandir/psmon.1
+ if [ -e $mandir/psmon.1 ]; then echo "done"; else echo "failed"; fi
+ else
+ echo "Could not find pod2man; skipped manual installation"
+ fi
+else
+ echo "Could not find psmon; skipped psmon installation"
+fi
+
+
+
diff --git a/psmon-1.29/support/perldoc.css b/psmon-1.29/support/perldoc.css
new file mode 100644
index 0000000..fb02d22
--- /dev/null
+++ b/psmon-1.29/support/perldoc.css
@@ -0,0 +1,201 @@
+/*
+############################################################
+# $Id: perldoc.css,v 1.6 2004/08/01 10:44:13 nicolaw Exp $
+# perldoc.css - Perl Documentation Cascading Style Sheet
+############################################################
+# This file is part of psmon.
+#
+# psmon is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# psmon is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with psmon; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+############################################################
+*/
+
+BODY {
+ font-family: Arial,Helvetica;
+}
+
+BLOCKQUOTE { margin: 10pt; }
+
+H1,A { color: #336699; }
+
+/*** Top menu style ****/
+.mmenuon {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #ff6600; font-size: 10pt;
+ }
+.mmenuoff {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #ffffff; font-size: 10pt;
+}
+.cpyright {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #ffffff; font-size: xx-small;
+}
+.cpyrightText {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #ffffff; font-size: xx-small;
+}
+.sections {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #336699; font-size: 11pt;
+}
+.dsections {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #336699; font-size: 12pt;
+}
+.slink {
+ font-family: Arial,Helvetica; font-weight: normal; text-decoration: none;
+ color: #336699; font-size: 9pt;
+}
+
+.slink2 { font-family: Arial,Helvetica; text-decoration: none; color: #336699; }
+
+.maintitle {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #336699; font-size: 18pt;
+}
+.dblArrow {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #336699; font-size: small;
+}
+.menuSec {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #336699; font-size: small;
+}
+
+.newstext {
+ font-family: Arial,Helvetica; font-size: small;
+}
+
+.linkmenu {
+ font-family: Arial,Helvetica; color: #000000; font-weight: bold;
+ text-decoration: none;
+}
+
+P {
+ font-family: Arial,Helvetica;
+}
+
+PRE {
+ border: 1px solid black;
+ background: #e5e5ee;
+ padding: 5px 5px 5px 5px;
+ font-size: 10pt;
+}
+.quote {
+ font-family: Times; text-decoration: none;
+ color: #000000; font-size: 9pt; font-style: italic;
+}
+.smstd { font-family: Arial,Helvetica; color: #000000; font-size: x-small; }
+.std { font-family: Arial,Helvetica; color: #000000; }
+.meerkatTitle {
+ font-family: sans-serif; font-size: x-small; color: black; }
+
+.meerkatDescription { font-family: sans-serif; font-size: 10pt; color: black }
+.meerkatCategory {
+ font-family: sans-serif; font-size: 9pt; font-weight: bold; font-style: italic;
+ color: brown; }
+.meerkatChannel {
+ font-family: sans-serif; font-size: 9pt; font-style: italic; color: brown; }
+.meerkatDate { font-family: sans-serif; font-size: xx-small; color: #336699; }
+
+.tocTitle {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #333333; font-size: 10pt;
+}
+
+.toc-item {
+ font-family: Arial,Helvetica; font-weight: bold;
+ color: #336699; font-size: 10pt; text-decoration: underline;
+}
+
+.perlVersion {
+ font-family: Arial,Helvetica; font-weight: bold;
+ color: #336699; font-size: 10pt; text-decoration: none;
+}
+
+.docTitle {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #000000; font-size: 10pt;
+}
+.dotDot {
+ font-family: Arial,Helvetica; font-weight: bold;
+ color: #000000; font-size: 9pt;
+}
+
+.docSec {
+ font-family: Arial,Helvetica; font-weight: normal;
+ color: #333333; font-size: 9pt;
+}
+.docVersion {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #336699; font-size: 10pt;
+}
+
+.docSecs-on {
+ font-family: Arial,Helvetica; font-weight: normal; text-decoration: none;
+ color: #ff0000; font-size: 10pt;
+}
+.docSecs-off {
+ font-family: Arial,Helvetica; font-weight: normal; text-decoration: none;
+ color: #333333; font-size: 10pt;
+}
+
+h2 {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #336699; font-size: medium;
+}
+h1 {
+ font-family: Verdana,Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #336699; font-size: large;
+}
+
+DL {
+ font-family: Arial,Helvetica; font-weight: normal; text-decoration: none;
+ color: #333333; font-size: 10pt;
+}
+
+UL > LI > A {
+ font-family: Arial,Helvetica; font-weight: bold;
+ color: #336699; font-size: 10pt;
+}
+
+.moduleInfo {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #333333; font-size: 11pt;
+}
+
+.moduleInfoSec {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #336699; font-size: 10pt;
+}
+
+.moduleInfoVal {
+ font-family: Arial,Helvetica; font-weight: normal; text-decoration: underline;
+ color: #000000; font-size: 10pt;
+}
+
+.cpanNavTitle {
+ font-family: Arial,Helvetica; font-weight: bold;
+ color: #ffffff; font-size: 10pt;
+}
+.cpanNavLetter {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #333333; font-size: 9pt;
+}
+.cpanCat {
+ font-family: Arial,Helvetica; font-weight: bold; text-decoration: none;
+ color: #336699; font-size: 9pt;
+}
+
diff --git a/psmon-1.29/support/psmon.html b/psmon-1.29/support/psmon.html
new file mode 100644
index 0000000..2e85586
--- /dev/null
+++ b/psmon-1.29/support/psmon.html
@@ -0,0 +1,1081 @@
+<HTML>
+<HEAD>
+<TITLE>psmon</TITLE>
+</HEAD>
+<BODY BGCOLOR="#ffffff" TEXT="#000000">
+<UL>
+<LI><A HREF="#NAME">NAME
+
+</A><LI><A HREF="#VERSION">VERSION
+
+</A><LI><A HREF="#SYNOPSIS">SYNOPSIS
+
+</A><UL>
+<LI><A HREF="#Crontab">Crontab
+
+</A></UL>
+<LI><A HREF="#DESCRIPTION">DESCRIPTION
+
+</A><LI><A HREF="#OPERATION">OPERATION
+
+</A><LI><A HREF="#INSTALLATION">INSTALLATION
+
+</A><LI><A HREF="#CONFIGURATION">CONFIGURATION
+
+</A><UL>
+<LI><A HREF="#DIRECTIVES">DIRECTIVES
+
+</A><LI><A HREF="#PROCESS%20SCOPE%20DIRECTIVES">PROCESS SCOPE DIRECTIVES
+
+</A><LI><A HREF="#EXAMPLES">EXAMPLES
+
+</A></UL>
+<LI><A HREF="#SIGNALS">SIGNALS
+
+</A><LI><A HREF="#EXIT%20CODES">EXIT CODES
+
+</A><LI><A HREF="#PERFORMANCE">PERFORMANCE
+
+</A><LI><A HREF="#SUBROUTINES">SUBROUTINES
+
+</A><UL>
+<LI><A HREF="#PSMon%3a%3aLogging%20METHODS">PSMon::Logging METHODS
+
+</A><LI><A HREF="#Unix%3a%3aSyslog%20STUB%20METHODS">Unix::Syslog STUB METHODS
+
+</A></UL>
+<LI><A HREF="#BUGS">BUGS
+
+</A><LI><A HREF="#TODO">TODO
+
+</A><LI><A HREF="#SEE%20ALSO">SEE ALSO
+
+</A><LI><A HREF="#LICENSE">LICENSE
+
+</A><LI><A HREF="#AUTHOR">AUTHOR
+
+</A></UL>
+<HR>
+<H1><A NAME="NAME">NAME
+
+</A></H1>
+
+<P>psmon - Process Table Monitoring Script
+
+</P><H1><A NAME="VERSION">VERSION
+
+</A></H1>
+
+<P>$Id: psmon.html,v 1.15 2005/05/06 14:36:36 nicolaw Exp $
+
+</P><H1><A NAME="SYNOPSIS">SYNOPSIS
+
+</A></H1>
+
+<PRE> Syntax: psmon [--conf=filename] [--daemon] [--cron] [--user=user] [--nouser]
+ [--adminemail=emailaddress] [--dryrun] [--verbose]
+ [--help] [--version]
+
+ --help Display this help
+ --version Display full version information
+ --dryrun Dry run (do not actually kill or spawn any processes)
+ --daemon Spawn in to background daemon
+ --cron Disables 'already running' errors with the --daemon option
+ --conf=str Specify alternative config filename
+ --user=str Only scan the process table for processes running as str
+ --nouser Force scanning for all users when not run as superuser
+ --adminemail=str Force all notification emails to be sent to str
+ --verbose Output more verbose information</PRE>
+<H2><A NAME="Crontab">Crontab
+
+</A></H2>
+
+<P>Single user account crontab operation:
+
+</P>
+<PRE> MAILTO=&quot;nicolaw@cpan.org&quot;
+ HOME=/home/nicolaw
+ USER=nicolaw
+ */5 * * * * psmon --daemon --cron --conf=$HOME/etc/psmon.conf --user=$USER --adminemail=$MAILTO</PRE>
+
+<P>Regular system-wide call from cron:
+
+</P>
+<PRE> */5 * * * * psmon --daemon --cron</PRE>
+
+<P>Only check processes during working office hours:
+
+</P>
+<PRE> * 9-17 * * * psmon</PRE>
+<H1><A NAME="DESCRIPTION">DESCRIPTION
+
+</A></H1>
+
+<P>This script monitors the process table using Proc::ProcessTable, and
+will respawn or kill processes based on a set of rules defined in an
+Apache style configuration file.
+
+</P>
+<P>Processes will be respawned if a spawn command is defined for a process,
+and no occurrences of that process are running. If the --user command line
+option is specified, then the process will only be spawned if no instances
+are running as the specified userid.
+
+</P>
+<P>Processes can be killed off if they have been running for too long,
+use too much CPU or memory resources, or have too many concurrent
+versions running. Exceptions can be made to kill rulesets using the
+<I>pidfile</I> and <I>lastsafepid</I> directives.
+
+</P>
+<P>If a PID file is declared for a process, psmon will never kill the
+process ID that is contained within the pid file. This is useful if for
+example, you have a script which spawns hundreds of child processes
+which you may need to automatically kill, but you do not want to kill
+the parent process.
+
+</P>
+<P>Any actions performed will be logged to the DAEMON syslog facility by default.
+There is support to optionally also send notifications emails to an
+administrator on a global or pre-rule basis.
+
+</P><H1><A NAME="OPERATION">OPERATION
+
+</A></H1>
+<DL><DT><A NAME="--help">--help
+
+</A></DT>
+<DD>
+Display this help.
+
+</DD>
+<DT><A NAME="--version">--version
+
+</A></DT>
+<DD>
+Display full version information.
+
+</DD>
+<DT><A NAME="--dryrun">--dryrun
+
+</A></DT>
+<DD>
+Execute a dry-run (do not actually kill or spawn and processes).
+
+</DD>
+<DT><A NAME="--daemon">--daemon
+
+</A></DT>
+<DD>
+Spawn in to background daemon.
+
+</DD>
+<DT><A NAME="--cron">--cron
+
+</A></DT>
+<DD>
+Disables already running warnings when trying to launch as another daemon.
+
+</DD>
+<DT><A NAME="--conf%3dfilename">--conf=<I>filename</I>
+
+</A></DT>
+<DD>
+Specify alternative config filename. The configuration file defaults
+to /etc/psmon.conf when running as superuser, or ~/etc/psmon.conf when
+running as a non-superuser.
+
+</DD>
+<DT><A NAME="--user%3duser">--user=<I>user</I>
+
+</A></DT>
+<DD>
+Only scan the process table for processes running under this username.
+
+</DD>
+<DT><A NAME="--nouser">--nouser
+
+</A></DT>
+<DD>
+Force scanning for all users when not run as superuser. By default psmon
+will only scan processes belonging to the current user for non-superusers.
+
+</DD>
+<DT><A NAME="--adminemail%3demailaddress">--adminemail=<I>emailaddress</I>
+
+</A></DT>
+<DD>
+Force all notification emails to be sent to this email address. This
+option will override all AdminEmail directives within the configuration
+file.
+
+</DD>
+<DT><A NAME="--verbose">--verbose
+
+</A></DT>
+<DD>
+Output more verbose information.
+
+</DD>
+</DL>
+<H1><A NAME="INSTALLATION">INSTALLATION
+
+</A></H1>
+
+<P>In addition to Perl 5.005_03 or higher, the following Perl modules are
+required:
+
+</P>
+<PRE> Proc::ProcessTable
+ Config::General
+ Getopt::Long
+ POSIX
+ IO::File
+ File::Basename</PRE>
+
+<P>These two additional modules are not required, but will provide enhanced
+functionality if present.
+
+</P>
+<PRE> Net::SMTP
+ Unix::Syslog</PRE>
+
+<P>The POSIX module is usually supplied with Perl as standard, as is
+IO::File and File::Basename. All these modules can be
+obtained from CPAN. Visit http://search.span.org and http://www.cpan.org
+for further details. For the lazy people reading this, you can try the
+following command to install these modules:
+
+</P>
+<PRE> for m in Config::General Proc::ProcessTable Net::SMTP \
+ Unix::Syslog Getopt::Long; do perl -MCPAN -e&quot;install $m&quot;;done</PRE>
+
+<P>Alternatively you can run the install.sh script which comes in the
+distribution tarball. It will attempt to install the right modules,
+install the script and configuration file, and generate UNIX man page
+documentation.
+
+</P>
+<P>By default psmon will look for its runtime configuration in /etc/psmon.conf,
+although this can be defined as otherwise from the command line. For system
+wide installations it is recommended that you install your psmon in to the
+default location.
+
+</P><H1><A NAME="CONFIGURATION">CONFIGURATION
+
+</A></H1>
+
+<P>The default configuration file location is /etc/psmon.conf. A different
+configuration file can be declared from the command line. You will find
+an example configuration file supplied in the etc/ directory of the
+distribution tarball. It is recommended that you use this as a guide to
+writing your own configuration file by hand. Alternatively you can use
+the <B>psmon-config</B> script which will interactively create a configuration
+for you.
+
+</P>
+<P>Syntax of the configuration file is based upon that which is used by
+Apache. Each process to be monitored is declared with a Process scope
+directive like this example which monitors the OpenSSH daemon:
+
+</P>
+<PRE> &lt;Process sshd&gt;
+ spawncmd /sbin/service sshd start
+ pidfile /var/run/sshd.pid
+ instances 50
+ pctcpu 90
+ &lt;/Process&gt;</PRE>
+
+<P>There is a special <I>*</I> process scope which applies to <I>all</I> running
+processes. This special scope should be used with extreme care. It does
+not support the use of the <I>spawncmd</I>, <I>pidfile</I>, <I>instances</I> or <I>ttl</I>
+directives. A typical example of this scope might be as follows:
+
+</P>
+<PRE> &lt;Process *&gt;
+ pctcpu 95
+ pctmem 80
+ &lt;/Process&gt;</PRE>
+
+<P>Global directives which are not specific to any one process should be placed
+outside of any Process scopes.
+
+</P><H2><A NAME="DIRECTIVES">DIRECTIVES
+
+</A></H2>
+
+<P>Configuration directives are not case sensitive, but the values that they
+define are.
+
+</P><DL><DT><A NAME="Facility">Facility
+
+</A></DT>
+<DD>
+Defines which syslog facility to log to. Valid options are as follows;
+LOG_KERN, LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_SYSLOG, LOG_LPR,
+LOG_NEWS, LOG_UUCP, LOG_CRON, LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2,
+LOG_LOCAL3, LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6 and LOG_LOCAL7. This
+functionality requires the Unix::Syslog module. Defaults to LOG_DAEMON.
+
+</DD>
+<DT><A NAME="LogLevel">LogLevel
+
+</A></DT>
+<DD>
+Defines the loglevel priority that notifications to syslog will be
+marked as. Valid options are as follows; LOG_EMERG, LOG_ALERT, LOG_CRIT,
+LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO and LOG_DEBUG. The log level
+used by a notification for any failed action will automatically be
+raised to the next level in order to highlight the failure. May be also be used
+in a Process scope which will take priority over a global declaration. This
+functionality requires the Unix::Syslog module. Defaults to LOG_NOTICE.
+
+</DD>
+<DT><A NAME="KillLogLevel%20(previously%20KillPIDLogLevel)">KillLogLevel (previously KillPIDLogLevel)
+
+</A></DT>
+<DD>
+The same as the loglevel directive, but only applies to process kill actions.
+Takes priority over the loglevel directive. May be also be used in a
+Process scope which will take priority over a global declaration.
+Undefined by default.
+
+</DD>
+<DT><A NAME="SpawnLogLevel">SpawnLogLevel
+
+</A></DT>
+<DD>
+The same as the loglevel directive, but only applies to process spawn actions.
+Takes priority over the loglevel directive. May be also be used in a
+Process scope which will take priority over a global declaration.
+Undefined by default.
+
+</DD>
+<DT><A NAME="AdminEmail">AdminEmail
+
+</A></DT>
+<DD>
+Defines the email address where notification emails should be sent to.
+May be also be used in a Process scope which will take priority over a
+global declaration. Defaults to root@localhost.
+
+</DD>
+<DT><A NAME="NotifyEmailFrom">NotifyEmailFrom
+
+</A></DT>
+<DD>
+Defines the email address that notification email should be addresses
+from. Defaults to &lt;username&gt;@<I>hostname</I>.
+
+</DD>
+<DT><A NAME="Frequency">Frequency
+
+</A></DT>
+<DD>
+Defines the frequency of process table queries. Defaults to 60 seconds.
+
+</DD>
+<DT><A NAME="LastSafePID">LastSafePID
+
+</A></DT>
+<DD>
+When defined, psmon will never attempt to kill a process ID which is
+numerically less than or equal to the value defined by lastsafepid. It
+should be noted that psmon will never attempt to kill itself, or a process ID
+less than or equal to 1. Defaults to 100.
+
+</DD>
+<DT><A NAME="ProtectSafePIDsQuietly">ProtectSafePIDsQuietly
+
+</A></DT>
+<DD>
+Accepts a boolean value of On or Off. Suppresses all notifications of
+preserved process IDs when used in conjunction with the <I>lastsafepid</I>
+directive. Defaults to Off.
+
+</DD>
+<DT><A NAME="SMTPHost">SMTPHost
+
+</A></DT>
+<DD>
+Defines the IP address or hostname of the SMTP server to used to send
+email notifications. This functionality requires the Net::SMTP module.
+Defaults to localhost.
+
+</DD>
+<DT><A NAME="SMTPTimeout">SMTPTimeout
+
+</A></DT>
+<DD>
+Defines the timeout in seconds to be used during SMTP connections. This
+functionality requires the Net::SMTP module. Defaults to 20 seconds.
+
+</DD>
+<DT><A NAME="SendmailCmd">SendmailCmd
+
+</A></DT>
+<DD>
+Defines the sendmail command to use to send notification emails if there
+is a failure with the SMTP connection to the host defined by <I>smtphost</I>.
+Defaults to '/lib/sendmail -t' or '/usr/sbin/sendmail -t'.
+
+</DD>
+<DT><A NAME="DefaultEmailMethod">DefaultEmailMethod
+
+</A></DT>
+<DD>
+Defines which method should be used by default to try and send notification
+emails. Legal values are 'SMTP' or 'sendmail'. Defaults to 'sendmail'.
+
+</DD>
+<DT><A NAME="Dryrun">Dryrun
+
+</A></DT>
+<DD>
+Forces psmon to act in the same way as if the --dryrun command line switch
+had specified. This is useful if you want to force a specific configuration
+file to only report and never actually take any automated action.
+
+</DD>
+<DT><A NAME="NeverKillPID">NeverKillPID
+
+</A></DT>
+<DD>
+Accepts a space delimited list of PIDs which will never be killed.
+Defaults to 1.
+
+</DD>
+<DT><A NAME="NeverKillProcessName">NeverKillProcessName
+
+</A></DT>
+<DD>
+Accepts a space delimited list of process names which will never be
+killed. Defaults to 'devfsadmd kswapd kupdated mdrecoveryd pageout sched init fsflush'.
+
+</DD>
+</DL>
+<H2><A NAME="PROCESS%20SCOPE%20DIRECTIVES">PROCESS SCOPE DIRECTIVES
+
+</A></H2>
+<DL><DT><A NAME="SpawnCmd">SpawnCmd
+
+</A></DT>
+<DD>
+Defines the full command line to be executed in order to respawn a dead
+process.
+
+</DD>
+<DT><A NAME="KillCmd">KillCmd
+
+</A></DT>
+<DD>
+Defines the full command line to be executed in order to gracefully
+shutdown or kill a rogue process. If the command returns a boolean true
+exit status then it is assumed that the command failed to execute
+successfully. If no KillCmd is specified or the command fails, the
+process will be killed by sending a SIGKILL signal with the standard
+kill() function. Undefined by default.
+
+</DD>
+<DT><A NAME="PIDFile">PIDFile
+
+</A></DT>
+<DD>
+Defines the full path and filename of a file created by a process which
+contain its main parent process ID. PSMon will not kill the PID number
+which is contained within the PIDFile.
+
+</DD>
+<DT><A NAME="TTL">TTL
+
+</A></DT>
+<DD>
+Defines a maximum time to live (in seconds) of a process. The process
+will be killed once it has been running longer than this value, and
+its process ID isn't contained in the defined pidfile.
+
+</DD>
+<DT><A NAME="PctCpu">PctCpu
+
+</A></DT>
+<DD>
+Defines a maximum allowable percentage of CPU time a process may use.
+The process will be killed once its CPU usage exceeds this threshold
+and its process ID isn't contained in the defined pidfile.
+
+</DD>
+<DT><A NAME="PctMem">PctMem
+
+</A></DT>
+<DD>
+Defines a maximum allowable percentage of total system memory a process
+may use. The process will be killed once its memory usage exceeds this
+threshold and its process ID isn't contained in the defined pidfile.
+
+</DD>
+<DT><A NAME="Instances">Instances
+
+</A></DT>
+<DD>
+Defines a maximum number of instances of a process which may run. The
+process will be killed once there are more than this number of occurrences
+running, and its process ID isn't contained in the defined pid file.
+
+</DD>
+<DT><A NAME="NoEmailOnKill">NoEmailOnKill
+
+</A></DT>
+<DD>
+Accepts a boolean value of True or False. Supresses process killing
+notification emails for this process scope. Defaults to False.
+
+</DD>
+<DT><A NAME="NoEmailOnSpawn">NoEmailOnSpawn
+
+</A></DT>
+<DD>
+Accepts a boolean value of True or False. Supresses process spawning
+notification emails for this process scope. Defaults to False.
+
+</DD>
+<DT><A NAME="NoEmail">NoEmail
+
+</A></DT>
+<DD>
+Accepts a boolean value of True or False. Supresses all notification
+emails for this process scope. Defaults to False.
+
+</DD>
+</DL>
+<H2><A NAME="EXAMPLES">EXAMPLES
+
+</A></H2>
+
+<PRE> &lt;Process syslogd&gt;
+ spawncmd /sbin/service syslogd restart
+ pidfile /var/run/syslogd.pid
+ instances 1
+ pctcpu 70
+ pctmem 30
+ &lt;/Process&gt;</PRE>
+
+<P>Syslog is a good example of a process which can get a little full
+of itself under certain circumstances, and excessively hog CPU and
+memory. Here we will kill off syslogd processes if it exceeds 70%
+CPU or 30% memory utilization.
+
+</P>
+<P>Older running copies of syslogd will be killed if they are running,
+while leaving the most recently spawned copy which will be listed in
+the PID file defined.
+
+</P>
+<PRE> &lt;Process httpd&gt;
+ spawncmd /sbin/service httpd restart
+ pidfile /var/run/httpd.pid
+ loglevel LOG_CRIT
+ adminemail pager@noc.company.com
+ &lt;/Process&gt;</PRE>
+
+<P>Here we are monitoring Apache to ensure that it is restarted if
+it dies. The pidfile directive in this example is actually
+redundant because we have not defined any rule where we should
+consider killing any httpd processes.
+
+</P>
+<P>All notifications relating to this process will be logged with the
+syslog priority of critical (LOG_CRIT), and all emailed to
+pager@noc.company.com which could typically forward to a pager.
+
+</P>
+<P>Any failed attempts to kill or restart a process will automatically
+be logged as a syslog priority one level higher than that specified.
+If a restart of Apache were to fail in this example, a wall
+notification would be broadcast to all interactive terminals
+connected to the machine, since the next log priority up from
+LOG_CRIT is LOG_EMERG.
+
+</P>
+<P>Note that the functionality to log information to syslog requires
+the Unix::Syslog module. In the event that Unix::Syslog is not
+installed, PSMon will write all status messages that would have
+been destined for syslog, to STDERR instead.
+
+</P>
+<PRE> &lt;Process find&gt;
+ noemail True
+ ttl 3600
+ &lt;/Process&gt;</PRE>
+
+<P>Kill old find processes which have been running for over an hour.
+Do not send an email notification since it's not too important.
+
+</P><H1><A NAME="SIGNALS">SIGNALS
+
+</A></H1>
+<DL><DT><A NAME="HUP">HUP
+
+</A></DT>
+<DD>
+Forces an immediate reload of the configuration file. You should
+send the HUP signal when you are running psmon as a background
+daemon and have altered the psmon.conf file.
+
+</DD>
+<DT><A NAME="USR1">USR1
+
+</A></DT>
+<DD>
+Forces an immediate scan of the process table.
+
+</DD>
+</DL>
+<H1><A NAME="EXIT%20CODES">EXIT CODES
+
+</A></H1>
+<DL><DT><A NAME="Value%200%3a%20Exited%20gracefully">Value 0: Exited gracefully
+
+</A></DT>
+<DD>
+The program exited gracefully.
+
+</DD>
+<DT><A NAME="Value%202%3a%20Failure%20to%20lookup%20UID%20for%20username">Value 2: Failure to lookup UID for username
+
+</A></DT>
+<DD>
+The username specified by the --user command line option did not resolve to a valid
+UID.
+
+</DD>
+<DT><A NAME="Value%203%3a%20Configuration%20file%20is%20disabled">Value 3: Configuration file is disabled
+
+</A></DT>
+<DD>
+The configuration file is disabled. (It contains an active 'Disabled' directive).
+
+</DD>
+<DT><A NAME="Value%204%3a%20Configuration%20file%20does%20not%20exist">Value 4: Configuration file does not exist
+
+</A></DT>
+<DD>
+The specified configuration file, (default or user specified) does not exist.
+
+</DD>
+<DT><A NAME="Value%205%3a%20Unable%20to%20open%20PID%20file%20handle">Value 5: Unable to open PID file handle
+
+</A></DT>
+<DD>
+Failed to open a read-only file handle for the runtime PID file.
+
+</DD>
+<DT><A NAME="Value%206%3a%20Failed%20to%20fork">Value 6: Failed to fork
+
+</A></DT>
+<DD>
+An error occurred while attempting to fork the child background daemon process.
+
+</DD>
+<DT><A NAME="Value%207%3a%20Unable%20to%20open%20PID%20file%20handle">Value 7: Unable to open PID file handle
+
+</A></DT>
+<DD>
+Failed to open a write file handle for the runtime PID file.
+
+</DD>
+</DL>
+<H1><A NAME="PERFORMANCE">PERFORMANCE
+
+</A></H1>
+
+<P>psmon is not especially fast. Much of its time is spent reading the process table.
+If the process table is particularly large this can take a number of seconds.
+Although is rarely a major problem on todays speedy machines, I have run a few tests
+so you take look at the times and decide if you can afford the wait.
+
+</P>
+<P>Approximate figures from release 1.0.3:
+
+</P>
+<PRE> CPU OS Open Files/Procs 1m Load Real Time
+ PIII 1.1G Mandrake 9.0 10148 / 267 0.01 0m0.430s
+ PIII 1.2G Mandrake 9.0 16714 / 304 0.44 0m0.640s
+ Celeron 500 Red Hat 6.1 1780 / 81 1.27 0m0.880s
+ PII 450 Red Hat 6.0 300 / 23 0.01 0m1.050s
+ 2x Xeon 1.8G Mandrake 9.0 90530 / 750 0.38 0m1.130s
+ Celeron 500 Red Hat 6.1 1517 / 77 1.00 0m1.450s
+ PIII 866 Red Hat 8.0 3769 / 76 0.63 0m1.662s
+ PIII 750 Red Hat 6.2 754 / 35 3.50 0m2.170s</PRE>
+
+<P>These production machines were running the latest patched stock distribution kernels.
+I have listed the total number of open file descriptors, processes running and 1 minute
+load average to give you a slightly better context of the performance.
+
+</P>
+<P>Approximate figures from release 1.17:
+
+</P>
+<PRE> CPU OS 1m Load CPU Time
+ UltraSPARC-IIe 500Mhz SunOS 5.9 0.10 0m0.550s
+ Athlon XP 2400+ 2Ghz RHEL 3.0 1.00 0m0.150s </PRE>
+<H1><A NAME="SUBROUTINES">SUBROUTINES
+
+</A></H1>
+<DL><DT><A NAME="check_processtable()">check_processtable()
+
+</A></DT>
+<DD>
+
+<P>Reads the current process table, checks and then executes any appropriate
+action to be taken. Does not accept any parameters.
+
+</P></DD>
+<DT><A NAME="slay_process()">slay_process()
+
+</A></DT>
+<DD>
+
+<P>Attempts to kill a process with its killcmd, or failing that using the kill() function.
+Accepts the process name, syslog log level, email notification to address and a reference
+to the %slay hash.
+
+</P></DD>
+<DT><A NAME="slurp_tmplog()">slurp_tmplog()
+
+</A></DT>
+<DD>
+
+<P>Slurps up the contents of a temporary log file and returns it as a chomped
+array after unlinking the temporary log file.
+
+</P></DD>
+<DT><A NAME="print_init_style()">print_init_style()
+
+</A></DT>
+<DD>
+
+<P>Prints a Red Hat sysvinit style status message. Accepts an array of messages
+to display in sequence.
+
+</P></DD>
+<DT><A NAME="spawn_process()">spawn_process()
+
+</A></DT>
+<DD>
+
+<P>Attempts to spawn a process. Accepts the process name, syslog log level, mail
+notification to address and spawn command.
+
+</P></DD>
+<DT><A NAME="display_help()">display_help()
+
+</A></DT>
+<DD>
+
+<P>Displays command line help.
+
+</P></DD>
+<DT><A NAME="parse_user_to_run_as()">parse_user_to_run_as()
+
+</A></DT>
+<DD>
+
+<P>Determine what UID to scan for in the process table.
+
+</P></DD>
+<DT><A NAME="read_config()">read_config()
+
+</A></DT>
+<DD>
+
+<P>Reads in runtime configuration options.
+
+</P></DD>
+<DT><A NAME="isnumeric()">isnumeric()
+
+</A></DT>
+<DD>
+
+<P>An evil bastard fudge to ensure that we're only dealing with numerics when
+necessary, from the config file and Proc::ProcessTable scan.
+
+</P></DD>
+<DT><A NAME="daemonize()">daemonize()
+
+</A></DT>
+<DD>
+
+<P>Launches the process in to the background. Checks to see if there is already an
+instance running.
+
+</P></DD>
+<DT><A NAME="display_version()">display_version()
+
+</A></DT>
+<DD>
+Displays complete version, author and license information.
+
+</DD>
+<DT><A NAME="TRACE()">TRACE()
+
+</A></DT>
+<DD>
+Prints trace information to STDOUT if the DEBUG constant has been set to
+boolean true. The DEBUG constant is set to boolean true in the event that
+the environment variable PSMon_DEBUG is also set to boolean true.
+
+</DD>
+<DT><A NAME="DUMP()">DUMP()
+
+</A></DT>
+<DD>
+See TRACE().
+
+</DD>
+</DL>
+<H2><A NAME="PSMon%3a%3aLogging%20METHODS">PSMon::Logging METHODS
+
+</A></H2>
+<DL><DT><A NAME="new()">new()
+
+</A></DT>
+<DD>
+Creates a new PSMon::Logging object.
+
+</DD>
+<DT><A NAME="openlog()">openlog()
+
+</A></DT>
+<DD>
+Opens a connection to syslog using Unix::Syslog.
+
+</DD>
+<DT><A NAME="closelog()">closelog()
+
+</A></DT>
+<DD>
+Closes a connection to syslog.
+
+</DD>
+<DT><A NAME="loglevel()">loglevel()
+
+</A></DT>
+<DD>
+Accepts a syslog loglevel keyword and returns the associated constant integer.
+
+</DD>
+<DT><A NAME="logfacility()">logfacility()
+
+</A></DT>
+<DD>
+Accepts a syslog facility keyword and returns the associated constant integer.
+
+</DD>
+<DT><A NAME="alert()">alert()
+
+</A></DT>
+<DD>
+Logs a message to syslog using Log() and sends a notification email using
+sendmail().
+
+</DD>
+<DT><A NAME="Log()">Log()
+
+</A></DT>
+<DD>
+Logs messages to DAEMON facility in syslog. Accepts a log
+level and message array. Will terminate the process if it is
+asked to log a message of a log level 2 or less (LOG_EMERG,
+LOG_ALERT, LOG_CRIT).
+
+</DD>
+<DT><A NAME="sendmail()">sendmail()
+
+</A></DT>
+<DD>
+Sends email notifications of syslog messages, called by alert().
+Accepts sending email address, recipient email address, short
+message subject and an optional detailed message body array.
+
+</DD>
+<DT><A NAME="_sendmail_sendmail()">_sendmail_sendmail()
+
+</A></DT>
+<DD>
+Called by sendmail(), sends an email using the sendmail command.
+
+</DD>
+<DT><A NAME="_sendmail_smtp()">_sendmail_smtp()
+
+</A></DT>
+<DD>
+Called by sendmail(), sends an email using the Net::SMTP module.
+
+</DD>
+</DL>
+<H2><A NAME="Unix%3a%3aSyslog%20STUB%20METHODS">Unix::Syslog STUB METHODS
+
+</A></H2>
+
+<P>The __DATA__ section of the PSMon code contains a stub version of the
+Unix::Syslog module. It is automatically loaded in the event that the
+real Unix::Syslog module is not present and/or cannot be loaded. This stub
+module provides very basic functionality to output the messages generated
+by the PSMon::Logging module to STDERR, instead of simply dropping them.
+
+</P><DL><DT><A NAME="_timestamp()">_timestamp()
+
+</A></DT>
+<DD>
+Retuns a timestamp string which closely resembles timestamps
+used by syslog.
+
+</DD>
+<DT><A NAME="syslog()">syslog()
+
+</A></DT>
+<DD>
+Outputs a syslog formatted and timestamped message to STDERR.
+
+</DD>
+<DT><A NAME="openlog()">openlog()
+
+</A></DT>
+<DD>
+Stub.
+
+</DD>
+<DT><A NAME="closelog()">closelog()
+
+</A></DT>
+<DD>
+Stub.
+
+</DD>
+<DT><A NAME="setlogmask()">setlogmask()
+
+</A></DT>
+<DD>
+Stub.
+
+</DD>
+<DT><A NAME="priorityname()">priorityname()
+
+</A></DT>
+<DD>
+Stub.
+
+</DD>
+<DT><A NAME="facilityname()">facilityname()
+
+</A></DT>
+<DD>
+Stub.
+
+</DD>
+</DL>
+<H1><A NAME="BUGS">BUGS
+
+</A></H1>
+
+<P>Hopefully none. ;-) Send any bug reports to me at nicolaw@cpan.org
+along with any patches and details of how to replicate the problem.
+Please only send reports for bugs which can be replicated in the
+<I>latest</I> version of the software. The latest version can always be
+found at http://search.cpan.org/~nicolaw/
+
+</P><H1><A NAME="TODO">TODO
+
+</A></H1>
+
+<P>The following functionality will be added soon:
+
+</P><DL><DT><A NAME="Code%20cleanup">Code cleanup
+
+</A></DT>
+<DD>
+The code needs to be cleaned up and made more efficient. The bulk of the
+code will be moved to a separate module, and psmon as you know it now will
+become a much smaller and simpler wrapper script.
+
+</DD>
+<DT><A NAME="Apply%20contributed%20patches">Apply contributed patches
+
+</A></DT>
+<DD>
+Users of psmon have sent me various patches for additional functionality.
+These will be incorporated in to the next major release of psmon once the
+code has been properly abstracted.
+
+</DD>
+<DT><A NAME="killperprocessname%20directive">killperprocessname directive
+
+</A></DT>
+<DD>
+Will accept a boolean value. If true, only 1 process per process scope
+will ever be killed, instead of all process IDs matching kill rules.
+This should be used in conjunction with the new killcmd directive. For
+example, you may define that a database daemon may never take up more
+than 90% CPU time, and it runs many children processes. If it exceeds
+90% CPU time, you want to issue ONE restart command in order to stop and
+then start all the database processes in one go.
+
+</DD>
+<DT><A NAME="time%20period%20limited%20rules">time period limited rules
+
+</A></DT>
+<DD>
+Functionality to limit validity of process scopes to only be checked
+between defined time periods. For example, only check that httpd is running
+between the hours of 8am and 5pm on Mondays and Tuesdays.
+
+</DD>
+</DL>
+<H1><A NAME="SEE%20ALSO">SEE ALSO
+
+</A></H1>
+
+<P>nsmon
+
+</P><H1><A NAME="LICENSE">LICENSE
+
+</A></H1>
+
+<P>Written by Nicola Worthington, &lt;nicolaw@cpan.org&gt;.
+Copyright (C) 2002,2003,2004,2005 Nicola Worthington.
+
+</P>
+<P>This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+</P>
+<P>This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+</P>
+<P>You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+</P><H1><A NAME="AUTHOR">AUTHOR
+
+</A></H1>
+
+<P>Nicola Worthington &lt;nicolaw@cpan.org&gt;
+
+</P>
+<P>http://search.cpan.org/~nicolaw/
+
+</P>
+<P>http://www.psmon.com
+
+</P>
+<P>http://www.nicolaworthington.com
+
+</P>
+</BODY>
+</HTML>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment