def getLvmData(self): """Get route table, exclude specifed iface""" pvDisplayProg = checkUtils('/sbin/pvdisplay') pvDisplay = process(pvDisplayProg,"--noh","-Co", "lv_name,vg_name,pv_name") for line in pvDisplay: line = line.split() if len(line) == 3: yield line
def setActivePartition(self,partition): """Change partition id, specified by systemid,set active""" deviceName = detectDeviceForPartition(partition) if deviceName is None: raise DistributiveError( _("Failed to determine the parent device for %s")%partition) # device hasn't any partition elif deviceName == "": return True fdiskProg, gdiskProg, partedProg = checkUtils('/sbin/fdisk', '/usr/sbin/gdisk','/usr/sbin/parted') disk = self.clVars.Select('os_install_disk_parent', where='os_install_disk_dev',eq=partition, limit=1) parttable = self.clVars.Select('os_device_table',where='os_device_dev', eq=disk,limit=1) partitionNumber = \ getUdevDeviceInfo(name=partition).get('ID_PART_ENTRY_NUMBER','') or \ getUdevDeviceInfo(name=partition).get('UDISKS_PARTITION_NUMBER','') devicePartitionCount = countPartitions(deviceName) if deviceName and not partitionNumber: raise DistributiveError( _("Failed to determine the partition number for %s")%partition) bootFlag = "boot" if parttable == "dos" else "legacy_boot" if parttable == "dos": fdisk = process(fdiskProg, "-l",deviceName) DEVICENUM,AFLAG = 0,1 changeActive = \ map(lambda x:x[DEVICENUM], filter(lambda x:x[DEVICENUM] != partitionNumber and \ x[AFLAG] == "*" or \ x[DEVICENUM] == partitionNumber and \ not x[AFLAG] == "*", list(map(lambda x:[str(x[0]),x[1][1].strip()], # enumerate partitions enumerate(filter(None, map(lambda x:x.split()[:2], # drop string before information about partitions dropwhile(lambda x:not x.lstrip().startswith("Device"), fdisk.readlines()))))))[1:])) else: parted = process(partedProg, "-m",deviceName,"print") DEVICENUM,FLAGS = 0,6 changeActive = \ map(lambda x:x[DEVICENUM], filter(lambda x:x[DEVICENUM] != partitionNumber and \ bootFlag in x[FLAGS].strip(';').split(', ') or \ x[DEVICENUM] == partitionNumber and \ not bootFlag in x[FLAGS].strip(';').split(', '), filter(lambda x:len(x)>=7, map(lambda x:x.split(':'), parted.readlines()[2:])))) if not changeActive: return True if parttable == "dos": pipe = Popen([fdiskProg,deviceName], stdin=PIPE, stdout=PIPE,stderr=PIPE) for partnum in changeActive: pipe.stdin.write("a\n%s\n"%partnum) pipe.stdin.write("w\n") pipe.stdin.close() pipe.wait() elif parttable == "gpt": pipe = Popen([gdiskProg,deviceName], stdin=PIPE, stdout=PIPE,stderr=PIPE) if devicePartitionCount > 1: pipe.stdin.write("x\n") for partnum in changeActive: pipe.stdin.write("a\n%s\n2\n\n"%partnum) pipe.stdin.write("w\nY\n") else: pipe.stdin.write("x\na\n2\n\nw\nY\n") pipe.stdin.close() pipe.wait() for waittime in (0.1,0.2,0.5,1,2,4): if path.exists(partition): return True else: sleep(waittime) raise InstallError( _("Failed to find partition %s after changing the activity")% partition)