You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
5.1 KiB
152 lines
5.1 KiB
Param(
|
|
[parameter(Position=0,Mandatory=$true)]
|
|
[ValidateSet("pdisk", "vdisk", "bbu", "adapter")]
|
|
[alias("m")]
|
|
[String]
|
|
$mode
|
|
,
|
|
[parameter()]
|
|
[ValidateRange(0,5)]
|
|
[alias("a","adp")]
|
|
[int]
|
|
$adapter
|
|
)
|
|
|
|
$CLI = "C:\Program Files\Zabbix Agent\bin\perccli64.exe"
|
|
|
|
|
|
function disco_adp() {
|
|
$number_of_adapters = [int](& $CLI -adpCount -NoLog | Select-String "Controller Count: (\d+)" -AllMatches | % {$_.Matches} | % {$_.groups[1].value})
|
|
$out = '['
|
|
$i = 1
|
|
for ($adapter_id = 0; $adapter_id -lt $number_of_adapters; $adapter_id++) {
|
|
$out = $out + "{`"{#MEGARAID_ADP}`": `"$adapter_id`"}"
|
|
if ($i -lt $number_of_adapters){
|
|
$out = $out + ','
|
|
}
|
|
$i++
|
|
}
|
|
$out = $out + ']'
|
|
Write-Host $out
|
|
}
|
|
|
|
function disco_bbu() {
|
|
$battery_units = @{}
|
|
$number_of_adapters = [int](& $CLI -adpCount -NoLog | Select-String "Controller Count: (\d+)" -AllMatches | % {$_.Matches} | % {$_.groups[1].value})
|
|
for ($adapter_id = 0; $adapter_id -lt $number_of_adapters; $adapter_id++) {
|
|
$bbu_is_missing = (& $CLI -AdpBbuCmd -GetBbuStatus -a $adapter -NoLog | Select-String ".*Get BBU Status Failed.*" | % {$_.Matches})
|
|
if (!$bbu_is_missing) {
|
|
$battery_units.Add($adapter,"{ `"{#ADAPTER_ID}`":`"$adapter`" }")
|
|
}
|
|
}
|
|
$out = '['
|
|
$i = 1
|
|
foreach ($battery_unit in $battery_units.Keys){
|
|
$out = $out + "$($battery_units.item($battery_unit))"
|
|
if ($i -lt $battery_units.Count){
|
|
$out = $out + ","
|
|
}
|
|
}
|
|
$out = $out + ']'
|
|
Write-Host $out
|
|
}
|
|
|
|
function disco_vdisk() {
|
|
$virtual_drives = @{}
|
|
# check IDs for configured RAID volumes (IDs could be sequential, or not)
|
|
$tmp_file = Join-Path ${env:temp} "raid_vdrives-$(Get-Date -Format yyyy-MM-dd-HH-mm-ss).tmp"
|
|
& $CLI -LDinfo -Lall -a $adapter -NoLog | Out-File $tmp_file
|
|
[regex]$regex_vd_id = "^\s*Virtual\sDrive:\s(\d+)\s.*$"
|
|
$reader = [System.IO.File]::OpenText($tmp_file)
|
|
$vdrive_id = -1;
|
|
try {
|
|
for(;;) {
|
|
$line = $reader.ReadLine()
|
|
if ($line -eq $null) { break }
|
|
if (($regex_vd_id.isMatch($line)) -eq $True) {
|
|
$vdrive_id = $regex_vd_id.Matches($line) | % {$_.groups[1].value}
|
|
$virtual_drives.Add("$adapter-$vdrive_id","{ `"{#VDRIVE_ID}`":`"$vdrive_id`", `"{#ADAPTER_ID}`":`"$adapter`" }")
|
|
} else {
|
|
Continue
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
$reader.Close()
|
|
}
|
|
remove-item $tmp_file
|
|
$out = '['
|
|
$i = 1
|
|
foreach ($virtual_drive in $virtual_drives.Keys) {
|
|
$out = $out + "$($virtual_drives.Item($virtual_drive))"
|
|
if ($i -lt $virtual_drives.Count) {
|
|
$out = $out + ","
|
|
}
|
|
$i++
|
|
}
|
|
$out = $out + ']'
|
|
Write-Host $out
|
|
}
|
|
|
|
function disco_pdisk() {
|
|
$physical_drives = @{}
|
|
# ========
|
|
# List all physical drives
|
|
# ========
|
|
$check_next_line = 0
|
|
[regex]$regex_enc = "^\s*Enclosure\sDevice\sID:\s(\d+)$"
|
|
[regex]$regex_enc_na = "^\s*Enclosure\sDevice\sID:\sN\/A$"
|
|
[regex]$regex_slot = "^\s*Slot\sNumber:\s(\d+)$"
|
|
|
|
$tmp_file = Join-Path ${env:temp} "raid_enclosures-$(Get-Date -Format yyyy-MM-dd-HH-mm-ss).tmp"
|
|
& $CLI -pdlist -a $adapter -NoLog | Out-File $tmp_file
|
|
$reader = [System.IO.File]::OpenText($tmp_file)
|
|
|
|
# Determine Slot Number for each drive on enclosure
|
|
$enclosure_id = -1;
|
|
try {
|
|
for(;;) {
|
|
$line = $reader.ReadLine()
|
|
if ($line -eq $null) { break }
|
|
# Line contains enc id, next line is slot id
|
|
if (($regex_enc.isMatch($line)) -eq $True) {
|
|
$enclosure_id = $regex_enc.Matches($line) | % {$_.groups[1].value}
|
|
$check_next_line = 1
|
|
} elseif (($regex_enc_na.isMatch($line)) -eq $True) {
|
|
# This can happen, if embedded raid controller is in use, there are drives and logical disks, but no enclosures
|
|
$enclosure_id = 2989 # 0xBAD, :( magic hack
|
|
$check_next_line = 1
|
|
} elseif ((($regex_slot.isMatch($line)) -eq $True) -and ($check_next_line -eq 1) -and ($enclosure_id -ne -1)) {
|
|
$drive_id = $regex_slot.Matches($line) | % {$_.groups[1].value}
|
|
$physical_drives.Add("$adapter-$enclosure_id-$drive_id","{ `"{#ENCLOSURE_ID}`":`"$enclosure_id`", `"{#PDRIVE_ID}`":`"$drive_id`", `"{#ADAPTER_ID}`":`"$adapter`" }")
|
|
$check_next_line = 0
|
|
$enclosure_id = -1
|
|
} else {
|
|
Continue
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
$reader.Close()
|
|
}
|
|
remove-item $tmp_file
|
|
|
|
$out = '['
|
|
$i = 1
|
|
foreach ($physical_drive in $physical_drives.Keys) {
|
|
$out = $out + "$($physical_drives.Item($physical_drive))"
|
|
if ($i -lt $physical_drives.Count) {
|
|
$out = $out + ","
|
|
}
|
|
$i++
|
|
}
|
|
$out = $out + ']'
|
|
Write-Host $out
|
|
}
|
|
|
|
switch ($mode) {
|
|
"adapter" { disco_adp }
|
|
"bbu" { disco_bbu }
|
|
"vdisk" { disco_vdisk }
|
|
"pdisk" { disco_pdisk }
|
|
}
|
|
|