mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00

* update-rc.d has added support of enable/disable options, which are expected to keep the previous configuration even after upgrade the packages. With support for these options, it will only create start/stop link when there are none, or it will keep the previous configuration. Our preinst uses "-f remove" to remove any links under the /etc/rcrunlevel.d which is conflicting behavior with disable/enable options, so remove it. For example, if a user disabled one service before upgrade, then after upgrade the service could be started. This happens because during preinst, all links have been deleted, then postinst may create the link to start service. With this change, we remove preinst and therefore keep the previous links so that after upgrade, if a link existed for the package, then the postinst will not create new start/stop links. * remove '-f' for postinst. Previously, the keepalived recipe used 'remove' during postinst, so we needed the -f, but now the keepalived recipe has fixed this problem, so it's safe to remove '-f'. [Yocto #12955] (From OE-Core rev: 7981d5261429cfb06030280460086f9af91876d9) Signed-off-by: Changqing Li <changqing.li@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
124 lines
4.2 KiB
Plaintext
124 lines
4.2 KiB
Plaintext
UPDATERCPN ?= "${PN}"
|
|
|
|
DEPENDS_append_class-target = "${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', ' update-rc.d initscripts', '', d)}"
|
|
|
|
UPDATERCD = "update-rc.d"
|
|
UPDATERCD_class-cross = ""
|
|
UPDATERCD_class-native = ""
|
|
UPDATERCD_class-nativesdk = ""
|
|
|
|
INITSCRIPT_PARAMS ?= "defaults"
|
|
|
|
INIT_D_DIR = "${sysconfdir}/init.d"
|
|
|
|
def use_updatercd(d):
|
|
# If the distro supports both sysvinit and systemd, and the current recipe
|
|
# supports systemd, only call update-rc.d on rootfs creation or if systemd
|
|
# is not running. That's because systemctl enable/disable will already call
|
|
# update-rc.d if it detects initscripts.
|
|
if bb.utils.contains('DISTRO_FEATURES', 'systemd', True, False, d) and bb.data.inherits_class('systemd', d):
|
|
return '[ -n "$D" -o ! -d /run/systemd/system ]'
|
|
return 'true'
|
|
|
|
PACKAGE_WRITE_DEPS += "update-rc.d-native"
|
|
|
|
updatercd_postinst() {
|
|
if ${@use_updatercd(d)} && type update-rc.d >/dev/null 2>/dev/null; then
|
|
if [ -n "$D" ]; then
|
|
OPT="-r $D"
|
|
else
|
|
OPT="-s"
|
|
fi
|
|
update-rc.d $OPT ${INITSCRIPT_NAME} ${INITSCRIPT_PARAMS}
|
|
fi
|
|
}
|
|
|
|
updatercd_prerm() {
|
|
if ${@use_updatercd(d)} && [ -z "$D" -a -x "${INIT_D_DIR}/${INITSCRIPT_NAME}" ]; then
|
|
${INIT_D_DIR}/${INITSCRIPT_NAME} stop || :
|
|
fi
|
|
}
|
|
|
|
updatercd_postrm() {
|
|
if ${@use_updatercd(d)} && type update-rc.d >/dev/null 2>/dev/null; then
|
|
if [ -n "$D" ]; then
|
|
OPT="-f -r $D"
|
|
else
|
|
OPT="-f"
|
|
fi
|
|
update-rc.d $OPT ${INITSCRIPT_NAME} remove
|
|
fi
|
|
}
|
|
|
|
|
|
def update_rc_after_parse(d):
|
|
if d.getVar('INITSCRIPT_PACKAGES', False) == None:
|
|
if d.getVar('INITSCRIPT_NAME', False) == None:
|
|
bb.fatal("%s inherits update-rc.d but doesn't set INITSCRIPT_NAME" % d.getVar('FILE', False))
|
|
if d.getVar('INITSCRIPT_PARAMS', False) == None:
|
|
bb.fatal("%s inherits update-rc.d but doesn't set INITSCRIPT_PARAMS" % d.getVar('FILE', False))
|
|
|
|
python __anonymous() {
|
|
update_rc_after_parse(d)
|
|
}
|
|
|
|
PACKAGESPLITFUNCS_prepend = "${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'populate_packages_updatercd ', '', d)}"
|
|
PACKAGESPLITFUNCS_remove_class-nativesdk = "populate_packages_updatercd "
|
|
|
|
populate_packages_updatercd[vardeps] += "updatercd_prerm updatercd_postrm updatercd_postinst"
|
|
populate_packages_updatercd[vardepsexclude] += "OVERRIDES"
|
|
|
|
python populate_packages_updatercd () {
|
|
def update_rcd_auto_depend(pkg):
|
|
import subprocess
|
|
import os
|
|
path = d.expand("${D}${INIT_D_DIR}/${INITSCRIPT_NAME}")
|
|
if not os.path.exists(path):
|
|
return
|
|
statement = "grep -q -w '/etc/init.d/functions' %s" % path
|
|
if subprocess.call(statement, shell=True) == 0:
|
|
mlprefix = d.getVar('MLPREFIX') or ""
|
|
d.appendVar('RDEPENDS_' + pkg, ' %sinitd-functions' % (mlprefix))
|
|
|
|
def update_rcd_package(pkg):
|
|
bb.debug(1, 'adding update-rc.d calls to postinst/prerm/postrm for %s' % pkg)
|
|
|
|
localdata = bb.data.createCopy(d)
|
|
overrides = localdata.getVar("OVERRIDES")
|
|
localdata.setVar("OVERRIDES", "%s:%s" % (pkg, overrides))
|
|
|
|
update_rcd_auto_depend(pkg)
|
|
|
|
postinst = d.getVar('pkg_postinst_%s' % pkg)
|
|
if not postinst:
|
|
postinst = '#!/bin/sh\n'
|
|
postinst += localdata.getVar('updatercd_postinst')
|
|
d.setVar('pkg_postinst_%s' % pkg, postinst)
|
|
|
|
prerm = d.getVar('pkg_prerm_%s' % pkg)
|
|
if not prerm:
|
|
prerm = '#!/bin/sh\n'
|
|
prerm += localdata.getVar('updatercd_prerm')
|
|
d.setVar('pkg_prerm_%s' % pkg, prerm)
|
|
|
|
postrm = d.getVar('pkg_postrm_%s' % pkg)
|
|
if not postrm:
|
|
postrm = '#!/bin/sh\n'
|
|
postrm += localdata.getVar('updatercd_postrm')
|
|
d.setVar('pkg_postrm_%s' % pkg, postrm)
|
|
|
|
d.appendVar('RRECOMMENDS_' + pkg, " ${MLPREFIX}${UPDATERCD}")
|
|
|
|
# Check that this class isn't being inhibited (generally, by
|
|
# systemd.bbclass) before doing any work.
|
|
if not d.getVar("INHIBIT_UPDATERCD_BBCLASS"):
|
|
pkgs = d.getVar('INITSCRIPT_PACKAGES')
|
|
if pkgs == None:
|
|
pkgs = d.getVar('UPDATERCPN')
|
|
packages = (d.getVar('PACKAGES') or "").split()
|
|
if not pkgs in packages and packages != []:
|
|
pkgs = packages[0]
|
|
for pkg in pkgs.split():
|
|
update_rcd_package(pkg)
|
|
}
|