Отправка писем о состоянии RAID-контроллера Adaptec.
Возникла необходимость настроить оповещение от Adaptec о состоянии старенького raid-контроллера Adaptec 5805, установленного на сервере, не имеющем управляющего модуля(BMC, IMM и т.п.).
Данный функционал, конечно, можно организовать с помощью утилиты Adaptec Storage Manager, но для этого, как минимум, нужен сервер с графическим интерфейсом для установки графической версии этой утилиты. Мне достаточно просто периодически получать оповещения о состоянии рэйда, поэтому было принято решение написать небольшой скрипт на питоне для отправки таких оповещений на электронную почту.
Предварительные требования.
Для мониторинга состояния рэйда, нам понадобится утилита ARCCONF от Adaptec, которая входит в состав Adaptec Storage Manager. Скачать ее можно на сайте Adaptec для нужной операционной системы. Нужна будет и учетная запись электронной почты, от которой мы будем отправлять письма. Ну и, естественно, потребуется установленный на сервере Python. Я разместил скрипт на сервере proxmox, питон там уже есть, так что устанавливать его мне не пришлось.
Скрипт отправки сообщений.
Работа скрипта основана на выводе команды arcconf GETCONFIG 1, которая показывает статус контроллера, батарейки и дисков.
Я буду отправлять оповещение от Adaptec в формате HTML и просто в текстовом формате(если HTML не поддерживается клиентом). В случае если статус контроллера(или еще чего-то) отличается от Optimal, эта строка в сообщении HTML будет выделена красным цветом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#!/usr/bin/python3 import smtplib from subprocess import * from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart output = getoutput("/usr/StorMan/arcconf GETCONFIG 1") host = "my_host" # set current hostname here smtp_server = "your.mail.server" sender_email = "user@your.mail.server" password = "password" receiver_email = "admin@your.mail" flag = 'Normal' html_list = [] for line in output.split('\n'): if 'Status' in line and 'Optimal' not in line: flag = 'Alarm' line = f'<span class="alarm">{line}</span><br>' html_list.append(line) else: line = f'<span class="normal">{line}</span><br>' html_list.append(line) html_output = '\n'.join(html_list) html = f""" <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Adaptec message</title> <style> .normal {{ color: green; }} .alarm {{ color: red; }} </style> </head> <body> {html_output} </body> </html>""" part1 = MIMEText(output, 'plain') part2 = MIMEText(html, 'html') msg = MIMEMultipart("alternative") msg.attach(part1) msg.attach(part2) msg['Subject'] = f'Adaptec {flag} message from {host}' msg['From'] = sender_email msg['To'] = receiver_email s = smtplib.SMTP(smtp_server) s.login(user=sender_email, password=password) s.sendmail(sender_email, receiver_email, msg.as_string()) s.quit() |
В данной версии скрипта имя хоста зашито в скрипте. Если есть желание сделать скрипт более универсальным, можно импортировать модуль socket при помощи команды import socket и присвоить переменной host значение socket.gethostname()
Теперь остается только поместить скрипт на сервер, сделать его исполняемым и добавить в планировщик с нужной частотой отправки писем.
Оповещение от Adaptec. Скрипт Powershell.
Если нужно отправлять оповещения от raid из Windows, используйте следующий скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
$hostname = $env:COMPUTERNAME $cmdoutput = (arcconf.exe GETCONFIG 1).Split([System.Environment]::NewLine) $flag = 'Normal' $html = @" <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Adaptec message</title> <style> .normal { color: green; } .alarm { color: red; } </style> </head> <body> "@ foreach ($line in $cmdoutput){ if ((($line -split " : ")[0].Contains('Status')) -and ((($line -split " : ")[1] -ne $null) -and ($line -split " : ")[1] -notin $excludearray)) { $line = "<span class=`"alarm`">$line</span><br>" $flag = 'Alarm' } else { $line = "<span class=`"normal`">$line</span><br>" } $html += $line} $html += " </body> </html> " $mypasswd = ConvertTo-SecureString "yourPassword" -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential ("user@mail.domain", $mypasswd) $MailMessage = @{ To = "mail@mail.domain" #receiver email #Bcc = "copy@mail.domain", "copy@mail.domain" # set additional receivers From = "User <user@mail.domain>" #sender email Subject = "Adaptec message from $hostname $flag" Body = $html Smtpserver = "mail.server" Port = 25 UseSsl = $false BodyAsHtml = $true Encoding = "UTF8" } Send-MailMessage @MailMessage -Credential $cred |
Создание задания в планировщике.
Несколько слов о запуске скрипта в планировщике задач Windows.
Создайте задачу на запуск скрипта с нужной периодичностью. Задание должно выполняться с максимальными правами и на сервере должен быть разрешен запуск скриптов. На вкладке «Действия» в планировщике в качестве программы укажите powershell.exe. В окне аргументы укажите -File «C:\path\to\script»
Задание с такими параметрами нормально отработало в Windows Server 2016, но не работало в Windows Server 2008. Мне удалось запустить задание с аргументами -noexit -Command «C:\path\to\script».
Вот так мне удалось настроить оповещение от Adaptec о состоянии рэйд-контроллера и отправку этого оповещения на email.