def get_pkg_info(rpm_path): '''Gathers information from the rpm file in three custom tags: PKGTYPE, PACKAGEPRESENCE, PACKAGETYPE.''' try: info = None name = rpm_path.split('/')[-1].strip() print('Analyzing:', rpm_path.split('/')[-1].strip()) command = "/auto/thirdparty-sdk/host-x86_64/lib/rpm-5.1.9/rpm -qp --qf '%{PKGTYPE} %{PACKAGEPRESENCE} %{PACKAGETYPE}' "+rpm_path + ' 2>/dev/null' cmd = utools.run_cmd(command) info = cmd.stdout.decode().split(' ') flag = 0 for i in range(len(info)): info[i] = info[i].strip() if info[i] == '(none)': flag += 1 if flag == 3: return Rpm.get_groups(rpm_path) if info[0].strip() == '(none)': info[0] = 'PD' if 'iosxr' in name: info[0] = 'PI' for i in range(len(info)): info[i] = info[i].strip() return info except subprocess.CalledProcessError as e: logging.debug(str(e)) return Rpm.get_groups(rpm_path) except Exception as e: logging.debug(str(e)) print("Program encountered a fatal error. Execution cannot proceed. Exiting") sys.exit(1)
def from_path(cls, rpm_extract_location, rpm_path): name = rpm_path.split('/')[-1].strip() elfs = RPM.get_elfs(rpm_extract_location) command = "rpm -qp --qf '%{NAME} %{VERSION}' " + rpm_path + " 2>/dev/null" cmd = utools.run_cmd(command) isReload = is_reload_rpm5(rpm_path) pkg_name, pkg_version = cmd.stdout.decode().split(' ') return RPM(name, rpm_path, elfs, pkg_name, pkg_version, isReload)
def is_reload_rpm5(rpm_path): command = "/auto/thirdparty-sdk/host-x86_64/lib/rpm-5.1.9/rpm -qp --qf '%{RESTARTTYPE}\n' " + rpm_path + " 2> /dev/null" try: op = utools.run_cmd(command) if "reboot" in op.stdout.decode().strip(): return True return False except subprocess.CalledProcessError: Print("Fatal Error!") sys.exit(1)
def get_SMU_info(SMU_path): try: SMU_path = os.path.abspath(SMU_path) SMU_Dir = SMU_path.rsplit( '/', 1)[0] + '/' + SMU_path.split('/')[-1].strip().replace( '.', "") #print(SMU_Dir) utools.run_cmd('rm -rf ' + SMU_Dir) os.mkdir(SMU_Dir) utools.run_cmd('tar -xf ' + SMU_path + ' -C ' + SMU_Dir) RPMs = [] for rpm in os.listdir(SMU_Dir): if '.rpm' in rpm: RPMs.append(get_RPM(SMU_Dir + '/' + rpm)) return RPMs except FileNotFoundError as fe: print(str(fe)) raise
def get_elfs(cls, rpm_extract_location): command = "find " + rpm_extract_location + " -name '*'" + " 2>/dev/null" elfs = [] try: out = utools.run_cmd(command) files = out.stdout.decode().split('\n') for f in files: f = f.strip() if f is '': continue if RPM.is_elf(f): md5 = os.popen('md5sum ' + f).read().split(' ')[0].strip() elfs.append(ELF.ELF.from_path(f, md5)) return elfs except Exception as e: print(str(e)) raise
def from_rpm(cls, rpm_path): '''Builds Rpm object when path to rpm file is given.''' folder = rpm_path.split('/')[-1].strip().replace('.rpm', '').replace('.','') command = './extract_rpm.sh ' + rpm_path +" "+ folder + ' 2>/dev/null' try: cmd = utools.run_cmd(command) extacted_path = os.path.dirname(rpm_path)+'/'+folder+'/opt/cisco/calvados/packages/' if 'sysadmin' not in rpm_path.split('/')[-1]: extacted_path = os.path.dirname(rpm_path)+'/'+folder+'/opt/cisco/XR/packages/' return Rpm.from_path([extacted_path, rpm_path]) except subprocess.CalledProcessError as e: logging.error(str(e)) print('Encountered error while extracting: '+rpm_path.split('/')[-1]+' Exiting ...') sys.exit(1) except Exception as e: logging.error(str(e)) print("Fatal Error!") sys.exit(1)
def from_path(cls, args): """ Builds the Rpm object when path to Rpm is given. Arguements ---------- args[0]: string location where rpm is extracted. args[1]: string location of unextracted rpm file. Returns ------- Rpm object. """ path = args[0] rpm_path = args[1] path = os.path.abspath(path) name = rpm_path.split('/')[-1].strip() elfs = Rpm.get_elfs(path) deps = [] with confu.ProcessPoolExecutor() as executor: for e in executor.map(Deps.from_path, elfs): if e != None: deps.append(e) try: #/auto/thirdparty-sdk/host-x86_64/lib/rpm-5.1.9/rpm -qp --qf "%{PKGTYPE} %{PACKAGEPRESENCE} %{PACKAGETYPE}" ncs5500-li-1.0.0.0-r711.x86_64.rpm info = Rpm.get_pkg_info(rpm_path) provides = Rpm.parse(rpm_path) requires = Rpm.get_reqs(rpm_path) command = "rpm -qp --qf '%{NAME} %{VERSION}' "+rpm_path+ " 2>/dev/null" cmd = utools.run_cmd(command) pkg_name, pkg_version = cmd.stdout.decode().split(' ') return Rpm(name, info[0], info[1], info[2], deps, rpm_path, provides, requires, pkg_name, pkg_version) except subprocess.CalledProcessError as e: print('Failed to find name and version for: '+rpm_path) return None except TypeError: print('Unable to find gather metadata from: '+rpm_path.split('/')[-1]) print('Exiting ...') sys.exit(1) except Exception as e: print(str(e)) sys.exit(1)
def get_RPM(rpm_path): folder = rpm_path.split('/')[-1].strip().replace('.rpm', '').replace('.', '') command = './extract_rpm.sh ' + rpm_path + " " + rpm_path.rsplit( "/", 1)[0] + "/" + folder + ' 2>/dev/null' try: cmd = utools.run_cmd(command) extracted_path = os.path.dirname( rpm_path) + '/' + folder + '/opt/cisco/calvados/packages/' if 'sysadmin' not in rpm_path.split( '/')[-1] or 'admin' not in rpm_path.split('/')[-1]: #print(rpm_path.split('/')[-1]) #sys.exit(0) extracted_path = os.path.dirname( rpm_path) + '/' + folder + '/opt/cisco/XR/packages/' return RPM.from_path(extracted_path, rpm_path) except Exception as e: print(str(e)) raise