swupdate.inc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. SUMMARY = "Image updater for Yocto projects"
  2. DESCRIPTION = "Application for automatic software update from USB Pen"
  3. HOMEPAGE = "https://swupdate.org"
  4. SECTION = "swupdate"
  5. DEPENDS += "libconfig zlib libubootenv json-c"
  6. # SWUpdate licensing is described in the following pages:
  7. # https://sbabic.github.io/swupdate/licensing.html
  8. # rst form: file://doc/source/licensing.rst
  9. LICENSE = "GPL-2.0-only & GPL-2.0-or-later & LGPL-2.1-or-later & LGPL-2.1-only & MIT & ISC & BSD-1-Clause & BSD-3-Clause"
  10. LICENSE:${PN}-ipc = "LGPL-2.1-or-later"
  11. LICENSE:${PN}-lua = "LGPL-2.1-only & MIT"
  12. LICENSE:${PN}-www = "MIT"
  13. LIC_FILES_CHKSUM = " \
  14. file://LICENSES/BSD-1-Clause.txt;md5=4c75b3902cf6a01969906bcae9cf8cd6 \
  15. file://LICENSES/BSD-3-Clause.txt;md5=4a1190eac56a9db675d58ebe86eaf50c \
  16. file://LICENSES/CC0-1.0.txt;md5=0ceb3372c9595f0a8067e55da801e4a1 \
  17. file://LICENSES/CC-BY-SA-4.0.txt;md5=7130783469368ceb248a4f03e89ea4b8 \
  18. file://LICENSES/GPL-2.0-only.txt;md5=4ee23c52855c222cba72583d301d2338 \
  19. file://LICENSES/GPL-2.0-or-later.txt;md5=261bea1168c0bdfa73232ee90df11eb6 \
  20. file://LICENSES/ISC.txt;md5=a6fd9988b21ff227cdfb961fd4b23ba4 \
  21. file://LICENSES/LGPL-2.1-or-later.txt;md5=4fbd65380cdd255951079008b364516c \
  22. file://LICENSES/MIT.txt;md5=838c366f69b72c5df05c96dff79b35f2 \
  23. file://LICENSES/OFL-1.1.txt;md5=7a75f82b54b8af9107d35c6d3cab23ac \
  24. "
  25. inherit cml1 update-rc.d systemd pkgconfig
  26. SRCBRANCH ?= "master"
  27. SRC_URI = "git://github.com/sbabic/swupdate.git;protocol=https;branch=${SRCBRANCH} \
  28. file://defconfig \
  29. file://swupdate \
  30. file://swupdate.sh \
  31. file://swupdate.service \
  32. file://swupdate.socket.tmpl \
  33. file://swupdate-usb.rules \
  34. file://swupdate-usb@.service \
  35. file://swupdate-progress.service \
  36. file://tmpfiles-swupdate.conf \
  37. file://10-mongoose-args.in \
  38. file://90-start-progress \
  39. "
  40. LTOEXTRA += "-flto-partition=none"
  41. PACKAGES =+ " \
  42. ${PN}-client \
  43. ${PN}-ipc \
  44. ${PN}-lua \
  45. ${PN}-progress \
  46. ${PN}-tools \
  47. ${PN}-tools-hawkbit \
  48. ${PN}-tools-ipc \
  49. ${PN}-usb \
  50. ${PN}-www \
  51. "
  52. INSANE_SKIP:${PN}-lua = "dev-so"
  53. wwwdir ?= "/www"
  54. # tools is now an empty meta package for backward compatibility
  55. ALLOW_EMPTY:${PN}-tools = "1"
  56. ALLOW_EMPTY:${PN}-tools-hawkbit = "1"
  57. ALLOW_EMPTY:${PN}-tools-ipc = "1"
  58. FILES:${PN}-client = "${bindir}/swupdate-client"
  59. FILES:${PN}-ipc = "${libdir}/libswupdate${SOLIBS}"
  60. FILES:${PN}-lua += "${libdir}/lua/"
  61. FILES:${PN}-progress = " \
  62. ${bindir}/swupdate-progress \
  63. ${systemd_system_unitdir}/swupdate-progress.service \
  64. ${libdir}/swupdate/conf.d/90-start-progress \
  65. "
  66. FILES:${PN}-usb = " \
  67. ${sysconfdir}/udev/rules.d/swupdate-usb.rules \
  68. ${systemd_system_unitdir}/swupdate-usb@.service \
  69. "
  70. FILES:${PN}-tools-hawkbit = " \
  71. ${bindir}/swupdate-hawkbitcfg \
  72. ${bindir}/swupdate-sendtohawkbit \
  73. "
  74. FILES:${PN}-tools-ipc = " \
  75. ${bindir}/swupdate-ipc \
  76. "
  77. FILES:${PN} += " \
  78. ${nonarch_libdir}/tmpfiles.d \
  79. ${libdir}/swupdate/* \
  80. ${systemd_system_unitdir}/swupdate.socket \
  81. ${systemd_system_unitdir}/swupdate.service \
  82. ${sysconfdir}/init.d/* \
  83. "
  84. FILES:${PN}-www = " \
  85. ${libdir}/swupdate/conf.d/*mongoose* \
  86. ${wwwdir}/* \
  87. "
  88. RDEPENDS:${PN}-usb += "${PN}-client"
  89. # The tools package is deprecated, it is an empty meta package for backward compatibility
  90. RDEPENDS:${PN}-tools += "${PN}-client ${PN}-progress ${PN}-tools-hawkbit \
  91. ${@bb.utils.contains('DISTRO_FEATURES','systemd','${PN}-usb','',d)} \
  92. "
  93. RDEPENDS:${PN}-dev += "${PN}-ipc"
  94. RRECOMMENDS:${PN} += "${PN}-ipc"
  95. S = "${WORKDIR}/git"
  96. B = "${WORKDIR}/build"
  97. 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"
  98. DEPENDS += "kern-tools-native"
  99. python () {
  100. import re
  101. try:
  102. defconfig = bb.fetch2.localpath('file://defconfig', d)
  103. except bb.fetch2.FetchError:
  104. return
  105. try:
  106. configfile = open(defconfig)
  107. except IOError:
  108. return
  109. features = configfile.read()
  110. configfile.close()
  111. for current_fragment in find_cfgs(d):
  112. try:
  113. fragment_fd = open(current_fragment)
  114. except IOError:
  115. continue
  116. fragment = fragment_fd.read()
  117. fragment_fd.close()
  118. fragment_search = re.findall('^(?:# )?(CONFIG_[a-zA-Z0-9_]*)[= ].*\n?', fragment, re.MULTILINE)
  119. for feature in fragment_search:
  120. features = re.sub("^(?:# )?" + feature + "[= ].*\n?", "", features, flags=re.MULTILINE)
  121. features = features + fragment
  122. features = features.splitlines(True)
  123. depends = ''
  124. pn = d.getVar('PN')
  125. rdepends = ''
  126. mlprefix = d.getVar("MLPREFIX") or ""
  127. if 'CONFIG_REMOTE_HANDLER=y\n' in features:
  128. depends += ' zeromq'
  129. if 'CONFIG_SSL_IMPL_OPENSSL=y\n' in features:
  130. depends += ' openssl'
  131. elif 'CONFIG_SSL_IMPL_MBEDTLS=y\n' in features:
  132. depends += ' mbedtls'
  133. elif 'CONFIG_SSL_IMPL_WOLFSSL=y\n' in features:
  134. depends += ' wolfssl'
  135. if 'CONFIG_JSON=y\n' in features:
  136. depends += ' json-c'
  137. if 'CONFIG_SYSTEMD=y\n' in features:
  138. depends += ' systemd'
  139. if 'CONFIG_ARCHIVE=y\n' in features:
  140. depends += ' libarchive'
  141. if 'CONFIG_LUA=y\n' in features:
  142. depends += ' lua'
  143. if 'CONFIG_UBOOT=y\n' in features:
  144. depends += ' libubootenv'
  145. rdepends += ' libubootenv'
  146. if 'CONFIG_DOWNLOAD=y\n' in features or 'CONFIG_SURICATTA=y\n' in features:
  147. depends += ' curl'
  148. if 'CONFIG_MTD=y\n' in features or 'CONFIG_CFI=y\n' in features or 'CONFIG_UBIVOL=y\n' in features:
  149. depends += ' mtd-utils'
  150. if 'CONFIG_UCFWHANDLER=y\n' in features:
  151. depends += ' libgpiod'
  152. if 'CONFIG_SWUFORWARDER_HANDLER=y\n' in features:
  153. depends += ' curl libwebsockets uriparser'
  154. if 'CONFIG_RDIFFHANDLER=y\n' in features:
  155. depends += ' librsync'
  156. if 'CONFIG_BOOTLOADER_EBG=y\n' in features:
  157. depends += ' efibootguard'
  158. rdepends += ' efibootguard'
  159. if 'CONFIG_ZSTD=y\n' in features:
  160. depends += ' zstd'
  161. if 'CONFIG_XZ=y\n' in features:
  162. depends += ' xz'
  163. if 'CONFIG_DISKPART=y\n' in features:
  164. depends += ' util-linux e2fsprogs'
  165. if 'CONFIG_BTRFS_FILESYSTEM=y\n' in features:
  166. depends += ' btrfs-tools'
  167. if 'CONFIG_DELTA=y\n' in features:
  168. depends += ' zchunk'
  169. if 'CONFIG_EXT_FILESYSTEM=y\n' in features:
  170. depends += ' e2fsprogs'
  171. if mlprefix:
  172. deps = ' '
  173. rdeps = ' '
  174. for dep in depends.split():
  175. dep = mlprefix + dep + ' '
  176. deps += dep
  177. for rdep in rdepends.split():
  178. rdep = mlprefix + dep + ' '
  179. rdeps += rdep
  180. depends = deps
  181. repends = rdeps
  182. d.appendVar('DEPENDS', depends)
  183. d.appendVar("RDEPENDS:%s" % pn, rdepends)
  184. if 'CONFIG_MONGOOSE=y\n' in features:
  185. d.setVar('SWUPDATE_MONGOOSE', 'true')
  186. else:
  187. d.setVar('SWUPDATE_MONGOOSE', 'false')
  188. if 'CONFIG_MONGOOSE_WEB_API_V2=y\n' in features:
  189. d.setVar('SWUPDATE_WWW', 'webapp')
  190. # Values not used here might be used in a bbappend
  191. d.setVar('SWUPDATE_SOCKET_CTRL_PATH', '/tmp/sockinstctrl')
  192. d.setVar('SWUPDATE_SOCKET_PROGRESS_PATH', '/tmp/swupdateprog')
  193. d.setVar('SWUPDATE_HW_COMPATIBILITY_FILE', '/etc/hwrevision')
  194. d.setVar('SWUPDATE_SW_VERSIONS_FILE', '/etc/sw-versions')
  195. for feature in features:
  196. if feature.startswith('CONFIG_SOCKET_CTRL_PATH='):
  197. ctrl_path = feature.split('=')[1].strip().replace('""','')
  198. if ctrl_path != "":
  199. d.setVar('SWUPDATE_SOCKET_CTRL_PATH', ctrl_path)
  200. elif feature.startswith('CONFIG_SOCKET_PROGRESS_PATH='):
  201. prog_path = feature.split('=')[1].strip().replace('""','')
  202. if prog_path != "":
  203. d.setVar('SWUPDATE_SOCKET_PROGRESS_PATH', prog_path)
  204. elif feature.startswith('CONFIG_HW_COMPATIBILITY_FILE='):
  205. hwrev_file = feature.split('=')[1].strip().replace('""','')
  206. if hwrev_file != "":
  207. d.setVar('SWUPDATE_HW_COMPATIBILITY_FILE', hwrev_file)
  208. elif feature.startswith('CONFIG_SW_VERSIONS_FILE='):
  209. swver_file = feature.split('=')[1].strip().replace('""','')
  210. if swver_file != "":
  211. d.setVar('SWUPDATE_SW_VERSIONS_FILE', swver_file)
  212. }
  213. do_configure () {
  214. cat > ${WORKDIR}/.config <<HEREDOC
  215. CONFIG_EXTRA_CFLAGS="${CFLAGS}"
  216. CONFIG_EXTRA_LDFLAGS="${LDFLAGS}"
  217. HEREDOC
  218. cat ${WORKDIR}/defconfig >> ${WORKDIR}/.config
  219. merge_config.sh -O ${B} -m ${WORKDIR}/.config ${@" ".join(find_cfgs(d))}
  220. (cd ${S} && cml1_do_configure)
  221. }
  222. do_compile() {
  223. unset LDFLAGS
  224. (cd ${S} && oe_runmake)
  225. }
  226. do_install () {
  227. (cd ${S} && oe_runmake install)
  228. install -m 0755 -d ${D}${wwwdir}
  229. if [ -d ${S}/web-app ];then
  230. cp -R --no-dereference --preserve=mode,links -v ${S}/examples/www/v2/* ${D}${wwwdir}
  231. else
  232. install -m 0755 ${S}/www/* ${D}${wwwdir}
  233. fi
  234. install -d ${D}${sysconfdir}/init.d
  235. install -m 755 ${WORKDIR}/swupdate ${D}${sysconfdir}/init.d
  236. sed -i -e "s|/usr/lib/|${libdir}/|" ${D}${sysconfdir}/init.d/swupdate
  237. # shell based configuration loader allows to place code snippets into this folder
  238. install -d ${D}${libdir}/swupdate/conf.d
  239. install -m 755 ${WORKDIR}/swupdate.sh ${D}${libdir}/swupdate
  240. sed -i 's#@LIBDIR@#${libdir}#g' ${D}${libdir}/swupdate/swupdate.sh
  241. if ${SWUPDATE_MONGOOSE}; then
  242. install -m 644 ${WORKDIR}/10-mongoose-args.in ${D}${libdir}/swupdate/conf.d/10-mongoose-args
  243. sed -e "s#@@wwwdir@@#${wwwdir}#g" \
  244. -i ${D}${libdir}/swupdate/conf.d/10-mongoose-args
  245. fi
  246. install -d ${D}${systemd_unitdir}/system
  247. install -m 644 ${WORKDIR}/swupdate.service ${D}${systemd_system_unitdir}
  248. sed -i 's#@LIBDIR@#${libdir}#' ${D}${systemd_system_unitdir}/swupdate.service
  249. install -m 644 ${WORKDIR}/swupdate.socket.tmpl ${D}${systemd_system_unitdir}/swupdate.socket
  250. sed -e "s,@@SWUPDATE_SOCKET_CTRL_PATH@@,${SWUPDATE_SOCKET_CTRL_PATH},g" \
  251. -e "s,@@SWUPDATE_SOCKET_PROGRESS_PATH@@,${SWUPDATE_SOCKET_PROGRESS_PATH},g" \
  252. -i ${D}${systemd_system_unitdir}/swupdate.socket
  253. install -m 644 ${WORKDIR}/swupdate-usb@.service ${D}${systemd_system_unitdir}
  254. install -m 644 ${WORKDIR}/swupdate-progress.service ${D}${systemd_system_unitdir}
  255. if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
  256. install -d ${D}${nonarch_libdir}/tmpfiles.d
  257. install -m 0644 ${WORKDIR}/tmpfiles-swupdate.conf ${D}${nonarch_libdir}/tmpfiles.d/swupdate.conf
  258. install -d ${D}${sysconfdir}/udev/rules.d
  259. install -m 0644 ${WORKDIR}/swupdate-usb.rules ${D}${sysconfdir}/udev/rules.d/
  260. else
  261. # in case of systemd there is a service file, for sysv init we need to start it as well
  262. install -m 0644 ${WORKDIR}/90-start-progress ${D}${libdir}/swupdate/conf.d/
  263. fi
  264. }
  265. INITSCRIPT_NAME = "swupdate"
  266. INITSCRIPT_PARAMS = "defaults 70"
  267. SYSTEMD_PACKAGES = "${PN} ${PN}-progress ${PN}-usb"
  268. SYSTEMD_SERVICE:${PN} = "swupdate.service swupdate.socket"
  269. SYSTEMD_SERVICE:${PN}-progress = "swupdate-progress.service"
  270. SYSTEMD_SERVICE:${PN}-usb = "swupdate-usb@.service"