diff --git a/updater-ng/release-ng.lua b/updater-ng/release-ng.lua new file mode 100755 index 0000000..ac48161 --- /dev/null +++ b/updater-ng/release-ng.lua @@ -0,0 +1,115 @@ +#!/usr/bin/env lua + +local function ERR(msg) print(msg) end + +local ok, lfs = pcall(require, 'lfs') +if not ok then + ERR('This script requires lfs, the Lua filesystem library') + os.exit(1) +end + +local D3D_REPO_FIRMWARE_NAME = 'doodle3d-firmware' +local D3D_REPO_CLIENT_NAME = 'doodle3d-client' +local D3D_REPO_PRINT3D_NAME = 'print3d' + +local paths = {} + +local M = {} + + +local function detectOpenWrtRoot() + local f = io.open('Makefile', 'r') + local line = f and f:read('*line') + local rv = (line and line:find('# Makefile for OpenWrt') == 1) and true or false + + if f then f:close() end + return rv +end + +-- returns uri (file path) of the wifibox feed, nil if not found or nil+msg on error +-- recognized feed names are 'wifibox' and 'doodle3d' (case-insensitive) +local function getWifiboxFeedRoot(feedsFile) + local typ, nam, uri = nil, nil, nil + local lineNo = 1 + local f = io.open(feedsFile, 'r') + + if not f then return nil, "could not open '" .. feedsFile .. '"' end + + for line in f:lines() do + typ, nam, uri = line:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)$') + + if not (typ and nam and uri) then + f:close() + return uri or nil, "could not parse line " .. feedsFile .. "#" .. lineNo + end + + local commented = (typ:find('#') == 1) + if not commented and (nam:lower() == 'wifibox' or nam:lower() == 'doodle3d') then + break + else + typ, nam, uri = nil, nil, nil + end + + lineNo = lineNo + 1 + end + + if uri and not (typ == 'src-link' or typ == 'src-cpy') then return nil, "d3d feed has wrong type '" .. typ .. "', use 'src-link' or 'src-cpy'" end + + f:close() + return uri +end + +-- TODO: pass table to functions to fill in? if they all return either true or nil+msg, that could be used for display of ok/msg +-- returns true on success, false on error, and displays meaningful messages +--local function runCheck(msg, processFunc) +-- io.stdout:write(msg .. "... ") +-- return processFunc(--[[ hmm ]]--) +--end + + + +local function main() + print("Doodle3D release script") +-- local opts = parseOptions(arg) +-- +-- if opts['wrt-root'] then changedir(opts['wrt-root']) end +-- if opts['cache-dir'] then paths.cache = opts['cache-dir'] end + + + io.stdout:write("Checking if working directory is the OpenWrt root... ") + local isOpenWrtRoot = detectOpenWrtRoot() + if isOpenWrtRoot then + print("ok") + else + print("unrecognized directory, try changing directories or using -wrt-root") + os.exit(1) + end + + io.stdout:write("Looking for Doodle3D feed path... ") + local d3dFeed,msg = getWifiboxFeedRoot('feeds.conf') + if d3dFeed then + print("found " .. d3dFeed) + else + if msg then print("not found: " .. msg) else print("not found") end + os.exit(1) + end + + paths.firmware = d3dFeed .. '/' .. D3D_REPO_FIRMWARE_NAME + paths.client = d3dFeed .. '/' .. D3D_REPO_CLIENT_NAME + paths.print3d = d3dFeed .. '/' .. D3D_REPO_PRINT3D_NAME + + -- if empty, try to set something sensible + if not paths.cache or paths.cache == '' then + paths.cache = '/tmp/d3d-release-dir' + end + + -- check if paths.cache is writable + + os.exit(1) +end + + +--- Only execute the main function if an arg table is present, this enables usage both as module and as standalone script. +if arg ~= nil then main() end + +return M