Я пытаюсь написать собственный плагин Nagios для мониторинга HP MSA2312fc через HTTP XML API. Я могу успешно войти в систему через / api / login / {login_hash}, но всегда получаю сообщение об ошибке «Запрошен несанкционированный доступ» при попытке получить некоторые данные (то есть через / api / show / system). Я пробовал команды на разных MSA, но это всегда одна и та же ошибка.
# Successful login
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RESPONSE>
<OBJECT basetype="status" name="status" oid="1">
<PROPERTY name="response-type">success</PROPERTY>
<PROPERTY name="response-type-numeric">0</PROPERTY>
<PROPERTY name="response">deb9b907d11459757af645bd859e01aa</PROPERTY>
<PROPERTY name="return-code">1</PROPERTY>
</OBJECT>
</RESPONSE>
# Error
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RESPONSE>
<OBJECT basetype="status" name="status" oid="1">
<PROPERTY name="response-type">error</PROPERTY>
<PROPERTY name="response-type-numeric">1</PROPERTY>
<PROPERTY name="response">Unauthorized access requested</PROPERTY>
<PROPERTY name="return-code">6</PROPERTY>
</OBJECT>
</RESPONSE>
Я уже могу успешно контролировать HP MSA P2000 G3 через API XMl без каких-либо проблем.
Я использую Python 2 для плагина. Прилагается соответствующий код для входа в систему и чтения данных из MSA P2000 G3:
import hashlib
import urllib2
from xml.etree import ElementTree
# Log into MSA
def msa_login(hostname, username, password):
def create_login_hash(username, password):
login_string = "{0}_{1}".format(username, password)
return hashlib.md5(login_string).hexdigest()
login_hash = create_login_hash(username, password)
url_login = "http://{0}/api/login/{1}".format(hostname, login_hash)
req_login = urllib2.Request(url_login)
response_login = urllib2.urlopen(req_login)
#print(response_login.read())
login = ElementTree.parse(response_login).getroot()
# Get sessionid
for property in login.findall('./OBJECT/PROPERTY'):
if property.attrib['name'] == 'response-type' and property.text != 'success':
print("CRITICAL - Couldn't login to MSA")
exit(NAGIOS_CRITICAL)
if property.attrib['name'] == 'response':
return property.text
# Read system data
def parse_system(hostname, sessionid):
url_system = "http://{0}/api/show/system".format(hostname)
req_system = urllib2.Request(url_system)
req_system.add_header('sessionKey', sessionid)
response_system = urllib2.urlopen(req_system)
system = ElementTree.parse(response_system).getroot()
[...] # parsing data
Может кто-нибудь подскажет, почему я всегда получаю несанкционированное сообщение? Или есть рабочий фрагмент кода? Я знаю, что в Telnet есть режим XML API, но я бы предпочел не использовать его по разным причинам.
Вам нужно отправить Cookie в заголовке:
Key Value
Cookie wbisessionkey=ee7426964a6d14788ba86f77764733bf; wbiusername=monitoruser
что-то вроде этого (код не тестировался):
cookie = "wbiusername={0}; wbisessionkey={1}".format(username,sessionid);
req_system.add_header('Cookie', cookie);