Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python libvirt:从状态整数到字符串?_Python_Libvirt - Fatal编程技术网

Python libvirt:从状态整数到字符串?

Python libvirt:从状态整数到字符串?,python,libvirt,Python,Libvirt,我有这个简单的脚本来检查libvirt管理的虚拟机的内存使用情况 如何将state的整数从dom.info()转换为人类可读的字符串 import libvirt import re import sys def mem_total_kb(): meminfo = open('/proc/meminfo').read() matched = re.search(r'^MemTotal:\s+(\d+)', meminfo) return int(matched.gr

我有这个简单的脚本来检查libvirt管理的虚拟机的内存使用情况

如何将
state
的整数从
dom.info()
转换为人类可读的字符串

import libvirt
import re

import sys


def mem_total_kb():
    meminfo = open('/proc/meminfo').read()
    matched = re.search(r'^MemTotal:\s+(\d+)', meminfo)
    return int(matched.groups()[0])


def main():
    conn = libvirt.openReadOnly(None)

    if conn == None:
        print 'Failed to open connection to the hypervisor'
        sys.exit(1)
    used_mem_sum = 0
    for domain_id in conn.listDomainsID():
        dom = conn.lookupByID(domain_id)
        state, max_mem, used_mem, vcpus, cpu_time_used = dom.info()
        print(
        'name=%s state=%s max_mem=%s used_mem=%s vcpus=%s cpu_time_used=%s' % (dom.name(), state, max_mem, used_mem, vcpus, cpu_time_used))
        used_mem_sum += used_mem
    print('Sum of used mem: %s KiB' % used_mem_sum)
    mem_total = mem_total_kb()
    print('Sum of physical mem: %s KiB' % mem_total)
    if used_mem_sum > mem_total:
        print('########## VMs use more RAM than available!')
        return
    mem_left=mem_total - used_mem_sum
    print('Memory left: %s KiB' % (mem_left))
    mem_left_should=4000000
    if mem_left<mem_left_should:
        print('less than mem_left_should=%sKiB left!' % mem_left_should)


if __name__ == '__main__':
    main()

此bash脚本将获取
virDomainState
值列表(不包括
VIR\u DOMAIN\u LAST
)及其JSON格式的描述:

#!/bin/bash

HEADER=include/libvirt/libvirt-domain.h

get_header_file()
{
    curl -s https://raw.githubusercontent.com/libvirt/libvirt/master/"$HEADER"
}

select_virDomainState_block()
{
    sed -n '/virDomainState:/,/^\} virDomainState;/ p'
}

join_multiline_comments()
{
    sed -n '\%/\*[^*]*$% N; \%/\*.*\*/$% { s/\s*\n\s*/ /; p; }'
}

enum_values_to_json_map()
{
    echo '{'
    sed "s/\s*VIR_DOMAIN\S\+\s*=\s*//; s^,\s*/\*\s*^ : '^; s^\s*\*/^',^;"
    echo '}'
}

get_header_file                 \
| select_virDomainState_block   \
| join_multiline_comments       \
| grep 'VIR_DOMAIN\S\+\s*='     \
| enum_values_to_json_map
用法示例:

$ ./get_libvirt_domain_states
{
0 : 'no state',
1 : 'the domain is running',
2 : 'the domain is blocked on resource',
3 : 'the domain is paused by user',
4 : 'the domain is being shut down',
5 : 'the domain is shut off',
6 : 'the domain is crashed',
7 : 'the domain is suspended by guest power management',
}

请注意,该脚本从GitHub的libvirt镜像存储库下载一个约150KB的文件。它旨在促进libvirt代码的更新。当然,您可以从python代码中调用它,但就个人而言,我不会这样做。

看起来至少枚举常量名称在
libvirt
模块中公开了。以下是我的作品

import libvirt
import pprint
import re

d = {}
for k, v in libvirt.__dict__.iteritems():
    if re.match('VIR_DOMAIN_[A-Z]+$', k):
        d[v] = k

pprint.pprint(d)
…还有指纹

{0: 'VIR_DOMAIN_NOSTATE',
 1: 'VIR_DOMAIN_RUNNING',
 2: 'VIR_DOMAIN_BLOCKED',
 3: 'VIR_DOMAIN_PAUSED',
 4: 'VIR_DOMAIN_SHUTDOWN',
 5: 'VIR_DOMAIN_SHUTOFF',
 6: 'VIR_DOMAIN_CRASHED',
 7: 'VIR_DOMAIN_PMSUSPENDED'}
这些描述可能只是原始源代码中的注释,可能没有公开。其中一个例子定义了自己的字典


…所以你可以从这里开始,尽管它似乎不完整。

你能举个例子说明你的意思吗,例如,
1->One
?@jcfollower我更新了这个问题。因为它很小,你能自己编一本字典吗
state_descr={0:'无状态',1:'域正在运行',…}
@jcfollower是的,这会起作用。但我想还有更好的解决办法。我说的“更好”是指一个解决方案,在这个解决方案中,我不能打字,名字来自libvirt。嗯,这取决于互联网连接。。。。没有办法通过libvirt从整数到字符串吗?libvirt似乎没有提供这样的功能。至少我找不到它。您必须在代码中维护自己的字典(正如@jcclopper所建议的)。我只是让你更容易保持字典与libvirt代码的同步。从整数到VIR_域名的映射就是我所需要的。非常感谢你。
{0: 'VIR_DOMAIN_NOSTATE',
 1: 'VIR_DOMAIN_RUNNING',
 2: 'VIR_DOMAIN_BLOCKED',
 3: 'VIR_DOMAIN_PAUSED',
 4: 'VIR_DOMAIN_SHUTDOWN',
 5: 'VIR_DOMAIN_SHUTOFF',
 6: 'VIR_DOMAIN_CRASHED',
 7: 'VIR_DOMAIN_PMSUSPENDED'}
state_names = { libvirt.VIR_DOMAIN_RUNNING  : "running",
                libvirt.VIR_DOMAIN_BLOCKED  : "idle",
                libvirt.VIR_DOMAIN_PAUSED   : "paused",
                libvirt.VIR_DOMAIN_SHUTDOWN : "in shutdown",
                libvirt.VIR_DOMAIN_SHUTOFF  : "shut off",
                libvirt.VIR_DOMAIN_CRASHED  : "crashed",
                libvirt.VIR_DOMAIN_NOSTATE  : "no state" }