CQL filter Python subprocess.check_output-ba ágyazva

0 votes
asked Apr 12, 2014 in IRF tantárgy by oszbence (23 points)  

A házi feladatomban Linux-ról kell elérnem ESXi szervert és onnan wsman protokoll segítségével adatokat lekérdeznem.

Ehhez az alábbi parancsot használom:
wsman -h 10.6.17.142 -u cimtar -p jelszo --auth basic --port 8889 enumerate 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_PCIDevice' --dialect="http://schemas.dmtf.org/wbem/cql/1/dsp0202.pdf" --filter="SELECT DeviceID, ElementName, BusNumber, VendorID FROM VMware_PCIBridge"

Ez a parancs önállóan lefuttatva jól működik. A problémám az, hogy Python-ban a subprocess.check_output-ba ágyazva nem működik az alábbi módon:

CQLString="SELECT DeviceID, ElementName, BusNumber, VendorID FROM VMware_PCIBridge"

PCIDevicesData = subprocess.check_output(["wsman",
                "-h", actualMachine["machineName"], 
                "-u", actualMachine["user"], 
                "-p", actualMachine["password"],
                "--auth", "basic", 
                "--port", actualMachine["port"], 
                "enumerate", "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_PCIDevice", 
                '--dialect="http://schemas.dmtf.org/wbem/cql/1/dsp0202.pdf"', 
                '--filter',
                CQLString
                ],
                universal_newlines=True
                )

A hibaüzenet:

Connection failed. response code = 400
Traceback (most recent call last):
  File "./getPCIDevices.py", line 54, in <module>
    universal_newlines=True
  File "/usr/lib/python3.3/subprocess.py", line 586, in check_output
    raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command '['wsman', '-h', '10.6.17.101', '-u', 'cimtar', '-p', 'jelszo', '--auth', 'basic', '--port', '8889', 'enumerate', 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_PCIDevice', '--dialect="http://schemas.dmtf.org/wbem/cql/1/dsp0202.pdf"', '--filter', 'SELECT DeviceID, ElementName, BusNumber, VendorID FROM VMware_PCIBridge']' returned non-zero exit status 1

Ha a CQL szűrést kiveszem a parancsból, akkor visszakapom az eszközök összes attribútumát, ami nagyrészt a feladat szempontjából felesleges adatokat tartalmaz.

Hogyan lehetne ezt megoldani?

1 Answer

0 votes
answered Apr 12, 2014 by marci32 (80 points)  

Ha jól látom, többek között az egyenlőségjel is hiányzik ehhez képest:
--filter="SELECT DeviceID, ElementName, BusNumber, VendorID FROM VMware_PCIBridge"

Egyébként én arra tippelnék, hogy ugyanúgy szóközök mentén kell széttördelned a CQL-t is, mint a többi argumentumot. (Erre jó a string.split() is...)

commented Apr 12, 2014 by oszbence (23 points)  
Kösz, de próbáltam mindkettőt már, nem működik úgy se sajnos.
commented Apr 12, 2014 by marci32 (80 points)  
Közben rájöttem, hogy a string.split() valószínűleg nem jó, inkább shlex.split(). Az IP helyén szándékos a 10.6?
commented Apr 12, 2014 by oszbence (23 points)  
A 10.6 az elírás a másolásból.
Közben sikerült megoldani: a dialect=http.. -nál a " zavart be valahogy.
Kösz a segítséget!
...