WS-Management Python érthetelen hiba

0 votes
asked Apr 18, 2016 in IRF tantárgy by fjblp6 (28 points)  

Elkészítettem a házi feladatot, működik szépen. A gond, hogy bár már ezt is megírtam az asszociációkat nem tudom lekérdezni vele. Ez még sok mindent jelenthetne, DE:
- minden más parancs működik, a pythonból hívva
- ez a parancs hibát ad, ezért kiíratom a pythonnal
- egyszerűen visszamásolom a consolba és így indítva működik és azt teszi amit várok tőle

Hogyan lehetséges hogy ugyan az a parancs, a subprocess-en keresztűl nem működik (nem a hívás a rossz, hanem olyan mintha pl a namespacet írtam volna el) De onnan a konzolba visszamásolva már jól működik? Bármilyen ötletre nyitott vagyok.

Tudom hogy már nincs rá sok esély hogy a beadásig kiderüljön de azért nagyon kiváncsi vagyok. Illetve arra is, hogy a javítók, ilyenkor belenéznek-e a kódba is, hogy kiderüljön, hogy egyébként jó házi feladatról van szó.

[102725@vm-small-2 test]$ python3 ../src/get_partition_performance.py -o . -s mytest -u mb
10.6.16.154 identified successfully as Openwsman Project 2.4
CIM ERROR:
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsman="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">
  <s:Header>
    <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
    <wsa:Action>http://schemas.xmlsoap.org/ws/2004/08/addressing/fault</wsa:Action>
    <wsa:RelatesTo>uuid:614b0345-30c5-10c5-8002-022423565000</wsa:RelatesTo>
    <wsa:MessageID>uuid:6169a559-30c5-10c5-8026-6a2423565000</wsa:MessageID>
  </s:Header>
  <s:Body>
    <s:Fault>
      <s:Code>
        <s:Value>s:Sender</s:Value>
        <s:Subcode>
          <s:Value>wsa:DestinationUnreachable</s:Value>
        </s:Subcode>
      </s:Code>
      <s:Reason>
        <s:Text xml:lang="en">No route can be determined to reach the destination role defined by the WS-Addressing To.</s:Text>
      </s:Reason>
      <s:Detail>
        <wsman:FaultDetail>http://schemas.dmtf.org/wbem/wsman/1/wsman/faultDetail/InvalidResourceURI</wsman:FaultDetail>
      </s:Detail>
    </s:Fault>
  </s:Body>
</s:Envelope>
Connection failed. response code = 400

command was: wsman --hostname 10.6.16.154 -u 102725 -p XXXXXX --auth basic associators 'http://schemas.dmtf.org/wbem/wscim/1/*' --filter 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/LMI_DiskPartition?CreationClassName="LMI_DiskPartition",DeviceID="/dev/disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0-part1",SystemCreationClassName="PG_ComputerSystem",SystemName="localhost",AssociationClassName="LMI_StorageElementStatisticalData"'
[102725@vm-small-2 test]$ wsman --hostname 10.6.16.154 -u 102725 -p XXXXXX --auth basic associators 'http://schemas.dmtf.org/wbem/wscim/1/*' --filter 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/LMI_DiskPartition?CreationClassName="LMI_DiskPartition",DeviceID="/dev/disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0-part1",SystemCreationClassName="PG_ComputerSystem",SystemName="localhost",AssociationClassName="LMI_StorageElementStatisticalData"'
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsen="http://schemas.xmlsoap.org/ws/2004/09/enumeration">
  <s:Header>
    <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
    <wsa:Action>http://schemas.xmlsoap.org/ws/2004/09/enumeration/EnumerateResponse</wsa:Action>
    <wsa:RelatesTo>uuid:70a3db58-30c5-10c5-8002-022423565000</wsa:RelatesTo>
    <wsa:MessageID>uuid:70c310b5-30c5-10c5-8028-6a2423565000</wsa:MessageID>
  </s:Header>
  <s:Body>
    <wsen:EnumerateResponse>
      <wsen:EnumerationContext>70b329b3-30c5-10c5-8027-6a2423565000</wsen:EnumerationContext>
    </wsen:EnumerateResponse>
  </s:Body>
</s:Envelope>
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsen="http://schemas.xmlsoap.org/ws/2004/09/enumeration" xmlns:n1="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/LMI_BlockStorageStatisticalData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <s:Header>
    <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
    <wsa:Action>http://schemas.xmlsoap.org/ws/2004/09/enumeration/PullResponse</wsa:Action>
    <wsa:RelatesTo>uuid:70c326e4-30c5-10c5-8003-022423565000</wsa:RelatesTo>
    <wsa:MessageID>uuid:70d2e2db-30c5-10c5-8029-6a2423565000</wsa:MessageID>
  </s:Header>
  <s:Body>
    [...]
  </s:Body>
</s:Envelope>
commented Apr 19, 2016 by vilmos.nagy (28 points)  
mostmár mindegy, tudom, de pythonból hogy hívod a wsmant?
commented Apr 19, 2016 by fjblp6 (28 points)  
Én nem mondanám hogy mindegy, nagyon kiváncsi lennék a megoldásra :)
A releváns részt bemásoltam ide. Az exceptionok saját osztályok, de csak leszármaznak az Exception osztályból, hogy meg lehessen különböztetni őket. A parse_error az xml formátumban vissza adott hibából nyerné ki az üzenetet, de végül ez nem lett teljesen megvalósítva gyakorlatilag csak visszaadja amit kap. Ezek nem is lényegesek annyira
Ami fontos, hogy a **subprocess.check_output** -tal hívom a parancsot, és exception esetén ki is íratom a végrehajtott parancsot (command was: *parancs*). Na és ezt a consolba akár kézzel másolva, akár a puttyban jobb egérgobbal klónozva, majd lefuttatva simán működik ahogy kell.

    try:
            result = subprocess.check_output(command.split(" "),
                    universal_newlines=True, stderr=subprocess.STDOUT)
            return parse_output(result)
        except subprocess.CalledProcessError as ex:
            if not ex.output.strip():
                raise ConnectionError()
            else:
                error = ex.output
                if ex.output[0:5] == "<?xml":
                    error = parse_error(ex.output)
                raise CIMError(error + "\ncommand was: " + " ".join(ex.cmd))
commented Apr 19, 2016 by vilmos.nagy (28 points)  
A wsman visszatérési értéke micsoda? Nekem nem nulla esetén logolta az stderr-re a Python, de ez lehet, csak a PyCharm feature.

Ha a szerveren az openwsmand-ot debugban indítod, ír bármik a logba?

Esetleg még azt nézném meg, hogy egy wiresharkban látszik-e bármi (egyáltalán localban, nálad van a hiba, és nem sikerül a wsmant úgy indítani, ahogy képzeled. vagy a szerver ad más választ)

Ez meg nagyon trivi lesz, de véletlen nincs valahol két space a command-ban egymás után? A `command.split(" ")` biztosan jó tömböt ad vissza (üres elemek benne, etc.)

1 Answer

+1 vote
answered Apr 22, 2016 by kovari (2,221 points)  
selected Apr 23, 2016 by fjblp6
 
Best answer

Ez kicsit trükkös volt. Mivel azt írtad, hogy kíváncsi vagy rá, így leírom.

A subprocess híváskor keletkező exception (subprocess.CalledProcessError) által visszaadott futtatott cmd valóban helyes, terminálba bemásolva visszakapjuk a releváns adatokat. Azonban a subprocess hívásnak nem teljesen ezt adjuk át. Ha a hívás előtt kiíratjuk a cmd tömb tartalmát:

['wsman', '--hostname', 'localhost', '-u', 'meres', '-p', 'LaborImage', 
'--auth', 'basic', 'associators', "'http://schemas.dmtf.org/wbem/wscim/1/*'", '--filter',
 '\'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/LMI_DiskPartition?CreationClassName="LMI_DiskPartition",DeviceID="/dev/disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0-part1",SystemCreationClassName="PG_ComputerSystem",SystemName="localhost",AssociationClassName="LMI_StorageElementStatisticalData"\'']

akkor látható, hogy az utolsó elem elé és után bekerült 1-1 fölösleges backslash. A kódban itt a bűnös rész:

command = "associators 'http://schemas.dmtf.org/wbem/wscim/1/*' --filter '"
command += "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/"

A második http://schemas... részhez tartozó aposztróf még az első sorba került, a filter végére, és aztán így az stringek összefűzése során valahogy bekerült egy backslash. A másik backslash probléma hasonló módon javítható. Így a cmd tömb már az alábbi módon néz ki:

['wsman', '--hostname', 'localhost', '-u', 'meres', '-p', 'LaborImage', 
'--auth', 'basic', 'associators', "'http://schemas.dmtf.org/wbem/wscim/1/*'", '--filter',
'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/LMI_DiskPartition?CreationClassName="LMI_DiskPartition",DeviceID="/dev/disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0-part1",SystemCreationClassName="PG_ComputerSystem",SystemName="localhost",AssociationClassName="LMI_StorageElementStatisticalData"']

A lekérdezés azonban még mindig nem megy. Ami szembetűnő, hogy a "'http://schemas.dmtf.org/wbem/wscim/1/*'" résznél fölöslegesen található 1 pár idézőjel. Ezt kitörölve már valóban lefut a lekérdezés, és a json kimenet is helyesen létrejön.

commented Apr 23, 2016 by fjblp6 (28 points)  
Nagyon szépen köszönöm. Tényleg nem hagyott nyugodni :)
Egyébként azt én is sejtettem, hogy valami módon nem ugyan az a parancs fut ami kiíródik. Csak az zavart meg, hogy nem hittem hogy az exceptionben visszaadott parancs eltérhet a kiadott-tól.
(Az extra whitespaceről szóló választ is olvastam - csak nem kommenteltem -, és ki is próbáltam illetve ellenőriztem, de az nem segített, pedig akkor is felcsillant remény.)
commented Apr 23, 2016 by vilmos.nagy (28 points)  
pedig a darabolt tömbben ott volt a turpisság (visszaper), ha jól látom :-)
...