Beispiel #1
0
	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)
Beispiel #2
0
 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)
Beispiel #3
0
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)
Beispiel #4
0
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
Beispiel #5
0
 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
Beispiel #6
0
	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)
Beispiel #7
0
	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)
Beispiel #8
0
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