Добрый день, столкнулся с такой проблемой.
Попытка использования плагина smart на рабочих станциях HP Z, встроенный контроллер Intel C600/C220
smartctl выдает список устройств:
Первые 2 устройства это физические диски, у них тип устройства SAT.
Дальше буду опираться на то как понял написанное в исходниках smartfs.go.
Плагин их определяет в список "raidDev", и дальше пытается работать с ним как с рейд массивом, пытаясь перебором определить тип контроллера:
Далее по этому списку запускается smartctl в цикле, с увеличение порядкового номера диска в массиве, в ожидании достигнуть конца рейд массива, получив ошибку от smartctl.
Вот только ни один из указанных raidTypes не поддерживает smartctl в Windows в таком виде вызова, который прописан в коде плагина (в плагине инструментарий вызова для Linux): https://www.smartmontools.org/wiki/S...ID-Controllers
В итоге мы получаем такое сообщение, которое не воспринимается ожидаемой ошибкой и цикл не завершается:
Теперь собственно сама проблема:
Код в smartfs.go не обрабатывает это сообщение как ошибку, не останавливает цикл проверки предполагаемного рейд массива, по итогу мы получаем бесконечный цикл в функции getRaidDevices который во все ядра cpu запускает smartctl.exe, практически вешая систему.
Возможно тут требуется отправить баг репорт, но я не умею этого делать, помогите кто может.
Можно ли как-то исправить без пересборки Агента из исходников? Закостылить проблему я понял как, например, как частный случай убрать вообще рассмотрение рейдов, например, посредствам комментирования блока формирования списка предполагаемых массивов:
Но это костыль для частного случая, хотелось бы качественного решения, для этого моих навыков программирования не хватит.
Мне кажется необходимо в целом пересмотреть логику плагина для Windows.
Попытка использования плагина smart на рабочих станциях HP Z, встроенный контроллер Intel C600/C220
smartctl выдает список устройств:
Code:
smartctl.exe --scan /dev/sda -d sat # /dev/sda [SAT], ATA device /dev/sdb -d sat # /dev/sdb [SAT], ATA device /dev/sdc -d scsi # /dev/sdc, SCSI device /dev/sdd -d scsi # /dev/sdd, SCSI device /dev/sde -d scsi # /dev/sde, SCSI device /dev/csmi0,0 -d ata # /dev/csmi0,0, ATA device /dev/csmi1,0 -d ata # /dev/csmi1,0, ATA device /dev/csmi1,1 -d ata # /dev/csmi1,1, ATA device
Дальше буду опираться на то как понял написанное в исходниках smartfs.go.
Плагин их определяет в список "raidDev", и дальше пытается работать с ним как с рейд массивом, пытаясь перебором определить тип контроллера:
Code:
raidTypes:=[]string{"3ware","areca","cciss","megaraid","sat"}
...
for_,rDev:=range raidDev {
for_,rType:=range raidTypes {
r.raids <- raidParameters{rDev.Name, rType}
}
}
Code:
// getRaidDevices sets raid device information returned by smartctl. // Works by incrementing raid disk number till there is an error from smartctl.
В итоге мы получаем такое сообщение, которое не воспринимается ожидаемой ошибкой и цикл не завершается:
Code:
"string": "/dev/sda: Unknown device type 'cciss,1'", "severity": "error"
Код в smartfs.go не обрабатывает это сообщение как ошибку, не останавливает цикл проверки предполагаемного рейд массива, по итогу мы получаем бесконечный цикл в функции getRaidDevices который во все ядра cpu запускает smartctl.exe, практически вешая систему.
Возможно тут требуется отправить баг репорт, но я не умею этого делать, помогите кто может.
Можно ли как-то исправить без пересборки Агента из исходников? Закостылить проблему я понял как, например, как частный случай убрать вообще рассмотрение рейдов, например, посредствам комментирования блока формирования списка предполагаемых массивов:
Code:
raid:
for_,tmp:=range basicTmp {
//for _, r := range raid {
//if tmp.Name == r.Name {
//continue raid
//}
//}
basic=append(basic, tmp)
}
Мне кажется необходимо в целом пересмотреть логику плагина для Windows.