From d05491c8a14e84e96419076aa690c5bc97bcde59 Mon Sep 17 00:00:00 2001 From: Cameron Thompson <50184035+iamromulan@users.noreply.github.com> Date: Sat, 22 Feb 2025 00:06:06 -0500 Subject: [PATCH] Remove conflicting files Files from luci-lua-runtime are appart of luci-base on sdxpinn. Removed conflicting files. Rebuilt opkg feed --- .../CONTROL/control | 8 +- .../root/usr/lib/lua/luci/cacheloader.lua | 12 - .../root/usr/lib/lua/luci/ccache.lua | 76 --- .../root/usr/lib/lua/luci/config.lua | 18 - .../root/usr/lib/lua/luci/dispatcher.lua | 484 -------------- .../root/usr/lib/lua/luci/i18n.lua | 55 -- .../root/usr/lib/lua/luci/model/uci.lua | 508 --------------- .../root/usr/lib/lua/luci/store.lua | 6 - .../root/usr/lib/lua/luci/sys.lua | 615 ------------------ .../root/usr/lib/lua/luci/sys/zoneinfo.lua | 19 - .../usr/lib/lua/luci/sys/zoneinfo/tzdata.lua | 455 ------------- .../lib/lua/luci/sys/zoneinfo/tzoffset.lua | 46 -- .../root/usr/lib/lua/luci/template.lua | 184 ------ .../root/usr/lib/lua/luci/template/parser.so | Bin 65666 -> 0 bytes .../root/usr/lib/lua/luci/version.lua | 20 - .../lua/luci/view/empty_node_placeholder.htm | 11 - .../root/usr/lib/lua/luci/view/indexer.htm | 7 - .../root/usr/lib/lua/luci/xml.lua | 26 - opkg-feed/Packages | 12 +- opkg-feed/Packages.gz | Bin 2926 -> 2932 bytes opkg-feed/Packages.log | 18 +- opkg-feed/Packages.sig | 2 +- ...e_25.034.70690~7b0663a-sdxpinn_sdxpinn.ipk | Bin 0 -> 2072 bytes ...5.034.70690~7b0663a_aarch64_cortex-a53.ipk | Bin 31355 -> 0 bytes 24 files changed, 18 insertions(+), 2564 deletions(-) mode change 100644 => 100755 ipk-source/luci-lua-runtime_aarch64_cortex-a53/CONTROL/control delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/cacheloader.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/ccache.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/config.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/dispatcher.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/i18n.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/model/uci.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/store.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo/tzdata.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo/tzoffset.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/template.lua delete mode 100755 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/template/parser.so delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/version.lua delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/view/empty_node_placeholder.htm delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/view/indexer.htm delete mode 100644 ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/xml.lua create mode 100644 opkg-feed/luci-lua-runtime_25.034.70690~7b0663a-sdxpinn_sdxpinn.ipk delete mode 100644 opkg-feed/luci-lua-runtime_25.034.70690~7b0663a_aarch64_cortex-a53.ipk diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/CONTROL/control b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/CONTROL/control old mode 100644 new mode 100755 index 2342d1c..e7eff13 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/CONTROL/control +++ b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/CONTROL/control @@ -1,5 +1,5 @@ Package: luci-lua-runtime -Version: 25.034.70690~7b0663a +Version: 25.034.70690~7b0663a-sdxpinn Depends: libc, luci-base, lua, luci-lib-base, luci-lib-nixio, luci-lib-ip, luci-lib-jsonc, libubus-lua, liblucihttp-lua, ucode-mod-lua Source: https://dl.openwrt.ai/packages-24.10/aarch64_cortex-a53/luci/luci-lua-runtime_25.049.66344~2b8e93c_aarch64_cortex-a53.ipk SourceName: luci-lua-runtime @@ -7,7 +7,7 @@ License: Apache-2.0 Section: luci SourceDateEpoch: 1738611490 URL: https://github.com/openwrt/luci -Maintainer: OpenWrt LuCI community -Architecture: aarch64_cortex-a53 +Maintainer: github/iamromulan +Architecture: sdxpinn Installed-Size: 153600 -Description: LuCI Lua runtime libraries +Description: Missing LuCI Lua runtime libraries for sdxpinn diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/cacheloader.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/cacheloader.lua deleted file mode 100644 index 7ef971d..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/cacheloader.lua +++ /dev/null @@ -1,12 +0,0 @@ --- Copyright 2008 Steven Barth --- Copyright 2008 Jo-Philipp Wich --- Licensed to the public under the Apache License 2.0. - -local config = require "luci.config" -local ccache = require "luci.ccache" - -module "luci.cacheloader" - -if config.ccache and config.ccache.enable == "1" then - ccache.cache_ondemand() -end diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/ccache.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/ccache.lua deleted file mode 100644 index d3be7cb..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/ccache.lua +++ /dev/null @@ -1,76 +0,0 @@ --- Copyright 2008 Steven Barth --- Copyright 2008 Jo-Philipp Wich --- Licensed to the public under the Apache License 2.0. - -local io = require "io" -local fs = require "nixio.fs" -local util = require "luci.util" -local nixio = require "nixio" -local debug = require "debug" -local string = require "string" -local package = require "package" - -local type, loadfile = type, loadfile - - -module "luci.ccache" - -function cache_ondemand(...) - if debug.getinfo(1, 'S').source ~= "=?" then - cache_enable(...) - end -end - -function cache_enable(cachepath, mode) - cachepath = cachepath or "/tmp/luci-modulecache" - mode = mode or "r--r--r--" - - local loader = package.loaders[2] - local uid = nixio.getuid() - - if not fs.stat(cachepath) then - fs.mkdir(cachepath) - end - - local function _encode_filename(name) - local encoded = "" - for i=1, #name do - encoded = encoded .. ("%2X" % string.byte(name, i)) - end - return encoded - end - - local function _load_sane(file) - local stat = fs.stat(file) - if stat and stat.uid == uid and stat.modestr == mode then - return loadfile(file) - end - end - - local function _write_sane(file, func) - if nixio.getuid() == uid then - local fp = io.open(file, "w") - if fp then - fp:write(util.get_bytecode(func)) - fp:close() - fs.chmod(file, mode) - end - end - end - - package.loaders[2] = function(mod) - local encoded = cachepath .. "/" .. _encode_filename(mod) - local modcons = _load_sane(encoded) - - if modcons then - return modcons - end - - -- No cachefile - modcons = loader(mod) - if type(modcons) == "function" then - _write_sane(encoded, modcons) - end - return modcons - end -end diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/config.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/config.lua deleted file mode 100644 index d01153f..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/config.lua +++ /dev/null @@ -1,18 +0,0 @@ --- Copyright 2008 Steven Barth --- Licensed to the public under the Apache License 2.0. - -local util = require "luci.util" -module("luci.config", - function(m) - if pcall(require, "luci.model.uci") then - local config = util.threadlocal() - setmetatable(m, { - __index = function(tbl, key) - if not config[key] then - config[key] = luci.model.uci.cursor():get_all("luci", key) - end - return config[key] - end - }) - end - end) diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/dispatcher.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/dispatcher.lua deleted file mode 100644 index bbe7600..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/dispatcher.lua +++ /dev/null @@ -1,484 +0,0 @@ --- Copyright 2008 Steven Barth --- Copyright 2008-2015 Jo-Philipp Wich --- Licensed to the public under the Apache License 2.0. - -module("luci.dispatcher", package.seeall) - -local http = _G.L.http - -context = setmetatable({}, { - __index = function(t, k) - if k == "request" or k == "requestpath" then - return _G.L.ctx.request_path - elseif k == "requestargs" then - return _G.L.ctx.request_args - else - return _G.L.ctx[k] - end - end -}) - -uci = require "luci.model.uci" -uci:set_session_id(_G.L.ctx.authsession) - -i18n = require "luci.i18n" -i18n.setlanguage(_G.L.dispatcher.lang) - -build_url = _G.L.dispatcher.build_url -menu_json = _G.L.dispatcher.menu_json -error404 = _G.L.dispatcher.error404 -error500 = _G.L.dispatcher.error500 - -function is_authenticated(auth) - local session = _G.L.dispatcher.is_authenticated(auth) - if session then - return session.sid, session.data, session.acls - end -end - -function assign(path, clone, title, order) - local obj = node(unpack(path)) - - obj.title = title - obj.order = order - - setmetatable(obj, {__index = node(unpack(clone))}) - - return obj -end - -function entry(path, target, title, order) - local c = node(unpack(path)) - - c.title = title - c.order = order - c.action = target - - return c -end - --- enabling the node. -function get(...) - return node(...) -end - -function node(...) - local p = table.concat({ ... }, "/") - - if not __entries[p] then - __entries[p] = {} - end - - return __entries[p] -end - -function lookup(...) - local i, path = nil, {} - for i = 1, select('#', ...) do - local name, arg = nil, tostring(select(i, ...)) - for name in arg:gmatch("[^/]+") do - path[#path+1] = name - end - end - - local node = menu_json() - for i = 1, #path do - node = node.children[path[i]] - - if not node then - return nil - elseif node.leaf then - break - end - end - - return node, build_url(unpack(path)) -end - - -function process_lua_controller(path) - local base = "/usr/lib/lua/luci/controller/" - local modname = "luci.controller." .. path:sub(#base+1, #path-4):gsub("/", ".") - local mod = require(modname) - assert(mod ~= true, - "Invalid controller file found\n" .. - "The file '" .. path .. "' contains an invalid module line.\n" .. - "Please verify whether the module name is set to '" .. modname .. - "' - It must correspond to the file path!") - - local idx = mod.index - if type(idx) ~= "function" then - return nil - end - - local entries = {} - - __entries = entries - __controller = modname - - setfenv(idx, setmetatable({}, { __index = luci.dispatcher }))() - - __entries = nil - __controller = nil - - -- fixup gathered node specs - for path, entry in pairs(entries) do - if entry.leaf then - entry.wildcard = true - end - - if type(entry.file_depends) == "table" then - for _, v in ipairs(entry.file_depends) do - entry.depends = entry.depends or {} - entry.depends.fs = entry.depends.fs or {} - - local ft = fs.stat(v, "type") - if ft == "dir" then - entry.depends.fs[v] = "directory" - elseif v:match("/s?bin/") then - entry.depends.fs[v] = "executable" - else - entry.depends.fs[v] = "file" - end - end - end - - if type(entry.uci_depends) == "table" then - for k, v in pairs(entry.uci_depends) do - entry.depends = entry.depends or {} - entry.depends.uci = entry.depends.uci or {} - entry.depends.uci[k] = v - end - end - - if type(entry.acl_depends) == "table" then - for _, acl in ipairs(entry.acl_depends) do - entry.depends = entry.depends or {} - entry.depends.acl = entry.depends.acl or {} - entry.depends.acl[#entry.depends.acl + 1] = acl - end - end - - if (entry.sysauth_authenticator ~= nil) or - (entry.sysauth ~= nil and entry.sysauth ~= false) - then - if entry.sysauth_authenticator == "htmlauth" then - entry.auth = { - login = true, - methods = { "cookie:sysauth_https", "cookie:sysauth_http" } - } - elseif path == "rpc" and modname == "luci.controller.rpc" then - entry.auth = { - login = false, - methods = { "query:auth", "cookie:sysauth_https", "cookie:sysauth_http", "cookie:sysauth" } - } - elseif modname == "luci.controller.admin.uci" then - entry.auth = { - login = false, - methods = { "param:sid" } - } - end - elseif entry.sysauth == false then - entry.auth = {} - end - - if entry.action == nil and type(entry.target) == "table" then - entry.action = entry.target - entry.target = nil - end - - entry.leaf = nil - - entry.file_depends = nil - entry.uci_depends = nil - entry.acl_depends = nil - - entry.sysauth = nil - entry.sysauth_authenticator = nil - end - - return entries -end - -function invoke_cbi_action(model, config, ...) - local cbi = require "luci.cbi" - local tpl = require "luci.template" - local util = require "luci.util" - - if not config then - config = {} - end - - local maps = cbi.load(model, ...) - - local state = nil - - local function has_uci_access(config, level) - local rv = util.ubus("session", "access", { - ubus_rpc_session = context.authsession, - scope = "uci", object = config, - ["function"] = level - }) - - return (type(rv) == "table" and rv.access == true) or false - end - - local i, res - for i, res in ipairs(maps) do - if util.instanceof(res, cbi.SimpleForm) then - io.stderr:write("Model %s returns SimpleForm but is dispatched via cbi(),\n" - % model) - - io.stderr:write("please change %s to use the form() action instead.\n" - % table.concat(context.request, "/")) - end - - res.flow = config - local cstate = res:parse() - if cstate and (not state or cstate < state) then - state = cstate - end - end - - local function _resolve_path(path) - return type(path) == "table" and build_url(unpack(path)) or path - end - - if config.on_valid_to and state and state > 0 and state < 2 then - http:redirect(_resolve_path(config.on_valid_to)) - return - end - - if config.on_changed_to and state and state > 1 then - http:redirect(_resolve_path(config.on_changed_to)) - return - end - - if config.on_success_to and state and state > 0 then - http:redirect(_resolve_path(config.on_success_to)) - return - end - - if config.state_handler then - if not config.state_handler(state, maps) then - return - end - end - - http:header("X-CBI-State", state or 0) - - if not config.noheader then - _G.L.include("cbi/header", {state = state}) - end - - local redirect - local messages - local applymap = false - local pageaction = true - local parsechain = { } - local writable = false - - for i, res in ipairs(maps) do - if res.apply_needed and res.parsechain then - local c - for _, c in ipairs(res.parsechain) do - parsechain[#parsechain+1] = c - end - applymap = true - end - - if res.redirect then - redirect = redirect or res.redirect - end - - if res.pageaction == false then - pageaction = false - end - - if res.message then - messages = messages or { } - messages[#messages+1] = res.message - end - end - - for i, res in ipairs(maps) do - local is_readable_map = has_uci_access(res.config, "read") - local is_writable_map = has_uci_access(res.config, "write") - - writable = writable or is_writable_map - - res:render({ - firstmap = (i == 1), - redirect = redirect, - messages = messages, - pageaction = pageaction, - parsechain = parsechain, - readable = is_readable_map, - writable = is_writable_map - }) - end - - if not config.nofooter then - _G.L.include("cbi/footer", { - flow = config, - pageaction = pageaction, - redirect = redirect, - state = state, - autoapply = config.autoapply, - trigger_apply = applymap, - writable = writable - }) - end -end - -function invoke_form_action(model, ...) - local cbi = require "luci.cbi" - local tpl = require "luci.template" - - local maps = luci.cbi.load(model, ...) - local state = nil - - local i, res - for i, res in ipairs(maps) do - local cstate = res:parse() - if cstate and (not state or cstate < state) then - state = cstate - end - end - - http:header("X-CBI-State", state or 0) - _G.L.include("header") - for i, res in ipairs(maps) do - res:render() - end - _G.L.include("footer") -end - -function render_lua_template(path) - local tpl = require "luci.template" - - tpl.render(path, getfenv(1)) -end - -function test_post_security() - if http:getenv("REQUEST_METHOD") ~= "POST" then - http:status(405, "Method Not Allowed") - http:header("Allow", "POST") - return false - end - - if http:formvalue("token") ~= context.authtoken then - http:status(403, "Forbidden") - _G.L.include("csrftoken") - return false - end - - return true -end - - -function call(name, ...) - return { - ["type"] = "call", - ["module"] = __controller, - ["function"] = name, - ["parameters"] = select('#', ...) > 0 and {...} or nil - } -end - -function post_on(params, name, ...) - return { - ["type"] = "call", - ["module"] = __controller, - ["function"] = name, - ["parameters"] = select('#', ...) > 0 and {...} or nil, - ["post"] = params - } -end - -function post(...) - return post_on(true, ...) -end - -function view(name) - return { - ["type"] = "view", - ["path"] = name - } -end - -function template(name) - return { - ["type"] = "template", - ["path"] = name - } -end - -function cbi(model, config) - return { - ["type"] = "call", - ["module"] = "luci.dispatcher", - ["function"] = "invoke_cbi_action", - ["parameters"] = { model, config or {} }, - ["post"] = { - ["cbi.submit"] = true - } - } -end - -function form(model) - return { - ["type"] = "call", - ["module"] = "luci.dispatcher", - ["function"] = "invoke_form_action", - ["parameters"] = { model }, - ["post"] = { - ["cbi.submit"] = true - } - } -end - -function firstchild() - return { - ["type"] = "firstchild" - } -end - -function firstnode() - return { - ["type"] = "firstchild", - ["recurse"] = true - } -end - -function arcombine(trg1, trg2) - return { - ["type"] = "arcombine", - ["targets"] = { trg1, trg2 } --, - --env = getfenv(), - } -end - -function alias(...) - return { - ["type"] = "alias", - ["path"] = table.concat({ ... }, "/") - } -end - -function rewrite(n, ...) - return { - ["type"] = "rewrite", - ["path"] = table.concat({ ... }, "/"), - ["remove"] = n - } -end - - -translate = i18n.translate - --- This function does not actually translate the given argument but --- is used by build/i18n-scan.pl to find translatable entries. -function _(text) - return text -end diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/i18n.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/i18n.lua deleted file mode 100644 index 323912b..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/i18n.lua +++ /dev/null @@ -1,55 +0,0 @@ --- Copyright 2008 Steven Barth --- Licensed to the public under the Apache License 2.0. - -local tparser = require "luci.template.parser" -local util = require "luci.util" -local tostring = tostring - -module "luci.i18n" - -i18ndir = util.libpath() .. "/i18n/" -context = util.threadlocal() -default = "en" - - -function setlanguage(lang) - local code, subcode = lang:match("^([A-Za-z][A-Za-z])[%-_]([A-Za-z][A-Za-z])$") - if not (code and subcode) then - subcode = lang:match("^([A-Za-z][A-Za-z])$") - if not subcode then - return nil - end - end - - context.parent = code and code:lower() - context.lang = context.parent and context.parent.."-"..subcode:lower() or subcode:lower() - - if tparser.load_catalog(context.lang, i18ndir) and - tparser.change_catalog(context.lang) - then - return context.lang - - elseif context.parent then - if tparser.load_catalog(context.parent, i18ndir) and - tparser.change_catalog(context.parent) - then - return context.parent - end - end - - return nil -end - -function translate(key) - return tparser.translate(key) or key -end - -function translatef(key, ...) - return tostring(translate(key)):format(...) -end - -function dump() - local rv = {} - tparser.get_translations(function(k, v) rv[k] = v end) - return rv -end diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/model/uci.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/model/uci.lua deleted file mode 100644 index 816f6f2..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/model/uci.lua +++ /dev/null @@ -1,508 +0,0 @@ --- Copyright 2008 Steven Barth --- Licensed to the public under the Apache License 2.0. - -local os = require "os" -local util = require "luci.util" -local table = require "table" - - -local setmetatable, rawget, rawset = setmetatable, rawget, rawset -local require, getmetatable, assert = require, getmetatable, assert -local error, pairs, ipairs, select = error, pairs, ipairs, select -local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack - --- The typical workflow for UCI is: Get a cursor instance from the --- cursor factory, modify data (via Cursor.add, Cursor.delete, etc.), --- save the changes to the staging area via Cursor.save and finally --- Cursor.commit the data to the actual config files. --- LuCI then needs to Cursor.apply the changes so daemons etc. are --- reloaded. -module "luci.model.uci" - -local ERRSTR = { - "Invalid command", - "Invalid argument", - "Method not found", - "Entry not found", - "No data", - "Permission denied", - "Timeout", - "Not supported", - "Unknown error", - "Connection failed" -} - -local session_id = nil - -local function call(cmd, args) - if type(args) == "table" and session_id then - args.ubus_rpc_session = session_id - end - return util.ubus("uci", cmd, args) -end - - -function cursor() - return _M -end - -function cursor_state() - return _M -end - -function substate(self) - return self -end - - -function get_confdir(self) - return "/etc/config" -end - -function get_savedir(self) - return "/tmp/.uci" -end - -function get_session_id(self) - return session_id -end - -function set_confdir(self, directory) - return false -end - -function set_savedir(self, directory) - return false -end - -function set_session_id(self, id) - session_id = id - return true -end - - -function load(self, config) - return true -end - -function save(self, config) - return true -end - -function unload(self, config) - return true -end - - -function changes(self, config) - local rv, err = call("changes", { config = config }) - - if type(rv) == "table" and type(rv.changes) == "table" then - return rv.changes - elseif err then - return nil, ERRSTR[err] - else - return { } - end -end - - -function revert(self, config) - local _, err = call("revert", { config = config }) - return (err == nil), ERRSTR[err] -end - -function commit(self, config) - local _, err = call("commit", { config = config }) - return (err == nil), ERRSTR[err] -end - -function apply(self, rollback) - local _, err - - if rollback then - local sys = require "luci.sys" - local conf = require "luci.config" - local timeout = tonumber(conf and conf.apply and conf.apply.rollback or 90) or 0 - - _, err = call("apply", { - timeout = (timeout > 90) and timeout or 90, - rollback = true - }) - - if not err then - local now = os.time() - local token = sys.uniqueid(16) - - util.ubus("session", "set", { - ubus_rpc_session = "00000000000000000000000000000000", - values = { - rollback = { - token = token, - session = session_id, - timeout = now + timeout - } - } - }) - - return token - end - else - _, err = call("changes", {}) - - if not err then - if type(_) == "table" and type(_.changes) == "table" then - local k, v - for k, v in pairs(_.changes) do - _, err = call("commit", { config = k }) - if err then - break - end - end - end - end - - if not err then - _, err = call("apply", { rollback = false }) - end - end - - return (err == nil), ERRSTR[err] -end - -function confirm(self, token) - local is_pending, time_remaining, rollback_sid, rollback_token = self:rollback_pending() - - if is_pending then - if token ~= rollback_token then - return false, "Permission denied" - end - - local _, err = util.ubus("uci", "confirm", { - ubus_rpc_session = rollback_sid - }) - - if not err then - util.ubus("session", "set", { - ubus_rpc_session = "00000000000000000000000000000000", - values = { rollback = {} } - }) - end - - return (err == nil), ERRSTR[err] - end - - return false, "No data" -end - -function rollback(self) - local is_pending, time_remaining, rollback_sid = self:rollback_pending() - - if is_pending then - local _, err = util.ubus("uci", "rollback", { - ubus_rpc_session = rollback_sid - }) - - if not err then - util.ubus("session", "set", { - ubus_rpc_session = "00000000000000000000000000000000", - values = { rollback = {} } - }) - end - - return (err == nil), ERRSTR[err] - end - - return false, "No data" -end - -function rollback_pending(self) - local rv, err = util.ubus("session", "get", { - ubus_rpc_session = "00000000000000000000000000000000", - keys = { "rollback" } - }) - - local now = os.time() - - if type(rv) == "table" and - type(rv.values) == "table" and - type(rv.values.rollback) == "table" and - type(rv.values.rollback.token) == "string" and - type(rv.values.rollback.session) == "string" and - type(rv.values.rollback.timeout) == "number" and - rv.values.rollback.timeout > now - then - return true, - rv.values.rollback.timeout - now, - rv.values.rollback.session, - rv.values.rollback.token - end - - return false, ERRSTR[err] -end - - -function foreach(self, config, stype, callback) - if type(callback) == "function" then - local rv, err = call("get", { - config = config, - type = stype - }) - - if type(rv) == "table" and type(rv.values) == "table" then - local sections = { } - local res = false - local index = 1 - - local _, section - for _, section in pairs(rv.values) do - section[".index"] = section[".index"] or index - sections[index] = section - index = index + 1 - end - - table.sort(sections, function(a, b) - return a[".index"] < b[".index"] - end) - - for _, section in ipairs(sections) do - local continue = callback(section) - res = true - if continue == false then - break - end - end - return res - else - return false, ERRSTR[err] or "No data" - end - else - return false, "Invalid argument" - end -end - -local function _get(self, operation, config, section, option) - if section == nil then - return nil - elseif type(option) == "string" and option:byte(1) ~= 46 then - local rv, err = call(operation, { - config = config, - section = section, - option = option - }) - - if type(rv) == "table" then - return rv.value or nil - elseif err then - return false, ERRSTR[err] - else - return nil - end - elseif option == nil then - local values = self:get_all(config, section) - if values then - return values[".type"], values[".name"] - else - return nil - end - else - return false, "Invalid argument" - end -end - -function get(self, ...) - return _get(self, "get", ...) -end - -function get_state(self, ...) - return _get(self, "state", ...) -end - -function get_all(self, config, section) - local rv, err = call("get", { - config = config, - section = section - }) - - if type(rv) == "table" and type(rv.values) == "table" then - return rv.values - elseif err then - return false, ERRSTR[err] - else - return nil - end -end - -function get_bool(self, ...) - local val = self:get(...) - return (val == "1" or val == "true" or val == "yes" or val == "on") -end - -function get_first(self, config, stype, option, default) - local rv = default - - self:foreach(config, stype, function(s) - local val = not option and s[".name"] or s[option] - - if type(default) == "number" then - val = tonumber(val) - elseif type(default) == "boolean" then - val = (val == "1" or val == "true" or - val == "yes" or val == "on") - end - - if val ~= nil then - rv = val - return false - end - end) - - return rv -end - -function get_list(self, config, section, option) - if config and section and option then - local val = self:get(config, section, option) - return (type(val) == "table" and val or { val }) - end - return { } -end - - -function section(self, config, stype, name, values) - local rv, err = call("add", { - config = config, - type = stype, - name = name, - values = values - }) - - if type(rv) == "table" then - return rv.section - elseif err then - return false, ERRSTR[err] - else - return nil - end -end - - -function add(self, config, stype) - return self:section(config, stype) -end - -function set(self, config, section, option, ...) - if select('#', ...) == 0 then - local sname, err = self:section(config, option, section) - return (not not sname), err - else - local _, err = call("set", { - config = config, - section = section, - values = { [option] = select(1, ...) } - }) - return (err == nil), ERRSTR[err] - end -end - -function set_list(self, config, section, option, value) - if section == nil or option == nil then - return false - elseif value == nil or (type(value) == "table" and #value == 0) then - return self:delete(config, section, option) - elseif type(value) == "table" then - return self:set(config, section, option, value) - else - return self:set(config, section, option, { value }) - end -end - -function tset(self, config, section, values) - local _, err = call("set", { - config = config, - section = section, - values = values - }) - return (err == nil), ERRSTR[err] -end - -function reorder(self, config, section, index) - local sections - - if type(section) == "string" and type(index) == "number" then - local pos = 0 - - sections = { } - - self:foreach(config, nil, function(s) - if pos == index then - pos = pos + 1 - end - - if s[".name"] ~= section then - pos = pos + 1 - sections[pos] = s[".name"] - else - sections[index + 1] = section - end - end) - elseif type(section) == "table" then - sections = section - else - return false, "Invalid argument" - end - - local _, err = call("order", { - config = config, - sections = sections - }) - - return (err == nil), ERRSTR[err] -end - - -function delete(self, config, section, option) - local _, err = call("delete", { - config = config, - section = section, - option = option - }) - return (err == nil), ERRSTR[err] -end - -function delete_all(self, config, stype, comparator) - local _, err - if type(comparator) == "table" then - _, err = call("delete", { - config = config, - type = stype, - match = comparator - }) - elseif type(comparator) == "function" then - local rv = call("get", { - config = config, - type = stype - }) - - if type(rv) == "table" and type(rv.values) == "table" then - local sname, section - for sname, section in pairs(rv.values) do - if comparator(section) then - _, err = call("delete", { - config = config, - section = sname - }) - end - end - end - elseif comparator == nil then - _, err = call("delete", { - config = config, - type = stype - }) - else - return false, "Invalid argument" - end - - return (err == nil), ERRSTR[err] -end diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/store.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/store.lua deleted file mode 100644 index a735981..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/store.lua +++ /dev/null @@ -1,6 +0,0 @@ --- Copyright 2009 Steven Barth --- Copyright 2009 Jo-Philipp Wich --- Licensed to the public under the Apache License 2.0. - -local util = require "luci.util" -module("luci.store", util.threadlocal) diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys.lua deleted file mode 100644 index e6eb762..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys.lua +++ /dev/null @@ -1,615 +0,0 @@ --- Copyright 2008 Steven Barth --- Licensed to the public under the Apache License 2.0. - -local io = require "io" -local os = require "os" -local table = require "table" -local nixio = require "nixio" -local fs = require "nixio.fs" -local uci = require "luci.model.uci" - -local luci = {} -luci.util = require "luci.util" -luci.ip = require "luci.ip" - -local tonumber, ipairs, pairs, pcall, type, next, setmetatable, require, select, unpack = - tonumber, ipairs, pairs, pcall, type, next, setmetatable, require, select, unpack - - -module "luci.sys" - -function call(...) - return os.execute(...) / 256 -end - -exec = luci.util.exec - --- containing the whole environment is returned otherwise this function returns --- the corresponding string value for the given name or nil if no such variable --- exists. -getenv = nixio.getenv - -function hostname(newname) - if type(newname) == "string" and #newname > 0 then - fs.writefile( "/proc/sys/kernel/hostname", newname ) - return newname - else - return nixio.uname().nodename - end -end - -function httpget(url, stream, target) - if not target then - local source = stream and io.popen or luci.util.exec - return source("wget -qO- %s" % luci.util.shellquote(url)) - else - return os.execute("wget -qO %s %s" % - {luci.util.shellquote(target), luci.util.shellquote(url)}) - end -end - -function reboot() - return os.execute("reboot >/dev/null 2>&1") -end - -function syslog() - return luci.util.exec("logread") -end - -function dmesg() - return luci.util.exec("dmesg") -end - -function uniqueid(bytes) - local rand = fs.readfile("/dev/urandom", bytes) - return rand and nixio.bin.hexlify(rand) -end - -function uptime() - return nixio.sysinfo().uptime -end - - -net = {} - -local function _nethints(what, callback) - local _, k, e, mac, ip, name, duid, iaid - local cur = uci.cursor() - local ifn = { } - local hosts = { } - local lookup = { } - - local function _add(i, ...) - local k = select(i, ...) - if k then - if not hosts[k] then hosts[k] = { } end - hosts[k][1] = select(1, ...) or hosts[k][1] - hosts[k][2] = select(2, ...) or hosts[k][2] - hosts[k][3] = select(3, ...) or hosts[k][3] - hosts[k][4] = select(4, ...) or hosts[k][4] - end - end - - luci.ip.neighbors(nil, function(neigh) - if neigh.mac and neigh.family == 4 then - _add(what, neigh.mac:string(), neigh.dest:string(), nil, nil) - elseif neigh.mac and neigh.family == 6 then - _add(what, neigh.mac:string(), nil, neigh.dest:string(), nil) - end - end) - - if fs.access("/etc/ethers") then - for e in io.lines("/etc/ethers") do - mac, name = e:match("^([a-fA-F0-9:-]+)%s+(%S+)") - mac = luci.ip.checkmac(mac) - if mac and name then - if luci.ip.checkip4(name) then - _add(what, mac, name, nil, nil) - else - _add(what, mac, nil, nil, name) - end - end - end - end - - cur:foreach("dhcp", "dnsmasq", - function(s) - if s.leasefile and fs.access(s.leasefile) then - for e in io.lines(s.leasefile) do - mac, ip, name = e:match("^%d+ (%S+) (%S+) (%S+)") - mac = luci.ip.checkmac(mac) - if mac and ip then - _add(what, mac, ip, nil, name ~= "*" and name) - end - end - end - end - ) - - cur:foreach("dhcp", "odhcpd", - function(s) - if type(s.leasefile) == "string" and fs.access(s.leasefile) then - for e in io.lines(s.leasefile) do - duid, iaid, name, _, ip = e:match("^# %S+ (%S+) (%S+) (%S+) (-?%d+) %S+ %S+ ([0-9a-f:.]+)/[0-9]+") - mac = net.duid_to_mac(duid) - if mac then - if ip and iaid == "ipv4" then - _add(what, mac, ip, nil, name ~= "*" and name) - elseif ip then - _add(what, mac, nil, ip, name ~= "*" and name) - end - end - end - end - end - ) - - cur:foreach("dhcp", "host", - function(s) - for mac in luci.util.imatch(s.mac) do - mac = luci.ip.checkmac(mac) - if mac then - _add(what, mac, s.ip, nil, s.name) - end - end - end) - - for _, e in ipairs(nixio.getifaddrs()) do - if e.name ~= "lo" then - ifn[e.name] = ifn[e.name] or { } - if e.family == "packet" and e.addr and #e.addr == 17 then - ifn[e.name][1] = e.addr:upper() - elseif e.family == "inet" then - ifn[e.name][2] = e.addr - elseif e.family == "inet6" then - ifn[e.name][3] = e.addr - end - end - end - - for _, e in pairs(ifn) do - if e[what] and (e[2] or e[3]) then - _add(what, e[1], e[2], e[3], e[4]) - end - end - - for _, e in pairs(hosts) do - lookup[#lookup+1] = (what > 1) and e[what] or (e[2] or e[3]) - end - - if #lookup > 0 then - lookup = luci.util.ubus("network.rrdns", "lookup", { - addrs = lookup, - timeout = 250, - limit = 1000 - }) or { } - end - - for _, e in luci.util.kspairs(hosts) do - callback(e[1], e[2], e[3], lookup[e[2]] or lookup[e[3]] or e[4]) - end -end - --- Each entry contains the values in the following order: --- [ "mac", "name" ] -function net.mac_hints(callback) - if callback then - _nethints(1, function(mac, v4, v6, name) - name = name or v4 - if name and name ~= mac then - callback(mac, name or v4) - end - end) - else - local rv = { } - _nethints(1, function(mac, v4, v6, name) - name = name or v4 - if name and name ~= mac then - rv[#rv+1] = { mac, name or v4 } - end - end) - return rv - end -end - --- Each entry contains the values in the following order: --- [ "ip", "name" ] -function net.ipv4_hints(callback) - if callback then - _nethints(2, function(mac, v4, v6, name) - name = name or mac - if name and name ~= v4 then - callback(v4, name) - end - end) - else - local rv = { } - _nethints(2, function(mac, v4, v6, name) - name = name or mac - if name and name ~= v4 then - rv[#rv+1] = { v4, name } - end - end) - return rv - end -end - --- Each entry contains the values in the following order: --- [ "ip", "name" ] -function net.ipv6_hints(callback) - if callback then - _nethints(3, function(mac, v4, v6, name) - name = name or mac - if name and name ~= v6 then - callback(v6, name) - end - end) - else - local rv = { } - _nethints(3, function(mac, v4, v6, name) - name = name or mac - if name and name ~= v6 then - rv[#rv+1] = { v6, name } - end - end) - return rv - end -end - -function net.host_hints(callback) - if callback then - _nethints(1, function(mac, v4, v6, name) - if mac and mac ~= "00:00:00:00:00:00" and (v4 or v6 or name) then - callback(mac, v4, v6, name) - end - end) - else - local rv = { } - _nethints(1, function(mac, v4, v6, name) - if mac and mac ~= "00:00:00:00:00:00" and (v4 or v6 or name) then - local e = { } - if v4 then e.ipv4 = v4 end - if v6 then e.ipv6 = v6 end - if name then e.name = name end - rv[mac] = e - end - end) - return rv - end -end - -function net.conntrack(callback) - local ok, nfct = pcall(io.lines, "/proc/net/nf_conntrack") - if not ok or not nfct then - return nil - end - - local line, connt = nil, (not callback) and { } - for line in nfct do - local fam, l3, l4, rest = - line:match("^(ipv[46]) +(%d+) +%S+ +(%d+) +(.+)$") - - local timeout, tuples = rest:match("^(%d+) +(.+)$") - - if not tuples then - tuples = rest - end - - if fam and l3 and l4 and not tuples:match("^TIME_WAIT ") then - l4 = nixio.getprotobynumber(l4) - - local entry = { - bytes = 0, - packets = 0, - layer3 = fam, - layer4 = l4 and l4.name or "unknown", - timeout = tonumber(timeout, 10) - } - - local key, val - for key, val in tuples:gmatch("(%w+)=(%S+)") do - if key == "bytes" or key == "packets" then - entry[key] = entry[key] + tonumber(val, 10) - elseif key == "src" or key == "dst" then - if entry[key] == nil then - entry[key] = luci.ip.new(val):string() - end - elseif key == "sport" or key == "dport" then - if entry[key] == nil then - entry[key] = val - end - elseif val then - entry[key] = val - end - end - - if callback then - callback(entry) - else - connt[#connt+1] = entry - end - end - end - - return callback and true or connt -end - -function net.devices() - local devs = {} - local seen = {} - for k, v in ipairs(nixio.getifaddrs()) do - if v.name and not seen[v.name] then - seen[v.name] = true - devs[#devs+1] = v.name - end - end - return devs -end - -function net.duid_to_mac(duid) - local b1, b2, b3, b4, b5, b6 - - if type(duid) == "string" then - -- DUID-LLT / Ethernet - if #duid == 28 then - b1, b2, b3, b4, b5, b6 = duid:match("^00010001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)%x%x%x%x%x%x%x%x$") - - -- DUID-LL / Ethernet - elseif #duid == 20 then - b1, b2, b3, b4, b5, b6 = duid:match("^00030001(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$") - - -- DUID-LL / Ethernet (Without Header) - elseif #duid == 12 then - b1, b2, b3, b4, b5, b6 = duid:match("^(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)$") - end - end - - return b1 and luci.ip.checkmac(table.concat({ b1, b2, b3, b4, b5, b6 }, ":")) -end - -process = {} - -function process.info(key) - local s = {uid = nixio.getuid(), gid = nixio.getgid()} - return not key and s or s[key] -end - -function process.list() - local data = {} - local k - local ps = luci.util.execi("/bin/busybox top -bn1") - - if not ps then - return - end - - for line in ps do - local pid, ppid, user, stat, vsz, mem, cpu, cmd = line:match( - "^ *(%d+) +(%d+) +(%S.-%S) +([RSDZTW][ 2 then - fd:close() - end -end - -function process.exec(command, stdout, stderr, nowait) - local out_r, out_w, err_r, err_w - if stdout then out_r, out_w = nixio.pipe() end - if stderr then err_r, err_w = nixio.pipe() end - - local pid = nixio.fork() - if pid == 0 then - nixio.chdir("/") - - local null = nixio.open("/dev/null", "w+") - if null then - nixio.dup(out_w or null, nixio.stdout) - nixio.dup(err_w or null, nixio.stderr) - nixio.dup(null, nixio.stdin) - xclose(out_w) - xclose(out_r) - xclose(err_w) - xclose(err_r) - xclose(null) - end - - nixio.exec(unpack(command)) - os.exit(-1) - end - - local _, pfds, rv = nil, {}, { code = -1, pid = pid } - - xclose(out_w) - xclose(err_w) - - if out_r then - pfds[#pfds+1] = { - fd = out_r, - cb = type(stdout) == "function" and stdout, - name = "stdout", - events = nixio.poll_flags("in", "err", "hup") - } - end - - if err_r then - pfds[#pfds+1] = { - fd = err_r, - cb = type(stderr) == "function" and stderr, - name = "stderr", - events = nixio.poll_flags("in", "err", "hup") - } - end - - while #pfds > 0 do - local nfds, err = nixio.poll(pfds, -1) - if not nfds and err ~= nixio.const.EINTR then - break - end - - local i - for i = #pfds, 1, -1 do - local rfd = pfds[i] - if rfd.revents > 0 then - local chunk, err = rfd.fd:read(4096) - if chunk and #chunk > 0 then - if rfd.cb then - rfd.cb(chunk) - else - rfd.buf = rfd.buf or {} - rfd.buf[#rfd.buf + 1] = chunk - end - else - table.remove(pfds, i) - if rfd.buf then - rv[rfd.name] = table.concat(rfd.buf, "") - end - rfd.fd:close() - end - end - end - end - - if not nowait then - _, _, rv.code = nixio.waitpid(pid) - end - - return rv -end - - -user = {} - --- { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" } -user.getuser = nixio.getpw - -function user.getpasswd(username) - local pwe = nixio.getsp and nixio.getsp(username) or nixio.getpw(username) - local pwh = pwe and (pwe.pwdp or pwe.passwd) - if not pwh or #pwh < 1 then - return nil, pwe - else - return pwh, pwe - end -end - -function user.checkpasswd(username, pass) - local pwh, pwe = user.getpasswd(username) - if pwe then - return (pwh == nil or nixio.crypt(pass, pwh) == pwh) - end - return false -end - -function user.setpasswd(username, password) - return os.execute("(echo %s; sleep 1; echo %s) | passwd %s >/dev/null 2>&1" %{ - luci.util.shellquote(password), - luci.util.shellquote(password), - luci.util.shellquote(username) - }) -end - - -wifi = {} - -function wifi.getiwinfo(ifname) - local ntm = require "luci.model.network" - - ntm.init() - - local wnet = ntm:get_wifinet(ifname) - if wnet and wnet.iwinfo then - return wnet.iwinfo - end - - local wdev = ntm:get_wifidev(ifname) - if wdev and wdev.iwinfo then - return wdev.iwinfo - end - - return { ifname = ifname } -end - - -init = {} -init.dir = "/etc/init.d/" - -function init.names() - local names = { } - for name in fs.glob(init.dir.."*") do - names[#names+1] = fs.basename(name) - end - return names -end - -function init.index(name) - name = fs.basename(name) - if fs.access(init.dir..name) then - return call("env -i sh -c 'source %s%s enabled; exit ${START:-255}' >/dev/null" - %{ init.dir, name }) - end -end - -local function init_action(action, name) - name = fs.basename(name) - if fs.access(init.dir..name) then - return call("env -i %s%s %s >/dev/null" %{ init.dir, name, action }) - end -end - -function init.enabled(name) - return (init_action("enabled", name) == 0) -end - -function init.enable(name) - return (init_action("enable", name) == 0) -end - -function init.disable(name) - return (init_action("disable", name) == 0) -end - -function init.start(name) - return (init_action("start", name) == 0) -end - -function init.stop(name) - return (init_action("stop", name) == 0) -end - -function init.restart(name) - return (init_action("restart", name) == 0) -end - -function init.reload(name) - return (init_action("reload", name) == 0) -end diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo.lua deleted file mode 100644 index aa054a2..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo.lua +++ /dev/null @@ -1,19 +0,0 @@ --- Licensed to the public under the Apache License 2.0. - -local setmetatable, require, rawget, rawset = setmetatable, require, rawget, rawset - -module "luci.sys.zoneinfo" - -setmetatable(_M, { - __index = function(t, k) - if k == "TZ" and not rawget(t, k) then - local m = require "luci.sys.zoneinfo.tzdata" - rawset(t, k, rawget(m, k)) - elseif k == "OFFSET" and not rawget(t, k) then - local m = require "luci.sys.zoneinfo.tzoffset" - rawset(t, k, rawget(m, k)) - end - - return rawget(t, k) - end -}) diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo/tzdata.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo/tzdata.lua deleted file mode 100644 index 3ef2f4c..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo/tzdata.lua +++ /dev/null @@ -1,455 +0,0 @@ --- Licensed to the public under the Apache License 2.0. - -module "luci.sys.zoneinfo.tzdata" - -TZ = { - { 'Africa/Abidjan', 'GMT0' }, - { 'Africa/Accra', 'GMT0' }, - { 'Africa/Addis Ababa', 'EAT-3' }, - { 'Africa/Algiers', 'CET-1' }, - { 'Africa/Asmara', 'EAT-3' }, - { 'Africa/Bamako', 'GMT0' }, - { 'Africa/Bangui', 'WAT-1' }, - { 'Africa/Banjul', 'GMT0' }, - { 'Africa/Bissau', 'GMT0' }, - { 'Africa/Blantyre', 'CAT-2' }, - { 'Africa/Brazzaville', 'WAT-1' }, - { 'Africa/Bujumbura', 'CAT-2' }, - { 'Africa/Cairo', 'EET-2' }, - { 'Africa/Casablanca', '<+01>-1' }, - { 'Africa/Ceuta', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Africa/Conakry', 'GMT0' }, - { 'Africa/Dakar', 'GMT0' }, - { 'Africa/Dar es Salaam', 'EAT-3' }, - { 'Africa/Djibouti', 'EAT-3' }, - { 'Africa/Douala', 'WAT-1' }, - { 'Africa/El Aaiun', '<+01>-1' }, - { 'Africa/Freetown', 'GMT0' }, - { 'Africa/Gaborone', 'CAT-2' }, - { 'Africa/Harare', 'CAT-2' }, - { 'Africa/Johannesburg', 'SAST-2' }, - { 'Africa/Juba', 'CAT-2' }, - { 'Africa/Kampala', 'EAT-3' }, - { 'Africa/Khartoum', 'CAT-2' }, - { 'Africa/Kigali', 'CAT-2' }, - { 'Africa/Kinshasa', 'WAT-1' }, - { 'Africa/Lagos', 'WAT-1' }, - { 'Africa/Libreville', 'WAT-1' }, - { 'Africa/Lome', 'GMT0' }, - { 'Africa/Luanda', 'WAT-1' }, - { 'Africa/Lubumbashi', 'CAT-2' }, - { 'Africa/Lusaka', 'CAT-2' }, - { 'Africa/Malabo', 'WAT-1' }, - { 'Africa/Maputo', 'CAT-2' }, - { 'Africa/Maseru', 'SAST-2' }, - { 'Africa/Mbabane', 'SAST-2' }, - { 'Africa/Mogadishu', 'EAT-3' }, - { 'Africa/Monrovia', 'GMT0' }, - { 'Africa/Nairobi', 'EAT-3' }, - { 'Africa/Ndjamena', 'WAT-1' }, - { 'Africa/Niamey', 'WAT-1' }, - { 'Africa/Nouakchott', 'GMT0' }, - { 'Africa/Ouagadougou', 'GMT0' }, - { 'Africa/Porto-Novo', 'WAT-1' }, - { 'Africa/Sao Tome', 'GMT0' }, - { 'Africa/Tripoli', 'EET-2' }, - { 'Africa/Tunis', 'CET-1' }, - { 'Africa/Windhoek', 'CAT-2' }, - { 'America/Adak', 'HST10HDT,M3.2.0,M11.1.0' }, - { 'America/Anchorage', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/Anguilla', 'AST4' }, - { 'America/Antigua', 'AST4' }, - { 'America/Araguaina', '<-03>3' }, - { 'America/Argentina/Buenos Aires', '<-03>3' }, - { 'America/Argentina/Catamarca', '<-03>3' }, - { 'America/Argentina/Cordoba', '<-03>3' }, - { 'America/Argentina/Jujuy', '<-03>3' }, - { 'America/Argentina/La Rioja', '<-03>3' }, - { 'America/Argentina/Mendoza', '<-03>3' }, - { 'America/Argentina/Rio Gallegos', '<-03>3' }, - { 'America/Argentina/Salta', '<-03>3' }, - { 'America/Argentina/San Juan', '<-03>3' }, - { 'America/Argentina/San Luis', '<-03>3' }, - { 'America/Argentina/Tucuman', '<-03>3' }, - { 'America/Argentina/Ushuaia', '<-03>3' }, - { 'America/Aruba', 'AST4' }, - { 'America/Asuncion', '<-04>4<-03>,M10.1.0/0,M3.4.0/0' }, - { 'America/Atikokan', 'EST5' }, - { 'America/Bahia', '<-03>3' }, - { 'America/Bahia Banderas', 'CST6CDT,M4.1.0,M10.5.0' }, - { 'America/Barbados', 'AST4' }, - { 'America/Belem', '<-03>3' }, - { 'America/Belize', 'CST6' }, - { 'America/Blanc-Sablon', 'AST4' }, - { 'America/Boa Vista', '<-04>4' }, - { 'America/Bogota', '<-05>5' }, - { 'America/Boise', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Cambridge Bay', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Campo Grande', '<-04>4' }, - { 'America/Cancun', 'EST5' }, - { 'America/Caracas', '<-04>4' }, - { 'America/Cayenne', '<-03>3' }, - { 'America/Cayman', 'EST5' }, - { 'America/Chicago', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Chihuahua', 'MST7MDT,M4.1.0,M10.5.0' }, - { 'America/Costa Rica', 'CST6' }, - { 'America/Creston', 'MST7' }, - { 'America/Cuiaba', '<-04>4' }, - { 'America/Curacao', 'AST4' }, - { 'America/Danmarkshavn', 'GMT0' }, - { 'America/Dawson', 'MST7' }, - { 'America/Dawson Creek', 'MST7' }, - { 'America/Denver', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Detroit', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Dominica', 'AST4' }, - { 'America/Edmonton', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Eirunepe', '<-05>5' }, - { 'America/El Salvador', 'CST6' }, - { 'America/Fort Nelson', 'MST7' }, - { 'America/Fortaleza', '<-03>3' }, - { 'America/Glace Bay', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'America/Goose Bay', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'America/Grand Turk', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Grenada', 'AST4' }, - { 'America/Guadeloupe', 'AST4' }, - { 'America/Guatemala', 'CST6' }, - { 'America/Guayaquil', '<-05>5' }, - { 'America/Guyana', '<-04>4' }, - { 'America/Halifax', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'America/Havana', 'CST5CDT,M3.2.0/0,M11.1.0/1' }, - { 'America/Hermosillo', 'MST7' }, - { 'America/Indiana/Indianapolis', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Knox', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Marengo', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Petersburg', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Tell City', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Vevay', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Vincennes', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Indiana/Winamac', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Inuvik', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Iqaluit', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Jamaica', 'EST5' }, - { 'America/Juneau', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/Kentucky/Louisville', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Kentucky/Monticello', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Kralendijk', 'AST4' }, - { 'America/La Paz', '<-04>4' }, - { 'America/Lima', '<-05>5' }, - { 'America/Los Angeles', 'PST8PDT,M3.2.0,M11.1.0' }, - { 'America/Lower Princes', 'AST4' }, - { 'America/Maceio', '<-03>3' }, - { 'America/Managua', 'CST6' }, - { 'America/Manaus', '<-04>4' }, - { 'America/Marigot', 'AST4' }, - { 'America/Martinique', 'AST4' }, - { 'America/Matamoros', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Mazatlan', 'MST7MDT,M4.1.0,M10.5.0' }, - { 'America/Menominee', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Merida', 'CST6CDT,M4.1.0,M10.5.0' }, - { 'America/Metlakatla', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/Mexico City', 'CST6CDT,M4.1.0,M10.5.0' }, - { 'America/Miquelon', '<-03>3<-02>,M3.2.0,M11.1.0' }, - { 'America/Moncton', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'America/Monterrey', 'CST6CDT,M4.1.0,M10.5.0' }, - { 'America/Montevideo', '<-03>3' }, - { 'America/Montserrat', 'AST4' }, - { 'America/Nassau', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/New York', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Nipigon', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Nome', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/Noronha', '<-02>2' }, - { 'America/North Dakota/Beulah', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/North Dakota/Center', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/North Dakota/New Salem', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Nuuk', '<-03>3<-02>,M3.5.0/-2,M10.5.0/-1' }, - { 'America/Ojinaga', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'America/Panama', 'EST5' }, - { 'America/Pangnirtung', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Paramaribo', '<-03>3' }, - { 'America/Phoenix', 'MST7' }, - { 'America/Port of Spain', 'AST4' }, - { 'America/Port-au-Prince', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Porto Velho', '<-04>4' }, - { 'America/Puerto Rico', 'AST4' }, - { 'America/Punta Arenas', '<-03>3' }, - { 'America/Rainy River', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Rankin Inlet', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Recife', '<-03>3' }, - { 'America/Regina', 'CST6' }, - { 'America/Resolute', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Rio Branco', '<-05>5' }, - { 'America/Santarem', '<-03>3' }, - { 'America/Santiago', '<-04>4<-03>,M9.1.6/24,M4.1.6/24' }, - { 'America/Santo Domingo', 'AST4' }, - { 'America/Sao Paulo', '<-03>3' }, - { 'America/Scoresbysund', '<-01>1<+00>,M3.5.0/0,M10.5.0/1' }, - { 'America/Sitka', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/St Barthelemy', 'AST4' }, - { 'America/St Johns', 'NST3:30NDT,M3.2.0,M11.1.0' }, - { 'America/St Kitts', 'AST4' }, - { 'America/St Lucia', 'AST4' }, - { 'America/St Thomas', 'AST4' }, - { 'America/St Vincent', 'AST4' }, - { 'America/Swift Current', 'CST6' }, - { 'America/Tegucigalpa', 'CST6' }, - { 'America/Thule', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'America/Thunder Bay', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Tijuana', 'PST8PDT,M3.2.0,M11.1.0' }, - { 'America/Toronto', 'EST5EDT,M3.2.0,M11.1.0' }, - { 'America/Tortola', 'AST4' }, - { 'America/Vancouver', 'PST8PDT,M3.2.0,M11.1.0' }, - { 'America/Whitehorse', 'MST7' }, - { 'America/Winnipeg', 'CST6CDT,M3.2.0,M11.1.0' }, - { 'America/Yakutat', 'AKST9AKDT,M3.2.0,M11.1.0' }, - { 'America/Yellowknife', 'MST7MDT,M3.2.0,M11.1.0' }, - { 'Antarctica/Casey', '<+11>-11' }, - { 'Antarctica/Davis', '<+07>-7' }, - { 'Antarctica/DumontDUrville', '<+10>-10' }, - { 'Antarctica/Macquarie', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, - { 'Antarctica/Mawson', '<+05>-5' }, - { 'Antarctica/McMurdo', 'NZST-12NZDT,M9.5.0,M4.1.0/3' }, - { 'Antarctica/Palmer', '<-03>3' }, - { 'Antarctica/Rothera', '<-03>3' }, - { 'Antarctica/Syowa', '<+03>-3' }, - { 'Antarctica/Troll', '<+00>0<+02>-2,M3.5.0/1,M10.5.0/3' }, - { 'Antarctica/Vostok', '<+06>-6' }, - { 'Arctic/Longyearbyen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Asia/Aden', '<+03>-3' }, - { 'Asia/Almaty', '<+06>-6' }, - { 'Asia/Amman', '<+03>-3' }, - { 'Asia/Anadyr', '<+12>-12' }, - { 'Asia/Aqtau', '<+05>-5' }, - { 'Asia/Aqtobe', '<+05>-5' }, - { 'Asia/Ashgabat', '<+05>-5' }, - { 'Asia/Atyrau', '<+05>-5' }, - { 'Asia/Baghdad', '<+03>-3' }, - { 'Asia/Bahrain', '<+03>-3' }, - { 'Asia/Baku', '<+04>-4' }, - { 'Asia/Bangkok', '<+07>-7' }, - { 'Asia/Barnaul', '<+07>-7' }, - { 'Asia/Beirut', 'EET-2EEST,M3.5.0/0,M10.5.0/0' }, - { 'Asia/Bishkek', '<+06>-6' }, - { 'Asia/Brunei', '<+08>-8' }, - { 'Asia/Chita', '<+09>-9' }, - { 'Asia/Choibalsan', '<+08>-8' }, - { 'Asia/Colombo', '<+0530>-5:30' }, - { 'Asia/Damascus', '<+03>-3' }, - { 'Asia/Dhaka', '<+06>-6' }, - { 'Asia/Dili', '<+09>-9' }, - { 'Asia/Dubai', '<+04>-4' }, - { 'Asia/Dushanbe', '<+05>-5' }, - { 'Asia/Famagusta', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Asia/Gaza', 'EET-2EEST,M3.4.4/50,M10.4.4/50' }, - { 'Asia/Hebron', 'EET-2EEST,M3.4.4/50,M10.4.4/50' }, - { 'Asia/Ho Chi Minh', '<+07>-7' }, - { 'Asia/Hong Kong', 'HKT-8' }, - { 'Asia/Hovd', '<+07>-7' }, - { 'Asia/Irkutsk', '<+08>-8' }, - { 'Asia/Jakarta', 'WIB-7' }, - { 'Asia/Jayapura', 'WIT-9' }, - { 'Asia/Jerusalem', 'IST-2IDT,M3.4.4/26,M10.5.0' }, - { 'Asia/Kabul', '<+0430>-4:30' }, - { 'Asia/Kamchatka', '<+12>-12' }, - { 'Asia/Karachi', 'PKT-5' }, - { 'Asia/Kathmandu', '<+0545>-5:45' }, - { 'Asia/Khandyga', '<+09>-9' }, - { 'Asia/Kolkata', 'IST-5:30' }, - { 'Asia/Krasnoyarsk', '<+07>-7' }, - { 'Asia/Kuala Lumpur', '<+08>-8' }, - { 'Asia/Kuching', '<+08>-8' }, - { 'Asia/Kuwait', '<+03>-3' }, - { 'Asia/Macau', 'CST-8' }, - { 'Asia/Magadan', '<+11>-11' }, - { 'Asia/Makassar', 'WITA-8' }, - { 'Asia/Manila', 'PST-8' }, - { 'Asia/Muscat', '<+04>-4' }, - { 'Asia/Nicosia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Asia/Novokuznetsk', '<+07>-7' }, - { 'Asia/Novosibirsk', '<+07>-7' }, - { 'Asia/Omsk', '<+06>-6' }, - { 'Asia/Oral', '<+05>-5' }, - { 'Asia/Phnom Penh', '<+07>-7' }, - { 'Asia/Pontianak', 'WIB-7' }, - { 'Asia/Pyongyang', 'KST-9' }, - { 'Asia/Qatar', '<+03>-3' }, - { 'Asia/Qostanay', '<+06>-6' }, - { 'Asia/Qyzylorda', '<+05>-5' }, - { 'Asia/Riyadh', '<+03>-3' }, - { 'Asia/Sakhalin', '<+11>-11' }, - { 'Asia/Samarkand', '<+05>-5' }, - { 'Asia/Seoul', 'KST-9' }, - { 'Asia/Shanghai', 'CST-8' }, - { 'Asia/Singapore', '<+08>-8' }, - { 'Asia/Srednekolymsk', '<+11>-11' }, - { 'Asia/Taipei', 'CST-8' }, - { 'Asia/Tashkent', '<+05>-5' }, - { 'Asia/Tbilisi', '<+04>-4' }, - { 'Asia/Tehran', '<+0330>-3:30' }, - { 'Asia/Thimphu', '<+06>-6' }, - { 'Asia/Tokyo', 'JST-9' }, - { 'Asia/Tomsk', '<+07>-7' }, - { 'Asia/Ulaanbaatar', '<+08>-8' }, - { 'Asia/Urumqi', '<+06>-6' }, - { 'Asia/Ust-Nera', '<+10>-10' }, - { 'Asia/Vientiane', '<+07>-7' }, - { 'Asia/Vladivostok', '<+10>-10' }, - { 'Asia/Yakutsk', '<+09>-9' }, - { 'Asia/Yangon', '<+0630>-6:30' }, - { 'Asia/Yekaterinburg', '<+05>-5' }, - { 'Asia/Yerevan', '<+04>-4' }, - { 'Atlantic/Azores', '<-01>1<+00>,M3.5.0/0,M10.5.0/1' }, - { 'Atlantic/Bermuda', 'AST4ADT,M3.2.0,M11.1.0' }, - { 'Atlantic/Canary', 'WET0WEST,M3.5.0/1,M10.5.0' }, - { 'Atlantic/Cape Verde', '<-01>1' }, - { 'Atlantic/Faroe', 'WET0WEST,M3.5.0/1,M10.5.0' }, - { 'Atlantic/Madeira', 'WET0WEST,M3.5.0/1,M10.5.0' }, - { 'Atlantic/Reykjavik', 'GMT0' }, - { 'Atlantic/South Georgia', '<-02>2' }, - { 'Atlantic/St Helena', 'GMT0' }, - { 'Atlantic/Stanley', '<-03>3' }, - { 'Australia/Adelaide', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' }, - { 'Australia/Brisbane', 'AEST-10' }, - { 'Australia/Broken Hill', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' }, - { 'Australia/Darwin', 'ACST-9:30' }, - { 'Australia/Eucla', '<+0845>-8:45' }, - { 'Australia/Hobart', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, - { 'Australia/Lindeman', 'AEST-10' }, - { 'Australia/Lord Howe', '<+1030>-10:30<+11>-11,M10.1.0,M4.1.0' }, - { 'Australia/Melbourne', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, - { 'Australia/Perth', 'AWST-8' }, - { 'Australia/Sydney', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, - { 'Etc/GMT', 'GMT0' }, - { 'Etc/GMT+1', '<-01>1' }, - { 'Etc/GMT+10', '<-10>10' }, - { 'Etc/GMT+11', '<-11>11' }, - { 'Etc/GMT+12', '<-12>12' }, - { 'Etc/GMT+2', '<-02>2' }, - { 'Etc/GMT+3', '<-03>3' }, - { 'Etc/GMT+4', '<-04>4' }, - { 'Etc/GMT+5', '<-05>5' }, - { 'Etc/GMT+6', '<-06>6' }, - { 'Etc/GMT+7', '<-07>7' }, - { 'Etc/GMT+8', '<-08>8' }, - { 'Etc/GMT+9', '<-09>9' }, - { 'Etc/GMT-1', '<+01>-1' }, - { 'Etc/GMT-10', '<+10>-10' }, - { 'Etc/GMT-11', '<+11>-11' }, - { 'Etc/GMT-12', '<+12>-12' }, - { 'Etc/GMT-13', '<+13>-13' }, - { 'Etc/GMT-14', '<+14>-14' }, - { 'Etc/GMT-2', '<+02>-2' }, - { 'Etc/GMT-3', '<+03>-3' }, - { 'Etc/GMT-4', '<+04>-4' }, - { 'Etc/GMT-5', '<+05>-5' }, - { 'Etc/GMT-6', '<+06>-6' }, - { 'Etc/GMT-7', '<+07>-7' }, - { 'Etc/GMT-8', '<+08>-8' }, - { 'Etc/GMT-9', '<+09>-9' }, - { 'Europe/Amsterdam', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Andorra', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Astrakhan', '<+04>-4' }, - { 'Europe/Athens', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Belgrade', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Berlin', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Bratislava', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Brussels', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Bucharest', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Budapest', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Busingen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Chisinau', 'EET-2EEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Copenhagen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Dublin', 'IST-1GMT0,M10.5.0,M3.5.0/1' }, - { 'Europe/Gibraltar', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Guernsey', 'GMT0BST,M3.5.0/1,M10.5.0' }, - { 'Europe/Helsinki', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Isle of Man', 'GMT0BST,M3.5.0/1,M10.5.0' }, - { 'Europe/Istanbul', '<+03>-3' }, - { 'Europe/Jersey', 'GMT0BST,M3.5.0/1,M10.5.0' }, - { 'Europe/Kaliningrad', 'EET-2' }, - { 'Europe/Kirov', '<+03>-3' }, - { 'Europe/Kyiv', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Lisbon', 'WET0WEST,M3.5.0/1,M10.5.0' }, - { 'Europe/Ljubljana', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/London', 'GMT0BST,M3.5.0/1,M10.5.0' }, - { 'Europe/Luxembourg', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Madrid', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Malta', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Mariehamn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Minsk', '<+03>-3' }, - { 'Europe/Monaco', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Moscow', 'MSK-3' }, - { 'Europe/Oslo', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Paris', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Podgorica', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Prague', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Riga', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Rome', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Samara', '<+04>-4' }, - { 'Europe/San Marino', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Sarajevo', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Saratov', '<+04>-4' }, - { 'Europe/Simferopol', 'MSK-3' }, - { 'Europe/Skopje', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Sofia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Stockholm', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Tallinn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Tirane', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Ulyanovsk', '<+04>-4' }, - { 'Europe/Vaduz', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Vatican', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Vienna', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Vilnius', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, - { 'Europe/Volgograd', '<+03>-3' }, - { 'Europe/Warsaw', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Zagreb', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Europe/Zurich', 'CET-1CEST,M3.5.0,M10.5.0/3' }, - { 'Indian/Antananarivo', 'EAT-3' }, - { 'Indian/Chagos', '<+06>-6' }, - { 'Indian/Christmas', '<+07>-7' }, - { 'Indian/Cocos', '<+0630>-6:30' }, - { 'Indian/Comoro', 'EAT-3' }, - { 'Indian/Kerguelen', '<+05>-5' }, - { 'Indian/Mahe', '<+04>-4' }, - { 'Indian/Maldives', '<+05>-5' }, - { 'Indian/Mauritius', '<+04>-4' }, - { 'Indian/Mayotte', 'EAT-3' }, - { 'Indian/Reunion', '<+04>-4' }, - { 'Pacific/Apia', '<+13>-13' }, - { 'Pacific/Auckland', 'NZST-12NZDT,M9.5.0,M4.1.0/3' }, - { 'Pacific/Bougainville', '<+11>-11' }, - { 'Pacific/Chatham', '<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45' }, - { 'Pacific/Chuuk', '<+10>-10' }, - { 'Pacific/Easter', '<-06>6<-05>,M9.1.6/22,M4.1.6/22' }, - { 'Pacific/Efate', '<+11>-11' }, - { 'Pacific/Fakaofo', '<+13>-13' }, - { 'Pacific/Fiji', '<+12>-12<+13>,M11.2.0,M1.2.3/99' }, - { 'Pacific/Funafuti', '<+12>-12' }, - { 'Pacific/Galapagos', '<-06>6' }, - { 'Pacific/Gambier', '<-09>9' }, - { 'Pacific/Guadalcanal', '<+11>-11' }, - { 'Pacific/Guam', 'ChST-10' }, - { 'Pacific/Honolulu', 'HST10' }, - { 'Pacific/Kanton', '<+13>-13' }, - { 'Pacific/Kiritimati', '<+14>-14' }, - { 'Pacific/Kosrae', '<+11>-11' }, - { 'Pacific/Kwajalein', '<+12>-12' }, - { 'Pacific/Majuro', '<+12>-12' }, - { 'Pacific/Marquesas', '<-0930>9:30' }, - { 'Pacific/Midway', 'SST11' }, - { 'Pacific/Nauru', '<+12>-12' }, - { 'Pacific/Niue', '<-11>11' }, - { 'Pacific/Norfolk', '<+11>-11<+12>,M10.1.0,M4.1.0/3' }, - { 'Pacific/Noumea', '<+11>-11' }, - { 'Pacific/Pago Pago', 'SST11' }, - { 'Pacific/Palau', '<+09>-9' }, - { 'Pacific/Pitcairn', '<-08>8' }, - { 'Pacific/Pohnpei', '<+11>-11' }, - { 'Pacific/Port Moresby', '<+10>-10' }, - { 'Pacific/Rarotonga', '<-10>10' }, - { 'Pacific/Saipan', 'ChST-10' }, - { 'Pacific/Tahiti', '<-10>10' }, - { 'Pacific/Tarawa', '<+12>-12' }, - { 'Pacific/Tongatapu', '<+13>-13' }, - { 'Pacific/Wake', '<+12>-12' }, - { 'Pacific/Wallis', '<+12>-12' }, -} diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo/tzoffset.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo/tzoffset.lua deleted file mode 100644 index caee1d2..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/sys/zoneinfo/tzoffset.lua +++ /dev/null @@ -1,46 +0,0 @@ --- Licensed to the public under the Apache License 2.0. - -module "luci.sys.zoneinfo.tzoffset" - -OFFSET = { - gmt = 0, -- GMT - eat = 10800, -- EAT - cet = 3600, -- CET - wat = 3600, -- WAT - cat = 7200, -- CAT - eet = 7200, -- EET - sast = 7200, -- SAST - hst = -36000, -- HST - hdt = -32400, -- HDT - akst = -32400, -- AKST - akdt = -28800, -- AKDT - ast = -14400, -- AST - est = -18000, -- EST - cst = -21600, -- CST - cdt = -18000, -- CDT - mst = -25200, -- MST - mdt = -21600, -- MDT - pst = -28800, -- PST - pdt = -25200, -- PDT - nst = -12600, -- NST - ndt = -9000, -- NDT - aest = 36000, -- AEST - aedt = 39600, -- AEDT - nzst = 43200, -- NZST - nzdt = 46800, -- NZDT - hkt = 28800, -- HKT - wib = 25200, -- WIB - wit = 32400, -- WIT - ist = 7200, -- IST - idt = 10800, -- IDT - pkt = 18000, -- PKT - wita = 28800, -- WITA - kst = 32400, -- KST - jst = 32400, -- JST - wet = 0, -- WET - acst = 34200, -- ACST - acdt = 37800, -- ACDT - awst = 28800, -- AWST - msk = 10800, -- MSK - sst = -39600, -- SST -} diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/template.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/template.lua deleted file mode 100644 index b6b9af0..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/template.lua +++ /dev/null @@ -1,184 +0,0 @@ --- Copyright 2008 Steven Barth --- Licensed to the public under the Apache License 2.0. - -local util = require "luci.util" -local config = require "luci.config" -local tparser = require "luci.template.parser" - -local tostring, pairs, loadstring = tostring, pairs, loadstring -local setmetatable, loadfile = setmetatable, loadfile -local getfenv, setfenv, rawget = getfenv, setfenv, rawget -local assert, type, error = assert, type, error -local table, string, unpack = table, string, unpack - - ---- ---- bootstrap ---- -local _G = _G -local L = _G.L - -local http = _G.L.http - -local disp = require "luci.dispatcher" -local i18n = require "luci.i18n" -local xml = require "luci.xml" -local fs = require "nixio.fs" - - ---- LuCI template library. -module "luci.template" - -config.template = config.template or {} -viewdir = config.template.viewdir or util.libpath() .. "/view" - - --- Define the namespace for template modules -context = {} --util.threadlocal() - ---- Render a certain template. --- @param name Template name --- @param scope Scope to assign to template (optional) -function render(name, scope) - return Template(name):render(scope or getfenv(2)) -end - ---- Render a template from a string. --- @param template Template string --- @param scope Scope to assign to template (optional) -function render_string(template, scope) - return Template(nil, template):render(scope or getfenv(2)) -end - - --- Template class -Template = util.class() - --- Shared template cache to store templates in to avoid unnecessary reloading -Template.cache = setmetatable({}, {__mode = "v"}) - - - -local function _ifattr(cond, key, val, noescape) - if cond then - local env = getfenv(3) - local scope = (type(env.self) == "table") and env.self - if type(val) == "table" then - if not next(val) then - return '' - else - val = util.serialize_json(val) - end - end - - val = tostring(val or - (type(env[key]) ~= "function" and env[key]) or - (scope and type(scope[key]) ~= "function" and scope[key]) or "") - - if noescape ~= true then - val = xml.pcdata(val) - end - - return string.format(' %s="%s"', tostring(key), val) - else - return '' - end -end - -context.viewns = setmetatable({ - include = function(name) - if fs.access(viewdir .. "/" .. name .. ".htm") then - Template(name):render(getfenv(2)) - else - L.include(name, getfenv(2)) - end - end; - translate = i18n.translate; - translatef = i18n.translatef; - export = function(k, v) if context.viewns[k] == nil then context.viewns[k] = v end end; - striptags = xml.striptags; - pcdata = xml.pcdata; - ifattr = function(...) return _ifattr(...) end; - attr = function(...) return _ifattr(true, ...) end; - url = disp.build_url; -}, {__index=function(tbl, key) - if key == "controller" then - return disp.build_url() - elseif key == "REQUEST_URI" then - return disp.build_url(unpack(disp.context.requestpath)) - elseif key == "FULL_REQUEST_URI" then - local url = { http:getenv("SCRIPT_NAME") or "", http:getenv("PATH_INFO") } - local query = http:getenv("QUERY_STRING") - if query and #query > 0 then - url[#url+1] = "?" - url[#url+1] = query - end - return table.concat(url, "") - elseif key == "token" then - return disp.context.authtoken - elseif key == "theme" then - return L.media and fs.basename(L.media) or tostring(L) - elseif key == "resource" then - return L.config.main.resourcebase - else - return rawget(tbl, key) or _G[key] or L[key] - end -end}) - - --- Constructor - Reads and compiles the template on-demand -function Template.__init__(self, name, template) - if name then - self.template = self.cache[name] - self.name = name - else - self.name = "[string]" - end - - -- Create a new namespace for this template - self.viewns = context.viewns - - -- If we have a cached template, skip compiling and loading - if not self.template then - - -- Compile template - local err - local sourcefile - - if name then - sourcefile = viewdir .. "/" .. name .. ".htm" - self.template, _, err = tparser.parse(sourcefile) - else - sourcefile = "[string]" - self.template, _, err = tparser.parse_string(template) - end - - -- If we have no valid template throw error, otherwise cache the template - if not self.template then - error("Failed to load template '" .. self.name .. "'.\n" .. - "Error while parsing template '" .. sourcefile .. "':\n" .. - (err or "Unknown syntax error")) - elseif name then - self.cache[name] = self.template - end - end -end - - --- Renders a template -function Template.render(self, scope) - scope = scope or getfenv(2) - - -- Put our predefined objects in the scope of the template - setfenv(self.template, setmetatable({}, {__index = - function(tbl, key) - return rawget(tbl, key) or self.viewns[key] or scope[key] - end})) - - -- Now finally render the thing - local stat, err = util.copcall(self.template) - if not stat then - error("Failed to execute template '" .. self.name .. "'.\n" .. - "A runtime error occurred: " .. tostring(err or "(nil)")) - end -end diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/template/parser.so b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/template/parser.so deleted file mode 100755 index c96a60d5f58f046213441c2d2db3dcd51c78fd85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65666 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 mG`so#1OfSm - Copyright 2018 Daniel F. Dickinson - Licensed to the public under the Apache License 2.0. --%> - -<%+header%> - -

Component not present.

- -<%+footer%> diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/view/indexer.htm b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/view/indexer.htm deleted file mode 100644 index 28fc3de..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/view/indexer.htm +++ /dev/null @@ -1,7 +0,0 @@ -<%# - Copyright 2008 Steven Barth - Copyright 2008 Jo-Philipp Wich - Licensed to the public under the Apache License 2.0. --%> - -<% include("themes/" .. theme .. "/indexer") %> \ No newline at end of file diff --git a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/xml.lua b/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/xml.lua deleted file mode 100644 index 30b3721..0000000 --- a/ipk-source/luci-lua-runtime_aarch64_cortex-a53/root/usr/lib/lua/luci/xml.lua +++ /dev/null @@ -1,26 +0,0 @@ --- Copyright 2008 Steven Barth --- Licensed to the public under the Apache License 2.0. - -local tparser = require "luci.template.parser" -local string = require "string" - -local tostring = tostring - -module "luci.xml" - --- --- String and data manipulation routines --- - -function pcdata(value) - return value and tparser.pcdata(tostring(value)) -end - -function striptags(value) - return value and tparser.striptags(tostring(value)) -end - - --- also register functions above in the central string class for convenience -string.pcdata = pcdata -string.striptags = striptags diff --git a/opkg-feed/Packages b/opkg-feed/Packages index 7e9b1be..6169d5e 100644 --- a/opkg-feed/Packages +++ b/opkg-feed/Packages @@ -102,8 +102,8 @@ Description: Luci app for tailscale Package: luci-lua-runtime -Version: 25.034.70690~7b0663a -Architecture: aarch64_cortex-a53 +Version: 25.034.70690~7b0663a-sdxpinn +Architecture: sdxpinn Depends: libc, luci-base, lua, luci-lib-base, luci-lib-nixio, luci-lib-ip, luci-lib-jsonc, libubus-lua, liblucihttp-lua, ucode-mod-lua Source: https://dl.openwrt.ai/packages-24.10/aarch64_cortex-a53/luci/luci-lua-runtime_25.049.66344~2b8e93c_aarch64_cortex-a53.ipk SourceName: luci-lua-runtime @@ -111,10 +111,10 @@ License: Apache-2.0 Section: luci SourceDateEpoch: 1738611490 URL: https://github.com/openwrt/luci -Maintainer: OpenWrt LuCI community -MD5Sum: 73ad81aa525e7ca829175ab3ace1e542 -Size: 31355 -Filename: luci-lua-runtime_25.034.70690~7b0663a_aarch64_cortex-a53.ipk +Maintainer: github/iamromulan +MD5Sum: c6c571d34de434c6a55262112bc9261d +Size: 2072 +Filename: luci-lua-runtime_25.034.70690~7b0663a-sdxpinn_sdxpinn.ipk Description: LuCI Lua runtime libraries diff --git a/opkg-feed/Packages.gz b/opkg-feed/Packages.gz index 49d8cf19de7c6bf716e5eec813459c440d36266c..288de6a7716ac492f3c47579f5d7e1144e2252b0 100644 GIT binary patch literal 2932 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 ePB*ElKt{FuP+m{(`6#I|t& literal 2926 zcmV-!3z766iwFq#QMqRT15jaOYhh<)a{%R9U31$u7Jb*Rz}s$TEC~QX5XfXZaqVu# z9jEoiX|wyJ0Rd1#OpyvdVtXI*+xLPLB~qg7r0I5MXD5lr`~oh{J@?*of!rv4r45}K&gxMUjB%Nqcc0!`T{WL( zwwjz5dgUs(Qx|@81(%#HbY4{UVXDGl@N9`(SllS#3qFbfE;oe zD(y#DnYIXSOs<`_Sqam7^loK$1EQ@LJoOs)0rxB_SE{fE6?Im* zb@Oteibs^>Mf14*()q~R6c&EY2BfRCo2t!bs*0tjMxG^ZImiNsG)vPXUimSA@EcW4 z-dfN6?NfgrOjz4?^c}^Pu3FXc4Bni7uto8BSKrn1QA_59O)U_soL6c&|K!c-b7b85 zJx$>82u*m1BS9sj14fJ)wPQj=A|rVeGsUcCSQsfG@o;4{mN<@Zmwv(^>=R+kJfDmf zfZ~X+uj`8|@G&^pJMY|ogf7}O^;~wh&dv1R6?R#x!t8z3%hsiN*tjg4f=Be~z=7Lm zgSB6Pxdlx2ZUtV16oH&t7x}tQRrYF+%MJ}GYy=5dXqu2XOcKUz5=A74S;7M)Sr->V z_P`jLy&#LNA%h&;bHd()AxiJNA$%70tb-Yh=Xc)F{mvGdO~)zTX74E&(nD<)%-GbY zDNKkwr1ticA;*XOIu4IMvcJG^?~AH+tq+YlbJgPxNs>U-kyeYuh7k>7K^Tq`swqjV z3bE*TB{&=9)qX{b;X-x{>yX{1j`=7WLx63Je!Xfa*cHJ+(F#VvUFKt)WU~Qn0I>+lQ)WSwDLm zJn6hzS1v6_+&WTk2xpjtoDYMku<(vS@gur?GheGan}Fy1>#jgaS5;K(^w~QH(hx%dZ!4 zet567{I6Ksg2*(sgjXLUdn2u=u-c=GGp>;1}lHE6rS z#_q3SX%r|Uh*BX9ZKM^54HAVa4wSaUh9EpzmIfpUkMzPJJco?=GTGP|c3rCjS?Fwe z#MQn++jAAF37r;AIiWauUIgm8fVAw11=$X=@Y%7CjEJG=wuh%MuQV2*10?D0I(e?QRM&#Lm5*g**G<7)t97Q9aJNEv zg8oqhDmF!L--Hhj2nv;5mtWwVJ<@|FfS#hgFRcG{FJR0JONfpnwTY%CfF8hD8gVLP zWrMiO3!I4&FYK1obOGP$f>yx#Ev~v$F-X^DcnAd5?qQ+)lPyx!ZZX_m{`2PQ=byLm z&rl1Z%`}u66xW#nIoKcyokZo5$42lsqik>7EB91`F>Gaf^(j1VcSmAq%y|cj^DCQQ zY&8#Q0G%2&%E-`I!a0vIQ9Qv?^RBkzkd1h%Sq3EU@PzPuvh_VjOA98e6eX@Gt1dE{ zF$d0Qo_5l{9iI42iPY(;936KW+e+B3Ul%}c z>#~Hv{+EK>G8#grn3_Dz*D&Ju#}53`pwqGBI<(MZLBq{?5=bM3OlTC@SmPw>QXi!R z%MoYx*1TvS{G)Q;ecOT?TP^_*gR0!?IACs`ElX!?+q`*?_i|wP6*=(8TRkce-?Tju zTxUZvH@zMZ`n$6&Z+dYJvM?`fQ^%%W0ybMIwf7Em^X0m1+W&R{zfTM^%jx-zZ#ni5 z!MGnjo*hY+rz!Zqz&=BjrO>EC$8ShPOe|>#$(~0bMI*yIsRNH8+dR#_#)pfo>%NhM zKm7Ra{7<3c*8PKHjuRX>N=>;|)fE25g)>Y0O_C`ukYp)~AN@d!D`26t`d~(0C{>*iwif$Vg)RMgiy;UNJi?WVk5_tL7jp<(K33kYD zuu=|ja5{DMJb37BcC;^|rmYIzZgN+3_UE~svnXaJ(ASx?A`a)y(%_GCr?YAoIQ7H1zP?K4oyeOngwmZLr@HYC7ejDVjCL6DHS-e zk?0x<$_KIL?ezV_?>!N{@^Rov?$1B};z#>S_y12kNGqFeAS^1VU>81al2k#wy+40@ zgFvlrTgCxyfKk8GhCc^s?F8SO?$qf4O24_canRe|ixm+hk?=#)*oY*EWB|m$8p2>F zr~)2ELiEqNyiJSNl*Pexr{HR4p8F5?JH!Lr{G;Z-@?@ya@+5KEsT6Wek(cFkld1}2 YRJ#x5^;91_Pprx0Kgis^pgko30L$yIGynhq diff --git a/opkg-feed/Packages.log b/opkg-feed/Packages.log index 18d9b30..b504696 100644 --- a/opkg-feed/Packages.log +++ b/opkg-feed/Packages.log @@ -1,17 +1,14 @@ -Starting package analysis - Fri Feb 21 11:26:32 PM EST 2025 +Starting package analysis - Sat Feb 22 12:04:59 AM EST 2025 No update needed for atinout (version 0.9.1, MD5: 444eb87488bad1927b6ed069dedf7393, size: 4323) No update needed for kmod-wireguard (version 1, MD5: 98e77b68c2f1b5ff46ef7713b4f63a94, size: 789) -Updating package info for libucode20230711... -Updated libucode20230711 to version 2024.07.22~b610860d-r3 with MD5: c38bd45a6aa14a969b7e92f051481d7e and size: 79358 -Updating package info for luci-app-argon-config... -Updated luci-app-argon-config to version 0.9 with MD5: 717d967b4a4ec408d99edf6adc090b70 and size: 4535 +No update needed for libucode20230711 (version 2024.07.22~b610860d-r3, MD5: c38bd45a6aa14a969b7e92f051481d7e, size: 79358) +No update needed for luci-app-argon-config (version 0.9, MD5: 717d967b4a4ec408d99edf6adc090b70, size: 4535) No update needed for luci-app-atinout-mod (version 1.3.4-20250119, MD5: 1ffee9ec8fe5723b8140bf2c21fea508, size: 4864) No update needed for luci-app-go-wireguard (version 4.500-2, MD5: 66549e8d970b9046440e6a836f9c9639, size: 24213) No update needed for luci-app-tailscale (version 1.2.3-2, MD5: 53c84c947c42d7518aecb4a6b8a9c5a8, size: 6501) Updating package info for luci-lua-runtime... -Updated luci-lua-runtime to version 25.034.70690~7b0663a with MD5: 73ad81aa525e7ca829175ab3ace1e542 and size: 31355 -Updating package info for luci-theme-argon... -Updated luci-theme-argon to version 2.3.2-r20250207 with MD5: 1354d843e7a0257fc8684548ec37a284 and size: 401244 +Updated luci-lua-runtime to version 25.034.70690~7b0663a-sdxpinn with MD5: c6c571d34de434c6a55262112bc9261d and size: 2072 +No update needed for luci-theme-argon (version 2.3.2-r20250207, MD5: 1354d843e7a0257fc8684548ec37a284, size: 401244) No update needed for ookla-speedtest (version 1.2.0, MD5: b26e1909599f73cab40ea0281c5a6283, size: 1075696) No update needed for sdxpinn-console-menu (version 0.0.2, MD5: de75d2889510e92b57fc8a7ca087ced4, size: 7361) No update needed for sdxpinn-mount-fix (version 1.3.2, MD5: 004d4f1c792efc2d32c2de27629bae3b, size: 4648) @@ -22,9 +19,8 @@ No update needed for sms-tool (version 2025.1.19-APmod-iamromulan, MD5: 83dc8bfd No update needed for socat-at-bridge (version 1.1.1, MD5: a5f4c4c371426fbe12bf2345938af195, size: 1795) No update needed for tailscale (version 1.78.1-2, MD5: baa4d97ba49aa42ef104accba2dc2fd8, size: 9882856) No update needed for tailscaled (version 1.78.1-4, MD5: 647b4d3c6e51f700dd96362f92f20b54, size: 17960998) -Updating package info for ucode-mod-lua... -Updated ucode-mod-lua to version 1 with MD5: cd83c6848867112332d1155b4c4f0640 and size: 10085 +No update needed for ucode-mod-lua (version 1, MD5: cd83c6848867112332d1155b4c4f0640, size: 10085) No update needed for warp (version 1.0, MD5: ea95658bf84f619cabe5dd62280fe787, size: 2698) No update needed for wgcf (version 2.2.24, MD5: b2ba181f9181c2bd8f37933c60c0713f, size: 3677883) Package file and signature updated successfully. -Package analysis completed - Fri Feb 21 11:26:32 PM EST 2025 +Package analysis completed - Sat Feb 22 12:05:00 AM EST 2025 diff --git a/opkg-feed/Packages.sig b/opkg-feed/Packages.sig index 181a006..67684af 100644 --- a/opkg-feed/Packages.sig +++ b/opkg-feed/Packages.sig @@ -1,2 +1,2 @@ untrusted comment: signed by key 6262698f038d1226 -RWRiYmmPA40SJm/QKJtoftEQ1uNz1FVUyWYiu5FLeX8wVgsHQPhzHK8uBo4fyDsctcBMEQlGrhxoPnvAxbL/7IxLarFFBa+/fwU= +RWRiYmmPA40SJiBVVdYfoz4CU1mMNX+vVSvNzQF0RidDocwdyXjzB5AHzgZWaNyzoXHH2Up5D36Yuz38lbAY+N/H1Wk4S97ZyAw= diff --git a/opkg-feed/luci-lua-runtime_25.034.70690~7b0663a-sdxpinn_sdxpinn.ipk b/opkg-feed/luci-lua-runtime_25.034.70690~7b0663a-sdxpinn_sdxpinn.ipk new file mode 100644 index 0000000000000000000000000000000000000000..e5ecf1dc9834b79f66d8a8a63347844c6da6e1f5 GIT binary patch literal 2072 zcmV+z2dY|>K_5D7+e%^t2g06QU0Z%#w`8M>wKpPtVKEL?m`~n3*8tyhi8yFd(jL;B$ zq=5kv4N=wqM(6oAk>L?|lBz0%L?lN1xA(rb{}*MT_g(%n=zo+Ckq|*52J3wZfnGq& zxB13b@{ct9&;0-W5t#q)KqX!L9}7`#zB`erFBiYkD3CmS6Qc?pei&J~)>~0rE2_Mo ztdOL&Bg~!oDl>S!RurFW{J8Ss`Lq-%1V7h}ZbDx+F)^pttcTSnN>yrBxQ(Rs_&1gO z(&j9;f=fDkBW1OfE-lkXbi0AmI-miOw!Z0T-&r)5vJ~~4qN!{z#&UdPbgx<#ICYom zmT{mej%=|(&>(V%jIMO0c}iXfN~v~2t9RKEmezHm^9Fu|RyeM)iHE_Vh60eaWvPrgJpo`$j@nHc4qQ+8zWbZD=#KFe&A#!Ug6-J~ZFJCtC~5 z7j+$6Y#$orsQYwWZfs5|GC!~+SaBZe94DT?IV+i+X$qkxv~8KJA{X6B&ppksw$JMP z)s7~ohbbE77D3zV`M5!mAK=lRHAU(^D5gKnQBm9Z$qcEMzfj~)psec8hROXZUU0d> zsm2=*H}H_Gk zz8Fsx!Hgk6@1;QT^2Nv$$os(R1~~F+udCZA{*glW@$Gqq-r;cV@E`NB0mP^CBObfr zSH>&W`)2#M#z~_-OV1lHiXZ#QKCGW=^{#f&*_=-M=Lll&a87uu4AJ~^boO-W!EOzRb<1ZL_f( zMPkGgymZJcrY-8d85)_kOie+>47@(l7>165IjMMcB1|-BS#@vcfeaeWZ7-hmw27(fJGDiNLCj6S7RRI1_DP&(M++wdFD?owqNc)d?7>%}^aYAldLRQZ z34Inva9o}$WQz*}7EYWKOn#zc0M4HE078E2vHh1uU&IJ+=pb5xUAjAS#`?ZDL>yqDKBw60XuUpxDr}<;gO{=1C7vo{f{TC^cIcDco&!K6_+pd@WbEtV9!e=bA=LV!#Nz zztOs1=|NJ;{h(Ob_81s;iQiLQ`oN@kaEp_cty|Mcf>uam&5^Orj5nv^M?xLFX62oT zR{a;79~Q3$Yb(yW_iJ1uu~f*c;-MdZ!gP2ZrH>8FJ7d|~ToQ~s>6*!s`MZ;bC)9Pf zwcKbz@OB|1ij!9(-lfc0iZBo9m)Tz77}G5i(gkf(CwAq)Q3`~$tN|IaU7W=SZKd#f zUFU7HsY#<)d8fciu0tZErZd>j(AR2H6=&HatsXWvGahp_jD#$nLrnsY+IM)oyem`yw9xKy0JBdT zLL6;wD_?o{^$C=>Sq)&5&R@I$XtYz}V*!ixSC83Wnd+&ej}C{`Ub%f16EIsK&T8PJ zW7?S+`|GN2Sq5u0Ig0%@$URw?H&d>?nAtSxmaK80-0`O=-&c3D^EgzWnMbQ>l<-_! zVK*i2dIZ^2s$MA{jFN)bt1xF^Vy{A7bA3v30g0MOQ&lDYz>)owEvM-muA1 z#>6bX?frdWuA%}t{PgX>|NZ3%0)apv5C{YUfj}S-2m}IwKp@ax)ZYLjjT^TBC;$Ks CwiKlR literal 0 HcmV?d00001 diff --git a/opkg-feed/luci-lua-runtime_25.034.70690~7b0663a_aarch64_cortex-a53.ipk b/opkg-feed/luci-lua-runtime_25.034.70690~7b0663a_aarch64_cortex-a53.ipk deleted file mode 100644 index 6853d0a329e52c4e0bf8d35c8154c638965eed39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31355 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 O``-Wy^&>$5pa1|@Q$>*g