summaryrefslogtreecommitdiffstats
path: root/meta/lib/oe/package_manager.py
diff options
context:
space:
mode:
authorMariano Lopez <mariano.lopez@linux.intel.com>2016-01-18 14:33:04 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-01-20 17:07:15 +0000
commitc708411f20f8944eaabce40121b61e17d26e8a15 (patch)
treef5fed6f77be0c8c0aaae69149cc396f48676425e /meta/lib/oe/package_manager.py
parent113e1365a88c5bcdaa8f6b06146de6ff2454a385 (diff)
downloadpoky-c708411f20f8944eaabce40121b61e17d26e8a15.tar.gz
lib/oe/package_manager: Add list_pkgs() to PkgsList class
Currently the class PkgList returns a formated string of the installed packages. It would be more clean to pass a standard data structure to the callers instead to format the output inside PkgsList class. This patch adds list_pkgs() method to PkgsList class to get the all the information for installed packages and return a dictionary with the info. [YOCTO #7427] (From OE-Core rev: 6cbb144a86a8188fad102bb281fd9e8d0a4b9142) Signed-off-by: Mariano Lopez <mariano.lopez@linux.intel.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oe/package_manager.py')
-rw-r--r--meta/lib/oe/package_manager.py135
1 files changed, 135 insertions, 0 deletions
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py
index bc397213ae..79cadda682 100644
--- a/meta/lib/oe/package_manager.py
+++ b/meta/lib/oe/package_manager.py
@@ -296,6 +296,60 @@ class PkgsList(object):
296 def list(self, format=None): 296 def list(self, format=None):
297 pass 297 pass
298 298
299 @abstractmethod
300 def list_pkgs(self):
301 pass
302
303
304 """
305 This method parse the output from the package manager
306 and return a dictionary with the information of the
307 installed packages. This is used whne the packages are
308 in deb or ipk format
309 """
310 def opkg_query(self, cmd_output):
311 verregex = re.compile(' \([=<>]* [^ )]*\)')
312 output = dict()
313 filename = ""
314 dep = []
315 for line in cmd_output.splitlines():
316 line = line.rstrip()
317 if ':' in line:
318 if line.startswith("Package: "):
319 pkg = line.split(": ")[1]
320 elif line.startswith("Architecture: "):
321 arch = line.split(": ")[1]
322 elif line.startswith("Version: "):
323 ver = line.split(": ")[1]
324 elif line.startswith("File: "):
325 filename = line.split(": ")[1]
326 elif line.startswith("Depends: "):
327 depends = verregex.sub('', line.split(": ")[1])
328 for depend in depends.split(", "):
329 dep.append(depend)
330 elif line.startswith("Recommends: "):
331 recommends = verregex.sub('', line.split(": ")[1])
332 for recommend in recommends.split(", "):
333 dep.append("%s [REC]" % recommend)
334 else:
335 # IPK doesn't include the filename
336 if not filename:
337 filename = "%s_%s_%s.ipk" % (pkg, ver, arch)
338 if pkg:
339 output[pkg] = {"arch":arch, "ver":ver,
340 "filename":filename, "deps": dep }
341 pkg = ""
342 filename = ""
343 dep = []
344
345 if pkg:
346 if not filename:
347 filename = "%s_%s_%s.ipk" % (pkg, ver, arch)
348 output[pkg] = {"arch":arch, "ver":ver,
349 "filename":filename, "deps": dep }
350
351 return output
352
299 353
300class RpmPkgsList(PkgsList): 354class RpmPkgsList(PkgsList):
301 def __init__(self, d, rootfs_dir, arch_var=None, os_var=None): 355 def __init__(self, d, rootfs_dir, arch_var=None, os_var=None):
@@ -412,6 +466,59 @@ class RpmPkgsList(PkgsList):
412 466
413 return '\n'.join(output) 467 return '\n'.join(output)
414 468
469 def list_pkgs(self):
470 cmd = self.rpm_cmd + ' --root ' + self.rootfs_dir
471 cmd += ' -D "_dbpath /var/lib/rpm" -qa'
472 if self.rpm_version == 4:
473 cmd += " --qf '[%{NAME} %{ARCH} %{VERSION}\n]'"
474 else:
475 cmd += " --qf '[%{NAME} %{ARCH} %{VERSION} %{PACKAGEORIGIN}\n]'"
476
477 try:
478 # bb.note(cmd)
479 tmp_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip()
480 except subprocess.CalledProcessError as e:
481 bb.fatal("Cannot get the installed packages list. Command '%s' "
482 "returned %d:\n%s" % (cmd, e.returncode, e.output))
483
484 output = dict()
485 deps = dict()
486 if self.rpm_version == 4:
487 bb.warn("Dependency listings are not supported with rpm 4 since rpmresolve does not work")
488 dependencies = ""
489 else:
490 dependencies = self._list_pkg_deps()
491
492 # Populate deps dictionary for better manipulation
493 for line in dependencies.splitlines():
494 pkg, dep = line.split("|")
495 if not pkg in deps:
496 deps[pkg] = list()
497 if not dep in deps[pkg]:
498 deps[pkg].append(dep)
499
500 for line in tmp_output.split('\n'):
501 if len(line.strip()) == 0:
502 continue
503 pkg = line.split()[0]
504 arch = line.split()[1]
505 ver = line.split()[2]
506 dep = deps.get(pkg, [])
507
508 # Skip GPG keys
509 if pkg == 'gpg-pubkey':
510 continue
511 if self.rpm_version == 4:
512 pkgorigin = "unknown"
513 else:
514 pkgorigin = line.split()[3]
515 new_pkg, new_arch = self._pkg_translate_smart_to_oe(pkg, arch)
516
517 output[new_pkg] = {"arch":new_arch, "ver":ver,
518 "filename":pkgorigin, "deps":dep}
519
520 return output
521
415 522
416class OpkgPkgsList(PkgsList): 523class OpkgPkgsList(PkgsList):
417 def __init__(self, d, rootfs_dir, config_file): 524 def __init__(self, d, rootfs_dir, config_file):
@@ -466,6 +573,19 @@ class OpkgPkgsList(PkgsList):
466 573
467 return '\n'.join(output) 574 return '\n'.join(output)
468 575
576 def list_pkgs(self, format=None):
577 cmd = "%s %s status" % (self.opkg_cmd, self.opkg_args)
578
579 try:
580 # bb.note(cmd)
581 cmd_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip()
582
583 except subprocess.CalledProcessError as e:
584 bb.fatal("Cannot get the installed packages list. Command '%s' "
585 "returned %d:\n%s" % (cmd, e.returncode, e.output))
586
587 return self.opkg_query(cmd_output)
588
469 589
470class DpkgPkgsList(PkgsList): 590class DpkgPkgsList(PkgsList):
471 def list(self, format=None): 591 def list(self, format=None):
@@ -523,6 +643,21 @@ class DpkgPkgsList(PkgsList):
523 643
524 return output 644 return output
525 645
646 def list_pkgs(self):
647 cmd = [bb.utils.which(os.getenv('PATH'), "dpkg-query"),
648 "--admindir=%s/var/lib/dpkg" % self.rootfs_dir,
649 "-W"]
650
651 cmd.append("-f=Package: ${Package}\nArchitecture: ${PackageArch}\nVersion: ${Version}\nFile: ${Package}_${Version}_${Architecture}.deb\nDepends: ${Depends}\nRecommends: ${Recommends}\n\n")
652
653 try:
654 cmd_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).strip()
655 except subprocess.CalledProcessError as e:
656 bb.fatal("Cannot get the installed packages list. Command '%s' "
657 "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output))
658
659 return self.opkg_query(cmd_output)
660
526 661
527class PackageManager(object): 662class PackageManager(object):
528 """ 663 """