swupdate.inc 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. SUMMARY="Image updater for Yocto projects"
  2. DESCRIPTION = "Application for automatic software update from USB Pen"
  3. SECTION="swupdate"
  4. DEPENDS += "libconfig"
  5. # SWUpdate licensing is described in the following pages:
  6. # https://sbabic.github.io/swupdate/licensing.html
  7. # rst form: file://doc/source/licensing.rst
  8. LICENSE = "GPLv2+ & LGPLv2+ & MIT"
  9. LICENSE_${PN}-lua = "LGPLv2+"
  10. LICENSE_${PN}-www = "MIT"
  11. LIC_FILES_CHKSUM = "file://COPYING;md5=0636e73ff0215e8d672dc4c32c317bb3 \
  12. file://Licenses/lgpl-2.1.txt;md5=4fbd65380cdd255951079008b364516c \
  13. file://Licenses/mit.txt;md5=838c366f69b72c5df05c96dff79b35f2 \
  14. file://Licenses/Exceptions;md5=5f205fe7a7f2b056b4fa42603fe2d63a"
  15. inherit cml1 update-rc.d systemd pkgconfig
  16. SRC_URI = "git://github.com/sbabic/swupdate.git;protocol=https \
  17. file://defconfig \
  18. file://swupdate \
  19. file://swupdate.sh \
  20. file://swupdate.service \
  21. file://swupdate.socket.tmpl \
  22. file://swupdate-usb.rules \
  23. file://swupdate-usb@.service \
  24. file://swupdate-progress.service \
  25. file://tmpfiles-swupdate.conf \
  26. file://10-mongoose-args \
  27. file://90-start-progress \
  28. "
  29. LTOEXTRA += "-flto-partition=none"
  30. PACKAGES =+ " \
  31. ${PN}-client \
  32. ${PN}-lua \
  33. ${PN}-progress \
  34. ${PN}-progress-bin \
  35. ${PN}-progress-systemd \
  36. ${PN}-progress-sysvinit \
  37. ${PN}-tools \
  38. ${PN}-tools-hawkbit \
  39. ${PN}-usb \
  40. ${PN}-www \
  41. "
  42. INSANE_SKIP_${PN}-lua = "dev-so"
  43. # tools is now an empty meta package for backward compatibility
  44. ALLOW_EMPTY_${PN}-tools = "1"
  45. FILES_${PN}-client = "${bindir}/swupdate-client"
  46. FILES_${PN}-lua += "${libdir}/lua/"
  47. ALLOW_EMPTY_${PN}-progress = "1"
  48. FILES_${PN}-progress-bin = "${bindir}/swupdate-progress"
  49. FILES_${PN}-progress-systemd = "${systemd_system_unitdir}/swupdate-progress.service"
  50. FILES_${PN}-progress-sysvinit = "${libdir}/swupdate/conf.d/90-start-progress"
  51. FILES_${PN}-usb = " \
  52. ${sysconfdir}/udev/rules.d/swupdate-usb.rules \
  53. ${systemd_system_unitdir}/swupdate-usb@.service \
  54. "
  55. FILES_${PN}-tools-hawkbit = " \
  56. ${bindir}/swupdate-hawkbitcfg \
  57. ${bindir}/swupdate-sendtohawkbit \
  58. "
  59. FILES_${PN} += " \
  60. ${libdir}/tmpfiles.d \
  61. ${libdir}/swupdate/* \
  62. ${systemd_system_unitdir}/swupdate.socket \
  63. ${systemd_system_unitdir}/swupdate.service \
  64. ${sysconfdir}/init.d/* \
  65. "
  66. FILES_${PN}-www = " \
  67. ${libdir}/swupdate/conf.d/*mongoose* \
  68. /www/* \
  69. "
  70. RDEPENDS_${PN}-usb += "${PN}-client"
  71. RDEPENDS_${PN}-progress += "${@bb.utils.contains('DISTRO_FEATURES','systemd','${PN}-progress-systemd','${PN}-progress-sysvinit',d)}"
  72. RDEPENDS_${PN}-progress-systemd += "${PN}-progress-bin"
  73. RDEPENDS_${PN}-progress-sysvinit += "${PN}-progress-bin"
  74. # The tools package is deprecated, it is an empty meta package for backward compatibility
  75. RDEPENDS_${PN}-tools += "${PN}-client ${PN}-progress ${PN}-tools-hawkbit \
  76. ${@bb.utils.contains('DISTRO_FEATURES','systemd','${PN}-usb','',d)} \
  77. "
  78. S = "${WORKDIR}/git"
  79. B = "${WORKDIR}/build"
  80. EXTRA_OEMAKE += " O=${B} HOSTCC="${BUILD_CC}" HOSTCXX="${BUILD_CXX}" LD="${CC}" DESTDIR="${D}" LIBDIR="${libdir}" V=1 ARCH=${TARGET_ARCH} CROSS_COMPILE=${TARGET_PREFIX} SKIP_STRIP=y"
  81. DEPENDS += "kern-tools-native"
  82. python () {
  83. import re
  84. try:
  85. defconfig = bb.fetch2.localpath('file://defconfig', d)
  86. except bb.fetch2.FetchError:
  87. return
  88. try:
  89. configfile = open(defconfig)
  90. except IOError:
  91. return
  92. features = configfile.read()
  93. configfile.close()
  94. for current_fragment in find_cfgs(d):
  95. try:
  96. fragment_fd = open(current_fragment)
  97. except IOError:
  98. continue
  99. fragment = fragment_fd.read()
  100. fragment_fd.close()
  101. fragment_search = re.findall('^(?:# )?(CONFIG_[a-zA-Z0-9_]*)[= ].*\n?', fragment, re.MULTILINE)
  102. for feature in fragment_search:
  103. features = re.sub("^(?:# )?" + feature + "[= ].*\n?", "", features, flags=re.MULTILINE)
  104. features = features + fragment
  105. features = features.splitlines(True)
  106. depends = d.getVar('DEPENDS', False)
  107. if 'CONFIG_REMOTE_HANDLER=y\n' in features:
  108. depends += ' zeromq'
  109. if 'CONFIG_SSL_IMPL_OPENSSL=y\n' in features:
  110. depends += ' openssl'
  111. elif 'CONFIG_SSL_IMPL_MBEDTLS=y\n' in features:
  112. depends += ' mbedtls'
  113. elif 'CONFIG_SSL_IMPL_WOLFSSL=y\n' in features:
  114. depends += ' wolfssl'
  115. if 'CONFIG_JSON=y\n' in features:
  116. depends += ' json-c'
  117. if 'CONFIG_SYSTEMD=y\n' in features:
  118. depends += ' systemd'
  119. if 'CONFIG_ARCHIVE=y\n' in features:
  120. depends += ' libarchive'
  121. if 'CONFIG_LUA=y\n' in features:
  122. depends += ' lua'
  123. if 'CONFIG_UBOOT=y\n' in features:
  124. depends += ' libubootenv'
  125. if 'CONFIG_DOWNLOAD=y\n' in features or 'CONFIG_SURICATTA=y\n' in features:
  126. depends += ' curl'
  127. if 'CONFIG_MTD=y\n' in features or 'CONFIG_CFI=y\n' in features or 'CONFIG_UBIVOL=y\n' in features:
  128. depends += ' mtd-utils'
  129. if 'CONFIG_UCFWHANDLER=y\n' in features:
  130. depends += ' libgpiod'
  131. if 'CONFIG_SWUFORWARDER_HANDLER=y\n' in features:
  132. depends += ' curl libwebsockets uriparser'
  133. if 'CONFIG_RDIFFHANDLER=y\n' in features:
  134. depends += ' librsync'
  135. if 'CONFIG_BOOTLOADER_EBG=y\n' in features:
  136. depends += ' efibootguard'
  137. if 'CONFIG_ZSTD=y\n' in features:
  138. depends += ' zstd'
  139. if 'CONFIG_DISKPART=y\n' in features:
  140. depends += ' util-linux'
  141. d.setVar('DEPENDS', depends)
  142. if 'CONFIG_MONGOOSE=y\n' in features:
  143. d.setVar('SWUPDATE_MONGOOSE', 'true')
  144. else:
  145. d.setVar('SWUPDATE_MONGOOSE', 'false')
  146. if 'CONFIG_MONGOOSE_WEB_API_V2=y\n' in features:
  147. d.setVar('SWUPDATE_WWW', 'webapp')
  148. # Values not used here might be used in a bbappend
  149. d.setVar('SWUPDATE_SOCKET_CTRL_PATH', '/tmp/sockinstctrl')
  150. d.setVar('SWUPDATE_SOCKET_PROGRESS_PATH', '/tmp/swupdateprog')
  151. d.setVar('SWUPDATE_HW_COMPATIBILITY_FILE', '/etc/hwrevision')
  152. d.setVar('SWUPDATE_SW_VERSIONS_FILE', '/etc/sw-versions')
  153. for feature in features:
  154. if feature.startswith('CONFIG_SOCKET_CTRL_PATH='):
  155. ctrl_path = feature.split('=')[1].strip()
  156. d.setVar('SWUPDATE_SOCKET_CTRL_PATH', ctrl_path)
  157. elif feature.startswith('CONFIG_SOCKET_PROGRESS_PATH='):
  158. prog_path = feature.split('=')[1].strip()
  159. d.setVar('SWUPDATE_SOCKET_PROGRESS_PATH', prog_path)
  160. elif feature.startswith('CONFIG_HW_COMPATIBILITY_FILE='):
  161. hwrev_file = feature.split('=')[1].strip()
  162. d.setVar('SWUPDATE_HW_COMPATIBILITY_FILE', hwrev_file)
  163. elif feature.startswith('CONFIG_SW_VERSIONS_FILE='):
  164. swver_file = feature.split('=')[1].strip()
  165. d.setVar('SWUPDATE_SW_VERSIONS_FILE', swver_file)
  166. }
  167. do_configure () {
  168. cat > ${WORKDIR}/.config <<HEREDOC
  169. CONFIG_EXTRA_CFLAGS="${CFLAGS}"
  170. CONFIG_EXTRA_LDFLAGS="${LDFLAGS}"
  171. HEREDOC
  172. cat ${WORKDIR}/defconfig >> ${WORKDIR}/.config
  173. merge_config.sh -O ${B} -m ${WORKDIR}/.config ${@" ".join(find_cfgs(d))}
  174. (cd ${S} && cml1_do_configure)
  175. }
  176. do_compile() {
  177. unset LDFLAGS
  178. (cd ${S} && oe_runmake)
  179. }
  180. do_install () {
  181. (cd ${S} && oe_runmake install)
  182. install -m 0755 -d ${D}/www
  183. if [ -d ${S}/web-app ];then
  184. cp -R --no-dereference --preserve=mode,links -v ${S}/examples/www/v2/* ${D}/www
  185. else
  186. install -m 0755 ${S}/www/* ${D}/www
  187. fi
  188. install -d ${D}${sysconfdir}/init.d
  189. install -m 755 ${WORKDIR}/swupdate ${D}${sysconfdir}/init.d
  190. sed -i -e "s|/usr/lib/|${libdir}/|" ${D}${sysconfdir}/init.d/swupdate
  191. # shell based configuration loader allows to place code snippets into this folder
  192. install -d ${D}${libdir}/swupdate/conf.d
  193. install -m 755 ${WORKDIR}/swupdate.sh ${D}${libdir}/swupdate
  194. sed -i 's#@LIBDIR@#${libdir}#g' ${D}${libdir}/swupdate/swupdate.sh
  195. if ${SWUPDATE_MONGOOSE}; then
  196. install -m 644 ${WORKDIR}/10-mongoose-args ${D}${libdir}/swupdate/conf.d/
  197. fi
  198. install -d ${D}${systemd_unitdir}/system
  199. install -m 644 ${WORKDIR}/swupdate.service ${D}${systemd_system_unitdir}
  200. sed -i 's#@LIBDIR@#${libdir}#' ${D}${systemd_system_unitdir}/swupdate.service
  201. install -m 644 ${WORKDIR}/swupdate.socket.tmpl ${D}${systemd_system_unitdir}/swupdate.socket
  202. sed -e "s,@@SWUPDATE_SOCKET_CTRL_PATH@@,${SWUPDATE_SOCKET_CTRL_PATH},g" \
  203. -e "s,@@SWUPDATE_SOCKET_PROGRESS_PATH@@,${SWUPDATE_SOCKET_PROGRESS_PATH},g" \
  204. -i ${D}${systemd_system_unitdir}/swupdate.socket
  205. install -m 644 ${WORKDIR}/swupdate-usb@.service ${D}${systemd_system_unitdir}
  206. install -m 644 ${WORKDIR}/swupdate-progress.service ${D}${systemd_system_unitdir}
  207. if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
  208. install -d ${D}${libdir}/tmpfiles.d
  209. install -m 0644 ${WORKDIR}/tmpfiles-swupdate.conf ${D}${libdir}/tmpfiles.d/swupdate.conf
  210. install -d ${D}${sysconfdir}/udev/rules.d
  211. install -m 0644 ${WORKDIR}/swupdate-usb.rules ${D}${sysconfdir}/udev/rules.d/
  212. fi
  213. # in case of systemd there is a service file, for sysv init we need to start it as well
  214. install -m 0644 ${WORKDIR}/90-start-progress ${D}${libdir}/swupdate/conf.d/
  215. }
  216. INITSCRIPT_NAME = "swupdate"
  217. INITSCRIPT_PARAMS = "defaults 70"
  218. SYSTEMD_PACKAGES = "${PN} ${PN}-progress ${PN}-usb"
  219. SYSTEMD_SERVICE_${PN} = "swupdate.service swupdate.socket"
  220. SYSTEMD_SERVICE_${PN}-progress = "swupdate-progress.service"
  221. SYSTEMD_SERVICE_${PN}-usb = "swupdate-usb@.service"