1*4882a593SmuzhiyunUPDATERCPN ?= "${PN}" 2*4882a593Smuzhiyun 3*4882a593SmuzhiyunDEPENDS:append:class-target = "${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', ' update-rc.d initscripts', '', d)}" 4*4882a593Smuzhiyun 5*4882a593SmuzhiyunUPDATERCD = "update-rc.d" 6*4882a593SmuzhiyunUPDATERCD:class-cross = "" 7*4882a593SmuzhiyunUPDATERCD:class-native = "" 8*4882a593SmuzhiyunUPDATERCD:class-nativesdk = "" 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunINITSCRIPT_PARAMS ?= "defaults" 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunINIT_D_DIR = "${sysconfdir}/init.d" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyundef use_updatercd(d): 15*4882a593Smuzhiyun # If the distro supports both sysvinit and systemd, and the current recipe 16*4882a593Smuzhiyun # supports systemd, only call update-rc.d on rootfs creation or if systemd 17*4882a593Smuzhiyun # is not running. That's because systemctl enable/disable will already call 18*4882a593Smuzhiyun # update-rc.d if it detects initscripts. 19*4882a593Smuzhiyun if bb.utils.contains('DISTRO_FEATURES', 'systemd', True, False, d) and bb.data.inherits_class('systemd', d): 20*4882a593Smuzhiyun return '[ -n "$D" -o ! -d /run/systemd/system ]' 21*4882a593Smuzhiyun return 'true' 22*4882a593Smuzhiyun 23*4882a593SmuzhiyunPACKAGE_WRITE_DEPS += "update-rc.d-native" 24*4882a593Smuzhiyun 25*4882a593Smuzhiyunupdatercd_postinst() { 26*4882a593Smuzhiyunif ${@use_updatercd(d)} && type update-rc.d >/dev/null 2>/dev/null; then 27*4882a593Smuzhiyun if [ -n "$D" ]; then 28*4882a593Smuzhiyun OPT="-r $D" 29*4882a593Smuzhiyun else 30*4882a593Smuzhiyun OPT="-s" 31*4882a593Smuzhiyun fi 32*4882a593Smuzhiyun update-rc.d $OPT ${INITSCRIPT_NAME} ${INITSCRIPT_PARAMS} 33*4882a593Smuzhiyunfi 34*4882a593Smuzhiyun} 35*4882a593Smuzhiyun 36*4882a593Smuzhiyunupdatercd_prerm() { 37*4882a593Smuzhiyunif ${@use_updatercd(d)} && [ -z "$D" -a -x "${INIT_D_DIR}/${INITSCRIPT_NAME}" ]; then 38*4882a593Smuzhiyun ${INIT_D_DIR}/${INITSCRIPT_NAME} stop || : 39*4882a593Smuzhiyunfi 40*4882a593Smuzhiyun} 41*4882a593Smuzhiyun 42*4882a593Smuzhiyunupdatercd_postrm() { 43*4882a593Smuzhiyunif ${@use_updatercd(d)} && type update-rc.d >/dev/null 2>/dev/null; then 44*4882a593Smuzhiyun if [ -n "$D" ]; then 45*4882a593Smuzhiyun OPT="-f -r $D" 46*4882a593Smuzhiyun else 47*4882a593Smuzhiyun OPT="-f" 48*4882a593Smuzhiyun fi 49*4882a593Smuzhiyun update-rc.d $OPT ${INITSCRIPT_NAME} remove 50*4882a593Smuzhiyunfi 51*4882a593Smuzhiyun} 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun 54*4882a593Smuzhiyundef update_rc_after_parse(d): 55*4882a593Smuzhiyun if d.getVar('INITSCRIPT_PACKAGES', False) == None: 56*4882a593Smuzhiyun if d.getVar('INITSCRIPT_NAME', False) == None: 57*4882a593Smuzhiyun bb.fatal("%s inherits update-rc.d but doesn't set INITSCRIPT_NAME" % d.getVar('FILE', False)) 58*4882a593Smuzhiyun if d.getVar('INITSCRIPT_PARAMS', False) == None: 59*4882a593Smuzhiyun bb.fatal("%s inherits update-rc.d but doesn't set INITSCRIPT_PARAMS" % d.getVar('FILE', False)) 60*4882a593Smuzhiyun 61*4882a593Smuzhiyunpython __anonymous() { 62*4882a593Smuzhiyun update_rc_after_parse(d) 63*4882a593Smuzhiyun} 64*4882a593Smuzhiyun 65*4882a593SmuzhiyunPACKAGESPLITFUNCS:prepend = "${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'populate_packages_updatercd ', '', d)}" 66*4882a593SmuzhiyunPACKAGESPLITFUNCS:remove:class-nativesdk = "populate_packages_updatercd " 67*4882a593Smuzhiyun 68*4882a593Smuzhiyunpopulate_packages_updatercd[vardeps] += "updatercd_prerm updatercd_postrm updatercd_postinst" 69*4882a593Smuzhiyunpopulate_packages_updatercd[vardepsexclude] += "OVERRIDES" 70*4882a593Smuzhiyun 71*4882a593Smuzhiyunpython populate_packages_updatercd () { 72*4882a593Smuzhiyun def update_rcd_auto_depend(pkg): 73*4882a593Smuzhiyun import subprocess 74*4882a593Smuzhiyun import os 75*4882a593Smuzhiyun path = d.expand("${D}${INIT_D_DIR}/${INITSCRIPT_NAME}") 76*4882a593Smuzhiyun if not os.path.exists(path): 77*4882a593Smuzhiyun return 78*4882a593Smuzhiyun statement = "grep -q -w '/etc/init.d/functions' %s" % path 79*4882a593Smuzhiyun if subprocess.call(statement, shell=True) == 0: 80*4882a593Smuzhiyun mlprefix = d.getVar('MLPREFIX') or "" 81*4882a593Smuzhiyun d.appendVar('RDEPENDS:' + pkg, ' %sinitd-functions' % (mlprefix)) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun def update_rcd_package(pkg): 84*4882a593Smuzhiyun bb.debug(1, 'adding update-rc.d calls to postinst/prerm/postrm for %s' % pkg) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun localdata = bb.data.createCopy(d) 87*4882a593Smuzhiyun overrides = localdata.getVar("OVERRIDES") 88*4882a593Smuzhiyun localdata.setVar("OVERRIDES", "%s:%s" % (pkg, overrides)) 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun update_rcd_auto_depend(pkg) 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun postinst = d.getVar('pkg_postinst:%s' % pkg) 93*4882a593Smuzhiyun if not postinst: 94*4882a593Smuzhiyun postinst = '#!/bin/sh\n' 95*4882a593Smuzhiyun postinst += localdata.getVar('updatercd_postinst') 96*4882a593Smuzhiyun d.setVar('pkg_postinst:%s' % pkg, postinst) 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun prerm = d.getVar('pkg_prerm:%s' % pkg) 99*4882a593Smuzhiyun if not prerm: 100*4882a593Smuzhiyun prerm = '#!/bin/sh\n' 101*4882a593Smuzhiyun prerm += localdata.getVar('updatercd_prerm') 102*4882a593Smuzhiyun d.setVar('pkg_prerm:%s' % pkg, prerm) 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun postrm = d.getVar('pkg_postrm:%s' % pkg) 105*4882a593Smuzhiyun if not postrm: 106*4882a593Smuzhiyun postrm = '#!/bin/sh\n' 107*4882a593Smuzhiyun postrm += localdata.getVar('updatercd_postrm') 108*4882a593Smuzhiyun d.setVar('pkg_postrm:%s' % pkg, postrm) 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun d.appendVar('RRECOMMENDS:' + pkg, " ${MLPREFIX}${UPDATERCD}") 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun # Check that this class isn't being inhibited (generally, by 113*4882a593Smuzhiyun # systemd.bbclass) before doing any work. 114*4882a593Smuzhiyun if not d.getVar("INHIBIT_UPDATERCD_BBCLASS"): 115*4882a593Smuzhiyun pkgs = d.getVar('INITSCRIPT_PACKAGES') 116*4882a593Smuzhiyun if pkgs == None: 117*4882a593Smuzhiyun pkgs = d.getVar('UPDATERCPN') 118*4882a593Smuzhiyun packages = (d.getVar('PACKAGES') or "").split() 119*4882a593Smuzhiyun if not pkgs in packages and packages != []: 120*4882a593Smuzhiyun pkgs = packages[0] 121*4882a593Smuzhiyun for pkg in pkgs.split(): 122*4882a593Smuzhiyun update_rcd_package(pkg) 123*4882a593Smuzhiyun} 124