Commit 135d46bc authored by Stefano Babic's avatar Stefano Babic
Browse files

swupdate: improve systemd config

For most projects starting swupdate requires some logic implemented
in shell scripts. Therefore swupdate is now started by a shell script
if systemd is enabled in DISTRO_FEATURES.

The new swupdate startup script sources code snippets located in
/usr/lib/swupdate/conf.d and in /etc/swupdate/conf.d. The snippets are
executed in alphabetical order. The idea is that files in /usr are added
at build time and files in /etc might be added or modified at run-time.
If two scripts, one in /etc and one in /usr have the same file name, the
script in /usr gets skipped completely. This allows to disable code in
/usr, which is probably mounted ro, at runtime.

Code snippets are automatically generated at build-time, depending on
the configuration created by swupdate's menuconfig. But code snippets
may be created manually and added via bbappend to the
/usr/lib/swupdate/conf.d folder as well.

All modes (file, webserver, webclient) of swupdate are supported.
Different variables might be defined by the code snippets added to the
named folders:

Finally swupdate gets started by a line similar to:

  exec /usr/bin/swupdate $SWUPDATE_ARGS \
                         -w "$SWUPDATE_WEBSERVER_ARGS" \
                         -u "$SWUPDATE_DOWNLOAD_ARGS"

The default set of configuraton and service files is now installed by
the "make install" target of the swupdate Makefile. The service files
which are not used for the latest git version of swupdate are moved
to swupdate-2019.04 folder.

Fixes in do_install
- This changes the filenames of the tools binaries for several reasons:
  - Binaries should not be named "client" or "progress"
    (also not accepted by Debian upstream)
  - Inconsistent with names referred in the service files
- The file gets merged into file. By
  removing the tools file some bugs are fixed:
  - The tools binaries were installed twice.
  - do_compile from was over written resulting in wired
  - swupdate-progress.service file was part of swupdate package were
    the corresponding swupdate-progress binary was part of the tools

Improve package splitting
- New packages are: swupdate-client, swupdate-progress, swupdate-usb,
- Additionally swupdate-sd, swupdate-sv, swupdate-usb-sd and
  swupdate-progress-sd have been introduced. The purpose of the -sd
  and -sv packages is to provide the systemd service files or the
  sysv init scripts. Splitting the init scripts and service files is
  very atypical for Yocto, but it offers the flexibility to build a
  second minimal rescue image with sysv, just capable to run swupdate,
  out of the same DISTRO.
  By default (if not changed by a bbappend file) the rdepends are
  set e.g. from swupdate-usb to swupdate-sd, if systemd is enabled.
- The swupdate-tools package is an empty meta package now. It provides
  backward compatibility for setups installing swupdate-tools. It
  depends on swupdate-client, swupdate-progress, swupdate-usb,
  swupdate-tools-hawkbit packages.

Remove the INSANE_SKIP_${PN} = "ldflags". Seems obsolete.
Signed-off-by: default avatarAdrian Freihofer <>
Signed-off-by: Stefano Babic's avatarStefano Babic <>
parent 9f1d8a6c
......@@ -10,19 +10,53 @@ inherit cml1 update-rc.d systemd pkgconfig
SRC_URI = "git://;protocol=https \
file://defconfig \
file://swupdate \
file://swupdate.service \
file://swupdate-usb.rules \
file://swupdate-usb@.service \
file://swupdate-progress.service \
file://systemd-tmpfiles-swupdate.conf \
INSANE_SKIP_${PN} = "ldflags"
PACKAGES =+ "${PN}-www ${PN}-lua"
${PN}-client \
${PN}-lua \
${PN}-progress \
${PN}-progress-sd \
${PN}-sd \
${PN}-sv \
${PN}-tools \
${PN}-tools-hawkbit \
${PN}-usb \
${PN}-usb-sd \
${PN}-www \
FILES_${PN}-client = "${bindir}/swupdate-client"
FILES_${PN}-lua += "${libdir}/lua/"
FILES_${PN}-www = "/www/*"
FILES_${PN} += "${libdir}/tmpfiles.d"
FILES_${PN}-progress = "${bindir}/swupdate-progress"
FILES_${PN}-progress-sd = "${systemd_system_unitdir}/swupdate-progress.service"
FILES_${PN}-sd = " \
${systemd_system_unitdir}/swupdate.socket \
${systemd_system_unitdir}/swupdate.service \
FILES_${PN}-sv = "${sysconfdir}/init.d/*"
FILES_${PN}-usb = "${sysconfdir}/udev/rules.d/swupdate-usb.rules"
FILES_${PN}-usb-sd = "${systemd_system_unitdir}/swupdate-usb@.service"
FILES_${PN}-tools-hawkbit = " \
${bindir}/swupdate-hawkbitcfg \
${bindir}/swupdate-sendtohawkbit \
FILES_${PN} += " \
${libdir}/tmpfiles.d \
${libdir}/swupdate/* \
FILES_${PN}-www = " \
${libdir}/swupdate/conf.d/*mongoose* \
/www/* \
RDEPENDS_${PN}-progress += "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'swupdate-progress-sd', '', d)}"
RDEPENDS_${PN}-usb += "${PN}-client ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'swupdate-usb-sd', '', d)}"
RDEPENDS_${PN} += "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'swupdate-sd', 'swupdate-sv', d)}"
# The tools package is deprecated, it is an empty meta package for backward compatibility
RDEPENDS_${PN}-tools += "${PN}-client ${PN}-progress ${PN}-tools-hawkbit ${PN}-usb"
S = "${WORKDIR}/git/"
......@@ -116,17 +150,21 @@ python () {
do_configure () {
cp ${WORKDIR}/defconfig ${S}/.config -m .config ${@" ".join(find_cfgs(d))}
# Always install systemd support and the shell wrapper.
# This allows to build swupdate packages init manager agnostic and splitt the file to separate packages.
#grep -v 'CONFIG_SYSTEMD' ${WORKDIR}/defconfig > ${S}/.config
#echo "# Global settings from swupdate recipe" >> ${S}/.config
#echo "CONFIG_SYSTEMD=y" >> ${S}/.config
#echo "CONFIG_SYSTEMD_SYSTEM_UNITDIR=\"${systemd_system_unitdir}\"" >> ${S}/.config
cp ${WORKDIR}/defconfig ${S}/.config -m .config ${@" ".join(find_cfgs(d))}
do_compile() {
oe_runmake swupdate_unstripped progress_unstripped
cp swupdate_unstripped swupdate
cp progress_unstripped progress
do_install () {
......@@ -142,23 +180,20 @@ do_install () {
install -d ${D}${sysconfdir}/init.d
install -m 755 ${WORKDIR}/swupdate ${D}${sysconfdir}/init.d
install -d ${D}${systemd_unitdir}/system
install -m 644 ${WORKDIR}/swupdate.service ${D}${systemd_unitdir}/system
install -m 644 ${WORKDIR}/swupdate-usb@.service ${D}${systemd_unitdir}/system
install -m 644 ${WORKDIR}/swupdate-progress.service ${D}${systemd_unitdir}/system
if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
install -d ${D}${libdir}/tmpfiles.d
install -m 0644 ${WORKDIR}/systemd-tmpfiles-swupdate.conf ${D}${libdir}/tmpfiles.d/swupdate.conf
install -d ${D}${sysconfdir}/udev/rules.d
install -m 0644 ${WORKDIR}/swupdate-usb.rules ${D}${sysconfdir}/udev/rules.d/
INITSCRIPT_NAME = "swupdate"
INITSCRIPT_PARAMS = "defaults 70"
SYSTEMD_SERVICE_${PN} = "swupdate.service"
SYSTEMD_SERVICE_${PN} += "swupdate-usb@.service swupdate-progress.service"
SYSTEMD_PACKAGES_append = " ${PN}-sd ${PN}-progress-sd ${PN}-usb-sd"
SYSTEMD_SERVICE_${PN}-sd = "swupdate.service"
SYSTEMD_SERVICE_${PN}-progress-sd = "swupdate-progress.service"
SYSTEMD_SERVICE_${PN}-usb-sd = "swupdate-usb@.service"
# Prevents the systemd.bbclass from deleting scripts or service files.
rm_systemd_unitdir () {
return 0
rm_sysvinit_initddir () {
return 0
SRC_URI += " \
file://swupdate.service \
file://swupdate-usb.rules \
file://swupdate-usb@.service \
file://swupdate-progress.service \
file://systemd-tmpfiles-swupdate.conf \
SRCREV = "d39f4b8e00ef1929545b66158e45b82ea922bf81"
do_install_append () {
# Rename the binaries installed by make install
test -f ${D}${bindir}/progress && mv ${D}${bindir}/progress ${D}${bindir}/swupdate-progress
test -f ${D}${bindir}/client && mv ${D}${bindir}/client ${D}${bindir}/swupdate-client
test -f ${D}${bindir}/hawkbitcfg && mv ${D}${bindir}/hawkbitcfg ${D}${bindir}/swupdate-hawkbitcfg
test -f ${D}${bindir}/sendtohawkbit && mv ${D}${bindir}/sendtohawkbit ${D}${bindir}/swupdate-sendtohawkbit
install -d ${D}${systemd_system_unitdir}
install -m 644 ${WORKDIR}/swupdate.service ${D}${systemd_system_unitdir}
install -m 644 ${WORKDIR}/swupdate-usb@.service ${D}${systemd_system_unitdir}
install -m 644 ${WORKDIR}/swupdate-progress.service ${D}${systemd_system_unitdir}
if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
install -d ${D}${libdir}/tmpfiles.d
install -m 0644 ${WORKDIR}/systemd-tmpfiles-swupdate.conf ${D}${libdir}/tmpfiles.d/swupdate.conf
install -d ${D}${sysconfdir}/udev/rules.d
install -m 0644 ${WORKDIR}/swupdate-usb.rules ${D}${sysconfdir}/udev/rules.d/
SRCREV ?= "045a618a725d0a2fce64161f10101c0004ac5d85"
PV = "2019.04+git${SRCPV}"
swupdate.socket \
PACKAGES =+ "${PN}-tools"
INSANE_SKIP_${PN}-tools = "ldflags"
FILES_${PN}-tools = "${bindir}/swupdate-client \
${bindir}/swupdate-progress \
${bindir}/swupdate-hawkbitcfg \
do_compile() {
cp swupdate_unstripped swupdate
do_install_append () {
install -m 0755 tools/client_unstripped ${D}${bindir}/swupdate-client
install -m 0755 tools/progress_unstripped ${D}${bindir}/swupdate-progress
install -m 0755 tools/hawkbitcfg_unstripped ${D}${bindir}/swupdate-hawkbitcfg
install -m 0755 tools/sendtohawkbit_unstripped ${D}${bindir}/swupdate-sendtohawkbit
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment