summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephano Cetola <stephano.cetola@linux.intel.com>2016-12-06 07:30:59 -0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2018-04-05 15:13:47 +0100
commit8cdf2a2e36432d3d91dead2acd54c5cecbe00ff8 (patch)
treecb0829b97785ec6dd2f49fd580da32401d19a3c6
parent2d5e8043be1305c633bd44652bf1c34950214a9e (diff)
downloadpoky-8cdf2a2e36432d3d91dead2acd54c5cecbe00ff8.tar.gz
package_manager: remove strings and migrate to direct arrays
When using subprocess call and check_output, it is better to use arrays rather than strings when possible to avoid whitespace and quoting problems. [ YOCTO #9342 ] (From OE-Core rev: b12cec9a5ef14ecb02be7feec65508cf5d65c795) (From OE-Core rev: 60ba1d424636bdd5700ec3ee0acec5c19550b884) Signed-off-by: Stephano Cetola <stephano.cetola@linux.intel.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> Signed-off-by: Armin Kuster <akuster808@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/lib/oe/package.py13
-rw-r--r--meta/lib/oe/package_manager.py233
2 files changed, 121 insertions, 125 deletions
diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py
index 02642f29f0..ae60a5843e 100644
--- a/meta/lib/oe/package.py
+++ b/meta/lib/oe/package.py
@@ -18,23 +18,24 @@ def runstrip(arg):
18 newmode = origmode | stat.S_IWRITE | stat.S_IREAD 18 newmode = origmode | stat.S_IWRITE | stat.S_IREAD
19 os.chmod(file, newmode) 19 os.chmod(file, newmode)
20 20
21 extraflags = "" 21 stripcmd = [strip]
22 22
23 # kernel module 23 # kernel module
24 if elftype & 16: 24 if elftype & 16:
25 extraflags = "--strip-debug --remove-section=.comment --remove-section=.note --preserve-dates" 25 stripcmd.extend(["--strip-debug", "--remove-section=.comment",
26 "--remove-section=.note", "--preserve-dates"])
26 # .so and shared library 27 # .so and shared library
27 elif ".so" in file and elftype & 8: 28 elif ".so" in file and elftype & 8:
28 extraflags = "--remove-section=.comment --remove-section=.note --strip-unneeded" 29 stripcmd.extend(["--remove-section=.comment", "--remove-section=.note", "--strip-unneeded"])
29 # shared or executable: 30 # shared or executable:
30 elif elftype & 8 or elftype & 4: 31 elif elftype & 8 or elftype & 4:
31 extraflags = "--remove-section=.comment --remove-section=.note" 32 stripcmd.extend(["--remove-section=.comment", "--remove-section=.note"])
32 33
33 stripcmd = "'%s' %s '%s'" % (strip, extraflags, file) 34 stripcmd.append(file)
34 bb.debug(1, "runstrip: %s" % stripcmd) 35 bb.debug(1, "runstrip: %s" % stripcmd)
35 36
36 try: 37 try:
37 output = subprocess.check_output(stripcmd, stderr=subprocess.STDOUT, shell=True) 38 output = subprocess.check_output(stripcmd, stderr=subprocess.STDOUT)
38 except subprocess.CalledProcessError as e: 39 except subprocess.CalledProcessError as e:
39 bb.error("runstrip: '%s' strip command failed with %s (%s)" % (stripcmd, e.returncode, e.output)) 40 bb.error("runstrip: '%s' strip command failed with %s (%s)" % (stripcmd, e.returncode, e.output))
40 41
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py
index 7c280ae0a7..12dffe585b 100644
--- a/meta/lib/oe/package_manager.py
+++ b/meta/lib/oe/package_manager.py
@@ -358,12 +358,11 @@ class RpmPkgsList(PkgsList):
358 RpmIndexer(d, rootfs_dir).get_ml_prefix_and_os_list(arch_var, os_var) 358 RpmIndexer(d, rootfs_dir).get_ml_prefix_and_os_list(arch_var, os_var)
359 359
360 # Determine rpm version 360 # Determine rpm version
361 cmd = "%s --version" % self.rpm_cmd
362 try: 361 try:
363 output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).decode("utf-8") 362 output = subprocess.check_output([self.rpm_cmd, "--version"], stderr=subprocess.STDOUT).decode("utf-8")
364 except subprocess.CalledProcessError as e: 363 except subprocess.CalledProcessError as e:
365 bb.fatal("Getting rpm version failed. Command '%s' " 364 bb.fatal("Getting rpm version failed. Command '%s' "
366 "returned %d:\n%s" % (cmd, e.returncode, e.output.decode("utf-8"))) 365 "returned %d:\n%s" % (self.rpm_cmd, e.returncode, e.output.decode("utf-8")))
367 366
368 ''' 367 '''
369 Translate the RPM/Smart format names to the OE multilib format names 368 Translate the RPM/Smart format names to the OE multilib format names
@@ -412,16 +411,15 @@ class RpmPkgsList(PkgsList):
412 return output 411 return output
413 412
414 def list_pkgs(self): 413 def list_pkgs(self):
415 cmd = self.rpm_cmd + ' --root ' + self.rootfs_dir 414 cmd = [self.rpm_cmd, '--root', self.rootfs_dir]
416 cmd += ' -D "_dbpath /var/lib/rpm" -qa' 415 cmd.extend(['-D', '_dbpath /var/lib/rpm'])
417 cmd += " --qf '[%{NAME} %{ARCH} %{VERSION} %{PACKAGEORIGIN}\n]'" 416 cmd.extend(['-qa', '--qf', '[%{NAME} %{ARCH} %{VERSION} %{PACKAGEORIGIN}\n]'])
418 417
419 try: 418 try:
420 # bb.note(cmd) 419 tmp_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).strip().decode("utf-8")
421 tmp_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip().decode("utf-8")
422 except subprocess.CalledProcessError as e: 420 except subprocess.CalledProcessError as e:
423 bb.fatal("Cannot get the installed packages list. Command '%s' " 421 bb.fatal("Cannot get the installed packages list. Command '%s' "
424 "returned %d:\n%s" % (cmd, e.returncode, e.output.decode("utf-8"))) 422 "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output.decode("utf-8")))
425 423
426 output = dict() 424 output = dict()
427 deps = dict() 425 deps = dict()
@@ -672,11 +670,11 @@ class RpmPM(PackageManager):
672 # 2 = --log-level=debug 670 # 2 = --log-level=debug
673 # 3 = --log-level=debug plus dumps of scriplet content and command invocation 671 # 3 = --log-level=debug plus dumps of scriplet content and command invocation
674 self.debug_level = int(d.getVar('ROOTFS_RPM_DEBUG', True) or "0") 672 self.debug_level = int(d.getVar('ROOTFS_RPM_DEBUG', True) or "0")
675 self.smart_opt = "--log-level=%s --data-dir=%s" % \ 673 self.smart_opt = ["--log-level=%s" %
676 ("warning" if self.debug_level == 0 else 674 ("warning" if self.debug_level == 0 else
677 "info" if self.debug_level == 1 else 675 "info" if self.debug_level == 1 else
678 "debug", 676 "debug"), "--data-dir=%s" %
679 os.path.join(target_rootfs, 'var/lib/smart')) 677 os.path.join(target_rootfs, 'var/lib/smart')]
680 self.scriptlet_wrapper = self.d.expand('${WORKDIR}/scriptlet_wrapper') 678 self.scriptlet_wrapper = self.d.expand('${WORKDIR}/scriptlet_wrapper')
681 self.solution_manifest = self.d.expand('${T}/saved/%s_solution' % 679 self.solution_manifest = self.d.expand('${T}/saved/%s_solution' %
682 self.task_name) 680 self.task_name)
@@ -732,18 +730,18 @@ class RpmPM(PackageManager):
732 for arch in arch_list: 730 for arch in arch_list:
733 bb.note('Adding Smart channel url%d%s (%s)' % 731 bb.note('Adding Smart channel url%d%s (%s)' %
734 (uri_iterator, arch, channel_priority)) 732 (uri_iterator, arch, channel_priority))
735 self._invoke_smart('channel --add url%d-%s type=rpm-md baseurl=%s/%s -y' 733 self._invoke_smart(['channel', '--add', 'url%d-%s' % (uri_iterator, arch),
736 % (uri_iterator, arch, uri, arch)) 734 'type=rpm-md', 'baseurl=%s/%s' % (uri, arch), '-y'])
737 self._invoke_smart('channel --set url%d-%s priority=%d' % 735 self._invoke_smart(['channel', '--set', 'url%d-%s' % (uri_iterator, arch),
738 (uri_iterator, arch, channel_priority)) 736 'priority=%d' % channel_priority])
739 channel_priority -= 5 737 channel_priority -= 5
740 else: 738 else:
741 bb.note('Adding Smart channel url%d (%s)' % 739 bb.note('Adding Smart channel url%d (%s)' %
742 (uri_iterator, channel_priority)) 740 (uri_iterator, channel_priority))
743 self._invoke_smart('channel --add url%d type=rpm-md baseurl=%s -y' 741 self._invoke_smart(['channel', '--add', 'url%d' % uri_iterator,
744 % (uri_iterator, uri)) 742 'type=rpm-md', 'baseurl=%s' % uri, '-y'])
745 self._invoke_smart('channel --set url%d priority=%d' % 743 self._invoke_smart(['channel', '--set', 'url%d' % uri_iterator,
746 (uri_iterator, channel_priority)) 744 'priority=%d' % channel_priority])
747 channel_priority -= 5 745 channel_priority -= 5
748 746
749 uri_iterator += 1 747 uri_iterator += 1
@@ -774,18 +772,17 @@ class RpmPM(PackageManager):
774 772
775 self._create_configs(platform, platform_extra) 773 self._create_configs(platform, platform_extra)
776 774
775 #takes array args
777 def _invoke_smart(self, args): 776 def _invoke_smart(self, args):
778 cmd = "%s %s %s" % (self.smart_cmd, self.smart_opt, args) 777 cmd = [self.smart_cmd] + self.smart_opt + args
779 # bb.note(cmd) 778 # bb.note(cmd)
780 try: 779 try:
781 complementary_pkgs = subprocess.check_output(cmd, 780 complementary_pkgs = subprocess.check_output(cmd,stderr=subprocess.STDOUT).decode("utf-8")
782 stderr=subprocess.STDOUT,
783 shell=True).decode("utf-8")
784 # bb.note(complementary_pkgs) 781 # bb.note(complementary_pkgs)
785 return complementary_pkgs 782 return complementary_pkgs
786 except subprocess.CalledProcessError as e: 783 except subprocess.CalledProcessError as e:
787 bb.fatal("Could not invoke smart. Command " 784 bb.fatal("Could not invoke smart. Command "
788 "'%s' returned %d:\n%s" % (cmd, e.returncode, e.output.decode("utf-8"))) 785 "'%s' returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output.decode("utf-8")))
789 786
790 def _search_pkg_name_in_feeds(self, pkg, feed_archs): 787 def _search_pkg_name_in_feeds(self, pkg, feed_archs):
791 for arch in feed_archs: 788 for arch in feed_archs:
@@ -800,19 +797,23 @@ class RpmPM(PackageManager):
800 797
801 # Search provides if not found by pkgname. 798 # Search provides if not found by pkgname.
802 bb.note('Not found %s by name, searching provides ...' % pkg) 799 bb.note('Not found %s by name, searching provides ...' % pkg)
803 cmd = "%s %s query --provides %s --show-format='$name-$version'" % \ 800 cmd = [self.smart_cmd] + self.smart_opt + ["query", "--provides", pkg,
804 (self.smart_cmd, self.smart_opt, pkg) 801 "--show-format=$name-$version"]
805 cmd += " | sed -ne 's/ *Provides://p'" 802 bb.note('cmd: %s' % ' '.join(cmd))
806 bb.note('cmd: %s' % cmd) 803 ps = subprocess.Popen(cmd, stdout=subprocess.PIPE)
807 output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).decode("utf-8") 804 try:
808 # Found a provider 805 output = subprocess.check_output(["sed", "-ne", "s/ *Provides://p"],
809 if output: 806 stdin=ps.stdout, stderr=subprocess.STDOUT).decode("utf-8")
810 bb.note('Found providers for %s: %s' % (pkg, output)) 807 # Found a provider
811 for p in output.split(): 808 if output:
812 for arch in feed_archs: 809 bb.note('Found providers for %s: %s' % (pkg, output))
813 arch = arch.replace('-', '_') 810 for p in output.split():
814 if p.rstrip().endswith('@' + arch): 811 for arch in feed_archs:
815 return p 812 arch = arch.replace('-', '_')
813 if p.rstrip().endswith('@' + arch):
814 return p
815 except subprocess.CalledProcessError as e:
816 bb.error("Failed running smart query on package %s." % pkg)
816 817
817 return "" 818 return ""
818 819
@@ -949,30 +950,32 @@ class RpmPM(PackageManager):
949 open(db_config_dir, 'w+').write(DB_CONFIG_CONTENT) 950 open(db_config_dir, 'w+').write(DB_CONFIG_CONTENT)
950 951
951 # Create database so that smart doesn't complain (lazy init) 952 # Create database so that smart doesn't complain (lazy init)
952 opt = "-qa" 953 cmd = [self.rpm_cmd, '--root', self.target_rootfs, '--dbpath', '/var/lib/rpm', '-qa']
953 cmd = "%s --root %s --dbpath /var/lib/rpm %s > /dev/null" % (
954 self.rpm_cmd, self.target_rootfs, opt)
955 try: 954 try:
956 subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) 955 subprocess.check_output(cmd, stderr=subprocess.STDOUT)
957 except subprocess.CalledProcessError as e: 956 except subprocess.CalledProcessError as e:
958 bb.fatal("Create rpm database failed. Command '%s' " 957 bb.fatal("Create rpm database failed. Command '%s' "
959 "returned %d:\n%s" % (cmd, e.returncode, e.output.decode("utf-8"))) 958 "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output.decode("utf-8")))
960 # Import GPG key to RPM database of the target system 959 # Import GPG key to RPM database of the target system
961 if self.d.getVar('RPM_SIGN_PACKAGES', True) == '1': 960 if self.d.getVar('RPM_SIGN_PACKAGES', True) == '1':
962 pubkey_path = self.d.getVar('RPM_GPG_PUBKEY', True) 961 pubkey_path = self.d.getVar('RPM_GPG_PUBKEY', True)
963 cmd = "%s --root %s --dbpath /var/lib/rpm --import %s > /dev/null" % ( 962 cmd = [self.rpm_cmd, '--root', self.target_rootfs, '--dbpath', '/var/lib/rpm', '--import', pubkey_path]
964 self.rpm_cmd, self.target_rootfs, pubkey_path) 963 try:
965 subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) 964 subprocess.check_output(cmd, stderr=subprocess.STDOUT)
965 except subprocess.CalledProcessError as e:
966 bb.fatal("Import GPG key failed. Command '%s' "
967 "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output.decode("utf-8")))
968
966 969
967 # Configure smart 970 # Configure smart
968 bb.note("configuring Smart settings") 971 bb.note("configuring Smart settings")
969 bb.utils.remove(os.path.join(self.target_rootfs, 'var/lib/smart'), 972 bb.utils.remove(os.path.join(self.target_rootfs, 'var/lib/smart'),
970 True) 973 True)
971 self._invoke_smart('config --set rpm-root=%s' % self.target_rootfs) 974 self._invoke_smart(['config', '--set', 'rpm-root=%s' % self.target_rootfs])
972 self._invoke_smart('config --set rpm-dbpath=/var/lib/rpm') 975 self._invoke_smart(['config', '--set', 'rpm-dbpath=/var/lib/rpm'])
973 self._invoke_smart('config --set rpm-extra-macros._var=%s' % 976 self._invoke_smart(['config', '--set', 'rpm-extra-macros._var=%s' %
974 self.d.getVar('localstatedir', True)) 977 self.d.getVar('localstatedir', True)])
975 cmd = "config --set rpm-extra-macros._tmppath=/%s/tmp" % (self.install_dir_name) 978 cmd = ["config", "--set", "rpm-extra-macros._tmppath=/%s/tmp" % self.install_dir_name]
976 979
977 prefer_color = self.d.getVar('RPM_PREFER_ELF_ARCH', True) 980 prefer_color = self.d.getVar('RPM_PREFER_ELF_ARCH', True)
978 if prefer_color: 981 if prefer_color:
@@ -986,32 +989,32 @@ class RpmPM(PackageManager):
986 ['mips64', 'mips64el']: 989 ['mips64', 'mips64el']:
987 bb.fatal("RPM_PREFER_ELF_ARCH = \"4\" is for mips64 or mips64el " 990 bb.fatal("RPM_PREFER_ELF_ARCH = \"4\" is for mips64 or mips64el "
988 "only.") 991 "only.")
989 self._invoke_smart('config --set rpm-extra-macros._prefer_color=%s' 992 self._invoke_smart(['config', '--set', 'rpm-extra-macros._prefer_color=%s'
990 % prefer_color) 993 % prefer_color])
991 994
992 self._invoke_smart(cmd) 995 self._invoke_smart(cmd)
993 self._invoke_smart('config --set rpm-ignoresize=1') 996 self._invoke_smart(['config', '--set', 'rpm-ignoresize=1'])
994 997
995 # Write common configuration for host and target usage 998 # Write common configuration for host and target usage
996 self._invoke_smart('config --set rpm-nolinktos=1') 999 self._invoke_smart(['config', '--set', 'rpm-nolinktos=1'])
997 self._invoke_smart('config --set rpm-noparentdirs=1') 1000 self._invoke_smart(['config', '--set', 'rpm-noparentdirs=1'])
998 check_signature = self.d.getVar('RPM_CHECK_SIGNATURES', True) 1001 check_signature = self.d.getVar('RPM_CHECK_SIGNATURES', True)
999 if check_signature and check_signature.strip() == "0": 1002 if check_signature and check_signature.strip() == "0":
1000 self._invoke_smart('config --set rpm-check-signatures=false') 1003 self._invoke_smart(['config', '--set rpm-check-signatures=false'])
1001 for i in self.d.getVar('BAD_RECOMMENDATIONS', True).split(): 1004 for i in self.d.getVar('BAD_RECOMMENDATIONS', True).split():
1002 self._invoke_smart('flag --set ignore-recommends %s' % i) 1005 self._invoke_smart(['flag', '--set', 'ignore-recommends', i])
1003 1006
1004 # Do the following configurations here, to avoid them being 1007 # Do the following configurations here, to avoid them being
1005 # saved for field upgrade 1008 # saved for field upgrade
1006 if self.d.getVar('NO_RECOMMENDATIONS', True).strip() == "1": 1009 if self.d.getVar('NO_RECOMMENDATIONS', True).strip() == "1":
1007 self._invoke_smart('config --set ignore-all-recommends=1') 1010 self._invoke_smart(['config', '--set', 'ignore-all-recommends=1'])
1008 pkg_exclude = self.d.getVar('PACKAGE_EXCLUDE', True) or "" 1011 pkg_exclude = self.d.getVar('PACKAGE_EXCLUDE', True) or ""
1009 for i in pkg_exclude.split(): 1012 for i in pkg_exclude.split():
1010 self._invoke_smart('flag --set exclude-packages %s' % i) 1013 self._invoke_smart(['flag', '--set', 'exclude-packages', i])
1011 1014
1012 # Optional debugging 1015 # Optional debugging
1013 # self._invoke_smart('config --set rpm-log-level=debug') 1016 # self._invoke_smart(['config', '--set', 'rpm-log-level=debug'])
1014 # cmd = 'config --set rpm-log-file=/tmp/smart-debug-logfile' 1017 # cmd = ['config', '--set', 'rpm-log-file=/tmp/smart-debug-logfile']
1015 # self._invoke_smart(cmd) 1018 # self._invoke_smart(cmd)
1016 ch_already_added = [] 1019 ch_already_added = []
1017 for canonical_arch in platform_extra: 1020 for canonical_arch in platform_extra:
@@ -1030,16 +1033,16 @@ class RpmPM(PackageManager):
1030 if not arch in ch_already_added: 1033 if not arch in ch_already_added:
1031 bb.note('Adding Smart channel %s (%s)' % 1034 bb.note('Adding Smart channel %s (%s)' %
1032 (arch, channel_priority)) 1035 (arch, channel_priority))
1033 self._invoke_smart('channel --add %s type=rpm-md baseurl=%s -y' 1036 self._invoke_smart(['channel', '--add', arch, 'type=rpm-md',
1034 % (arch, arch_channel)) 1037 'baseurl=%s' % arch_channel, '-y'])
1035 self._invoke_smart('channel --set %s priority=%d' % 1038 self._invoke_smart(['channel', '--set', arch, 'priority=%d' %
1036 (arch, channel_priority)) 1039 channel_priority])
1037 channel_priority -= 5 1040 channel_priority -= 5
1038 1041
1039 ch_already_added.append(arch) 1042 ch_already_added.append(arch)
1040 1043
1041 bb.note('adding Smart RPM DB channel') 1044 bb.note('adding Smart RPM DB channel')
1042 self._invoke_smart('channel --add rpmsys type=rpm-sys -y') 1045 self._invoke_smart(['channel', '--add', 'rpmsys', 'type=rpm-sys', '-y'])
1043 1046
1044 # Construct install scriptlet wrapper. 1047 # Construct install scriptlet wrapper.
1045 # Scripts need to be ordered when executed, this ensures numeric order. 1048 # Scripts need to be ordered when executed, this ensures numeric order.
@@ -1102,15 +1105,15 @@ class RpmPM(PackageManager):
1102 1105
1103 bb.note("configuring RPM cross-install scriptlet_wrapper") 1106 bb.note("configuring RPM cross-install scriptlet_wrapper")
1104 os.chmod(self.scriptlet_wrapper, 0o755) 1107 os.chmod(self.scriptlet_wrapper, 0o755)
1105 cmd = 'config --set rpm-extra-macros._cross_scriptlet_wrapper=%s' % \ 1108 cmd = ['config', '--set', 'rpm-extra-macros._cross_scriptlet_wrapper=%s' %
1106 self.scriptlet_wrapper 1109 self.scriptlet_wrapper]
1107 self._invoke_smart(cmd) 1110 self._invoke_smart(cmd)
1108 1111
1109 # Debug to show smart config info 1112 # Debug to show smart config info
1110 # bb.note(self._invoke_smart('config --show')) 1113 # bb.note(self._invoke_smart(['config', '--show']))
1111 1114
1112 def update(self): 1115 def update(self):
1113 self._invoke_smart('update rpmsys') 1116 self._invoke_smart(['update', 'rpmsys'])
1114 1117
1115 def get_rdepends_recursively(self, pkgs): 1118 def get_rdepends_recursively(self, pkgs):
1116 # pkgs will be changed during the loop, so use [:] to make a copy. 1119 # pkgs will be changed during the loop, so use [:] to make a copy.
@@ -1207,20 +1210,19 @@ class RpmPM(PackageManager):
1207 return 1210 return
1208 if not attempt_only: 1211 if not attempt_only:
1209 bb.note('to be installed: %s' % ' '.join(pkgs)) 1212 bb.note('to be installed: %s' % ' '.join(pkgs))
1210 cmd = "%s %s install -y %s" % \ 1213 cmd = [self.smart_cmd] + self.smart_opt + ["install", "-y"] + pkgs
1211 (self.smart_cmd, self.smart_opt, ' '.join(pkgs)) 1214 bb.note(' '.join(cmd))
1212 bb.note(cmd)
1213 else: 1215 else:
1214 bb.note('installing attempt only packages...') 1216 bb.note('installing attempt only packages...')
1215 bb.note('Attempting %s' % ' '.join(pkgs)) 1217 bb.note('Attempting %s' % ' '.join(pkgs))
1216 cmd = "%s %s install --attempt -y %s" % \ 1218 cmd = [self.smart_cmd] + self.smart_opt + ["install", "--attempt",
1217 (self.smart_cmd, self.smart_opt, ' '.join(pkgs)) 1219 "-y"] + pkgs
1218 try: 1220 try:
1219 output = subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT).decode("utf-8") 1221 output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode("utf-8")
1220 bb.note(output) 1222 bb.note(output)
1221 except subprocess.CalledProcessError as e: 1223 except subprocess.CalledProcessError as e:
1222 bb.fatal("Unable to install packages. Command '%s' " 1224 bb.fatal("Unable to install packages. Command '%s' "
1223 "returned %d:\n%s" % (cmd, e.returncode, e.output.decode("utf-8"))) 1225 "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output.decode("utf-8")))
1224 1226
1225 ''' 1227 '''
1226 Remove pkgs with smart, the pkg name is smart/rpm format 1228 Remove pkgs with smart, the pkg name is smart/rpm format
@@ -1229,24 +1231,19 @@ class RpmPM(PackageManager):
1229 bb.note('to be removed: ' + ' '.join(pkgs)) 1231 bb.note('to be removed: ' + ' '.join(pkgs))
1230 1232
1231 if not with_dependencies: 1233 if not with_dependencies:
1232 cmd = "%s -e --nodeps " % self.rpm_cmd 1234 cmd = [self.rpm_cmd] + ["-e", "--nodeps", "--root=%s" %
1233 cmd += "--root=%s " % self.target_rootfs 1235 self.target_rootfs, "--dbpath=/var/lib/rpm",
1234 cmd += "--dbpath=/var/lib/rpm " 1236 "--define='_cross_scriptlet_wrapper %s'" %
1235 cmd += "--define='_cross_scriptlet_wrapper %s' " % \ 1237 self.scriptlet_wrapper,
1236 self.scriptlet_wrapper 1238 "--define='_tmppath /%s/tmp'" % self.install_dir_name] + pkgs
1237 cmd += "--define='_tmppath /%s/tmp' %s" % (self.install_dir_name, ' '.join(pkgs))
1238 else: 1239 else:
1239 # for pkg in pkgs: 1240 # for pkg in pkgs:
1240 # bb.note('Debug: What required: %s' % pkg) 1241 # bb.note('Debug: What required: %s' % pkg)
1241 # bb.note(self._invoke_smart('query %s --show-requiredby' % pkg)) 1242 # bb.note(self._invoke_smart(['query', pkg, '--show-requiredby']))
1242 1243 cmd = [self.smart_cmd] + self.smart_opt + ["remove", "-y"] + pkgs
1243 cmd = "%s %s remove -y %s" % (self.smart_cmd,
1244 self.smart_opt,
1245 ' '.join(pkgs))
1246
1247 try: 1244 try:
1248 bb.note(cmd) 1245 bb.note(' '.join(cmd))
1249 output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).decode("utf-8") 1246 output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode("utf-8")
1250 bb.note(output) 1247 bb.note(output)
1251 except subprocess.CalledProcessError as e: 1248 except subprocess.CalledProcessError as e:
1252 bb.note("Unable to remove packages. Command '%s' " 1249 bb.note("Unable to remove packages. Command '%s' "
@@ -1254,7 +1251,7 @@ class RpmPM(PackageManager):
1254 1251
1255 def upgrade(self): 1252 def upgrade(self):
1256 bb.note('smart upgrade') 1253 bb.note('smart upgrade')
1257 self._invoke_smart('upgrade') 1254 self._invoke_smart(['upgrade'])
1258 1255
1259 def write_index(self): 1256 def write_index(self):
1260 result = self.indexer.write_index() 1257 result = self.indexer.write_index()
@@ -1307,25 +1304,24 @@ class RpmPM(PackageManager):
1307 pkgs = self._pkg_translate_oe_to_smart(pkgs, False) 1304 pkgs = self._pkg_translate_oe_to_smart(pkgs, False)
1308 install_pkgs = list() 1305 install_pkgs = list()
1309 1306
1310 cmd = "%s %s install -y --dump %s 2>%s" % \ 1307 cmd = [self.smart_cmd] + self.smart_opt + ['install', '-y', '--dump'] + pkgs
1311 (self.smart_cmd,
1312 self.smart_opt,
1313 ' '.join(pkgs),
1314 self.solution_manifest)
1315 try: 1308 try:
1316 # Disable rpmsys channel for the fake install 1309 # Disable rpmsys channel for the fake install
1317 self._invoke_smart('channel --disable rpmsys') 1310 self._invoke_smart(['channel', '--disable', 'rpmsys'])
1318 1311
1319 subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) 1312 output = subprocess.check_output(cmd,stderr=subprocess.STDOUT).decode('utf-8')
1313 f = open(self.solution_manifest, 'w')
1314 f.write(output)
1315 f.close()
1320 with open(self.solution_manifest, 'r') as manifest: 1316 with open(self.solution_manifest, 'r') as manifest:
1321 for pkg in manifest.read().split('\n'): 1317 for pkg in manifest.read().split('\n'):
1322 if '@' in pkg: 1318 if '@' in pkg:
1323 install_pkgs.append(pkg) 1319 install_pkgs.append(pkg.strip())
1324 except subprocess.CalledProcessError as e: 1320 except subprocess.CalledProcessError as e:
1325 bb.note("Unable to dump install packages. Command '%s' " 1321 bb.note("Unable to dump install packages. Command '%s' "
1326 "returned %d:\n%s" % (cmd, e.returncode, e.output.decode("utf-8"))) 1322 "returned %d:\n%s" % (cmd, e.returncode, e.output.decode("utf-8")))
1327 # Recovery rpmsys channel 1323 # Recovery rpmsys channel
1328 self._invoke_smart('channel --enable rpmsys') 1324 self._invoke_smart(['channel', '--enable', 'rpmsys'])
1329 return install_pkgs 1325 return install_pkgs
1330 1326
1331 ''' 1327 '''
@@ -1355,17 +1351,16 @@ class RpmPM(PackageManager):
1355 def dump_all_available_pkgs(self): 1351 def dump_all_available_pkgs(self):
1356 available_manifest = self.d.expand('${T}/saved/available_pkgs.txt') 1352 available_manifest = self.d.expand('${T}/saved/available_pkgs.txt')
1357 available_pkgs = list() 1353 available_pkgs = list()
1358 cmd = "%s %s query --output %s" % \ 1354 cmd = [self.smart_cmd] + self.smart_opt + ['query', '--output', available_manifest]
1359 (self.smart_cmd, self.smart_opt, available_manifest)
1360 try: 1355 try:
1361 subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) 1356 subprocess.check_output(cmd, stderr=subprocess.STDOUT)
1362 with open(available_manifest, 'r') as manifest: 1357 with open(available_manifest, 'r') as manifest:
1363 for pkg in manifest.read().split('\n'): 1358 for pkg in manifest.read().split('\n'):
1364 if '@' in pkg: 1359 if '@' in pkg:
1365 available_pkgs.append(pkg.strip()) 1360 available_pkgs.append(pkg.strip())
1366 except subprocess.CalledProcessError as e: 1361 except subprocess.CalledProcessError as e:
1367 bb.note("Unable to list all available packages. Command '%s' " 1362 bb.note("Unable to list all available packages. Command '%s' "
1368 "returned %d:\n%s" % (cmd, e.returncode, e.output.decode("utf-8"))) 1363 "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output.decode("utf-8")))
1369 1364
1370 self.fullpkglist = available_pkgs 1365 self.fullpkglist = available_pkgs
1371 1366
@@ -1404,11 +1399,11 @@ class RpmPM(PackageManager):
1404 bb.utils.remove(os.path.join(self.target_rootfs, 'var/lib/smart'), 1399 bb.utils.remove(os.path.join(self.target_rootfs, 'var/lib/smart'),
1405 True) 1400 True)
1406 1401
1407 self._invoke_smart('config --set rpm-nolinktos=1') 1402 self._invoke_smart(['config', '--set', 'rpm-nolinktos=1'])
1408 self._invoke_smart('config --set rpm-noparentdirs=1') 1403 self._invoke_smart(['config', '--set', 'rpm-noparentdirs=1'])
1409 for i in self.d.getVar('BAD_RECOMMENDATIONS', True).split(): 1404 for i in self.d.getVar('BAD_RECOMMENDATIONS', True).split():
1410 self._invoke_smart('flag --set ignore-recommends %s' % i) 1405 self._invoke_smart(['flag', '--set', 'ignore-recommends', i])
1411 self._invoke_smart('channel --add rpmsys type=rpm-sys -y') 1406 self._invoke_smart(['channel', '--add', 'rpmsys', 'type=rpm-sys', '-y'])
1412 1407
1413 ''' 1408 '''
1414 The rpm db lock files were produced after invoking rpm to query on 1409 The rpm db lock files were produced after invoking rpm to query on
@@ -1425,12 +1420,12 @@ class RpmPM(PackageManager):
1425 Returns a dictionary with the package info. 1420 Returns a dictionary with the package info.
1426 """ 1421 """
1427 def package_info(self, pkg): 1422 def package_info(self, pkg):
1428 cmd = "%s %s info --urls %s" % (self.smart_cmd, self.smart_opt, pkg) 1423 cmd = [self.smart_cmd] + self.smart_opt + ['info', '--urls', pkg]
1429 try: 1424 try:
1430 output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).decode("utf-8") 1425 output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode("utf-8")
1431 except subprocess.CalledProcessError as e: 1426 except subprocess.CalledProcessError as e:
1432 bb.fatal("Unable to list available packages. Command '%s' " 1427 bb.fatal("Unable to list available packages. Command '%s' "
1433 "returned %d:\n%s" % (cmd, e.returncode, e.output.decode("utf-8"))) 1428 "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output.decode("utf-8")))
1434 1429
1435 # Set default values to avoid UnboundLocalError 1430 # Set default values to avoid UnboundLocalError
1436 arch = "" 1431 arch = ""
@@ -1550,18 +1545,18 @@ class OpkgDpkgPM(PackageManager):
1550 os.chdir(tmp_dir) 1545 os.chdir(tmp_dir)
1551 1546
1552 try: 1547 try:
1553 cmd = "%s x %s" % (ar_cmd, pkg_path) 1548 cmd = [ar_cmd, 'x', pkg_path]
1554 output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) 1549 output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
1555 cmd = "%s xf data.tar.*" % tar_cmd 1550 cmd = [tar_cmd, 'xf', 'data.tar.*']
1556 output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) 1551 output = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
1557 except subprocess.CalledProcessError as e: 1552 except subprocess.CalledProcessError as e:
1558 bb.utils.remove(tmp_dir, recurse=True) 1553 bb.utils.remove(tmp_dir, recurse=True)
1559 bb.fatal("Unable to extract %s package. Command '%s' " 1554 bb.fatal("Unable to extract %s package. Command '%s' "
1560 "returned %d:\n%s" % (pkg_path, cmd, e.returncode, e.output.decode("utf-8"))) 1555 "returned %d:\n%s" % (pkg_path, ' '.join(cmd), e.returncode, e.output.decode("utf-8")))
1561 except OSError as e: 1556 except OSError as e:
1562 bb.utils.remove(tmp_dir, recurse=True) 1557 bb.utils.remove(tmp_dir, recurse=True)
1563 bb.fatal("Unable to extract %s package. Command '%s' " 1558 bb.fatal("Unable to extract %s package. Command '%s' "
1564 "returned %d:\n%s at %s" % (pkg_path, cmd, e.errno, e.strerror, e.filename)) 1559 "returned %d:\n%s at %s" % (pkg_path, ' '.join(cmd), e.errno, e.strerror, e.filename))
1565 1560
1566 bb.note("Extracted %s to %s" % (pkg_path, tmp_dir)) 1561 bb.note("Extracted %s to %s" % (pkg_path, tmp_dir))
1567 bb.utils.remove(os.path.join(tmp_dir, "debian-binary")) 1562 bb.utils.remove(os.path.join(tmp_dir, "debian-binary"))