summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorMark Hatle <mark.hatle@windriver.com>2011-11-10 10:30:21 -0600
committerRichard Purdie <richard.purdie@linuxfoundation.org>2011-11-11 11:01:07 +0000
commitef1d61d711102b3417e83e56d4e2746f5b6a5db9 (patch)
tree11fd7e88d6e9cc6dcfad673211b6259436cbd84b /meta
parent298278257bdba9c684ae293351b1cf421b5b3e50 (diff)
downloadpoky-ef1d61d711102b3417e83e56d4e2746f5b6a5db9.tar.gz
rootfs_rpm.bbclass: Enable pre and post install scripts
[YOCTO #1755] We change the want the RPM rootfs install works to install pre and post install scripts. The new method uses a script helper that is invoked by RPM outside of the normal chroot. The wrapper is dynamically generated prior to the install starting. It will check the return code of the script. If the script fails, it will store a copy to be executed on the first system boot. This is similar to the previous mechanism. In addition, a line of debug was added to the scripts as written by package_rpm to list which package and which script for later debugging, if necessary. (From OE-Core rev: 3e7120d6a9fd5e46214673d0a6e1085a7314ff42) Signed-off-by: Mark Hatle <mark.hatle@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/package_rpm.bbclass33
-rw-r--r--meta/classes/rootfs_rpm.bbclass25
-rw-r--r--meta/recipes-devtools/rpm/rpm/rpm-scriptletexechelper.patch159
-rw-r--r--meta/recipes-devtools/rpm/rpm_5.4.0.bb3
4 files changed, 199 insertions, 21 deletions
diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass
index 2c5545c11d..2ace0537ac 100644
--- a/meta/classes/package_rpm.bbclass
+++ b/meta/classes/package_rpm.bbclass
@@ -382,13 +382,39 @@ package_install_internal_rpm () {
382 cat ${target_rootfs}/install/install_solution.manifest > ${target_rootfs}/install/total_solution.manifest 382 cat ${target_rootfs}/install/install_solution.manifest > ${target_rootfs}/install/total_solution.manifest
383 cat ${target_rootfs}/install/install_multilib_solution.manifest >> ${target_rootfs}/install/total_solution.manifest 383 cat ${target_rootfs}/install/install_multilib_solution.manifest >> ${target_rootfs}/install/total_solution.manifest
384 384
385 # Construct install scriptlet wrapper
386 cat << EOF > ${WORKDIR}/scriptlet_wrapper
387#!/bin/bash
388
389export PATH="${PATH}"
390export D="${target_rootfs}"
391export OFFLINE_ROOT="\$D"
392export IPKG_OFFLINE_ROOT="\$D"
393export OPKG_OFFLINE_ROOT="\$D"
394
395\$2 \$1/\$3 \$4
396if [ \$? -ne 0 ]; then
397 mkdir -p \$1/etc/rpm-postinsts
398 num=100
399 while [ -e \$1/etc/rpm-postinsts/\${num} ]; do num=\$((num + 1)); done
400 echo "#!\$2" > \$1/etc/rpm-postinsts/\${num}
401 echo "# Arg: \$4" >> \$1/etc/rpm-postinsts/\${num}
402 cat \$1/\$3 >> \$1/etc/rpm-postinsts/\${num}
403 chmod +x \$1/etc/rpm-postinsts/\${num}
404fi
405EOF
406
407 chmod 0755 ${WORKDIR}/scriptlet_wrapper
408
385 # Attempt install 409 # Attempt install
386 ${RPM} --root ${target_rootfs} \ 410 ${RPM} --root ${target_rootfs} \
387 --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \ 411 --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \
388 --predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \ 412 --predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \
413 -D "_var ${localstatedir}" \
389 -D "_dbpath ${rpmlibdir}" \ 414 -D "_dbpath ${rpmlibdir}" \
390 --noscripts --notriggers --noparentdirs --nolinktos --replacepkgs \ 415 --noparentdirs --nolinktos --replacepkgs \
391 -D "__dbi_txn create nofsync private" \ 416 -D "__dbi_txn create nofsync private" \
417 -D "_cross_scriptlet_wrapper ${WORKDIR}/scriptlet_wrapper" \
392 -Uhv ${target_rootfs}/install/total_solution.manifest 418 -Uhv ${target_rootfs}/install/total_solution.manifest
393} 419}
394 420
@@ -685,6 +711,7 @@ python write_specfile () {
685 elif script == 'postrm': 711 elif script == 'postrm':
686 spec_scriptlets_bottom.append('%%postun -n %s' % splitname) 712 spec_scriptlets_bottom.append('%%postun -n %s' % splitname)
687 scriptvar = wrap_uninstall(scriptvar) 713 scriptvar = wrap_uninstall(scriptvar)
714 spec_scriptlets_bottom.append('# %s - %s' % (splitname, script))
688 spec_scriptlets_bottom.append(scriptvar) 715 spec_scriptlets_bottom.append(scriptvar)
689 spec_scriptlets_bottom.append('') 716 spec_scriptlets_bottom.append('')
690 717
@@ -762,19 +789,23 @@ python write_specfile () {
762 789
763 if srcpreinst: 790 if srcpreinst:
764 spec_scriptlets_top.append('%pre') 791 spec_scriptlets_top.append('%pre')
792 spec_scriptlets_top.append('# %s - preinst' % srcname)
765 spec_scriptlets_top.append(srcpreinst) 793 spec_scriptlets_top.append(srcpreinst)
766 spec_scriptlets_top.append('') 794 spec_scriptlets_top.append('')
767 if srcpostinst: 795 if srcpostinst:
768 spec_scriptlets_top.append('%post') 796 spec_scriptlets_top.append('%post')
797 spec_scriptlets_top.append('# %s - postinst' % srcname)
769 spec_scriptlets_top.append(srcpostinst) 798 spec_scriptlets_top.append(srcpostinst)
770 spec_scriptlets_top.append('') 799 spec_scriptlets_top.append('')
771 if srcprerm: 800 if srcprerm:
772 spec_scriptlets_top.append('%preun') 801 spec_scriptlets_top.append('%preun')
802 spec_scriptlets_top.append('# %s - prerm' % srcname)
773 scriptvar = wrap_uninstall(srcprerm) 803 scriptvar = wrap_uninstall(srcprerm)
774 spec_scriptlets_top.append(scriptvar) 804 spec_scriptlets_top.append(scriptvar)
775 spec_scriptlets_top.append('') 805 spec_scriptlets_top.append('')
776 if srcpostrm: 806 if srcpostrm:
777 spec_scriptlets_top.append('%postun') 807 spec_scriptlets_top.append('%postun')
808 spec_scriptlets_top.append('# %s - postrm' % srcname)
778 scriptvar = wrap_uninstall(srcpostrm) 809 scriptvar = wrap_uninstall(srcpostrm)
779 spec_scriptlets_top.append(scriptvar) 810 spec_scriptlets_top.append(scriptvar)
780 spec_scriptlets_top.append('') 811 spec_scriptlets_top.append('')
diff --git a/meta/classes/rootfs_rpm.bbclass b/meta/classes/rootfs_rpm.bbclass
index 95e9455e5c..b3875a437c 100644
--- a/meta/classes/rootfs_rpm.bbclass
+++ b/meta/classes/rootfs_rpm.bbclass
@@ -20,8 +20,6 @@ do_rootfs[depends] += "opkg-native:do_populate_sysroot"
20 20
21do_rootfs[recrdeptask] += "do_package_write_rpm" 21do_rootfs[recrdeptask] += "do_package_write_rpm"
22 22
23AWKPOSTINSTSCRIPT = "${COREBASE}/scripts/rootfs_rpm-extract-postinst.awk"
24
25RPM_PREPROCESS_COMMANDS = "package_update_index_rpm; package_generate_rpm_conf; " 23RPM_PREPROCESS_COMMANDS = "package_update_index_rpm; package_generate_rpm_conf; "
26RPM_POSTPROCESS_COMMANDS = "" 24RPM_POSTPROCESS_COMMANDS = ""
27 25
@@ -108,19 +106,9 @@ EOF
108 106
109 ${ROOTFS_POSTINSTALL_COMMAND} 107 ${ROOTFS_POSTINSTALL_COMMAND}
110 108
111 mkdir -p ${IMAGE_ROOTFS}/etc/rpm-postinsts/ 109 # Report delayed package scriptlets
112 ${RPM} --root ${IMAGE_ROOTFS} -D '_dbpath ${rpmlibdir}' -qa \ 110 for i in ${IMAGE_ROOTFS}/etc/rpm-postinsts/*; do
113 -D "__dbi_txn create nofsync private" \ 111 echo "Delayed package scriptlet: `head -n 3 $i | tail -n 1`"
114 --qf 'Name: %{NAME}\n%|POSTIN?{postinstall scriptlet%|POSTINPROG?{ (using %{POSTINPROG})}|:\n%{POSTIN}\n}:{%|POSTINPROG?{postinstall program: %{POSTINPROG}\n}|}|' \
115 > ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined
116 awk -f ${AWKPOSTINSTSCRIPT} < ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined
117 rm ${IMAGE_ROOTFS}/etc/rpm-postinsts/combined
118
119 for i in ${IMAGE_ROOTFS}/etc/rpm-postinsts/*.sh; do
120 if [ -f $i ] && sh $i; then
121 # rm $i
122 mv $i $i.done
123 fi
124 done 112 done
125 113
126 install -d ${IMAGE_ROOTFS}/${sysconfdir}/rcS.d 114 install -d ${IMAGE_ROOTFS}/${sysconfdir}/rcS.d
@@ -128,11 +116,10 @@ EOF
128 i=\$i 116 i=\$i
129 cat > ${IMAGE_ROOTFS}${sysconfdir}/rcS.d/S${POSTINSTALL_INITPOSITION}configure << EOF 117 cat > ${IMAGE_ROOTFS}${sysconfdir}/rcS.d/S${POSTINSTALL_INITPOSITION}configure << EOF
130#!/bin/sh 118#!/bin/sh
131for i in /etc/rpm-postinsts/*.sh; do 119for i in /etc/rpm-postinsts/*; do
132 echo "Running postinst $i..." 120 echo "Running postinst $i..."
133 if [ -f $i ] && sh $i; then 121 if [ -f $i ] && $i; then
134 # rm $i 122 rm $i
135 mv $i $i.done
136 else 123 else
137 echo "ERROR: postinst $i failed." 124 echo "ERROR: postinst $i failed."
138 fi 125 fi
diff --git a/meta/recipes-devtools/rpm/rpm/rpm-scriptletexechelper.patch b/meta/recipes-devtools/rpm/rpm/rpm-scriptletexechelper.patch
new file mode 100644
index 0000000000..e4db0e4211
--- /dev/null
+++ b/meta/recipes-devtools/rpm/rpm/rpm-scriptletexechelper.patch
@@ -0,0 +1,159 @@
1Enable a cross-install scriptlet helper.
2
3The helper is called from outside of the chroot with the arguments:
4
5<root> <prog> <script> <arg1> [<arg2> ... <argN>]
6
7The helper script is used by oe-core to facilitate shell script actions that
8can not be run from within a chroot on a foreign target system during a
9cross install.
10
11Upstream-Status: Pending
12
13Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
14
15diff -ur rpm-5.4.0.orig/lib/psm.c rpm-5.4.0/lib/psm.c
16--- rpm-5.4.0.orig/lib/psm.c 2010-12-29 07:42:11.000000000 -0600
17+++ rpm-5.4.0/lib/psm.c 2011-11-08 13:38:48.132791154 -0600
18@@ -792,6 +792,10 @@
19 int xx;
20 int i;
21
22+#ifdef RPM_VENDOR_POKY
23+ const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
24+#endif
25+
26 if (psm->sstates != NULL && ix >= 0 && ix < RPMSCRIPT_MAX)
27 ssp = psm->sstates + ix;
28 if (ssp != NULL)
29@@ -858,14 +862,29 @@
30 (F_ISSET(psm, UNORDERED) ? "a" : ""));
31
32 if (Phe->p.argv == NULL) {
33- argv = alloca(5 * sizeof(*argv));
34- argv[0] = "/bin/sh";
35- argc = 1;
36+ argv = alloca(7 * sizeof(*argv));
37+ argc = 0;
38+ } else {
39+ argv = alloca((Phe->c + 6) * sizeof(*argv));
40+ argc = 0;
41+ }
42+
43+#ifdef RPM_VENDOR_POKY
44+ if (scriptletWrapper && *scriptletWrapper) {
45+ argv[argc++] = scriptletWrapper;
46+ argv[argc] = rpmtsRootDir(ts);
47+ if (!argv[argc] || !*argv[argc])
48+ argv[argc] = "/";
49+ argc++;
50+ }
51+#endif
52+
53+ if (Phe->p.argv == NULL) {
54+ argv[argc++] = "/bin/sh";
55 ldconfig_done = 0;
56 } else {
57- argv = alloca((Phe->c + 4) * sizeof(*argv));
58- memcpy(argv, Phe->p.argv, Phe->c * sizeof(*argv));
59- argc = Phe->c;
60+ memcpy((argv + argc), Phe->p.argv, Phe->c * sizeof(*argv));
61+ argc += Phe->c;
62 ldconfig_done = (ldconfig_path && !strcmp(argv[0], ldconfig_path)
63 ? 1 : 0);
64 }
65@@ -916,7 +935,12 @@
66 goto exit;
67
68 if (rpmIsDebug() &&
69- (!strcmp(argv[0], "/bin/sh") || !strcmp(argv[0], "/bin/bash")))
70+ (!strcmp(argv[0], "/bin/sh") || !strcmp(argv[0], "/bin/bash"))
71+#ifdef RPM_VENDOR_POKY
72+ || (scriptletWrapper && *scriptletWrapper && !strcmp(argv[1], "/bin/sh"))
73+ || (scriptletWrapper && *scriptletWrapper && !strcmp(argv[1], "/bin/bash"))
74+#endif
75+ )
76 {
77 static const char set_x[] = "set -x\n";
78 nw = Fwrite(set_x, sizeof(set_x[0]), sizeof(set_x)-1, fd);
79@@ -1051,12 +1075,22 @@
80
81 { const char * rootDir = rpmtsRootDir(ts);
82 if (!rpmtsChrootDone(ts) && rootDir != NULL &&
83+#ifdef RPM_VENDOR_POKY
84+ !(scriptletWrapper && *scriptletWrapper) &&
85+#endif
86 !(rootDir[0] == '/' && rootDir[1] == '\0'))
87 {
88 /*@-modobserver@*/
89 xx = Chroot(rootDir);
90 /*@=modobserver@*/
91 }
92+#ifdef RPM_VENDOR_POKY
93+ if (!rpmtsChrootDone(ts) && rootDir != NULL &&
94+ (scriptletWrapper && *scriptletWrapper) &&
95+ !(rootDir[0] == '/' && rootDir[1] == '\0'))
96+ xx = Chdir(rootDir);
97+ else
98+#endif
99 xx = Chdir("/");
100 rpmlog(RPMLOG_DEBUG, D_("%s: %s(%s)\texecv(%s) pid %d\n"),
101 psm->stepName, sln, NVRA,
102@@ -2961,6 +2995,13 @@
103 case PSM_SCRIPT: /* Run current package scriptlets. */
104 /* XXX running %verifyscript/%sanitycheck doesn't have psm->te */
105 { rpmtxn _parent = (psm && psm->te ? psm->te->txn : NULL);
106+
107+#ifdef RPM_VENDOR_POKY
108+ const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
109+ if (scriptletWrapper && *scriptletWrapper)
110+ rc = rpmpsmNext(psm, PSM_CHROOT_OUT);
111+#endif
112+
113 xx = rpmtxnBegin(rpmtsGetRdb(ts), _parent, NULL);
114 rc = runInstScript(psm);
115 if (rc)
116@@ -2968,11 +3009,24 @@
117 else
118 xx = rpmtxnCommit(rpmtsGetRdb(ts)->db_txn);
119 rpmtsGetRdb(ts)->db_txn = NULL;
120+#ifdef RPM_VENDOR_POKY
121+ if (scriptletWrapper && *scriptletWrapper)
122+ rc = rpmpsmNext(psm, PSM_CHROOT_IN);
123+#endif
124 } break;
125 case PSM_TRIGGERS:
126 /* Run triggers in other package(s) this package sets off. */
127 if (rpmtsFlags(ts) & RPMTRANS_FLAG_TEST) break;
128+#ifdef RPM_VENDOR_POKY
129+ const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
130+ if (scriptletWrapper && *scriptletWrapper)
131+ rc = rpmpsmNext(psm, PSM_CHROOT_OUT);
132+#endif
133 rc = runTriggers(psm);
134+#ifdef RPM_VENDOR_POKY
135+ if (scriptletWrapper && *scriptletWrapper)
136+ rc = rpmpsmNext(psm, PSM_CHROOT_IN);
137+#endif
138 break;
139 case PSM_IMMED_TRIGGERS:
140 /* Run triggers in this package other package(s) set off. */
141@@ -2982,7 +3036,18 @@
142 F_SET(psm, GOTTRIGGERS);
143 }
144 if (psm->triggers != NULL)
145+#ifdef RPM_VENDOR_POKY
146+ {
147+ const char * scriptletWrapper = rpmExpand("%{?_cross_scriptlet_wrapper}", NULL);
148+ if (scriptletWrapper && *scriptletWrapper)
149+ rc = rpmpsmNext(psm, PSM_CHROOT_OUT);
150+#endif
151 rc = runImmedTriggers(psm);
152+#ifdef RPM_VENDOR_POKY
153+ if (scriptletWrapper && *scriptletWrapper)
154+ rc = rpmpsmNext(psm, PSM_CHROOT_IN);
155+ }
156+#endif
157 break;
158
159 case PSM_RPMIO_FLAGS:
diff --git a/meta/recipes-devtools/rpm/rpm_5.4.0.bb b/meta/recipes-devtools/rpm/rpm_5.4.0.bb
index bbef0be71e..f8fe836562 100644
--- a/meta/recipes-devtools/rpm/rpm_5.4.0.bb
+++ b/meta/recipes-devtools/rpm/rpm_5.4.0.bb
@@ -45,7 +45,7 @@ LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1"
45DEPENDS = "bzip2 zlib db openssl elfutils expat libpcre attr acl popt ${extrarpmdeps}" 45DEPENDS = "bzip2 zlib db openssl elfutils expat libpcre attr acl popt ${extrarpmdeps}"
46extrarpmdeps = "python perl" 46extrarpmdeps = "python perl"
47extrarpmdeps_virtclass-native = "file-native" 47extrarpmdeps_virtclass-native = "file-native"
48PR = "r22" 48PR = "r23"
49 49
50# rpm2cpio is a shell script, which is part of the rpm src.rpm. It is needed 50# rpm2cpio is a shell script, which is part of the rpm src.rpm. It is needed
51# in order to extract the distribution SRPM into a format we can extract... 51# in order to extract the distribution SRPM into a format we can extract...
@@ -63,6 +63,7 @@ SRC_URI = "http://www.rpm5.org/files/rpm/rpm-5.4/rpm-5.4.0-0.20101229.src.rpm;ex
63 file://rpm-fileclass.patch \ 63 file://rpm-fileclass.patch \
64 file://rpm-canonarch.patch \ 64 file://rpm-canonarch.patch \
65 file://rpm-no-loopmsg.patch \ 65 file://rpm-no-loopmsg.patch \
66 file://rpm-scriptletexechelper.patch \
66 file://pythondeps.sh \ 67 file://pythondeps.sh \
67 " 68 "
68 69