2011-02-13 80 views
7

我使用virsh列表显示在计算机上运行的vms的列表。我想以2d数组的形式在过程中打印信息。virsh(libvirt)的替代

解决此问题的一种方法是获取输出,使用标记器并将其存储在数组中。但是有没有其他的方式可以直接将它转换成数组或其他形式,以便代码更具可扩展性。 (我能想到的东西是在python中使用libvirt api)

回答

13

确实有libvirt Python API bindings

import libvirt 

conn = libvirt.openReadOnly(None) # $LIBVIRT_DEFAULT_URI, or give a URI here 
assert conn, 'Failed to open connection' 

names = conn.listDefinedDomains() 
domains = map(conn.lookupByName, names) 

ids = conn.listDomainsID() 
running = map(conn.lookupByID, ids) 

columns = 3 

states = { 
    libvirt.VIR_DOMAIN_NOSTATE: 'no state', 
    libvirt.VIR_DOMAIN_RUNNING: 'running', 
    libvirt.VIR_DOMAIN_BLOCKED: 'blocked on resource', 
    libvirt.VIR_DOMAIN_PAUSED: 'paused by user', 
    libvirt.VIR_DOMAIN_SHUTDOWN: 'being shut down', 
    libvirt.VIR_DOMAIN_SHUTOFF: 'shut off', 
    libvirt.VIR_DOMAIN_CRASHED: 'crashed', 
} 
def info(dom): 
    [state, maxmem, mem, ncpu, cputime] = dom.info() 
    return '%s is %s,' % (dom.name(), states.get(state, state)) 

print 'Defined domains:' 
for row in map(None, *[iter(domains)] * columns): 
    for domain in row: 
     if domain: 
      print info(domain), 
    print 
print 

print 'Running domains:' 
for row in map(None, *[iter(running)] * columns): 
    for domain in row: 
     if domain: 
      print info(domain), 
    print