All pastes #291774 Raw Edit

Anonyme

public text v1 · immutable
#291774 ·published 2006-12-25 18:46 UTC
rendered paste body
#######################################
# Stats.tcl by KuNgFo0 (www.eggfaq.com)

#VERSION 0.5
#DESCRIPTION Adds several public !commands such as !uptime, !uname, !vhosts, etc. Useful for shell admins. Ineficient.

# Set the next line as the command you want to display the uptime
set stats_uptime_command "!uptime"
# Set the next line as the command you want to display the uname
set stats_uname_command "!uname"
# Set the next line as the command you want to display the vhosts
# (this command may not exist on all machines)
set stats_vhosts_command "!vhosts"
# Set the next line as the command you want to display the ps stats
set stats_ps_command "!ps"
# Set the next line as the list of processes to display stats on
set stats_processlist "bnc eggdrop ircd"
# Set the next line as the command you want to display the service stats
set stats_services_command "!services"
# Set the next line as the list of services to display stats on
set stats_servicelist "cron sendmail sshd named inetd httpd"
# Set then next line as the command you want to display the box stats
set stats_stats_command "!stats"
# Set then next line as the command you want to display the help
set stats_help_command "!help"
# Set the next line as the command on your shell to display the vhosts
# (may be vhosts vhost etc)
set stats_vhosts "vhosts"
# Set the next line as the box's processor speed and type
set stats_processor "Intel Pentium III xxx mhz"
# Set the next line as the box's memory capacity
set stats_memory "xx megs"
# Set the next line as the box's connection speed
set stats_linespeed "Txx xxxmbit"
# Set the next line as the channels you want to run in
set stats_chans "#testchannel1 #testchannel2"

proc validnum {num} {
 return [expr [scan $num "%f%s" a b] == 1]
}

proc uptime_check {nick hand chan} {
 global stats_chans
 return [expr {(([lsearch -exact [string tolower $stats_chans] [string tolower $chan]] != -1) || ([strcmp $stats_chans "*"] == 0)) && (![matchattr $hand b]) && (![isbotnick $nick])}]
}

proc pub_uptime {nick uhost hand chan arg} {
 if {[uptime_check $nick $hand $chan]} {
  if {[catch {exec uptime} output]} { putserv "PRIVMSG $chan :Error: Could not execute uptime" } \
  else { putserv "NOTICE $nick :Uptime: $output" }
 }
}

proc pub_uname {nick uhost hand chan arg} {
 if {[uptime_check $nick $hand $chan]} {
  if {[catch {exec uname -a} output]} { putserv "PRIVMSG $chan :Error: Could not execute uname" } \
  else { putserv "NOTICE $nick :System Info: $output" }
 }
}

proc pub_vhosts {nick uhost hand chan arg} {
 global stats_vhosts
 if {[uptime_check $nick $hand $chan]} {
  if {[catch {exec $stats_vhosts} output]} { putserv "PRIVMSG $chan :Error: Could not execute vhosts" } \
  else {
   putserv "NOTICE $nick :Vhosts:"
   foreach line [split $output \n] { putserv "NOTICE $nick :$line" }
  }
 }
}

proc pub_ps {nick uhost hand chan arg} {
 global stats_processlist
 if {[uptime_check $nick $hand $chan]} {
  if {[catch {exec ps axo user,tt,command} output]} { putserv "PRIVMSG $chan :Error: Could not execute ps" } \
  else {
   set processes 0
   foreach line [split $output \n] {
    if {([lsearch "root bin nobody qmail daemon mysql" [lindex $line 0]] == -1) && (([set tmp [lindex $line 1]] == "?") || ([string range $tmp end end] == "-"))} {
     foreach process $stats_processlist {
      if {[string match *[string tolower $process]* [string tolower $line]]} {
       if {![info exists processdata($process)]} { set processdata($process) 0 }
       incr processdata($process)
      }
      incr processes
     }
    }
   }
   set output ""
   if {[array names processdata] != ""} {
    foreach process $stats_processlist {
     if {[info exists processdata($process)]} { lappend output "$processdata($process) ${process}(s)" }
    }
    set output ", including: [join $output ", "]"
   }
   putserv "NOTICE $nick :Approx. $processes background process(es) currently running$output"
  }
 }
}

proc pub_services {nick uhost hand chan arg} {
 global stats_servicelist
 if {[uptime_check $nick $hand $chan]} {
  if {[catch {exec ps axo user,tt,command} output]} { putserv "PRIVMSG $chan :Error: Could not execute ps" } \
  else {
   foreach line [split $output \n] {
    if {[lsearch "root bin nobody qmail daemon mysql" [lindex $line 0]] != -1} {
     foreach service $stats_servicelist {
      if {[string match *[string tolower $service]* [string tolower $line]]} { set servicedata($service) 1 }
     }
    }
   }
   if {[array names servicedata] != ""} {
    set output ""
    foreach service $stats_servicelist {
     if {[info exists servicedata($service)]} { lappend output "$service is online" } \
     else { lappend output "$service is offline" }
    }
   } else { set output "none" }
   putserv "NOTICE $nick :Services running: [join $output ", "]"
  }
 }
}

proc pub_stats {nick uhost hand chan arg} {
 global stats_processor stats_memory stats_linespeed
 if {[uptime_check $nick $hand $chan]} {
  putserv "NOTICE $nick :Processor: $stats_processor"
  putserv "NOTICE $nick :Memory:    $stats_memory"
  catch {exec top -b -n 1} output
  foreach line [split $output \n] {
   if {([lindex $line 0] == "Mem:") || ([lindex $line 0] == "Swap:")} { putserv "NOTICE $nick :* $line" }
  }
  if {[catch {exec df -k} output]} { putserv "PRIVMSG $chan :Error: Could not execute df" } \
  else {
   set total 0
   set used  0
   set free  0
   foreach line [split $output \n] {
    if {[validnum [lindex $line 1]]} {
     incr total [lindex $line 1]
     incr used  [lindex $line 2]
     incr free  [lindex $line 3]
    }
   }
   set output2 ""
   if {$total} { lappend output2 [format "%.2f GB total" [expr ($total / 1024.0) / 1024.0]] }
   if {$used}  { lappend output2 [format "%.2f GB used"  [expr ($used / 1024.0) / 1024.0]] }
   if {$free}  { lappend output2 [format "%.2f GB free"  [expr ($free / 1024.0) / 1024.0]] }
  }
  if {$output2 != ""} { putserv "NOTICE $nick :Hard Disk: [join $output2 ", "]" }
  putserv "NOTICE $nick :Line Speed: $stats_linespeed"
 }
}

proc pub_help {nick uhost hand chan arg} {
 global stats_uptime_command stats_uname_command stats_vhosts_command stats_ps_command stats_services_command stats_stats_command
 if {[uptime_check $nick $hand $chan]} {
  putserv "NOTICE $nick :Usage:"
  putserv "NOTICE $nick :[format "%-10s %s" $stats_uptime_command   "Displays the server uptime"]"
  putserv "NOTICE $nick :[format "%-10s %s" $stats_uname_command    "Displays the server version info"]"
  putserv "NOTICE $nick :[format "%-10s %s" $stats_vhosts_command   "Displays the available vhosts"]"
  putserv "NOTICE $nick :[format "%-10s %s" $stats_ps_command       "Displays the current bg process stats"]"
  putserv "NOTICE $nick :[format "%-10s %s" $stats_services_command "Displays the current services process stats"]"
  putserv "NOTICE $nick :[format "%-10s %s" $stats_stats_command    "Displays the server stats"]"
 }
}

bind pub - $stats_uptime_command   pub_uptime
bind pub - $stats_uname_command    pub_uname
bind pub - $stats_vhosts_command   pub_vhosts
bind pub - $stats_ps_command       pub_ps
bind pub - $stats_services_command pub_services
bind pub - $stats_stats_command    pub_stats
bind pub - $stats_help_command     pub_help

putlog "*** Stats.tcl 0.4 by KuNgFo0 loaded"