diff --git a/Makefile b/Makefile index 8daaf8c..4d5a5b0 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ .PHONY: all -all: ./library/copy.lua ./library/file.lua ./library/lineinfile.lua ./library/opkg.lua ./library/stat.lua ./library/ubus.lua ./library/uci.lua +all: ./library/copy.lua ./library/file.lua ./library/lineinfile.lua ./library/opkg.lua ./library/slurp.lua ./library/stat.lua ./library/ubus.lua ./library/uci.lua WHITELIST=io,os,posix.,ubus FATPACKARGS=--whitelist $(WHITELIST) --truncate diff --git a/src/base64.lua b/src/base64.lua new file mode 100644 index 0000000..41239c7 --- /dev/null +++ b/src/base64.lua @@ -0,0 +1,40 @@ +-- Lua 5.1+ base64 v3.0 (c) 2009 by Alex Kloss , +-- 2018 Piotr Úliwka +-- licensed under the terms of the LGPL2 + +local base64 = {} + +-- character table string +local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' + +-- encoding +function base64.encode(data) + return ((data:gsub('.', function(x) + local r,b='',x:byte() + for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end + return r; + end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) + if (#x < 6) then return '' end + local c=0 + for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end + return b:sub(c+1,c+1) + end)..({ '', '==', '=' })[#data%3+1]) +end + +-- decoding +function base64.decode(data) + data = string.gsub(data, '[^'..b..'=]', '') + return (data:gsub('.', function(x) + if (x == '=') then return '' end + local r,f='',(b:find(x)-1) + for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end + return r; + end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x) + if (#x ~= 8) then return '' end + local c=0 + for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end + return string.char(c) + end)) +end + +return base64 diff --git a/src/slurp.lua b/src/slurp.lua new file mode 100644 index 0000000..8cf9c33 --- /dev/null +++ b/src/slurp.lua @@ -0,0 +1,26 @@ +#!/usr/bin/lua +-- WANT_JSON + +local Ansible = require("ansible") +local base64 = require("base64") + +function main(arg) + local module = Ansible.new({ + src = { required=true, aliases={"path"} }, + }) + + module:parse(arg[1]) + + local source = module:get_params()["src"] + + -- FIXME: add IO error handling + local file = io.open(source, "rb") + local content = file:read "*a" + file:close() + + local encoded = base64.encode(content) + + module:exit_json({content=encoded, source=source, encoding='base64'}) +end + +main(arg)