""" openstack中 虚拟机nova_db.instances.id 需转换为16进制 后补8位 http://wiki.qemu.org/Features/QAPI/GuestAgent """ import os import sys import json import base64 import crypt import string import random import re if len(sys.argv)<3: print('Pls input argument instance password.') sys.exit(1) instance=sys.argv[1] pwd_=sys.argv[2] FILE_OPEN_READ="""{"execute":"guest-file-open", "arguments":{"path":"%s","mode":"r"}}""" FILE_OPEN_WRITE="""{"execute":"guest-file-open", "arguments":{"path":"%s","mode":"w+"}}""" FILE_READ="""{"execute":"guest-file-read", "arguments":{"handle":%s,"count":%d}}""" FILE_WRITE="""{"execute":"guest-file-write", "arguments":{"handle":%s,"buf-b64":"%s"}}""" FILE_CLOSE="""{"execute":"guest-file-close", "arguments":{"handle":%s}}""" def EXE(param): cmd="""virsh qemu-agent-command %s '%s' """ % (instance,param) #print "Exe command:%s" % cmd stream=os.popen(cmd).read() return None if not stream else json.loads(stream) def guestFileRead(path): file_handle=-1 try: file_handle=EXE(FILE_OPEN_READ % path)["return"] file_content=EXE(FILE_READ % (file_handle,1024000))["return"]["buf-b64"] except Exception,ex: print Exception,":",ex return None finally: EXE(FILE_CLOSE % file_handle) return file_content def guestFileWrite(path,content): file_handle=-1 try: file_handle=EXE(FILE_OPEN_WRITE % path)["return"] write_count=EXE(FILE_WRITE % (file_handle,content))["return"]["count"] except Exception,ex: print Exception,":",ex return -1 finally: EXE(FILE_CLOSE % file_handle) return write_count def genPwd(pwd): salt=''.join(random.choice(string.ascii_letters + string.digits) for _ in range(8)) return crypt.crypt(pwd, "$6$%s" % salt) def resetPwd(path,pwd): content=base64.standard_b64decode(guestFileRead(path)) #print "Read file content:%s" % content user_array=re.split("\n",content) for i,line in enumerate(user_array): info=line.split(":") if info[0]=="root": info[1]=genPwd(pwd) user_array[i]=":".join(info) #print "After change,user info:%s" % user_array[i] break content=base64.standard_b64encode("\n".join(user_array)) write_count=guestFileWrite(path,content) print write_count>0 resetPwd("/etc/shadow",pwd_)
转换qga执行的instanceid ---> "instance-%s" % hex(instid)[2:].zfill(8)