From 781a4dc7a10266eef7b4788399649016c36664b4 Mon Sep 17 00:00:00 2001 From: Wouter R Date: Thu, 20 Feb 2014 14:20:51 +0100 Subject: [PATCH] Implement upstream syncing. --- updater-ng/d3d-update-mgr.lua | 40 +++++++++++----------- updater-ng/release-ng.lua | 64 ++++++++++++++++++++++++++++------- 2 files changed, 71 insertions(+), 33 deletions(-) diff --git a/updater-ng/d3d-update-mgr.lua b/updater-ng/d3d-update-mgr.lua index 868ea64..4127cd5 100644 --- a/updater-ng/d3d-update-mgr.lua +++ b/updater-ng/d3d-update-mgr.lua @@ -105,23 +105,6 @@ local function E(msg) end end -compatlua51 = _VERSION == 'Lua 5.1' - ---- execute a shell command. Taken from penlight library. --- This is a compatibility function that returns the same for Lua 5.1 and Lua 5.2 --- @param cmd a shell command --- @return true if successful --- @return actual return code -function compatexecute (cmd) - local res1,res2,res3 = os.execute(cmd) - if compatlua51 then - local cmd,sys = splitExitStatus(res1) - return (res1 == 0) and true or nil, sys - else - return res1, res3 - end -end - --- Splits the return status from `os.execute` (only Lua <= 5.1), which consists of two bytes. -- -- `os.execute` internally calls [system](http://linux.die.net/man/3/system), @@ -171,7 +154,7 @@ end -- @return bool|nil True, or nil on error. -- @return ?string A message in case of error. local function createCacheDirectory() - local _,rv = compatexecute('mkdir -p ' .. cachePath) + local _,rv = M.compatexecute('mkdir -p ' .. cachePath) if rv ~= 0 then return nil,"Error: could not create cache directory '" .. cachePath .. "'" end @@ -266,7 +249,7 @@ end local function runCommand(command, dryRun) --D("about to run: '" .. command .. "'") if dryRun then return -1 end - return compatexecute(command) + return M.compatexecute(command) end --- Removes a file. @@ -353,6 +336,23 @@ end -- MODULE FUNCTIONS -- ---------------------- +local compatlua51 = _VERSION == 'Lua 5.1' + +--- execute a shell command. Taken from penlight library. +-- This is a compatibility function that returns the same for Lua 5.1 and Lua 5.2 +-- @param cmd a shell command +-- @return true if successful +-- @return actual return code +function M.compatexecute (cmd) + local res1,res2,res3 = os.execute(cmd) + if compatlua51 then + local cmd, sys = splitExitStatus(res1) + return (res1 == 0) and true or nil, sys + else + return res1, res3 + end +end + --- Set verbosity (log level) that determines which messages do get logged and which do not. -- @tparam number level The level to set, between -1 and 1. function M.setVerbosity(level) @@ -761,7 +761,7 @@ function M.clear() D("Removing " .. cachePath .. "/doodle3d-wifibox-*.bin") M.setState(M.STATE.NONE, "") - local rv = compatexecute('rm -f ' .. cachePath .. '/doodle3d-wifibox-*.bin') + local rv = M.compatexecute('rm -f ' .. cachePath .. '/doodle3d-wifibox-*.bin') return (rv == 0) and true or nil,"could not remove image files" end diff --git a/updater-ng/release-ng.lua b/updater-ng/release-ng.lua index f4346fc..3bf4956 100755 --- a/updater-ng/release-ng.lua +++ b/updater-ng/release-ng.lua @@ -25,11 +25,18 @@ arg = argStash -- CONSTANTS AND VARIABLES -- ----------------------------- +local SERVER_HOST = 'localhost' +local SERVER_PATH = '~wouter/public_html/wifibox/updates' +--local SERVER_HOST = 'doodle3d.com' +--local SERVER_PATH = 'doodle3d.com/DEFAULT/updates' + local D3D_REPO_FIRMWARE_NAME = 'doodle3d-firmware' local D3D_REPO_CLIENT_NAME = 'doodle3d-client' local D3D_REPO_PRINT3D_NAME = 'print3d' local IMAGE_BASENAME = 'doodle3d-wifibox' -local INDEX_BACKUP_SUFFIX = 'bkp' +local BACKUP_FILE_SUFFIX = 'bkp' +local RELEASE_NOTES_FILE = "ReleaseNotes.md" +local RSYNC_TIMEOUT = 2 local deviceType = 'tl-mr3020' -- or 'tl-wr703' local lock = nil @@ -208,7 +215,9 @@ local function generateIndex(newVersion, versionTable, isStable) end) local indexPath = pl.path.join(paths.cache, indexFilename) - pl.file.copy(indexPath, pl.path.join(paths.cache, indexFilename..'.'..INDEX_BACKUP_SUFFIX)) + local rv = pl.file.copy(indexPath, pl.path.join(paths.cache, indexFilename..'.'..BACKUP_FILE_SUFFIX)) + if not rv then return nil,"could not backup index file" end + local idxFile = io.open(pl.path.join(paths.cache, indexFilename), 'w') if not idxFile then return nil,"could not open index file for writing" end @@ -249,6 +258,15 @@ local function copyImages(newVersion) return true end +local function uploadFiles() + local serverUrl = SERVER_HOST..':'..SERVER_PATH + -- rsync options are: recursive, preserve perms, symlinks and timestamps, be verbose and use compression + local cmd = "rsync -rpltvz -e ssh --progress --timeout=" .. RSYNC_TIMEOUT .. " --exclude '*.bkp' --exclude 'lockfile.lfs' " .. paths.cache .. "/* " .. serverUrl + print("Running command: '" .. cmd .. "'") + local rv,ev = um.compatexecute(cmd) + return rv and true or nil,("rsync failed, exit status: " .. ev) +end + local function main() print("Doodle3D release script") -- local opts = parseOptions(arg) @@ -283,6 +301,14 @@ local function main() quit(3) end +-- pl.pretty.dump(newVersion) +-- print("stables: "); pl.pretty.dump(stables) +-- print("==========================="); +-- print("betas: "); pl.pretty.dump(betas) + + --TODO: if requested, fetch images and packages (i.e., mirror whole directory) + --TODO: run sanity checks + io.stdout:write("Generating new index file...") if not generateIndex(newVersion, isStable and stables or betas, isStable) then print("Error: could not generate index") @@ -300,20 +326,32 @@ local function main() print("ok") end + io.stdout:write("Copying release notes...") + local releaseNotesPath = pl.path.join(paths.cache, RELEASE_NOTES_FILE) + if pl.path.isfile(releaseNotesPath) then + local rv = pl.file.copy(releaseNotesPath, pl.path.join(paths.cache, RELEASE_NOTES_FILE..'.'..BACKUP_FILE_SUFFIX)) + if not rv then + print("backing up failed") + quit(4) + end + end --- pl.pretty.dump(newVersion) --- print("stables: "); pl.pretty.dump(stables) --- print("==========================="); --- print("betas: "); pl.pretty.dump(betas) + local rv = pl.file.copy(pl.path.join(paths.firmware, RELEASE_NOTES_FILE), releaseNotesPath) + if not rv then + print("copy failed") + quit(4) + else + print("ok") + end + print("About to sync files to server...") + local rv,msg = uploadFiles() + if not rv then + print("Error: could not upload files (" .. msg .. ")") + quit(5) + end - --if requested, fetch images and packages (i.e., mirror whole directory) - - --run sanity checks - - --check whether newVersion is not conflicting with or older than anything in corresponding table - --add newVersion to correct table and generate updated index file - + print("Done.") quit() end