2009-12-23

nagios + powershell = дружба

Вот. Асилил сегодня за полчаса мучений...
На серваках wsus засосал powershell, поэтому можно теперь по-клёвому извращацца. Фиг знает, откуда эта мысль у меня сегодня родилась в тот момент, когда надо было уже валить с работы. Но родилась...пришлось сидеть на работе до половины восьмого =)

Собственно источник мучений - хреновая реализация функции CheckUpTime в библиотеке CheckSystem. У меня после месяца аптайма на серваке nagios начинал говорить, что у сервака аптайм столько-то недель, пару миллиардов часов и т.д. Глюки какие-то. Наверно функция не рассчитана, что винда может так долго работать. В общем неприятно, да и формат вывода отличается от юниксового аптайма,который я на перле набросал. И вот powershell. Поехали, собственно все просто:
# Добавим такую инфу в nsc.ini для nsclientpp на винде
[modules]
...
CheckExternalScripts.dll
...
[External Scripts]
# Все в одну строчку
check_uptime=cmd /c echo scripts\check_uptime.ps1
 | "C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -command -

Перезапустим службу nsclient и вуаля. Все работает. Если powershell стоит конечно :-D

check_uptime.ps1 лежит в папке scripts, которая лежит в папке nsclient++
Кому интересно - вот стыренный где-то скрипт powershell'а.
function WMIDateStringToDate($Bootup) {
     [System.Management.ManagementDateTimeconverter]::ToDateTime($Bootup)
 }
# Main script
$system = Get-WMIObject -class Win32_OperatingSystem
$Bootup = $system.LastBootUpTime
$LastBootUpTime = WMIDateStringToDate($Bootup)
$now = Get-Date
$Uptime = $now - $lastBootUpTime
$d = $Uptime.Days
$h = $Uptime.Hours
$m = $uptime.Minutes
$s = $uptime.Seconds

if ($d -lt 1) {
 "System uptime: {0} day(s), {1} h. {2} m. {3} s." -f $d,$h,$m,$s
 exit(1)
} else {
 "System uptime: {0} day(s), {1} h. {2} m. {3} s." -f $d,$h,$m,$s
 exit(0)
}