v-zhuravlev / zbx-smartctl

Templates and scripts for monitoring disks health with Zabbix and smartmontools
https://share.zabbix.com/storage-devices/smartmontools/smart-monitoring-with-smartmontools-lld
GNU General Public License v3.0
245 stars 127 forks source link

Wrong discovery by PS1 script #56

Closed kosfango closed 6 years ago

kosfango commented 6 years ago

Hi All,

Seems, something wrong:

PS C:\Users\Administrator> C:\zabbix\smartmontools\bin\smartctl.exe --scan

/dev/sda -d scsi # /dev/sda, SCSI device
/dev/sdb -d scsi # /dev/sdb, SCSI device
/dev/csmi0,2 -d ata # /dev/csmi0,2, ATA device
/dev/csmi0,3 -d ata # /dev/csmi0,3, ATA device
/dev/csmi0,4 -d ata # /dev/csmi0,4, ATA device
/dev/csmi0,5 -d ata # /dev/csmi0,5, ATA device

PS C:\Users\Administrator> powershell -NoProfile -ExecutionPolicy Bypass -File

C:\zabbix\scripts\smartctl-disks-discovery.ps1
{
 "data":[

        {
                "{#DISKNAME}":"/dev/hda",
                "{#SMART_ENABLED}":"0"
        },

        {
                "{#DISKNAME}":"/dev/hdb",
                "{#SMART_ENABLED}":"0"
        },

        {
                "{#DISKNAME}":"/dev/hdc",
                "{#SMART_ENABLED}":"0"
        }

 ]
}
PS C:\Users\Administrator>

But in the same time this bat file:

@echo off
setlocal enabledelayedexpansion

set smartctl_path=C:\zabbix\smartmontools\bin\smartctl.exe
set serials=dummy_serial
set /a first=1

echo {"data":[
for /f "tokens=1,2,3 delims= " %%i in ('!smartctl_path! --scan') do (
    set smart_enabled=0
    set duplicate=0
    for /F "tokens=3*" %%a in ('!smartctl_path! -i %%i %%j %%k^| find "Serial Number"') do (
        set serial=%%a
    )

        rem duplicate disk entity, check by serial number
        for %%j in (!serials!) do (if %%j == !serial! (set /a duplicate+=1)) 
        set serials=%serials% !serial!

    FOR /F "tokens=1" %%a IN ('!smartctl_path! -i %%i %%j %%k ^|find "SMART" ^| find /C "Enabled"') DO (
        if %%a gtr 0 (
        set /a smart_enabled=1
        )
    )
    if not !duplicate! == 1 (
            if not !first! ==1 (
                echo ,
            )
            echo {"{#DISKNAME}":"%%i","{#SMART_ENABLED}":"!smart_enabled!"}
            set /a first=0
    )
)
echo ]}

seems works good:

PS C:\Users\Administrator> C:\zabbix\scripts\smartctl-disks-discovery.bat
{"data":[
{"{#DISKNAME}":"/dev/sda","{#SMART_ENABLED}":"0"}
,
{"{#DISKNAME}":"/dev/sdb","{#SMART_ENABLED}":"0"}
,
{"{#DISKNAME}":"/dev/csmi0,2","{#SMART_ENABLED}":"1"}
,
{"{#DISKNAME}":"/dev/csmi0,3","{#SMART_ENABLED}":"1"}
,
{"{#DISKNAME}":"/dev/csmi0,4","{#SMART_ENABLED}":"1"}
,
{"{#DISKNAME}":"/dev/csmi0,5","{#SMART_ENABLED}":"1"}
]}
PS C:\Users\Administrator>
lzbohnz commented 6 years ago

I ran into the same thing. I fixed the PS script, here is the pertinent fragment:

$smart_scanresults = & $smartctl "--scan" 

write-host "{"
write-host " `"data`":[`n"
foreach ($smart_scanresult in $smart_scanresults)
{

    $smartctl_disk_name = $smart_scanresult.Substring(0,$smart_scanresult.IndexOf(" "))
    $smart_enabled = & $smartctl "-i" $smartctl_disk_name | select-string "SMART.+Enabled$"

             if($smart_enabled) {            
                $smart_enabled = 1
            } else {            
                $smart_enabled = 0
            }

    if ($idx -lt  $smart_scanresults.Count-1)
    {
        $line= "`t{`n " + "`t`t`"{#DISKNAME}`":`""+$smartctl_disk_name+"`""+ ",`n" + "`t`t`"{#SMART_ENABLED}`":`""+$smart_enabled+"`"" +"`n`t},`n"
        write-host $line
    }
    elseif ($idx -ge  $smart_scanresults.Count-1)
    {

        $line= "`t{`n " + "`t`t`"{#DISKNAME}`":`""+$smartctl_disk_name+"`""+ ",`n" + "`t`t`"{#SMART_ENABLED}`":`""+$smart_enabled+"`"" +"`n`t}"
        write-host $line
    }
    $idx++;
}

This gives me the appropriate /dev/sda, /dev/hda, etc. rather than having it hard-coded as hda.

kosfango commented 6 years ago

Btw, in my case it works too:

https://github.com/v-zhuravlev/zbx-smartctl/pull/52

v-zhuravlev commented 6 years ago

Thanks @lzbohnz ,