diff options
-rw-r--r-- | updater-ng/Makefile | 75 | ||||
-rw-r--r-- | updater-ng/files/turris.lua | 95 | ||||
-rw-r--r-- | updater-ng/files/updater.config | 4 |
3 files changed, 174 insertions, 0 deletions
diff --git a/updater-ng/Makefile b/updater-ng/Makefile new file mode 100644 index 0000000..6a573ed --- /dev/null +++ b/updater-ng/Makefile @@ -0,0 +1,75 @@ +# +## Copyright (C) 2016-2020 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_URL:=https://gitlab.labs.nic.cz/turris/updater/updater.git +PKG_SOURCE_BRANCH:=libarchive-unpack +PKG_MAINTAINER:=CZ.NIC <packaging@turris.cz> + +PKG_BUILD_DEPENDS:=busybox libb64 uthash argp-standalone + +include $(INCLUDE_DIR)/autopkg-branch.mk +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + TITLE:=The next generation updater + DEPENDS:=\ + +liblua \ + +libuci-lua \ + +libevent2 \ + +libcurl \ + +liburiparser \ + +libarchive \ + +usign \ + +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/pkgupdate $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/pkgtransaction $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/update_alternatives.sh $(1)/usr/bin/ + + $(INSTALL_DIR) $(1)/etc/updater + $(INSTALL_CONF) $(PKG_BUILD_DIR)/src/pkgupdate/configs/conf.lua $(1)/etc/updater + $(INSTALL_DIR) $(1)/etc/updater/conf.d + $(INSTALL_CONF) ./files/turris.lua $(1)/etc/updater/conf.d/turris.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 + touch $(1)/etc/updater/hook_preupdate/.keep + $(INSTALL_DIR) $(1)/etc/updater/hook_postupdate + touch $(1)/etc/updater/hook_postupdate/.keep + $(INSTALL_DIR) $(1)/etc/updater/hook_reboot_required + $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/pkgupdate/hook_reboot_required/50-create-notification.sh $(1)/etc/updater/hook_reboot_required/50-create-notification.sh + + # Note: this file is not ever used as appropriate one is generated to medkit + # it is here only for reference and to make sure that it exists. + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_CONF) ./files/updater.config $(1)/etc/config/updater +endef + +define Package/$(PKG_NAME)/conffiles +/etc/updater/conf.d/example.lua +/etc/config/updater +endef + + +define Build/Compile + $(MAKE_VARS) $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_FLAGS) \ + NO_DOC=1 LUA_COMPILE:=no \ + BUSYBOX_EXEC=$(STAGING_DIR)/bin/busybox-static \ + ARGP_STANDALONE=y \ + UPDATER_VERSION:=$(PKG_VERSION) +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/updater-ng/files/turris.lua b/updater-ng/files/turris.lua new file mode 100644 index 0000000..97a7faf --- /dev/null +++ b/updater-ng/files/turris.lua @@ -0,0 +1,95 @@ +--[[ +This file is part of updater-ng. Don't edit it. +]] + +local uci_cursor = nil +if uci then + uci_cursor = uci.cursor(root_dir .. "/etc/config") +else + ERROR("UCI library is not available. Configuration not used.") +end +local function uci_cnf(name, default) + if uci_cursor then + return uci_cursor:get("updater", "turris", name) or default + else + return default + end +end + +-- Configuration variables +local mode = uci_cnf("mode", "branch") -- should we follow branch or version? +local branch = uci_cnf("branch", "hbs") -- which branch to follow +local version = uci_cnf("version", nil) -- which version to follow +local pkglists = uci_cnf("pkglists", {}) -- what additional lists should we use + +-- Verify that we have sensible configuration +if mode == "version" and not version then + WARN("Mode configured to be 'version' but no version provided. Changing mode to 'branch' instead.") + mode = "branch" +end + +-- Convert pkglists to set set of lists (ensures uniqueness) +if type(pkglists) == "string" then -- if there is single list then uci returns just a string + pkglists = {pkglists} +end +local lists = {} +for _, list in pairs(pkglists) do + lists["pkglists/" .. list] = true +end + +-- Load lists forced by boot arguments +if root_dir == "/" then + local cmdf = io.open("/proc/cmdline") + if cmdf then + for cmdarg in cmdf:read():gmatch('[^ ]+') do + local key, value = cmdarg:match('([^=]+)=(.*)') + if key == "turris_lists" then + for list in value:gmatch('[^,]+') do + lists[list] = true + end + end + end + cmdf:close() + end +end + +-- Detect host board +local product = os_release["OPENWRT_DEVICE_PRODUCT"] or os_release["LEDE_DEVICE_PRODUCT"] +if product:match("[Mm]ox") then + board = "mox" +elseif product:match("[Oo]mnia") then + board = "omnia" +elseif product:match("[Tt]urris 1.x") then + board = "turris1x" +else + DIE("Unsupported Turris board: " .. tostring(product)) +end +Export('board') + +-- Common URI to Turris OS lists +local base_url +if mode == "branch" then + base_url = "https://repo.turris.cz/" .. branch .. "/" .. board .. "/lists/" +elseif mode == "version" then + base_url = "https://repo.turris.cz/archive/" .. version .. "/" .. board .. "/lists/" +else + DIE("Invalid updater.turris.mode specified: " .. mode) +end + +-- Common connection settings for Turris OS scripts +local script_options = { + security = "Remote", + pubkey = { + "file:///etc/updater/keys/release.pub", + "file:///etc/updater/keys/standby.pub", + "file:///etc/updater/keys/test.pub" -- It is normal for this one to not be present in production systems + } +} + +-- The distribution base script. It contains the repository and bunch of basic packages +Script(base_url .. "base.lua", script_options) + +-- Additional enabled distribution lists +for l in pairs(lists) do + Script(base_url .. l .. ".lua", script_options) +end diff --git a/updater-ng/files/updater.config b/updater-ng/files/updater.config new file mode 100644 index 0000000..82e220e --- /dev/null +++ b/updater-ng/files/updater.config @@ -0,0 +1,4 @@ + +config turris 'turris' + option mode 'branch' + |