--On Donnerstag, Februar 17, 2011 11:21:12 +0100 Denny Schierz
<[email protected]> wrote:
hi,
Kurze Frage vorweg: hat vmware keine Python api?
[...]
./vmx -g cluster1
Als Ausgabe soll ein schlichtes: off/on erscheinen.
Ruft man das vmware-cmd Tool auf, sieht das so aus:
vmware-cmd
/vmfs/volumes/4c52874b-65503560-05f0-0021288ea4ad/cluster_1/cluster_1.vmx
getstate
Ausgabe:
getstate() = off
splitte stdout nicht an den Zeileinenden und suche in der kompletten
Zeichenkette:
if output.find('getstate() = off') >= 0:
print 'off'
exit()
elif output.find('getstate() = on') >= 0:
print 'on'
exit()
else:
# Irgendwas anderes
print output
string.find(<sub>) hat eine blöde api. Es gibt die Position des ersten
Treffer für <sub> im string zurückgibt.
Das kann also 0..n sein. Wenn er nicht gefunden wird bekommt man -1. Das
läßt sich aber nicht auf True/False testen, denn
bool(0) ist False (der Substring wurde am Anfang der Zeichenkette gefunden,
bool(1) ist True und bool(-1) ist auch True.
Also musst Du mit ">= 0" (gefunden) oder "< 0" (nicht gefunden) testen.
Die den Pfad der Virtuellen Maschine hast Du ja in einer Liste. Wenn Du
vm-namen benutzen willst
sortiere die VMs in eine andere Datenstrukture ein, z.B. ein dict:
machines_by_name = {}
for vm in <liste der vms>:
vm_name = vm.split('/')[-2] # letzter verzeichnisname
# oder
from os.path import splitext
vm_name = splitext(vm)[0]
# splitext gibt ein (dateiname, erweiterung) tuple zurück
machines[vm_name] = vm
dann kannst statt mit nummern mit namen arbeiten.
vm = machines_by_name['cluster_1']
[...]
if regvm == None and getstate == None and setstate == None:
print("Keine Paramter angegeben, siehe --help")
if regvm == None and (getstate == None and setstate == None) or
(getstate != None and setstate != None):
Die untere Bedingung ist im vorderen Teil Identisch mit der oberen.
if "<var> == None" kannst Du durch "if <var>" ersetzen, weil None hier zu
"False" evaluiert wird und damit wird das ein Vergleiche auf True oder
False. Wenn Du explizit auf None testen musst, weil Deine Variable z.B.
False, 0, '' (leerer string) oder ein leeres objekt sein kann, nimm "is":
if <var> is None: # Testet, ob es sich um identische Objekte handelt.
Denn:
False == None
True
0 == None
True
False is None
False
Also z.B.
if not (regvm or getstate or setstate):
...
Ich hab dir den unteren Teil Deines Skriptes mal geordnet, wie man es
häufig findet.
..Carsten
def get_opts():
'''Kommandozeilenargumente sammeln'''
parser = OptionParser()
parser.add_option("-r", "--registerd-vm",
action="store",
type="string",
dest="regvm",
help="Get list of registerd VM, use 'all' to get all
VMs")
parser.add_option("-s", "--set-state",
action="store",
type="string",
dest="setstate",
#choices=['off', 'on', 'reset'],
help="Set powerstate from VM")
# willst Du das nicht mit type="int" speichern?
parser.add_option("-g", "--get-state",
action="store",
type="string",
dest="getstate",
help="Get powerstate from VM")
(options, args) = parser.parse_args()
# Werte zuweisen
regvm = options.regvm
print("regvm", regvm)
setstate = options.setstate
print("setstate", setstate)
getstate = options.getstate
print("getstate", getstate)
if regvm and regvm != 'all':
try:
regvm = int(regvm)
except ValueError:
parser.error('regvm kann nur "all" oder eine Zahl sein')
if not (regvm or getstate or setstate):
# will exit with errorcode 2 and prints usage message
parser.error("Keine Paramter angegeben")
if getstate and setstate:
parser.error("-g und -s schliessen sich aus")
return (regvm, getstate, setstate)
def main():
(regvm, getstate, setstate) = get_opts()
if regvm:
reg_vm(reg_vm)
elif getstate:
get_state(getstate)
if __name__ == '__main__':
main()
--
----------------------------------------------------------------------------
PUG - Penguin User Group Wiesbaden - http://www.pug.org