Example #1
0
 def get(self, vm_name=None):
     """get info on virtual machine(s)"""
     data = []
     #if no vm name get all
     if vm_name == None:
         #get list of all inactive and active
         vm_defined_list = self.conn.listDefinedDomains()
         vm_active_list = self.conn.listDomainsID()
         #iterate over these lists and get some info on each domain
         for vmid in vm_active_list:
             dom = self.conn.lookupByID(vmid)
             data.append(dom.XMLDesc(3))
         for name in vm_defined_list:
             dom = self.conn.lookupByName(name)
             data.append(dom.XMLDesc(3))
     else:
         vm_name = common.validate_hostname(vm_name)
         try:
             dom = self.conn.lookupByName(vm_name)
         except libvirt.libvirtError:
             result = common.process_results(data, 'VM')
             self.log.debug('Result: %s' % result)
             return result
         info = dom.XMLDesc(3)
         data.append(info)
     #self.conn.close() # Connection closing left to calling app - bad?
     result = common.process_results(data, 'VM')
     self.log.debug('Result: %s' % result)
     return result
Example #2
0
File: ip.py Project: mattmb/spoke
 def get(self):
     """Retrieve subnet information; return results list."""
     if not (self.network and self.mask): # Retrive all subnets
         data = self.KV.keys()
         result = common.process_results(data, 'Subnet')
         self.log.debug('Result: %s' % result)
         return result
     data = []
     obj = self.kv_name
     attributes = {}
     attributes['free'] = [self.KV.scard(self.kv_free)]
     attributes['aloc'] = [self.KV.scard(self.kv_aloc)]
     if attributes['free'] == [0] and attributes ['aloc'] == [0]:
         result = common.process_results(data, 'Subnet')
         self.log.debug('Result: %s' % result)
         return result
     try:
         free = attributes['free'][0]
     except KeyError:
         free = 0
     try:
         aloc = attributes['aloc'][0]
     except KeyError:
         aloc = 0
     msg = 'Subnet %s/%s found; %s free and %s pre-allocated IP addresses' % \
             (self.kv_name, str(self.mask), free, aloc)
     self.log.debug(msg)
     item = (obj, attributes)
     data.append(item)
     result = common.process_results(data, 'Subnet')
     self.log.debug('Result: %s' % result)
     return result
Example #3
0
File: ip.py Project: mattmb/spoke
 def get(self):
     """Retrieve subnet information; return results list."""
     if not (self.network and self.mask):  # Retrive all subnets
         data = self.KV.keys()
         result = common.process_results(data, 'Subnet')
         self.log.debug('Result: %s' % result)
         return result
     data = []
     obj = self.kv_name
     attributes = {}
     attributes['free'] = [self.KV.scard(self.kv_free)]
     attributes['aloc'] = [self.KV.scard(self.kv_aloc)]
     if attributes['free'] == [0] and attributes['aloc'] == [0]:
         result = common.process_results(data, 'Subnet')
         self.log.debug('Result: %s' % result)
         return result
     try:
         free = attributes['free'][0]
     except KeyError:
         free = 0
     try:
         aloc = attributes['aloc'][0]
     except KeyError:
         aloc = 0
     msg = 'Subnet %s/%s found; %s free and %s pre-allocated IP addresses' % \
             (self.kv_name, str(self.mask), free, aloc)
     self.log.debug(msg)
     item = (obj, attributes)
     data.append(item)
     result = common.process_results(data, 'Subnet')
     self.log.debug('Result: %s' % result)
     return result
Example #4
0
    def get(self, lv_name=None):
        """Get logical volume; return list of volume attributes."""
        if lv_name is not None:
            lv_name = common.validate_hostname(lv_name) # LV names are always hostnames
            args = ['lvs', '--noheadings', '--units', self.lv_units, '-o', 'lv_name,lv_size', '--separator', ':', '/dev/%s/%s' % (self.vg_name, lv_name)]
        else:
            args = ['lvs', '--noheadings', '--units', self.lv_units, '-o', 'lv_name,lv_size', '--separator', ':', '/dev/%s' % self.vg_name]
        str_args = " ".join(args)
        msg = "Running " + str_args
        self.log.debug(msg)
        try:
            result = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
        except Exception:
            msg = 'Running command %s failed' % str_args
            #trace = traceback.format_exec()
            raise error.SpokeError, msg
            
        out = result.communicate()
        (stdout, stderr) = (out[0], out[1])
        msg = "Command stdout was: %s, stderr was: %s" % (stdout, stderr)
        self.log.debug(msg)

        data = []
        # Errors we know about
        if "Volume group \"%s\" not found" % self.vg_name in stderr:
            msg = "Volume group '%s' was not found." % self.vg_name 
            raise error.NotFound(msg)
        elif "logical volume(s) not found" in stderr:
            result = common.process_results(data)
            self.log.debug('Result: %s' % result)
            return result
        elif stderr == "" and stdout == "":
            result = common.process_results(data)
            self.log.debug('Result: %s' % result)
            return result
        # Catch unexpected errors
        if result.returncode != 0:
            msg = "Search command returned non-zero: %s stdout was: %s, stderr was: %s" % \
                                                        (result.returncode, stdout, stderr)
            raise error.LVMError(msg)
        output = stdout.strip()
        output = re.compile('\n').split(output)
        for item in output:
            item = item.strip()
            dic = {}
            name, size = item.split(':')
            dic['lv_size'] = size
            dic['lv_name'] = name
            data.append(dic)
        result = common.process_results(data)
        self.log.debug('Result: %s' % result)
        return result
Example #5
0
File: ca.py Project: mattmb/spoke
 def get(self):
     """Retrieve a certificate request; return results object."""
     # TODO Put this in a dir walk loop so it supports multiple reqs
     data = []
     item = {}
     try:
         req = X509.load_request(self.req_file)
     except IOError:
         result = common.process_results(data, 'Request')
         return result
     item['req_cn'] = req.get_subject().CN
     item['req_as_pem'] = req.as_pem()
     pkey = req.get_pubkey()
     if req.verify(pkey):
         item['verify'] = 'success'
     data.append(item)
     result = common.process_results(data, 'Request')
     return result
Example #6
0
 def get(self):
     """Retrieve a certificate request; return results object."""
     # TODO Put this in a dir walk loop so it supports multiple reqs
     data = []
     item = {}
     try:
         req = X509.load_request(self.req_file)
     except IOError:
         result = common.process_results(data, 'Request')
         return result
     item['req_cn'] = req.get_subject().CN
     item['req_as_pem'] = req.as_pem()
     pkey = req.get_pubkey()
     if req.verify(pkey):
         item['verify'] = 'success'
     data.append(item)
     result = common.process_results(data, 'Request')
     return result
Example #7
0
 def get(self):
     """Search for a CA; return a result object containing CA attributes."""
     data = []
     item = {}
     for directory in self.req_dirs:
         if not (os.path.exists(directory)):
             self.log.debug('Cannot find %s' % directory)
             result = common.process_results(data, 'CA')
             self.log.debug('Result: %s' % result)
             return result
     ca_info = self._get_ca_info()
     item.update(ca_info)
     item['ca_key'] = self.ca_key_file
     item['ca_cert_file'] = self.ca_cert_file
     item['ca_def_duration'] = self.ca_def_duration
     data.append(item)
     result = common.process_results(data, 'CA')
     self.log.debug('Result: %s' % result)
     return result
Example #8
0
File: ca.py Project: mattmb/spoke
 def get(self):
     """Search for a CA; return a result object containing CA attributes."""
     data = []
     item = {}
     for directory in self.req_dirs:
         if not (os.path.exists(directory)):
             self.log.debug('Cannot find %s' % directory)
             result = common.process_results(data, 'CA')
             self.log.debug('Result: %s' % result)
             return result
     ca_info = self._get_ca_info()
     item.update(ca_info)
     item['ca_key'] = self.ca_key_file
     item['ca_cert_file'] = self.ca_cert_file
     item['ca_def_duration'] = self.ca_def_duration
     data.append(item)
     result = common.process_results(data, 'CA')
     self.log.debug('Result: %s' % result)
     return result
Example #9
0
 def get(self):
     """Retrieve a certificate; return results object."""
     # TODO Put this in a dir walk loop so it supports multiple reqs
     data = []
     item = {}
     try:
         cert = X509.load_cert(self.cert_file)
     except IOError:
         result = common.process_results(data, 'Certificate')
         self.log.debug('Result: %s' % result)
         return result
     item['cert_cn'] = cert.get_subject().CN
     item['cert_as_pem'] = cert.as_pem()
     item['verify'] = 'failure'
     if self._verify():
         item['verify'] = 'success'
     data.append(item)
     result = common.process_results(data, 'Certificate')
     self.log.debug('Result: %s' % result)
     return result
Example #10
0
File: ca.py Project: mattmb/spoke
 def get(self):
     """Retrieve a certificate; return results object."""
     # TODO Put this in a dir walk loop so it supports multiple reqs
     data = []
     item = {}
     try:
         cert = X509.load_cert(self.cert_file)
     except IOError:
         result = common.process_results(data, 'Certificate')
         self.log.debug('Result: %s' % result)
         return result
     item['cert_cn'] = cert.get_subject().CN
     item['cert_as_pem'] = cert.as_pem()
     item['verify'] = 'failure'
     if self._verify():
         item['verify'] = 'success'
     data.append(item)
     result = common.process_results(data, 'Certificate')
     self.log.debug('Result: %s' % result)
     return result
Example #11
0
 def get(self):
     '''get the power state of a given vm'''
     data = []
     item = {}
     state = self._lookupState(self.dom.info()[0])
     item['vm_name'] = self.vm_name
     item['state'] = state
     data.append(item)
     self.log.debug(data)
     result = common.process_results(data, 'VM')
     #out = xml.xml_to_text(info, self.headers)
     #self.log.info(out)
     self.log.debug('Result: %s' % result)
     return result
Example #12
0
 def get(self):
     '''get the power state of a given vm'''
     data = []
     item = {}
     state = self._lookupState(self.dom.info()[0])
     item['vm_name'] = self.vm_name
     item['state'] = state
     data.append(item)
     self.log.debug(data)
     result = common.process_results(data, 'VM')
     #out = xml.xml_to_text(info, self.headers)
     #self.log.info(out)
     self.log.debug('Result: %s' % result)
     return result
Example #13
0
File: ip.py Project: mattmb/spoke
 def modify(self, reserve=False, release=False):
     """Reserve or release IP address from Subnet"""
     if not (self.network and self.mask):
         msg = 'Please specify ip and mask'
         raise error.InputError(msg)
     if not reserve and not release:
         msg = 'You must specify if you wish to reserve or release an IP'
         raise error.InputError(msg)
     if reserve and release:
         msg = 'You cannot simultaneously reserve and release an IP'
         raise error.InputError(msg)
     if reserve:
         offer = self._reserve_ip(reserve)
         result = common.process_results(offer)
         result['msg'] = 'Reserved ip(s) %s from %s' % (offer, self.kv_name)
         self.log.debug('Result: %s' % result)
         return result
     if release:
         self._release_ip(release)
         result = self.get()
         result['msg'] = 'Returned %s ip(s) to %s' % (release, self.kv_name)
         self.log.debug('Result: %s' % result)
         return result
Example #14
0
File: ip.py Project: mattmb/spoke
 def modify(self, reserve=False, release=False):
     """Reserve or release IP address from Subnet"""
     if not (self.network and self.mask):
         msg = 'Please specify ip and mask'
         raise error.InputError(msg)
     if not reserve and not release:
         msg = 'You must specify if you wish to reserve or release an IP'
         raise error.InputError(msg)
     if reserve and release:
         msg = 'You cannot simultaneously reserve and release an IP'
         raise error.InputError(msg)
     if reserve:
         offer = self._reserve_ip(reserve)
         result = common.process_results(offer)
         result['msg'] = 'Reserved ip(s) %s from %s' % (offer, self.kv_name)
         self.log.debug('Result: %s' % result)
         return result
     if release:
         self._release_ip(release)
         result = self.get()
         result['msg'] = 'Returned %s ip(s) to %s' % (release, self.kv_name)
         self.log.debug('Result: %s' % result)
         return result
Example #15
0
File: lvm.py Project: mattmb/spoke
    def get(self, lv_name=None):
        """Get logical volume; return list of volume attributes."""
        if lv_name is not None:
            lv_name = common.validate_hostname(
                lv_name)  # LV names are always hostnames
            args = [
                'lvs', '--noheadings', '--units', self.lv_units, '-o',
                'lv_name,lv_size', '--separator', ':',
                '/dev/%s/%s' % (self.vg_name, lv_name)
            ]
        else:
            args = [
                'lvs', '--noheadings', '--units', self.lv_units, '-o',
                'lv_name,lv_size', '--separator', ':',
                '/dev/%s' % self.vg_name
            ]
        str_args = " ".join(args)
        msg = "Running " + str_args
        self.log.debug(msg)
        try:
            result = subprocess.Popen(args,
                                      stdout=subprocess.PIPE,
                                      stderr=subprocess.PIPE,
                                      close_fds=True)
        except Exception:
            msg = 'Running command %s failed' % str_args
            #trace = traceback.format_exec()
            raise error.SpokeError, msg

        out = result.communicate()
        (stdout, stderr) = (out[0], out[1])
        msg = "Command stdout was: %s, stderr was: %s" % (stdout, stderr)
        self.log.debug(msg)

        data = []
        # Errors we know about
        if "Volume group \"%s\" not found" % self.vg_name in stderr:
            msg = "Volume group '%s' was not found." % self.vg_name
            raise error.NotFound(msg)
        elif "logical volume(s) not found" in stderr:
            result = common.process_results(data)
            self.log.debug('Result: %s' % result)
            return result
        elif stderr == "" and stdout == "":
            result = common.process_results(data)
            self.log.debug('Result: %s' % result)
            return result
        # Catch unexpected errors
        if result.returncode != 0:
            msg = "Search command returned non-zero: %s stdout was: %s, stderr was: %s" % \
                                                        (result.returncode, stdout, stderr)
            raise error.LVMError(msg)
        output = stdout.strip()
        output = re.compile('\n').split(output)
        for item in output:
            item = item.strip()
            dic = {}
            name, size = item.split(':')
            dic['lv_size'] = size
            dic['lv_name'] = name
            data.append(dic)
        result = common.process_results(data)
        self.log.debug('Result: %s' % result)
        return result
Example #16
0
    def search(self, mac=None, template=None):
        data = []
        if mac is None and template is None:
            # Give me all macs and all templates
            #read the file system
            self.log.debug('Searching for all templates and macs under %s' % \
                           self.tftp_dir)
            file_list = os.listdir(self.tftp_dir)
            if len(file_list) == 0:
                result = common.process_results(data, self.type)
                self.log.debug('Result: %s' % result)
                return result
            item = {}
            for file in file_list:
                valid_template = False
                item_path = self.tftp_dir + file
                file_name = os.path.basename(item_path)
                if ".template" in file_name:
                    valid_template = True 
                file_name = file_name[3:]
                #use a regex to see if the file is a mac config
                pattern = re.compile('^([0-9a-fA-F]{2}[:-]){5}[0-9a-fA-F]{2}$')
                valid_mac = pattern.match(file_name)
                #if it's a mac add to list of macs
                if valid_mac and os.path.isfile(item_path):
                    macs = file_name
                    try:
                        item["configs"]
                    except KeyError:
                        item["configs"] = [] # Initialise dict if not exist
                    item["configs"].append(macs)
                elif valid_template and os.path.isfile(item_path):
                    try:
                        item["templates"]
                    except KeyError:
                        item["templates"] = [] # Initialise dict if not exist
                    item["templates"].append(file)
                else:
                    self.log.debug('Unknown file type %s, skipping' % file)
        elif mac is not None and template is None:
            # We're looking for a mac address
            mac = common.validate_mac(mac)
            mac_file = string.replace(mac, ":", "-") #Format for use on filesystem
            mac_file_name = self.tftp_prefix + mac_file           
            mac_link = self.tftp_dir + mac_file_name

            if not os.path.isfile(mac_link):
                result = common.process_results(data, self.type)
                self.log.debug('Result: %s' % result)
                return result
            else:
                item = [mac_file_name]
                #item[mac_file_name] = "Found"
        elif template is not None and mac is None:

            #Now we just want to check if template exists, no longer maintaining list of links
            template = common.validate_filename(template)
            template = self._validate_template(template)

            item = [template]
        else:
            msg = "please specify nothing, mac or target (not mac and target)."
            raise error.InputError, msg
        data.append(item)
        result = common.process_results(data, self.type)
        self.log.debug('Result: %s' % result)
        return result
Example #17
0
File: tftp.py Project: mattmb/spoke
    def search(self, mac=None, template=None):
        data = []
        if mac is None and template is None:
            # Give me all macs and all templates
            #read the file system
            self.log.debug('Searching for all templates and macs under %s' % \
                           self.tftp_dir)
            file_list = os.listdir(self.tftp_dir)
            if len(file_list) == 0:
                result = common.process_results(data, self.type)
                self.log.debug('Result: %s' % result)
                return result
            item = {}
            for file in file_list:
                valid_template = False
                item_path = self.tftp_dir + file
                file_name = os.path.basename(item_path)
                if ".template" in file_name:
                    valid_template = True
                file_name = file_name[3:]
                #use a regex to see if the file is a mac config
                pattern = re.compile('^([0-9a-fA-F]{2}[:-]){5}[0-9a-fA-F]{2}$')
                valid_mac = pattern.match(file_name)
                #if it's a mac add to list of macs
                if valid_mac and os.path.isfile(item_path):
                    macs = file_name
                    try:
                        item["configs"]
                    except KeyError:
                        item["configs"] = []  # Initialise dict if not exist
                    item["configs"].append(macs)
                elif valid_template and os.path.isfile(item_path):
                    try:
                        item["templates"]
                    except KeyError:
                        item["templates"] = []  # Initialise dict if not exist
                    item["templates"].append(file)
                else:
                    self.log.debug('Unknown file type %s, skipping' % file)
        elif mac is not None and template is None:
            # We're looking for a mac address
            mac = common.validate_mac(mac)
            mac_file = string.replace(mac, ":",
                                      "-")  #Format for use on filesystem
            mac_file_name = self.tftp_prefix + mac_file
            mac_link = self.tftp_dir + mac_file_name

            if not os.path.isfile(mac_link):
                result = common.process_results(data, self.type)
                self.log.debug('Result: %s' % result)
                return result
            else:
                item = [mac_file_name]
                #item[mac_file_name] = "Found"
        elif template is not None and mac is None:

            #Now we just want to check if template exists, no longer maintaining list of links
            template = common.validate_filename(template)
            template = self._validate_template(template)

            item = [template]
        else:
            msg = "please specify nothing, mac or target (not mac and target)."
            raise error.InputError, msg
        data.append(item)
        result = common.process_results(data, self.type)
        self.log.debug('Result: %s' % result)
        return result