diff options
Diffstat (limited to 'meta/lib/oe/package_manager.py')
-rw-r--r-- | meta/lib/oe/package_manager.py | 376 |
1 files changed, 211 insertions, 165 deletions
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py index ec96bb3d62..0cdf3b0857 100644 --- a/meta/lib/oe/package_manager.py +++ b/meta/lib/oe/package_manager.py | |||
@@ -219,6 +219,213 @@ class DpkgIndexer(Indexer): | |||
219 | return(result) | 219 | return(result) |
220 | 220 | ||
221 | 221 | ||
222 | class PkgsList(object): | ||
223 | __metaclass__ = ABCMeta | ||
224 | |||
225 | def __init__(self, d, rootfs_dir): | ||
226 | self.d = d | ||
227 | self.rootfs_dir = rootfs_dir | ||
228 | |||
229 | @abstractmethod | ||
230 | def list(self, format=None): | ||
231 | pass | ||
232 | |||
233 | |||
234 | class RpmPkgsList(PkgsList): | ||
235 | def __init__(self, d, rootfs_dir, arch_var=None, os_var=None): | ||
236 | super(RpmPkgsList, self).__init__(d, rootfs_dir) | ||
237 | |||
238 | self.rpm_cmd = bb.utils.which(os.getenv('PATH'), "rpm") | ||
239 | self.image_rpmlib = os.path.join(self.rootfs_dir, 'var/lib/rpm') | ||
240 | |||
241 | self.ml_prefix_list, self.ml_os_list = \ | ||
242 | RpmIndexer(d, rootfs_dir).get_ml_prefix_and_os_list(arch_var, os_var) | ||
243 | |||
244 | ''' | ||
245 | Translate the RPM/Smart format names to the OE multilib format names | ||
246 | ''' | ||
247 | def _pkg_translate_smart_to_oe(self, pkg, arch): | ||
248 | new_pkg = pkg | ||
249 | fixed_arch = arch.replace('_', '-') | ||
250 | found = 0 | ||
251 | for mlib in self.ml_prefix_list: | ||
252 | for cmp_arch in self.ml_prefix_list[mlib]: | ||
253 | fixed_cmp_arch = cmp_arch.replace('_', '-') | ||
254 | if fixed_arch == fixed_cmp_arch: | ||
255 | if mlib == 'default': | ||
256 | new_pkg = pkg | ||
257 | new_arch = cmp_arch | ||
258 | else: | ||
259 | new_pkg = mlib + '-' + pkg | ||
260 | # We need to strip off the ${mlib}_ prefix on the arch | ||
261 | new_arch = cmp_arch.replace(mlib + '_', '') | ||
262 | |||
263 | # Workaround for bug 3565. Simply look to see if we | ||
264 | # know of a package with that name, if not try again! | ||
265 | filename = os.path.join(self.d.getVar('PKGDATA_DIR', True), | ||
266 | 'runtime-reverse', | ||
267 | new_pkg) | ||
268 | if os.path.exists(filename): | ||
269 | found = 1 | ||
270 | break | ||
271 | |||
272 | if found == 1 and fixed_arch == fixed_cmp_arch: | ||
273 | break | ||
274 | #bb.note('%s, %s -> %s, %s' % (pkg, arch, new_pkg, new_arch)) | ||
275 | return new_pkg, new_arch | ||
276 | |||
277 | def _list_pkg_deps(self): | ||
278 | cmd = [bb.utils.which(os.getenv('PATH'), "rpmresolve"), | ||
279 | "-t", self.image_rpmlib] | ||
280 | |||
281 | try: | ||
282 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).strip() | ||
283 | except subprocess.CalledProcessError as e: | ||
284 | bb.fatal("Cannot get the package dependencies. Command '%s' " | ||
285 | "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output)) | ||
286 | |||
287 | return output | ||
288 | |||
289 | def list(self, format=None): | ||
290 | if format == "deps": | ||
291 | return self._list_pkg_deps() | ||
292 | |||
293 | cmd = self.rpm_cmd + ' --root ' + self.rootfs_dir | ||
294 | cmd += ' -D "_dbpath /var/lib/rpm" -qa' | ||
295 | cmd += " --qf '[%{NAME} %{ARCH} %{VERSION} %{PACKAGEORIGIN}\n]'" | ||
296 | |||
297 | try: | ||
298 | # bb.note(cmd) | ||
299 | tmp_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip() | ||
300 | |||
301 | rpm_db_locks = glob.glob('%s/var/lib/rpm/__db.*' % self.rootfs_dir) | ||
302 | for f in rpm_db_locks: | ||
303 | bb.utils.remove(f, True) | ||
304 | except subprocess.CalledProcessError as e: | ||
305 | bb.fatal("Cannot get the installed packages list. Command '%s' " | ||
306 | "returned %d:\n%s" % (cmd, e.returncode, e.output)) | ||
307 | |||
308 | output = list() | ||
309 | for line in tmp_output.split('\n'): | ||
310 | if len(line.strip()) == 0: | ||
311 | continue | ||
312 | pkg = line.split()[0] | ||
313 | arch = line.split()[1] | ||
314 | ver = line.split()[2] | ||
315 | pkgorigin = line.split()[3] | ||
316 | new_pkg, new_arch = self._pkg_translate_smart_to_oe(pkg, arch) | ||
317 | |||
318 | if format == "arch": | ||
319 | output.append('%s %s' % (new_pkg, new_arch)) | ||
320 | elif format == "file": | ||
321 | output.append('%s %s %s' % (new_pkg, pkgorigin, new_arch)) | ||
322 | elif format == "ver": | ||
323 | output.append('%s %s %s' % (new_pkg, new_arch, ver)) | ||
324 | else: | ||
325 | output.append('%s' % (new_pkg)) | ||
326 | |||
327 | output.sort() | ||
328 | |||
329 | return '\n'.join(output) | ||
330 | |||
331 | |||
332 | class OpkgPkgsList(PkgsList): | ||
333 | def __init__(self, d, rootfs_dir, config_file): | ||
334 | super(OpkgPkgsList, self).__init__(d, rootfs_dir) | ||
335 | |||
336 | self.opkg_cmd = bb.utils.which(os.getenv('PATH'), "opkg-cl") | ||
337 | self.opkg_args = "-f %s -o %s " % (config_file, rootfs_dir) | ||
338 | self.opkg_args += self.d.getVar("OPKG_ARGS", True) | ||
339 | |||
340 | def list(self, format=None): | ||
341 | opkg_query_cmd = bb.utils.which(os.getenv('PATH'), "opkg-query-helper.py") | ||
342 | |||
343 | if format == "arch": | ||
344 | cmd = "%s %s status | %s -a" % \ | ||
345 | (self.opkg_cmd, self.opkg_args, opkg_query_cmd) | ||
346 | elif format == "file": | ||
347 | cmd = "%s %s status | %s -f" % \ | ||
348 | (self.opkg_cmd, self.opkg_args, opkg_query_cmd) | ||
349 | elif format == "ver": | ||
350 | cmd = "%s %s status | %s -v" % \ | ||
351 | (self.opkg_cmd, self.opkg_args, opkg_query_cmd) | ||
352 | elif format == "deps": | ||
353 | cmd = "%s %s status | %s" % \ | ||
354 | (self.opkg_cmd, self.opkg_args, opkg_query_cmd) | ||
355 | else: | ||
356 | cmd = "%s %s list_installed | cut -d' ' -f1" % \ | ||
357 | (self.opkg_cmd, self.opkg_args) | ||
358 | |||
359 | try: | ||
360 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip() | ||
361 | except subprocess.CalledProcessError as e: | ||
362 | bb.fatal("Cannot get the installed packages list. Command '%s' " | ||
363 | "returned %d:\n%s" % (cmd, e.returncode, e.output)) | ||
364 | |||
365 | if output and format == "file": | ||
366 | tmp_output = "" | ||
367 | for line in output.split('\n'): | ||
368 | pkg, pkg_file, pkg_arch = line.split() | ||
369 | full_path = os.path.join(self.rootfs_dir, pkg_arch, pkg_file) | ||
370 | if os.path.exists(full_path): | ||
371 | tmp_output += "%s %s %s\n" % (pkg, full_path, pkg_arch) | ||
372 | else: | ||
373 | tmp_output += "%s %s %s\n" % (pkg, pkg_file, pkg_arch) | ||
374 | |||
375 | output = tmp_output | ||
376 | |||
377 | return output | ||
378 | |||
379 | |||
380 | class DpkgPkgsList(PkgsList): | ||
381 | def list(self, format=None): | ||
382 | cmd = [bb.utils.which(os.getenv('PATH'), "dpkg-query"), | ||
383 | "--admindir=%s/var/lib/dpkg" % self.rootfs_dir, | ||
384 | "-W"] | ||
385 | |||
386 | if format == "arch": | ||
387 | cmd.append("-f=${Package} ${PackageArch}\n") | ||
388 | elif format == "file": | ||
389 | cmd.append("-f=${Package} ${Package}_${Version}_${Architecture}.deb ${PackageArch}\n") | ||
390 | elif format == "ver": | ||
391 | cmd.append("-f=${Package} ${PackageArch} ${Version}\n") | ||
392 | elif format == "deps": | ||
393 | cmd.append("-f=Package: ${Package}\nDepends: ${Depends}\nRecommends: ${Recommends}\n\n") | ||
394 | else: | ||
395 | cmd.append("-f=${Package}\n") | ||
396 | |||
397 | try: | ||
398 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).strip() | ||
399 | except subprocess.CalledProcessError as e: | ||
400 | bb.fatal("Cannot get the installed packages list. Command '%s' " | ||
401 | "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output)) | ||
402 | |||
403 | if format == "file": | ||
404 | tmp_output = "" | ||
405 | for line in tuple(output.split('\n')): | ||
406 | pkg, pkg_file, pkg_arch = line.split() | ||
407 | full_path = os.path.join(self.rootfs_dir, pkg_arch, pkg_file) | ||
408 | if os.path.exists(full_path): | ||
409 | tmp_output += "%s %s %s\n" % (pkg, full_path, pkg_arch) | ||
410 | else: | ||
411 | tmp_output += "%s %s %s\n" % (pkg, pkg_file, pkg_arch) | ||
412 | |||
413 | output = tmp_output | ||
414 | elif format == "deps": | ||
415 | opkg_query_cmd = bb.utils.which(os.getenv('PATH'), "opkg-query-helper.py") | ||
416 | |||
417 | try: | ||
418 | output = subprocess.check_output("echo -e '%s' | %s" % | ||
419 | (output, opkg_query_cmd), | ||
420 | stderr=subprocess.STDOUT, | ||
421 | shell=True) | ||
422 | except subprocess.CalledProcessError as e: | ||
423 | bb.fatal("Cannot compute packages dependencies. Command '%s' " | ||
424 | "returned %d:\n%s" % (e.cmd, e.returncode, e.output)) | ||
425 | |||
426 | return output | ||
427 | |||
428 | |||
222 | class PackageManager(object): | 429 | class PackageManager(object): |
223 | """ | 430 | """ |
224 | This is an abstract class. Do not instantiate this directly. | 431 | This is an abstract class. Do not instantiate this directly. |
@@ -366,10 +573,10 @@ class RpmPM(PackageManager): | |||
366 | bb.utils.mkdirhier(self.d.expand('${T}/saved')) | 573 | bb.utils.mkdirhier(self.d.expand('${T}/saved')) |
367 | 574 | ||
368 | self.indexer = RpmIndexer(self.d, self.deploy_dir) | 575 | self.indexer = RpmIndexer(self.d, self.deploy_dir) |
576 | self.pkgs_list = RpmPkgsList(self.d, self.target_rootfs, arch_var, os_var) | ||
369 | 577 | ||
370 | self.ml_prefix_list, self.ml_os_list = self.indexer.get_ml_prefix_and_os_list(arch_var, os_var) | 578 | self.ml_prefix_list, self.ml_os_list = self.indexer.get_ml_prefix_and_os_list(arch_var, os_var) |
371 | 579 | ||
372 | |||
373 | def insert_feeds_uris(self): | 580 | def insert_feeds_uris(self): |
374 | if self.feed_uris == "": | 581 | if self.feed_uris == "": |
375 | return | 582 | return |
@@ -448,39 +655,6 @@ class RpmPM(PackageManager): | |||
448 | bb.fatal("Could not invoke smart. Command " | 655 | bb.fatal("Could not invoke smart. Command " |
449 | "'%s' returned %d:\n%s" % (cmd, e.returncode, e.output)) | 656 | "'%s' returned %d:\n%s" % (cmd, e.returncode, e.output)) |
450 | 657 | ||
451 | ''' | ||
452 | Translate the RPM/Smart format names to the OE multilib format names | ||
453 | ''' | ||
454 | def _pkg_translate_smart_to_oe(self, pkg, arch): | ||
455 | new_pkg = pkg | ||
456 | fixed_arch = arch.replace('_', '-') | ||
457 | found = 0 | ||
458 | for mlib in self.ml_prefix_list: | ||
459 | for cmp_arch in self.ml_prefix_list[mlib]: | ||
460 | fixed_cmp_arch = cmp_arch.replace('_', '-') | ||
461 | if fixed_arch == fixed_cmp_arch: | ||
462 | if mlib == 'default': | ||
463 | new_pkg = pkg | ||
464 | new_arch = cmp_arch | ||
465 | else: | ||
466 | new_pkg = mlib + '-' + pkg | ||
467 | # We need to strip off the ${mlib}_ prefix on the arch | ||
468 | new_arch = cmp_arch.replace(mlib + '_', '') | ||
469 | |||
470 | # Workaround for bug 3565. Simply look to see if we | ||
471 | # know of a package with that name, if not try again! | ||
472 | filename = os.path.join(self.d.getVar('PKGDATA_DIR', True), | ||
473 | 'runtime-reverse', | ||
474 | new_pkg) | ||
475 | if os.path.exists(filename): | ||
476 | found = 1 | ||
477 | break | ||
478 | |||
479 | if found == 1 and fixed_arch == fixed_cmp_arch: | ||
480 | break | ||
481 | #bb.note('%s, %s -> %s, %s' % (pkg, arch, new_pkg, new_arch)) | ||
482 | return new_pkg, new_arch | ||
483 | |||
484 | def _search_pkg_name_in_feeds(self, pkg, feed_archs): | 658 | def _search_pkg_name_in_feeds(self, pkg, feed_archs): |
485 | for arch in feed_archs: | 659 | for arch in feed_archs: |
486 | arch = arch.replace('-', '_') | 660 | arch = arch.replace('-', '_') |
@@ -821,56 +995,8 @@ class RpmPM(PackageManager): | |||
821 | self.image_rpmlib, | 995 | self.image_rpmlib, |
822 | symlinks=True) | 996 | symlinks=True) |
823 | 997 | ||
824 | def _list_pkg_deps(self): | ||
825 | cmd = [bb.utils.which(os.getenv('PATH'), "rpmresolve"), | ||
826 | "-t", self.image_rpmlib] | ||
827 | |||
828 | try: | ||
829 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).strip() | ||
830 | except subprocess.CalledProcessError as e: | ||
831 | bb.fatal("Cannot get the package dependencies. Command '%s' " | ||
832 | "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output)) | ||
833 | |||
834 | return output | ||
835 | |||
836 | def list_installed(self, format=None): | 998 | def list_installed(self, format=None): |
837 | if format == "deps": | 999 | return self.pkgs_list.list(format) |
838 | return self._list_pkg_deps() | ||
839 | |||
840 | cmd = self.rpm_cmd + ' --root ' + self.target_rootfs | ||
841 | cmd += ' -D "_dbpath /var/lib/rpm" -qa' | ||
842 | cmd += " --qf '[%{NAME} %{ARCH} %{VERSION} %{PACKAGEORIGIN}\n]'" | ||
843 | |||
844 | try: | ||
845 | # bb.note(cmd) | ||
846 | tmp_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip() | ||
847 | self._unlock_rpm_db() | ||
848 | except subprocess.CalledProcessError as e: | ||
849 | bb.fatal("Cannot get the installed packages list. Command '%s' " | ||
850 | "returned %d:\n%s" % (cmd, e.returncode, e.output)) | ||
851 | |||
852 | output = list() | ||
853 | for line in tmp_output.split('\n'): | ||
854 | if len(line.strip()) == 0: | ||
855 | continue | ||
856 | pkg = line.split()[0] | ||
857 | arch = line.split()[1] | ||
858 | ver = line.split()[2] | ||
859 | pkgorigin = line.split()[3] | ||
860 | new_pkg, new_arch = self._pkg_translate_smart_to_oe(pkg, arch) | ||
861 | |||
862 | if format == "arch": | ||
863 | output.append('%s %s' % (new_pkg, new_arch)) | ||
864 | elif format == "file": | ||
865 | output.append('%s %s %s' % (new_pkg, pkgorigin, new_arch)) | ||
866 | elif format == "ver": | ||
867 | output.append('%s %s %s' % (new_pkg, new_arch, ver)) | ||
868 | else: | ||
869 | output.append('%s' % (new_pkg)) | ||
870 | |||
871 | output.sort() | ||
872 | |||
873 | return '\n'.join(output) | ||
874 | 1000 | ||
875 | ''' | 1001 | ''' |
876 | If incremental install, we need to determine what we've got, | 1002 | If incremental install, we need to determine what we've got, |
@@ -1213,43 +1339,7 @@ class OpkgPM(PackageManager): | |||
1213 | bb.utils.mkdirhier(self.opkg_dir) | 1339 | bb.utils.mkdirhier(self.opkg_dir) |
1214 | 1340 | ||
1215 | def list_installed(self, format=None): | 1341 | def list_installed(self, format=None): |
1216 | opkg_query_cmd = bb.utils.which(os.getenv('PATH'), "opkg-query-helper.py") | 1342 | return OpkgPkgsList(self.d, self.target_rootfs, self.config_file).list(format) |
1217 | |||
1218 | if format == "arch": | ||
1219 | cmd = "%s %s status | %s -a" % \ | ||
1220 | (self.opkg_cmd, self.opkg_args, opkg_query_cmd) | ||
1221 | elif format == "file": | ||
1222 | cmd = "%s %s status | %s -f" % \ | ||
1223 | (self.opkg_cmd, self.opkg_args, opkg_query_cmd) | ||
1224 | elif format == "ver": | ||
1225 | cmd = "%s %s status | %s -v" % \ | ||
1226 | (self.opkg_cmd, self.opkg_args, opkg_query_cmd) | ||
1227 | elif format == "deps": | ||
1228 | cmd = "%s %s status | %s" % \ | ||
1229 | (self.opkg_cmd, self.opkg_args, opkg_query_cmd) | ||
1230 | else: | ||
1231 | cmd = "%s %s list_installed | cut -d' ' -f1" % \ | ||
1232 | (self.opkg_cmd, self.opkg_args) | ||
1233 | |||
1234 | try: | ||
1235 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip() | ||
1236 | except subprocess.CalledProcessError as e: | ||
1237 | bb.fatal("Cannot get the installed packages list. Command '%s' " | ||
1238 | "returned %d:\n%s" % (cmd, e.returncode, e.output)) | ||
1239 | |||
1240 | if output and format == "file": | ||
1241 | tmp_output = "" | ||
1242 | for line in output.split('\n'): | ||
1243 | pkg, pkg_file, pkg_arch = line.split() | ||
1244 | full_path = os.path.join(self.deploy_dir, pkg_arch, pkg_file) | ||
1245 | if os.path.exists(full_path): | ||
1246 | tmp_output += "%s %s %s\n" % (pkg, full_path, pkg_arch) | ||
1247 | else: | ||
1248 | tmp_output += "%s %s %s\n" % (pkg, pkg_file, pkg_arch) | ||
1249 | |||
1250 | output = tmp_output | ||
1251 | |||
1252 | return output | ||
1253 | 1343 | ||
1254 | def handle_bad_recommendations(self): | 1344 | def handle_bad_recommendations(self): |
1255 | bad_recommendations = self.d.getVar("BAD_RECOMMENDATIONS", True) or "" | 1345 | bad_recommendations = self.d.getVar("BAD_RECOMMENDATIONS", True) or "" |
@@ -1600,51 +1690,7 @@ class DpkgPM(PackageManager): | |||
1600 | "returned %d:\n%s" % (cmd, e.returncode, e.output)) | 1690 | "returned %d:\n%s" % (cmd, e.returncode, e.output)) |
1601 | 1691 | ||
1602 | def list_installed(self, format=None): | 1692 | def list_installed(self, format=None): |
1603 | cmd = [bb.utils.which(os.getenv('PATH'), "dpkg-query"), | 1693 | return DpkgPkgsList(self.d, self.target_rootfs).list() |
1604 | "--admindir=%s/var/lib/dpkg" % self.target_rootfs, | ||
1605 | "-W"] | ||
1606 | |||
1607 | if format == "arch": | ||
1608 | cmd.append("-f=${Package} ${PackageArch}\n") | ||
1609 | elif format == "file": | ||
1610 | cmd.append("-f=${Package} ${Package}_${Version}_${Architecture}.deb ${PackageArch}\n") | ||
1611 | elif format == "ver": | ||
1612 | cmd.append("-f=${Package} ${PackageArch} ${Version}\n") | ||
1613 | elif format == "deps": | ||
1614 | cmd.append("-f=Package: ${Package}\nDepends: ${Depends}\nRecommends: ${Recommends}\n\n") | ||
1615 | else: | ||
1616 | cmd.append("-f=${Package}\n") | ||
1617 | |||
1618 | try: | ||
1619 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).strip() | ||
1620 | except subprocess.CalledProcessError as e: | ||
1621 | bb.fatal("Cannot get the installed packages list. Command '%s' " | ||
1622 | "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output)) | ||
1623 | |||
1624 | if format == "file": | ||
1625 | tmp_output = "" | ||
1626 | for line in tuple(output.split('\n')): | ||
1627 | pkg, pkg_file, pkg_arch = line.split() | ||
1628 | full_path = os.path.join(self.deploy_dir, pkg_arch, pkg_file) | ||
1629 | if os.path.exists(full_path): | ||
1630 | tmp_output += "%s %s %s\n" % (pkg, full_path, pkg_arch) | ||
1631 | else: | ||
1632 | tmp_output += "%s %s %s\n" % (pkg, pkg_file, pkg_arch) | ||
1633 | |||
1634 | output = tmp_output | ||
1635 | elif format == "deps": | ||
1636 | opkg_query_cmd = bb.utils.which(os.getenv('PATH'), "opkg-query-helper.py") | ||
1637 | |||
1638 | try: | ||
1639 | output = subprocess.check_output("echo -e '%s' | %s" % | ||
1640 | (output, opkg_query_cmd), | ||
1641 | stderr=subprocess.STDOUT, | ||
1642 | shell=True) | ||
1643 | except subprocess.CalledProcessError as e: | ||
1644 | bb.fatal("Cannot compute packages dependencies. Command '%s' " | ||
1645 | "returned %d:\n%s" % (e.cmd, e.returncode, e.output)) | ||
1646 | |||
1647 | return output | ||
1648 | 1694 | ||
1649 | 1695 | ||
1650 | def generate_index_files(d): | 1696 | def generate_index_files(d): |