seveas / python-hpilo

Accessing the HP iLO XML interface from python
https://seveas.github.io/python-hpilo
Other
320 stars 101 forks source link

get_server_name() throwing xml.etree.ElementTree.ParseError #183

Closed transce closed 6 years ago

transce commented 6 years ago

Removed ip address, username, and password for privacy concerns.

import hpilo ilo = hpilo.Ilo("{ip_address}", login='{username}', password="{password}") ilo.get_fw_version() {'firmware_date': 'Aug 16 2017', 'firmware_version': '2.55', 'license_type': 'iLO Advanced', 'management_processor': 'iLO4'} ilo.get_server_name() Traceback (most recent call last): File "", line 1, in File "/home/apotts2/razors_edge/lib/python3.5/site-packages/hpilo.py", line 1243, in get_server_name return self._info_tag('SERVER_INFO', 'GET_SERVER_NAME', 'SERVER_NAME', process=lambda name: name['value']) File "/home/apotts2/razors_edge/lib/python3.5/site-packages/hpilo.py", line 698, in _info_tag header, message = self._request(root) File "/home/apotts2/razors_edge/lib/python3.5/site-packages/hpilo.py", line 253, in _request message = self._parse_message(data[:pos]) File "/home/apotts2/razors_edge/lib/python3.5/site-packages/hpilo.py", line 556, in _parse_message message = etree.fromstring(data) File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 1333, in XML parser.feed(text) File "", line None xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 8, column 48

seveas commented 6 years ago

That smells like an iLO bug. Could you set ilo.debug=2 before calling get_server_name() and share the debug output (after sanitizing out the sensitive info)?

transce commented 6 years ago
ilo.get_server_name()
Connecting to {ip_address} port 443
Connecting to {ip_address} port 443
Sending XML request, 257 bytes
POST /ribcl HTTP/1.1
Host: localhost
Content-Length: 176
Connection: Close
<?xml version="1.0"?>
<RIBCL VERSION="2.0"><LOGIN PASSWORD="********" USER_LOGIN="{username}"><SERVER_INFO MODE="read"><GET_SERVER_NAME /></SERVER_INFO></LOGIN></RIBCL>
Received 1268 bytes
HTTP/1.1 200 OK
Content-Type: text/xml
Transfer-Encoding: chunked
Cache-Control: no-cache
Connection: close
Date: Tue, 24 Apr 2018 15:01:03 GMT
X-Frame-Options: sameorigin
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
     <SERVER_NAME VALUE="{server_name}"/>
     <SERVER_OSNAME VALUE="Oracle Linux Server" "/>
     <SERVER_OSVERSION VALUE="6.9" "/>
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
<?xml version="1.0"?>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
</RIBCL>
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/apotts2/razors_edge/lib/python3.5/site-packages/hpilo.py", line 1243, in get_server_name
    return self._info_tag('SERVER_INFO', 'GET_SERVER_NAME', 'SERVER_NAME', process=lambda name: name['value'])
  File "/home/apotts2/razors_edge/lib/python3.5/site-packages/hpilo.py", line 698, in _info_tag
    header, message = self._request(root)
  File "/home/apotts2/razors_edge/lib/python3.5/site-packages/hpilo.py", line 253, in _request
    message = self._parse_message(data[:pos])
  File "/home/apotts2/razors_edge/lib/python3.5/site-packages/hpilo.py", line 556, in _parse_message
    message = etree.fromstring(data)
  File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 1333, in XML
    parser.feed(text)
  File "<string>", line None
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 8, column 48
seveas commented 6 years ago

That looks like you've stripped too much from the output. Between X-Frame-Options and the traceback, there should be the actual XML data.

transce commented 6 years ago

Weird. It showed all on the write pane, but not on the preview. Attached as a file.

get_servername_ilo.txt

seveas commented 6 years ago

Edited your comment to make sure all the data shows up, and we have an iLO bug indeed.

     <SERVER_OSNAME VALUE="Oracle Linux Server" "/>
     <SERVER_OSVERSION VALUE="6.9" "/>

That is not valid XML. This isn't the first time that iLO has bugs like this :frowning_face:

seveas commented 6 years ago

Could you please report this bug to HP? I'll add a workaround in python-hpilo, but this should be fixed in the firmware.

transce commented 6 years ago

We have a couple of HPE guys on site. I'll see if they know how to submit one for firmware fix. Thanks for looking.

seveas commented 6 years ago

I've added a workaround in 3c8e3db, but since my iLO's don't exhibit this behaviour, I can't actually test this workaround. Could you give it a spin?

transce commented 6 years ago

Here is the end output. Everything above the traceback looks the same: Traceback (most recent call last): File "/home/apotts2/hpilo_check/lib/python3.5/site-packages/hpilo.py", line 569, in _parse_message message = etree.fromstring(data) File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 1333, in XML parser.feed(text) xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 8, column 48

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/home/apotts2/PycharmProjects/check_hpilo/check_hpilo.py", line 8, in ilo.get_server_name() File "/home/apotts2/hpilo_check/lib/python3.5/site-packages/hpilo.py", line 1309, in get_server_name return self._info_tag('SERVER_INFO', 'GET_SERVER_NAME', 'SERVER_NAME', process=lambda name: name['value']) File "/home/apotts2/hpilo_check/lib/python3.5/site-packages/hpilo.py", line 713, in _info_tag header, message = self._request(root) File "/home/apotts2/hpilo_check/lib/python3.5/site-packages/hpilo.py", line 253, in _request message = self._parse_message(data[:pos]) File "/home/apotts2/hpilo_check/lib/python3.5/site-packages/hpilo.py", line 571, in _parse_message message = etree.fromstring(self._attempt_to_fix_broken_xml(data)) File "/usr/lib/python3.5/xml/etree/ElementTree.py", line 1333, in XML parser.feed(text) TypeError: a bytes-like object is required, not 'NoneType

seveas commented 6 years ago

That's why I hate not being able to test before committing, this was a dumb bug on my side. Try 451943c please :grin:

transce commented 6 years ago

I thought all good developers test in production. Hehehe. No errors this time, but there was not output from get_server_name(). Is that what you are expecting?

seveas commented 6 years ago

Production is the best place for testing :smile:

But I would expect something to be returned from get_server_name. Are you sure you're printing the return value?

transce commented 6 years ago

Ugh. My fault. That's what I get for doing three projects at the same time. I'm getting the servername now. Looks good.

seveas commented 6 years ago

Awesome! Thanks for reporting bugs