; No claim of copyright is made with regard to to this code. YOU MUST UNDERSTAND,
; AND APPROPRIATELY ADJUST, THIS MODULE BEFORE USING IN A PRODUCTION ENVIRONMENT.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; UptimeGleaner.m is the PipeLine Gleaner of the uptime and Log File Monitoring (ULFM)
; Reference Implementation. It monitors the output of the uptime command.
;
; The ULFM Reference Implementation monitors:
;
; * uptime: It captures up days and load averages after every 15 seconds from
; /usr/bin/uptime output and files them in the InfoHub database.
; It generates two notifications.when up days is less than 30 days and when
; the 15 minutes load average is less than 1. Note that the notification for up
; days is generated only once per day because up days gets updated only once per day.
; The notification criteria were chosen specifically so that they generate alerts.
;
; * System log (/var/log/messages): It automatically generates a notification when it
; detect a GT.M error in the system log.
;
; * Authentication log (/var/log/auth.log): It automatically generates a notification
; when it detects a login failure in the authentication log.
;
; No claim of copyright is made with respect to this code. Please ensure that you have a correctly
; configured Infohub, correctly configured environment variables, with
; appropriate directories and files.
;
; UptimeGleaner.m is a part of ULFM_RI.zip which can be download from the User Documentation website.
; The structure of the ULFM_RI.zip is as follows:
;
; ULFM_RI.zip
; |-- LogFileGleaner.m #FileLine Gleaner program for system log and authentication log).
; |-- UptimeGleaner.m #PipeLine Gleaner program for monitoring the outpuf of uptime.
; |-- configs
; `-- SimpleMonitor.cfg #InfoHub Configuration File for ULFM Reference Implementation.
;
; ULFM files are also available as part of your InfoHub distribution. For instructions on installing the ULFM
; reference implementation, please refer to the comment lines in SimpleMonitor.cfg.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Invoked prior to a new file getting processed, this function defines a few ;
; configuration options ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PreExpr(%l)
; Define the hardcoded relationship with the InfoDict
set ^UptimePath($job)=3030400
set ^LoadPath($job,1)=3030401
set ^LoadPath($job,5)=3030405
set ^LoadPath($job,15)=3030415
set ^Delimiter($job)=$char(30)
quit ""
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Return the decoded input with the hard coded InfoDict IDs ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
InfoExpr(%l)
new DaysUp,FiveMinAvg,FifteenMinAvg,KV,LoadAvg,OneMinAvg
;
; Some platforms use variable length padding for the fields, use %MPIECE to reduce these
set UptimeInfo=$$^%MPIECE(%l," "," ")
;
; Get the days up, ignoring the hours and minutes
set DaysUp=+$piece(UptimeInfo," ",3)
;
; Break apart the load average string starting from the last field inward. Using the '+'
; notation forces numeric evaluation of all pieces.
set LastField=$length(UptimeInfo," ")
set FifteenMinAvg=+$piece(UptimeInfo," ",LastField)
set FiveMinAvg=+$piece(UptimeInfo," ",$increment(LastField,-1))
set OneMinAvg=+$piece(UptimeInfo," ",$increment(LastField,-1))
;
; Build the KeyValue sequence
set KV=$get(KV)_^UptimePath($job)_^Delimiter($job)_DaysUp
set KV=$get(KV)_^Delimiter($job)_^LoadPath($job,1)_^Delimiter($job)_OneMinAvg
set KV=$get(KV)_^Delimiter($job)_^LoadPath($job,5)_^Delimiter($job)_FiveMinAvg
set KV=$get(KV)_^Delimiter($job)_^LoadPath($job,15)_^Delimiter($job)_FifteenMinAvg
;
; Return the KeyValue sequence
set:$get(debug,0) ^KV($job,$increment(^KV($job)))=KV
quit KV
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Invoked before termination ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PostExpr(%l)
; Clean up the local configuration. It is intentional to not clean up the debug global ^KV
kill ^UptimePath($job)
kill ^LoadPath($job)
kill ^Delimiter($job)
quit ""