#
## Copyright (C) 2016-2017 CZ.NIC z.s.p.o. (http://www.nic.cz/)
#
## This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
# #
#
include $(TOPDIR)/rules.mk

PKG_NAME:=updater-ng
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://gitlab.labs.nic.cz/turris/updater.git
PKG_SOURCE_BRANCH:=master
PKG_MAINTAINER:=CZ.NIC <packaging@turris.cz>
HOST_BUILD_DEPENDS:=curl/host libevent2/host lua/host

include $(INCLUDE_DIR)/pkgauto.mk
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/host-build.mk

define Package/$(PKG_NAME)
	TITLE:=The next generation updater
	DEPENDS:=+liblua +libevent2 +usign +libcurl +vixie-cron +ca-certificates
endef

define Package/$(PKG_NAME)/install
	$(INSTALL_DIR) $(1)/usr/lib/
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/libupdater.so $(1)/usr/lib/

	$(INSTALL_DIR) $(1)/usr/bin
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/opkg-trans $(1)/usr/bin/
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/pkgupdate $(1)/usr/bin/
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/pkgupdate/updater.sh $(1)/usr/bin/
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/pkgupdate/updater-unstuck.sh $(1)/usr/bin/
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/pkgupdate/updater-wipe.sh $(1)/usr/bin/

	$(INSTALL_DIR) $(1)/etc/updater
	$(INSTALL_CONF) $(PKG_BUILD_DIR)/src/pkgupdate/configs/entry.lua $(1)/etc/updater
	$(INSTALL_DIR) $(1)/etc/updater/conf.d
	$(INSTALL_CONF) $(PKG_BUILD_DIR)/src/pkgupdate/configs/base.lua $(1)/etc/updater/conf.d/base.lua
	$(INSTALL_CONF) $(PKG_BUILD_DIR)/src/pkgupdate/configs/example.lua $(1)/etc/updater/conf.d/example.lua

	$(INSTALL_DIR) $(1)/etc/updater/hook_preupdate
	$(INSTALL_DIR) $(1)/etc/updater/hook_postupdate
	$(INSTALL_DIR) $(1)/etc/updater/hook_reboot_required
	touch $(1)/etc/updater/hook_preupdate/.keep
	touch $(1)/etc/updater/hook_postupdate/.keep
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/pkgupdate/hook_reboot_required/50-create-notification.sh $(1)/etc/updater/hook_reboot_required/50-create-notification.sh

	$(INSTALL_DIR) $(1)/etc/config
	$(INSTALL_CONF) ./files/updater.config $(1)/etc/config/updater
ifneq ($(PKG_BRANCH),)
	echo >> $(1)/etc/config/updater
	echo "config override 'override'" >> $(1)/etc/config/updater
	echo "	option branch '$(PKG_BRANCH)'" >> $(1)/etc/config/updater
endif

	$(INSTALL_DIR) $(1)/etc/init.d
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/pkgupdate/init $(1)/etc/init.d/updater

	$(INSTALL_DIR) $(1)/etc/cron.d
	$(INSTALL_CONF) $(PKG_BUILD_DIR)/src/pkgupdate/cron $(1)/etc/cron.d/updater
endef

define Package/$(PKG_NAME)/conffiles
/etc/updater/conf.d/example.lua
/etc/config/updater
endef

define Package/$(PKG_NAME)/postinst
#!/bin/sh
if [ -z "$$IPKG_INSTROOT" ]; then
	/etc/init.d/updater enable || true
fi

# Remove morphered syntax from auto.lua
# This matches all Install and Package commands not followed by brackets. Whole
# line is enclosed with brackets and between strings and tables are added commas.
# Note: we don't have to check opkg-auto.lua as we do this migration before we
# move auto.lua to that name.
if [ -f "$$IPKG_INSTROOT/etc/updater/auto.lua" ]; then
	AUTOTMP="$$(mktemp)"
	sed -E '/^(Install|Package) +[^(]/{
			s/(Install|Package) +(.*)/\1(\2)/;
			s/("|\}) ("|\{)/\1, \2/g
		}' "$$IPKG_INSTROOT/etc/updater/auto.lua" > "$$AUTOTMP"
	# Note: Edit in place in busybox limits regexp syntax so we are using our temporally file
	mv "$$AUTOTMP" "$$IPKG_INSTROOT/etc/updater/auto.lua"
fi

# With updater version 60.0 all configurations were moved to /etc/updater/conf.d/
conf_move() {
	if [ -f "$$IPKG_INSTROOT/etc/updater/$$1" -a ! -f "$$IPKG_INSTROOT/etc/updater/conf.d/$$2" ]; then
		mv "$$IPKG_INSTROOT/etc/updater/$$1" "$$IPKG_INSTROOT/etc/updater/conf.d/$$2"
	fi
}
conf_move user.lua user.lua
conf_move auto.lua opkg-auto.lua
endef

define Build/Compile
	$(MAKE_VARS) $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_FLAGS) NO_DOC=1 LUA_COMPILE:=no UPDATER_VERSION:=$(PKG_VERSION)
endef

define Host/Compile
	$(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR) $(HOST_MAKE_FLAGS) NO_DOC=1 LUA_COMPILE:=no UPDATER_VERSION:=$(PKG_VERSION)
endef

define Host/Install
	$(INSTALL_DIR) $(STAGING_DIR_HOST)/usr/lib/
	$(INSTALL_BIN) $(HOST_BUILD_DIR)/lib/libupdater.so $(STAGING_DIR_HOST)/usr/lib/

	$(INSTALL_DIR) $(STAGING_DIR_HOST)/usr/bin
	$(INSTALL_BIN) $(HOST_BUILD_DIR)/bin/opkg-trans $(STAGING_DIR_HOST)/usr/bin/
	$(INSTALL_BIN) $(HOST_BUILD_DIR)/bin/pkgupdate $(STAGING_DIR_HOST)/usr/bin/
endef


define Package/$(PKG_NAME)-localrepo
	TITLE:=Next generation updater local repository manager
	DEPENDS:=+python-light
endef

define Package/$(PKG_NAME)-localrepo/install
	$(INSTALL_DIR) $(1)/usr/bin
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/localrepo/localrepo $(1)/usr/bin/localrepo
	$(INSTALL_DIR) $(1)/etc/updater/conf.d
	$(INSTALL_CONF) $(PKG_BUILD_DIR)/src/localrepo/localrepo.lua $(1)/etc/updater/conf.d/localrepo.lua
endef

# Repository should be consistent when updater is executed successfully but this
# ensures that we will fix any problems that can be caused by older version of
# localrepo
define Package/$(PKG_NAME)-localrepo/postinst
[ -n "$$IPKG_INSTROOT" ] || {
	localrepo check --fix
}
endef


define Package/$(PKG_NAME)-opkg
	TITLE:=OPKG compatibility wrapper for next generation updater
	DEPENDS:=+opkg +$(PKG_NAME)-localrepo
endef

define Package/$(PKG_NAME)-opkg/install
	$(INSTALL_DIR) $(1)/usr/bin
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/opkg-wrapper/opkg $(1)/usr/bin/opkg-pkgupdate-wrapper.sh
	$(INSTALL_DIR) $(1)/usr/share/updater
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/localrepo/content2localrepo $(1)/usr/share/updater/opkg-content2localrepo.sh
	$(INSTALL_DIR) $(1)/etc/updater/conf.d
	$(INSTALL_CONF) $(PKG_BUILD_DIR)/src/opkg-wrapper/opkg.lua $(1)/etc/updater/conf.d/opkg.lua
endef

# We are calling migration to localrepo from updater-ng-opkg package posinst as
# this one is called after updater-ng-localrepo one and script expect both of
# these packages.
define Package/$(PKG_NAME)-opkg/postinst
[ -n "$$IPKG_INSTROOT" ] || {
	/usr/share/updater/opkg-content2localrepo.sh
}
endef

# Current implementation of updater can't remove package before replan and so we
# can't let updater-ng steal opkg-trans files. With dependency:
#   if not version_match then
# 		Package 'updater-ng' { deps = 'opkg-trans' }
# 	end
# this empty package should ensure that we correctly move packages from opkg-trans
# to updater-ng even with old version of updater. Unfortunately this won't work
# with downgrade.
# Note that because version_match was defined after package rename we can't use it
# to check version. But if it isn't defined than we know that we are using some
# old version of updater.
define Package/opkg-trans
	TITLE:=Dummy opkg-trans package
endef

define Package/opkg-trans/install
	true
endef

# This is same case as opkg-trans. Updater is package with originally obsolete
# updater version.
define Package/updater
	TITLE:=Dummy updater package
endef

define Package/updater/install
	true
endef

$(eval $(call BuildPackage,updater-ng))
$(eval $(call BuildPackage,updater-ng-localrepo))
$(eval $(call BuildPackage,updater-ng-opkg))
$(eval $(call BuildPackage,opkg-trans))
$(eval $(call BuildPackage,updater))
$(eval $(call HostBuild))