mirror of
https://github.com/Doodle3D/doodle3d-firmware.git
synced 2024-12-22 11:03:48 +01:00
New API for loading and saving sketches (or arbitrary data really). Status call not implemented yet.
This commit is contained in:
parent
6ddd038495
commit
d069dafb5c
158
src/rest/api/api_sketch.lua
Normal file
158
src/rest/api/api_sketch.lua
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
--[[
|
||||||
|
This module uses the Lua filesystem library to iterate over all sketches.
|
||||||
|
A more flexible approach would be to use an index file (like the update module does).
|
||||||
|
That way, we could also store arbitrary meta-data together with the sketches.
|
||||||
|
]]--
|
||||||
|
|
||||||
|
local lfs = require('lfs')
|
||||||
|
local log = require('util.logger')
|
||||||
|
local utils = require('util.utils')
|
||||||
|
|
||||||
|
local M = {
|
||||||
|
isApi = true,
|
||||||
|
SKETCH_DIR = '/root/sketches',
|
||||||
|
MIN_FREE_SPACE = 1024 * 80
|
||||||
|
}
|
||||||
|
|
||||||
|
local NUMBER_PAD_WIDTH = 5
|
||||||
|
local SKETCH_FILE_EXTENSION = 'sketch'
|
||||||
|
|
||||||
|
|
||||||
|
-- creates sketch directory, and sets response to error state on failure
|
||||||
|
local function createSketchDirectory()
|
||||||
|
if os.execute('mkdir -p ' .. M.SKETCH_DIR) ~= 0 then
|
||||||
|
log:error("Error: could not create sketch directory '" .. M.SKETCH_DIR .. "'")
|
||||||
|
response:setError("could not create sketch directory")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function constructSketchFilename(idx)
|
||||||
|
return string.format('%0' .. NUMBER_PAD_WIDTH .. '.0f.%s', idx, SKETCH_FILE_EXTENSION)
|
||||||
|
end
|
||||||
|
|
||||||
|
--should this return 1k-blocks or bytes?
|
||||||
|
local function getFreeDiskSpace()
|
||||||
|
local kb = utils.captureCommandOutput('df / -k | awk \'$3 ~ /[0-9]+/ { print $4 }\'')
|
||||||
|
return kb * 1024
|
||||||
|
end
|
||||||
|
|
||||||
|
local function createSketchList()
|
||||||
|
local result = {}
|
||||||
|
|
||||||
|
for item in lfs.dir(M.SKETCH_DIR) do
|
||||||
|
if item ~= '.' and item ~= '..' then
|
||||||
|
local idx = item:match('^(%d+)\.sketch$')
|
||||||
|
if idx and idx:len() == NUMBER_PAD_WIDTH then
|
||||||
|
table.insert(result, tonumber(idx))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(result)
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- retrieve sketches, requires id(int)
|
||||||
|
function M._global_GET(request, response)
|
||||||
|
local argId = request:getBlankArgument() -- try this one first
|
||||||
|
if not argId then argId = request:get("id") end -- and fall back to this one
|
||||||
|
|
||||||
|
if not argId then
|
||||||
|
response:setError("missing id argument")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
argId = tonumber(argId)
|
||||||
|
|
||||||
|
if not createSketchDirectory(request, response) then return end
|
||||||
|
local sketches = createSketchList()
|
||||||
|
|
||||||
|
local exists = false
|
||||||
|
for _,sketchId in ipairs(sketches) do
|
||||||
|
if sketchId == argId then
|
||||||
|
exists = true
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
response:addData('id', argId)
|
||||||
|
if exists then
|
||||||
|
local loadFile,msg = io.open(M.SKETCH_DIR .. '/' .. constructSketchFilename(argId))
|
||||||
|
|
||||||
|
if not loadFile then
|
||||||
|
response:setError("could not open sketch file for reading (" .. msg .. ")")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local data = loadFile:read('*a')
|
||||||
|
if not data then data = '' end
|
||||||
|
response:addData('data', data)
|
||||||
|
|
||||||
|
loadFile:close()
|
||||||
|
response:setSuccess()
|
||||||
|
else
|
||||||
|
response:setFail("sketch not found")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- TODO: do we need locking?
|
||||||
|
-- save sketches, requires data(string)
|
||||||
|
function M._global_POST(request, response)
|
||||||
|
local argData = request:get("data")
|
||||||
|
|
||||||
|
if not argData then
|
||||||
|
response:setFail("missing data argument")
|
||||||
|
return
|
||||||
|
elseif argData:len() == 0 then
|
||||||
|
response:setFail("data argument must be non-empty")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if getFreeDiskSpace() - M.MIN_FREE_SPACE < argData:len() then
|
||||||
|
response:setFail("not enough free space")
|
||||||
|
response:addData('available', getFreeDiskSpace())
|
||||||
|
response:addData('reserved', M.MIN_FREE_SPACE)
|
||||||
|
response:addData('sketch_size', argData:len())
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if not createSketchDirectory(request, response) then return end
|
||||||
|
local sketches = createSketchList()
|
||||||
|
|
||||||
|
local listSize = table.getn(sketches)
|
||||||
|
local sketchIdx = listSize > 0 and sketches[listSize] + 1 or 1
|
||||||
|
local sketchFile = M.SKETCH_DIR .. '/' .. constructSketchFilename(sketchIdx)
|
||||||
|
|
||||||
|
log:debug("saving sketch #" .. sketchIdx .. " (" .. argData:len() .. " bytes)")
|
||||||
|
local saveFile,msg = io.open(sketchFile, 'w')
|
||||||
|
|
||||||
|
if not saveFile then
|
||||||
|
response:setError("error opening sketch file for writing (".. msg .. ")")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
saveFile:write(argData)
|
||||||
|
saveFile:close()
|
||||||
|
|
||||||
|
response:addData('id', sketchIdx)
|
||||||
|
response:setSuccess()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- get info on number of sketches, used space, free space (and reserved space for printserver?)
|
||||||
|
function M.status(request, response)
|
||||||
|
if not createSketchDirectory(request, response) then return end
|
||||||
|
--return amount of sketches, free space (and space used by sketches?)
|
||||||
|
response:setSuccess()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- remove all sketches
|
||||||
|
function M.clear_POST(request, response)
|
||||||
|
local rv = os.execute("rm -f " .. M.SKETCH_DIR .. '/*')
|
||||||
|
if rv == 0 then response:setSuccess()
|
||||||
|
else response:setFail("could not remove contents of sketch directory")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
Loading…
Reference in New Issue
Block a user