Welcome, guest | Sign In | My Account | Store | Cart
###########################################################
# Check for Maximum CPU usage. 
# Email alert if cpu exceeds 95%.
###########################################################

puts "\n executing [info script]\n"

# make script drive independent.

set drive [lindex [file split [info nameofexecutable]] 0 ] 

puts "\n proclib = $drive/scripts/TCL/proclib"

########################################################  
# Source utility procs.
########################################################  

source [ file join  $drive scripts/TCL/proclib/checkFile_proc.tcl ]
source [ file join  $drive scripts/TCL/proclib/smtp_proc.tcl ]
source [ file join  $drive scripts/TCL/proclib/reportHeader_proc.tcl ]
source [ file join  $drive scripts/TCL/proclib/printColumns.tcl ]
source [ file join  $drive scripts/TCL/proclib/convertToMb.tcl ]

########################################################  
# Source packages. 
########################################################  

package require twapi
package require winutils
package require Tclx

######################################
# Proc - check cpu usage. 
######################################
proc checkCpu {} {

   puts "\n checkcpu \n"

   while {1} { 

      # pause for 30 seconds 

      after 30000

      # check processor utilization over a ten second interval.
       
      set cpu [lindex [twapi::get_processor_info 0 -processorutilization -interval 10000] 1]

#     if cpu is > 90% and alert has not been generated send error report.

      set cpu 95

      if { ![ info exist report ] } {
         
         set report false
         
      }
         
      if { [ expr { int($cpu) } ] > 90 && [ string is false $report ] } { 

	  set report true
          
          writeReport $cpu 

      } else {

	  set continue true 

      }

      # if cpu is < 90% and alert has been generated send OK report.

      if { [ expr { int($cpu) }  ] < 90 && [ string is true $report ] } { 

	  set report false

          writeReport $cpu 

      } else {

	  set continue true 

      }

   }

}
######################################
# Proc - write report
######################################
proc writeReport { cpu } {
  
   global reportFile
   global reportFileId

   set header       "$::env(COMPUTERNAME) - Check Cpu Alert"

   reportHeader $reportFileId $header $reportFile
 
   set s "*****************************************"
   set t1 [ format "%-20s %s" " " $s ]
   set s "The End"
   set t2 [ format "%-35s    %s" " " $s ]
   set t3 "$::env(COMPUTERNAME) -  CPU utilization is $cpu\%\. " 
   set t9 "CPU utilization - Top Ten" 

   puts $reportFileId \n$t3\n

   set s "*****************************************"
   set t1 [ format "%-20s %s" " " $s ]

   puts $reportFileId \n$t1
   puts $reportFileId [ format "%-20s %s" " " $t9 ]
   puts $reportFileId $t1\n

   foreach e [ processDetails ] {

       set spaces " "
       set processName [ lindex $e 0 0 ]
       set processId   [ lindex $e 0 1 ] 
       set cpuUsage    [ expr { int( [ lindex $e 1 ] ) } ]

       set width [ string length $processId ]
                                               
       puts $reportFileId [ format "%-20s %-20s %6s %3d" $spaces      \
                                                         $processName \
                                                         $processId   \
                                                         $cpuUsage ]

   }

   puts $reportFileId \n$t1\n

   foreach e [ memDetails ] {

       puts $reportFileId [ format "%-20s %s" " " $e ] 

   }

   puts  $reportFileId \n$t1
   puts  $reportFileId $t2
   puts  $reportFileId $t1
 
   emailReport $cpu

   ftruncate -fileid $reportFileId 0

}
######################################
# Proc - get memory details. 
######################################
proc memDetails {} {

   set width 18 
   array set meminfo [twapi::get_memory_info -all]

   catch { puts_tabular $width "Physical memory:" "Total [toMB $meminfo(-totalphysical)] MB, Available [toMB $meminfo(-availphysical)] MB" } r 
 
   set t1 $r

   catch { puts_tabular $width "Commit:"  "Total [toMB $meminfo(-totalcommit)] MB, Available [toMB $meminfo(-availcommit)] MB" } r 

   set t2 $r

   catch { puts_tabular $width "Swap files:" "[join $meminfo(-swapfiles) {, }]" } r

   set t3 $r

   return [ list $t1 $t2 $t3 ]

}
######################################
# Proc - get cpu details. 
######################################
proc processDetails {} {

   set processList [ lsort [ winutils::processes ] ]

   # calculate the cpu utilization for each process then sort and select the top ten. 
   
   foreach e $processList {

      set c [ twapi::get_process_info [ lindex $e 1 ] -processorutilization ] 

      lappend usageList [ list $e [ expr { int([ lindex $c 1 ]) } ] ]

   }

   set topTen [ lrange [ lsort -decreasing -integer -index 1 $usageList ] 0 9 ] 
  
   return $topTen

}

###########################################
# Email Report 
###########################################

proc emailReport { cpu } {

   global reportFile
   global reportFileId

   flush $reportFileId  

   set computerName $::env(COMPUTERNAME)

   if { [ expr { int($cpu) }  ] < 90 } { 

       set subject "$computerName - Cpu Alert Over."   

   } else {

       set subject "$computerName - Cpu Alert."   

   }

   sendSimpleMessage you@emailaddress.com $subject $reportFile

}
######################################
# Control Section.
######################################

######################################
# Set Variables
######################################

set processId [ twapi::get_current_process_id ]

set eventId   [ twapi::eventlog_open -write ]

set data "CHECKCPU STARTING"

twapi::eventlog_write $eventId 1 -type information -loguser -data $data

twapi::eventlog_close $eventId

set reportFile   [ file join $drive reports/notify/checkCpu.txt ]

#########################################
# Check if files exist.
#########################################

checkFile [file dirname $reportFile]

######################################
# Open output files.
######################################

set reportFileId  [open $reportFile w]

################################### 
# Global variables.
################################### 

global reportFile
global reportFileId

checkCpu 

History