swupdate.inc 8.6 KB

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