Beispiel #1
0
    def netscan_scapy(dev):
        network = ifconfig.getAddr(dev)
        netmask = ifconfig.getMask(dev)
        netsize = netmask2netsz(netmask)

        ans, unans = srp(
            Ether(dst="ff:ff:ff:ff:ff:ff") / \
                ARP(pdst="{0}/{1}".format(network, netsize)),
                    timeout=0.1, iface=dev)

        for request, responce in ans:
            yield responce.payload.fields['hwsrc'].upper(), responce.payload.fields['psrc']
Beispiel #2
0
    def netscan_scapy(dev):
        network = ifconfig.getAddr(dev)
        netmask = ifconfig.getMask(dev)
        netsize = netmask2netsz(netmask)

        ans, unans = srp(
            Ether(dst="ff:ff:ff:ff:ff:ff") / \
                ARP(pdst="{0}/{1}".format(network, netsize)),
                    timeout=0.1, iface=dev)

        for request, responce in ans:
            yield responce.payload.fields['hwsrc'].upper(
            ), responce.payload.fields['psrc']
Beispiel #3
0
    def start_vm(self, vmname, users, prepare_image=False):
        logger.info("Start vm/network {0} with credentials {1}".format(
            vmname, users))

        vms = [
            vm for vm in self.vms.values()
            if vm.name == vmname or vm.name.startswith(vmname +
                                                       self.DOM_SEPARATOR)
        ]
        vm_names = " ".join(vm.name for vm in vms)
        logger.debug(
            "Found next vm's, which match name glob {0}".format(vm_names))

        for vm in vms:
            logger.debug("Prepare vm {0}".format(vm.name))

            path = os.path.join(self.root, self.templates[vm.htype])
            vm_xml_templ = open(path).read()
            logger.info("Use template '{0}'".format(path))

            vm_xm = fromstring(vm_xml_templ)

            el = Element('vcpu')
            el.text = str(vm.vcpu)
            vm_xm.append(el)

            el = Element('name')
            el.text = vm.name
            vm_xm.append(el)

            el = Element('memory')
            el.text = str(vm.mem * 1024)
            vm_xm.append(el)

            devs = vm_xm.find('devices')

            disk_emulator = self.defaults.get('disk_emulator', 'qemu')

            if 'virtio' in vm.opts:
                bus = 'virtio'
            else:
                bus = 'ide'

            if 'ide' == bus:
                dev_name_templ = 'hd'
            elif 'scsi' == bus:
                dev_name_templ = 'sd'
            elif 'virtio' == bus:
                dev_name_templ = 'vd'

            letters = [
                chr(ord('a') + pos) for pos in range(ord('z') - ord('a'))
            ]

            for hdd_pos, image in enumerate(vm.images):

                if hdd_pos > len(letters):
                    raise CloudError("To many HHD devices {0}".format(
                        len(vm.images)))

                rimage = image

                dev_st = os.stat(rimage)
                while stat.S_ISLNK(dev_st.st_mode):
                    rimage = os.readlink(rimage)
                    dev_st = os.stat(rimage)

                dev = dev_name_templ + letters[hdd_pos]

                if stat.S_ISDIR(dev_st.st_mode):
                    hdd = xmlbuilder.XMLBuilder('filesystem', type='mount')
                    hdd.source(dir=image)
                    hdd.target(dir='/')
                else:
                    res = subprocess.check_output(['qemu-img', 'info', image])
                    hdr = "file format: "
                    tp = None
                    for line in res.split('\n'):
                        if line.startswith(hdr):
                            tp = line[len(hdr):].strip()
                    assert tp is not None

                    if stat.S_ISBLK(dev_st.st_mode):
                        hdd = xmlbuilder.XMLBuilder('disk',
                                                    device='disk',
                                                    type='block')
                        hdd.driver(name=disk_emulator, type=tp)
                        hdd.source(dev=image)
                        hdd.target(bus=bus, dev=dev)
                    elif stat.S_ISREG(dev_st.st_mode):
                        hdd = xmlbuilder.XMLBuilder('disk',
                                                    device='disk',
                                                    type='file')
                        hdd.driver(name=disk_emulator, type=tp)
                        hdd.source(file=image)
                        hdd.target(bus=bus, dev=dev)
                    else:
                        raise CloudError(
                            "Can't connect hdd device {0!r}".format(image))

                devs.append(~hdd)

            eths = {}

            conn = self.get_vm_conn(vm.name)

            for eth in vm.eths():
                edev = xmlbuilder.XMLBuilder('interface', type='network')
                edev.source(network=eth['network'])
                edev.mac(address=eth['mac'])
                devs.append(~edev)

                if 'ip' not in eth:
                    eths[eth['name']] = (eth['mac'], 'dhcp', None, None)
                else:
                    brdev = get_network_bridge(conn, eth['network'])
                    addr = ifconfig.getAddr(brdev)
                    mask = ifconfig.getMask(brdev)
                    eths[eth['name']] = (eth['mac'], eth['ip'],
                                         netmask2netsz(mask), addr)

            if users is None:
                users = {vm.user: vm.passwd}

            try:
                if vm.htype == 'lxc':
                    prepare_guest(vm.images[0],
                                  vm.name,
                                  users,
                                  eths,
                                  format='lxc')
                elif prepare_image:
                    prepare_guest(vm.images[0], vm.name, users, eths)
            except CloudError as x:
                print "Can't update vm image -", x

            logger.debug("Image ready - start vm {0}".format(vm.name))

            conn.createXML(tostring(vm_xm), 0)
            logger.debug("VM {0} started ok".format(vm.name))
            conn.close()
Beispiel #4
0
    def start_vm(self, vmname, users, prepare_image=False):
        logger.info("Start vm/network {0} with credentials {1}".format(vmname, users))

        vms = [vm for vm in self.vms.values()
                if vm.name == vmname or
                    vm.name.startswith(vmname +
                                        self.DOM_SEPARATOR)]
        vm_names = " ".join(vm.name for vm in vms)
        logger.debug("Found next vm's, which match name glob {0}".format(vm_names))

        for vm in vms:
            logger.debug("Prepare vm {0}".format(vm.name))

            path = os.path.join(self.root, self.templates[vm.htype])
            vm_xml_templ = open(path).read()
            logger.info("Use template '{0}'".format(path))

            vm_xm = fromstring(vm_xml_templ)

            el = Element('vcpu')
            el.text = str(vm.vcpu)
            vm_xm.append(el)

            el = Element('name')
            el.text = vm.name
            vm_xm.append(el)

            el = Element('memory')
            el.text = str(vm.mem * 1024)
            vm_xm.append(el)

            devs = vm_xm.find('devices')

            disk_emulator = self.defaults.get('disk_emulator', 'qemu')

            if 'virtio' in vm.opts:
                bus = 'virtio'
            else:
                bus = 'ide'

            if 'ide' == bus:
                dev_name_templ = 'hd'
            elif 'scsi' == bus:
                dev_name_templ = 'sd'
            elif 'virtio' == bus:
                dev_name_templ = 'vd'

            letters = [chr(ord('a') + pos) for pos in range(ord('z') - ord('a'))]

            for hdd_pos, image in enumerate(vm.images):

                if hdd_pos > len(letters):
                    raise CloudError("To many HHD devices {0}".format(len(vm.images)))
                
                rimage = image

                dev_st = os.stat(rimage)
                while stat.S_ISLNK(dev_st.st_mode):
                    rimage = os.readlink(rimage)
                    dev_st = os.stat(rimage)

                dev = dev_name_templ + letters[hdd_pos]

                if stat.S_ISDIR(dev_st.st_mode):
                    hdd = xmlbuilder.XMLBuilder('filesystem', type='mount')
                    hdd.source(dir=image)
                    hdd.target(dir='/')
                else:
                    res = subprocess.check_output(['qemu-img', 'info', image])
                    hdr = "file format: "
                    tp = None
                    for line in res.split('\n'):
                        if line.startswith(hdr):
                            tp = line[len(hdr):].strip()
                    assert tp is not None

                    if stat.S_ISBLK(dev_st.st_mode):
                        hdd = xmlbuilder.XMLBuilder('disk', device='disk', type='block')
                        hdd.driver(name=disk_emulator, type=tp)
                        hdd.source(dev=image)
                        hdd.target(bus=bus, dev=dev)
                    elif stat.S_ISREG(dev_st.st_mode):
                        hdd = xmlbuilder.XMLBuilder('disk', device='disk', type='file')
                        hdd.driver(name=disk_emulator, type=tp)
                        hdd.source(file=image)
                        hdd.target(bus=bus, dev=dev)
                    else:
                        raise CloudError("Can't connect hdd device {0!r}".format(image))

                devs.append(~hdd)

            eths = {}

            conn = self.get_vm_conn(vm.name)

            for eth in vm.eths():
                edev = xmlbuilder.XMLBuilder('interface', type='network')
                edev.source(network=eth['network'])
                edev.mac(address=eth['mac'])
                devs.append(~edev)

                if 'ip' not in eth:
                    eths[eth['name']] = (eth['mac'], 'dhcp', None, None)
                else:
                    brdev = get_network_bridge(conn, eth['network'])
                    addr = ifconfig.getAddr(brdev)
                    mask = ifconfig.getMask(brdev)
                    eths[eth['name']] = (eth['mac'], eth['ip'], netmask2netsz(mask), addr)

            if users is None:
                users = {vm.user: vm.passwd}

            try:
                if vm.htype == 'lxc':
                    prepare_guest(vm.images[0], vm.name, users, eths, format='lxc')
                elif prepare_image:
                    prepare_guest(vm.images[0], vm.name, users, eths)
            except CloudError as x:
                print "Can't update vm image -", x

            logger.debug("Image ready - start vm {0}".format(vm.name))

            conn.createXML(tostring(vm_xm), 0)
            logger.debug("VM {0} started ok".format(vm.name))
            conn.close()