[libvirt] [test-API PATCH 1/5] test-API: Destroy the class for utils.py

Guannan Ren gren at redhat.com
Thu Apr 12 03:48:31 UTC 2012


On 04/10/2012 03:34 PM, Osier Yang wrote:
> IMHO there is not any benifit to use class in a utils script,
> except you have to construct the object again and again in
> scripts. :-)
>
> Incidental cleanups:
>    * s/parser_uri/parse_uri/
>    * s/#this/# This/
>    * Useless comments on the top are removed.
> ---
>   utils/utils.py |  769 ++++++++++++++++++++++++++++----------------------------
>   1 files changed, 382 insertions(+), 387 deletions(-)
>
> diff --git a/utils/utils.py b/utils/utils.py
> index 7d054df..3848aca 100644
> --- a/utils/utils.py
> +++ b/utils/utils.py
> @@ -13,9 +13,6 @@
>   # The GPL text is available in the file COPYING that accompanies this
>   # distribution and at<http://www.gnu.org/licenses>.
>   #
> -# Filename: utils.py
> -# Summary: basic operation on host
> -# Description: The module is a tool to provide basic operation on host
>
>   import os
>   import re
> @@ -32,402 +29,400 @@ import subprocess
>   from xml.dom import minidom
>   from urlparse import urlparse
>
> -class Utils(object):
> -    """Basic operation on host"""
> -    def get_hypervisor(self):
> -        if commands.getoutput("lsmod | grep kvm"):
> -            return 'kvm'
> -        elif os.access("/proc/xen", os.R_OK):
> -            return 'xen'
> -        else:
> -            return 'no any hypervisor is running.'
> -
> -    def get_uri(self, ip):
> -        """Get hypervisor uri"""
> -        hypervisor = self.get_hypervisor()
> -        if ip == "127.0.0.1":
> -            if hypervisor == "xen":
> -                uri = "xen:///"
> -            if hypervisor == "kvm":
> -                uri = "qemu:///system"
> -        else:
> -            if hypervisor == "xen":
> -                uri = "xen+ssh://%s" % ip
> -            if hypervisor == "kvm":
> -                uri = "qemu+ssh://%s/system" % ip
> -        return uri
> -
> -    def parser_uri(self, uri):
> -        #this is a simple parser for uri
> -        return urlparse(uri)
> -
> -    def get_host_arch(self):
> -        ret = commands.getoutput('uname -a')
> -        arch = ret.split(" ")[-2]
> -        return arch
> -
> -    def get_local_hostname(self):
> -        """ get local host name """
> -        return socket.gethostname()
> -
> -    def get_libvirt_version(self, ver = ''):
> -        ver = commands.getoutput("rpm -q libvirt|head -1")
> -        if ver.split('-')[0] == 'libvirt':
> -            return ver
> +def get_hypervisor():
> +    if commands.getoutput("lsmod | grep kvm"):
> +        return 'kvm'
> +    elif os.access("/proc/xen", os.R_OK):
> +        return 'xen'
> +    else:
> +        return 'no any hypervisor is running.'
> +
> +def get_uri(ip):
> +    """Get hypervisor uri"""
> +    hypervisor = get_hypervisor()
> +    if ip == "127.0.0.1":
> +        if hypervisor == "xen":
> +            uri = "xen:///"
> +        if hypervisor == "kvm":
> +            uri = "qemu:///system"
> +    else:
> +        if hypervisor == "xen":
> +            uri = "xen+ssh://%s" % ip
> +        if hypervisor == "kvm":
> +            uri = "qemu+ssh://%s/system" % ip
> +    return uri
> +
> +def parse_uri(uri):
> +    # This is a simple parser for uri
> +    return urlparse(uri)
> +
> +def get_host_arch():
> +    ret = commands.getoutput('uname -a')
> +    arch = ret.split(" ")[-2]
> +    return arch
> +
> +def get_local_hostname():
> +    """ get local host name """
> +    return socket.gethostname()
> +
> +def get_libvirt_version(ver = ''):
> +    ver = commands.getoutput("rpm -q libvirt|head -1")
> +    if ver.split('-')[0] == 'libvirt':
> +        return ver
> +    else:
> +        print "Missing libvirt package!"
> +        sys.exit(1)
> +
> +def get_hypervisor_version(ver = ''):
> +    hypervisor = get_hypervisor()
> +
> +    if 'kvm' in hypervisor:
> +        kernel_ver = get_host_kernel_version()
> +        if 'el5' in kernel_ver:
> +            ver = commands.getoutput("rpm -q kvm")
> +        elif 'el6' in kernel_ver:
> +            ver = commands.getoutput("rpm -q qemu-kvm")
>           else:
> -            print "Missing libvirt package!"
> +            print "Unsupported kernel type!"
>               sys.exit(1)
> -
> -    def get_hypervisor_version(self, ver = ''):
> -        hypervisor = self.get_hypervisor()
> -
> -        if 'kvm' in hypervisor:
> -            kernel_ver = self.get_host_kernel_version()
> -            if 'el5' in kernel_ver:
> -                ver = commands.getoutput("rpm -q kvm")
> -            elif 'el6' in kernel_ver:
> -                ver = commands.getoutput("rpm -q qemu-kvm")
> -            else:
> -                print "Unsupported kernel type!"
> -                sys.exit(1)
> -        elif 'xen' in hypervisor:
> -            ver = commands.getoutput("rpm -q xen")
> +    elif 'xen' in hypervisor:
> +        ver = commands.getoutput("rpm -q xen")
> +    else:
> +        print "Unsupported hypervisor type!"
> +        sys.exit(1)
> +
> +    return ver
> +
> +def get_host_kernel_version():
> +    kernel_ver = commands.getoutput('uname -r')
> +    return kernel_ver
> +
> +def get_ip_address(ifname):
> +    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
> +    return socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915, # SIOCGIFADDR
> +                            struct.pack('256s', ifname[:15]))[20:24])
> +
> +
> +def get_host_cpus():
> +    if not os.access("/proc/cpuinfo", os.R_OK):
> +        print "warning:os error"
> +        sys.exit(1)
> +    else:
> +        cmd = "cat /proc/cpuinfo | grep '^processor'|wc -l"
> +        cpus = int(commands.getoutput(cmd))
> +        if cpus:
> +            return cpus
>           else:
> -            print "Unsupported hypervisor type!"
> -            sys.exit(1)
> -
> -        return ver
> -
> -    def get_host_kernel_version(self):
> -        kernel_ver = commands.getoutput('uname -r')
> -        return kernel_ver
> -
> -    def get_ip_address(self, ifname):
> -        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
> -        return socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915, # SIOCGIFADDR
> -                                struct.pack('256s', ifname[:15]))[20:24])
> -
> -
> -    def get_host_cpus(self):
> -        if not os.access("/proc/cpuinfo", os.R_OK):
> -            print "warning:os error"
> -            sys.exit(1)
> +            print "warnning:don't get system cpu number"
> +
> +def get_host_frequency():
> +    if not os.access("/proc/cpuinfo", os.R_OK):
> +        print "warning:os error"
> +        sys.exit(1)
> +    else:
> +        cmd = "cat /proc/cpuinfo | grep 'cpu MHz'|uniq"
> +        cpufreq = commands.getoutput(cmd)
> +        if cpufreq:
> +            freq = cpufreq.split(":")[1].split(" ")[1]
> +            return freq
>           else:
> -            cmd = "cat /proc/cpuinfo | grep '^processor'|wc -l"
> -            cpus = int(commands.getoutput(cmd))
> -            if cpus:
> -                return cpus
> -            else:
> -                print "warnning:don't get system cpu number"
> -
> -    def get_host_frequency(self):
> -        if not os.access("/proc/cpuinfo", os.R_OK):
> -            print "warning:os error"
> -            sys.exit(1)
> +            print "warnning:don't get system cpu frequency"
> +
> +def get_host_memory():
> +    if not os.access("/proc/meminfo", os.R_OK):
> +        print "please check os."
> +        sys.exit(1)
> +    else:
> +        cmd = "cat /proc/meminfo | egrep 'MemTotal'"
> +        ret = commands.getoutput(cmd)
> +        strMem = ret.split(":")[1]
> +        mem_num = strMem.split("kB")[0]
> +        mem_size = int(mem_num.strip())
> +        if mem_size:
> +            return mem_size
>           else:
> -            cmd = "cat /proc/cpuinfo | grep 'cpu MHz'|uniq"
> -            cpufreq = commands.getoutput(cmd)
> -            if cpufreq:
> -                freq = cpufreq.split(":")[1].split(" ")[1]
> -                return freq
> -            else:
> -                print "warnning:don't get system cpu frequency"
> -
> -    def get_host_memory(self):
> -        if not os.access("/proc/meminfo", os.R_OK):
> -            print "please check os."
> -            sys.exit(1)
> +            print "warnning:don't get os memory"
> +
> +def get_vcpus_list():
> +    host_cpus = get_host_cpus()
> +    max_vcpus = host_cpus * 4
> +    vcpus_list = []
> +    n = 0
> +    while 2**n<= max_vcpus:
> +        vcpus_list.append(2**n)
> +        n += 1
> +    return vcpus_list
> +
> +def get_memory_list():
> +    host_mem = get_host_memory()
> +    mem_list = []
> +    i = 10
> +    while 2**i*1024<= host_mem:
> +        mem_list.append(2**i)
> +        i += 1
> +    return mem_list
> +
> +def get_curr_time():
> +    curr_time = time.strftime('%Y-%m-%d %H:%M:%S')
> +    return curr_time
> +
> +def get_rand_uuid():
> +    return file('/proc/sys/kernel/random/uuid').readline().strip()
> +
> +def get_rand_mac():
> +    mac = []
> +    mac.append(0x54)
> +    mac.append(0x52)
> +    mac.append(0x00)
> +    i = 0
> +    while i<  3:
> +        mac.append(random.randint(0x00, 0xff))
> +        i += 1
> +    return ':'.join(map (lambda x: "%02x" % x, mac))
> +
> +def get_dom_mac_addr(domname):
> +    """Get mac address of a domain
> +
> +       Return mac address on SUCCESS or None on FAILURE
> +    """
> +    cmd = \
> +    "virsh dumpxml " + domname \
> +    + " | grep 'mac address' | awk -F'=' '{print $2}' | tr -d \"[\'/>]\""
> +
> +    (ret, out) = commands.getstatusoutput(cmd)
> +    if ret == 0:
> +        return out
> +    else:
> +        return None
> +
> +def get_num_vcpus(domname):
> +    """Get mac address of a domain
> +       Return mac address on SUCCESS or None on FAILURE
> +    """
> +    cmd = "virsh dumpxml " + domname + \
> +    " | grep 'vcpu' | awk -F'<' '{print $2}' | awk -F'>' '{print $2}'"
> +
> +    (ret, out) = commands.getstatusoutput(cmd)
> +    if ret == 0:
> +        return out
> +    else:
> +        return None
> +
> +def get_size_mem(domname):
> +    """Get mem size of a domain
> +       Return mem size on SUCCESS or None on FAILURE
> +    """
> +    cmd = "virsh dumpxml " + domname + \
> +    " | grep 'currentMemory'|awk -F'<' '{print $2}'|awk -F'>' '{print $2}'"
> +
> +    (ret, out) = commands.getstatusoutput(cmd)
> +    if ret == 0:
> +        return out
> +    else:
> +        return None
> +
> +def get_disk_path(dom_xml):
> +    """Get full path of bootable disk image of domain
> +       Return mac address on SUCCESS or None on FAILURE
> +    """
> +    doc = minidom.parseString(dom_xml)
> +    disk_list = doc.getElementsByTagName('disk')
> +    source = disk_list[0].getElementsByTagName('source')[0]
> +    attribute = source.attributes.keys()[0]
> +
> +    return source.attributes[attribute].value
> +
> +def get_capacity_suffix_size(capacity):
> +    dicts = {}
> +    change_to_byte = {'K':pow(2, 10), 'M':pow(2, 20), 'G':pow(2, 30),
> +                      'T':pow(2, 40)}
> +    for suffix in change_to_byte.keys():
> +        if capacity.endswith(suffix):
> +            dicts['suffix'] = suffix
> +            dicts['capacity'] = capacity.split(suffix)[0]
> +            dicts['capacity_byte'] = \
> +            int(dicts['capacity']) * change_to_byte[suffix]
> +    return dicts
> +
> +def dev_num(guestname, device):
> +    """Get disk or interface number in the guest"""
> +    cur = commands.getoutput("pwd")
> +    cmd = "sh %s/utils/dev_num.sh %s %s" % (cur, guestname, device)
> +    num = int(commands.getoutput(cmd))
> +    if num:
> +        return num
> +    else:
> +        return None
> +
> +def stop_selinux():
> +    selinux_value = commands.getoutput("getenforce")
> +    if selinux_value == "Enforcing":
> +        os.system("setenforce 0")
> +        if commands.getoutput("getenforce") == "Permissive":
> +            return "selinux is disabled"
>           else:
> -            cmd = "cat /proc/meminfo | egrep 'MemTotal'"
> -            ret = commands.getoutput(cmd)
> -            strMem = ret.split(":")[1]
> -            mem_num = strMem.split("kB")[0]
> -            mem_size = int(mem_num.strip())
> -            if mem_size:
> -                return mem_size
> -            else:
> -                print "warnning:don't get os memory"
> -
> -    def get_vcpus_list(self):
> -        host_cpus = self.get_host_cpus()
> -        max_vcpus = host_cpus * 4
> -        vcpus_list = []
> -        n = 0
> -        while 2**n<= max_vcpus:
> -            vcpus_list.append(2**n)
> -            n += 1
> -        return vcpus_list
> -
> -    def get_memory_list(self):
> -        host_mem = self.get_host_memory()
> -        mem_list = []
> -        i = 10
> -        while 2**i*1024<= host_mem:
> -            mem_list.append(2**i)
> -            i += 1
> -        return mem_list
> -
> -    def get_curr_time(self):
> -        curr_time = time.strftime('%Y-%m-%d %H:%M:%S')
> -        return curr_time
> -
> -    def get_rand_uuid(self):
> -        return file('/proc/sys/kernel/random/uuid').readline().strip()
> -
> -    def get_rand_mac(self):
> -        mac = []
> -        mac.append(0x54)
> -        mac.append(0x52)
> -        mac.append(0x00)
> -        i = 0
> -        while i<  3:
> -            mac.append(random.randint(0x00, 0xff))
> -            i += 1
> -        return ':'.join(map (lambda x: "%02x" % x, mac))
> -
> -    def get_dom_mac_addr(self, domname):
> -        """Get mac address of a domain
> -
> -           Return mac address on SUCCESS or None on FAILURE
> -        """
> -        cmd = \
> -        "virsh dumpxml " + domname \
> -        + " | grep 'mac address' | awk -F'=' '{print $2}' | tr -d \"[\'/>]\""
> -
> +            return "Failed to stop selinux"
> +    else:
> +        return "selinux is disabled"
> +
> +def stop_firewall(ip):
> +    stopfire = ""
> +    if ip == "127.0.0.1":
> +        stopfire = commands.getoutput("service iptables stop")
> +    else:
> +        stopfire = commands.getoutput("ssh %s service iptables stop") %ip
> +    if stopfire.find("stopped"):
> +        print "Firewall is stopped."
> +    else:
> +        print "Failed to stop firewall"
> +        sys.exit(1)
> +
> +def print_section(title):
> +    print "\n%s" % title
> +    print "=" * 60
> +
> +def print_entry(key, value):
> +    print "%-10s %-10s" % (key, value)
> +
> +def print_xml(key, ctx, path):
> +    res = ctx.xpathEval(path)
> +    if res is None or len(res) == 0:
> +        value = "Unknown"
> +    else:
> +        value = res[0].content
> +    print_entry(key, value)
> +    return value
> +
> +def print_title(info, delimiter, num):
> +    curr_time = get_curr_time()
> +    blank = ' '*(num/2 - (len(info) + 8 + len(curr_time))/2)
> +    print delimiter * num
> +    print "%s%s\t%s" % (blank, info, curr_time)
> +    print delimiter * num
> +
> +def file_read(file):
> +    if os.path.exists(file):
> +        fh = open(file, 'r')
> +        theData = fh.read()
> +        fh.close()
> +        return theData
> +    else:
> +        print "The FILE %s doesn't exist." % file
> +
> +def parse_xml(file, element):
> +    xmldoc = minidom.parse(file)
> +    elementlist = xmldoc.getElementsByTagName(element)
> +    return elementlist
> +
> +def locate_utils():
> +    """Get the directory path of 'utils'"""
> +    pwd = os.getcwd()
> +    result = re.search('(.*)libvirt-test-API(.*)', pwd)
> +    return result.group(0) + "/utils"
> +
> +def mac_to_ip(mac, timeout):
> +    """Map mac address to ip
> +
> +       Return None on FAILURE and the mac address on SUCCESS
> +    """
> +    if not mac:
> +        return None
> +
> +    if timeout<  10:
> +        timeout = 10
> +
> +    cmd = "sh " + locate_utils() + "/ipget.sh " + mac
> +
> +    while timeout>  0:
>           (ret, out) = commands.getstatusoutput(cmd)
> -        if ret == 0:
> -            return out
> -        else:
> -            return None
> +        if not out.lstrip() == "":
> +            break
>
> -    def get_num_vcpus(self, domname):
> -        """Get mac address of a domain
> -           Return mac address on SUCCESS or None on FAILURE
> -        """
> -        cmd = "virsh dumpxml " + domname + \
> -        " | grep 'vcpu' | awk -F'<' '{print $2}' | awk -F'>' '{print $2}'"
> +        timeout -= 10
>
> -        (ret, out) = commands.getstatusoutput(cmd)
> -        if ret == 0:
> -            return out
> -        else:
> -            return None
> +    return timeout and out or None
>
> -    def get_size_mem(self, domname):
> -        """Get mem size of a domain
> -           Return mem size on SUCCESS or None on FAILURE
> -        """
> -        cmd = "virsh dumpxml " + domname + \
> -        " | grep 'currentMemory'|awk -F'<' '{print $2}'|awk -F'>' '{print $2}'"
> +def do_ping(ip, timeout):
> +    """Ping some host
>
> -        (ret, out) = commands.getstatusoutput(cmd)
> -        if ret == 0:
> -            return out
> -        else:
> -            return None
> -
> -    def get_disk_path(self, dom_xml):
> -        """Get full path of bootable disk image of domain
> -           Return mac address on SUCCESS or None on FAILURE
> -        """
> -        doc = minidom.parseString(dom_xml)
> -        disk_list = doc.getElementsByTagName('disk')
> -        source = disk_list[0].getElementsByTagName('source')[0]
> -        attribute = source.attributes.keys()[0]
> -
> -        return source.attributes[attribute].value
> -
> -    def get_capacity_suffix_size(self, capacity):
> -        dicts = {}
> -        change_to_byte = {'K':pow(2, 10), 'M':pow(2, 20), 'G':pow(2, 30),
> -                          'T':pow(2, 40)}
> -        for suffix in change_to_byte.keys():
> -            if capacity.endswith(suffix):
> -                dicts['suffix'] = suffix
> -                dicts['capacity'] = capacity.split(suffix)[0]
> -                dicts['capacity_byte'] = \
> -                int(dicts['capacity']) * change_to_byte[suffix]
> -        return dicts
> -
> -    def dev_num(self, guestname, device):
> -        """Get disk or interface number in the guest"""
> -        cur = commands.getoutput("pwd")
> -        cmd = "sh %s/utils/dev_num.sh %s %s" % (cur, guestname, device)
> -        num = int(commands.getoutput(cmd))
> -        if num:
> -            return num
> -        else:
> -            return None
> -
> -    def stop_selinux(self):
> -        selinux_value = commands.getoutput("getenforce")
> -        if selinux_value == "Enforcing":
> -            os.system("setenforce 0")
> -            if commands.getoutput("getenforce") == "Permissive":
> -                return "selinux is disabled"
> -            else:
> -                return "Failed to stop selinux"
> -        else:
> -            return "selinux is disabled"
> -
> -    def stop_firewall(self, ip):
> -        stopfire = ""
> -        if ip == "127.0.0.1":
> -            stopfire = commands.getoutput("service iptables stop")
> -        else:
> -            stopfire = commands.getoutput("ssh %s service iptables stop") %ip
> -        if stopfire.find("stopped"):
> -            print "Firewall is stopped."
> -        else:
> -            print "Failed to stop firewall"
> -            sys.exit(1)
> +       return True on success or False on Failure
> +       timeout should be greater or equal to 10
> +    """
> +    if not ip:
> +        return False
>
> -    def print_section(self, title):
> -        print "\n%s" % title
> -        print "=" * 60
> +    if timeout<  10:
> +        timeout = 10
>
> -    def print_entry(self, key, value):
> -        print "%-10s %-10s" % (key, value)
> +    cmd = "ping -c 3 " + str(ip)
>
> -    def print_xml(self, key, ctx, path):
> -        res = ctx.xpathEval(path)
> -        if res is None or len(res) == 0:
> -            value = "Unknown"
> -        else:
> -            value = res[0].content
> -        print_entry(key, value)
> -        return value
> -
> -    def print_title(self, info, delimiter, num):
> -        curr_time = self.get_curr_time()
> -        blank = ' '*(num/2 - (len(info) + 8 + len(curr_time))/2)
> -        print delimiter * num
> -        print "%s%s\t%s" % (blank, info, curr_time)
> -        print delimiter * num
> -
> -    def file_read(self, file):
> -        if os.path.exists(file):
> -            fh = open(file, 'r')
> -            theData = fh.read()
> -            fh.close()
> -            return theData
> +    while timeout>  0:
> +        (ret, out) = commands.getstatusoutput(cmd)
> +        if ret == 0:
> +            break
> +        timeout -= 10
> +
> +    return (timeout and 1) or 0
> +
> +def exec_cmd(command, sudo=False, cwd=None, infile=None, outfile=None, shell=False, data=None):
> +    """
> +    Executes an external command, optionally via sudo.
> +    """
> +    if sudo:
> +        if type(command) == type(""):
> +            command = "sudo " + command
>           else:
> -            print "The FILE %s doesn't exist." % file
> -
> -    def parse_xml(file, element):
> -        xmldoc = minidom.parse(file)
> -        elementlist = xmldoc.getElementsByTagName(element)
> -        return elementlist
> -
> -    def locate_utils(self):
> -        """Get the directory path of 'utils'"""
> -        pwd = os.getcwd()
> -        result = re.search('(.*)libvirt-test-API(.*)', pwd)
> -        return result.group(0) + "/utils"
> -
> -    def mac_to_ip(self, mac, timeout):
> -        """Map mac address to ip
> -
> -           Return None on FAILURE and the mac address on SUCCESS
> -        """
> -        if not mac:
> -            return None
> -
> -        if timeout<  10:
> -            timeout = 10
> -
> -        cmd = "sh " + self.locate_utils() + "/ipget.sh " + mac
> -
> -        while timeout>  0:
> -            (ret, out) = commands.getstatusoutput(cmd)
> -            if not out.lstrip() == "":
> -                break
> -
> -            timeout -= 10
> -
> -        return timeout and out or None
> -
> -    def do_ping(self, ip, timeout):
> -        """Ping some host
> -
> -           return True on success or False on Failure
> -           timeout should be greater or equal to 10
> -        """
> -        if not ip:
> -            return False
> -
> -        if timeout<  10:
> -            timeout = 10
> -
> -        cmd = "ping -c 3 " + str(ip)
> -
> -        while timeout>  0:
> -            (ret, out) = commands.getstatusoutput(cmd)
> -            if ret == 0:
> -                break
> -            timeout -= 10
> -
> -        return (timeout and 1) or 0
> -
> -    def exec_cmd(self, command, sudo=False, cwd=None, infile=None, outfile=None, shell=False, data=None):
> -        """
> -        Executes an external command, optionally via sudo.
> -        """
> -        if sudo:
> -            if type(command) == type(""):
> -                command = "sudo " + command
> -            else:
> -                command = ["sudo"] + command
> -        if infile == None:
> -            infile = subprocess.PIPE
> -        if outfile == None:
> -            outfile = subprocess.PIPE
> -        p = subprocess.Popen(command, shell=shell, close_fds=True, cwd=cwd,
> -                        stdin=infile, stdout=outfile, stderr=subprocess.PIPE)
> -        (out, err) = p.communicate(data)
> -        if out == None:
> -            # Prevent splitlines() from barfing later on
> -            out = ""
> -        return (p.returncode, out.splitlines())
> -
> -    def remote_exec_pexpect(self, hostname, username, password, cmd):
> -        """ Remote exec function via pexpect """
> -        user_hostname = "%s@%s" % (username, hostname)
> -        child = pexpect.spawn("/usr/bin/ssh", [user_hostname, cmd],
> -                              timeout = 60, maxread = 2000, logfile = None)
> -        while True:
> -            index = child.expect(['(yes\/no)', 'password:', pexpect.EOF,
> -                                 pexpect.TIMEOUT])
> -            if index == 0:
> -                child.sendline("yes")
> -            elif index == 1:
> -                child.sendline(password)
> -            elif index == 2:
> -                child.close()
> -                return 0, child.before
> -            elif index == 3:
> -                child.close()
> -                return 1, ""
> -
> -        return 0
> -
> -    def scp_file(self, hostname, username, password, target_path, file):
> -        """ Scp file to remote host """
> -        user_hostname = "%s@%s:%s" % (username, hostname, target_path)
> -        child = pexpect.spawn("/usr/bin/scp", [file, user_hostname])
> -        while True:
> -            index = child.expect(['yes\/no', 'password: ',
> -                                   pexpect.EOF,
> -                                   pexpect.TIMEOUT])
> -            if index == 0:
> -                child.sendline("yes")
> -            elif index == 1:
> -                child.sendline(password)
> -            elif index == 2:
> -                child.close()
> -                return 0
> -            elif index == 3:
> -                child.close()
> -                return 1
> -
> -        return 0
> +            command = ["sudo"] + command
> +    if infile == None:
> +        infile = subprocess.PIPE
> +    if outfile == None:
> +        outfile = subprocess.PIPE
> +    p = subprocess.Popen(command, shell=shell, close_fds=True, cwd=cwd,
> +                    stdin=infile, stdout=outfile, stderr=subprocess.PIPE)
> +    (out, err) = p.communicate(data)
> +    if out == None:
> +        # Prevent splitlines() from barfing later on
> +        out = ""
> +    return (p.returncode, out.splitlines())
> +
> +def remote_exec_pexpect(hostname, username, password, cmd):
> +    """ Remote exec function via pexpect """
> +    user_hostname = "%s@%s" % (username, hostname)
> +    child = pexpect.spawn("/usr/bin/ssh", [user_hostname, cmd],
> +                          timeout = 60, maxread = 2000, logfile = None)
> +    while True:
> +        index = child.expect(['(yes\/no)', 'password:', pexpect.EOF,
> +                             pexpect.TIMEOUT])
> +        if index == 0:
> +            child.sendline("yes")
> +        elif index == 1:
> +            child.sendline(password)
> +        elif index == 2:
> +            child.close()
> +            return 0, child.before
> +        elif index == 3:
> +            child.close()
> +            return 1, ""
> +
> +    return 0
> +
> +def scp_file(hostname, username, password, target_path, file):
> +    """ Scp file to remote host """
> +    user_hostname = "%s@%s:%s" % (username, hostname, target_path)
> +    child = pexpect.spawn("/usr/bin/scp", [file, user_hostname])
> +    while True:
> +        index = child.expect(['yes\/no', 'password: ',
> +                               pexpect.EOF,
> +                               pexpect.TIMEOUT])
> +        if index == 0:
> +            child.sendline("yes")
> +        elif index == 1:
> +            child.sendline(password)
> +        elif index == 2:
> +            child.close()
> +            return 0
> +        elif index == 3:
> +            child.close()
> +            return 1
> +
> +    return 0

         Agree, ACK and pushed.

         Guannan Ren




More information about the libvir-list mailing list