diff options
author | Ted Trask <ttrask01@yahoo.com> | 2009-12-31 14:27:23 +0000 |
---|---|---|
committer | Ted Trask <ttrask01@yahoo.com> | 2009-12-31 14:27:23 +0000 |
commit | 9f469a06780e66135cb3da9cfdedb48763931160 (patch) | |
tree | ddcb6f2375c81e90f276f31aa880b2654092603d | |
parent | be4063286a0b8f46754c082178517b3c684c3dff (diff) | |
download | acf-core-9f469a06780e66135cb3da9cfdedb48763931160.tar.bz2 acf-core-9f469a06780e66135cb3da9cfdedb48763931160.tar.xz |
Moved non-ACF-specific libraries to acf-lib package, moved cfe_unpack function to viewfunctions library.
-rw-r--r-- | app/acf-util/logon-html.lsp | 3 | ||||
-rw-r--r-- | app/acf-util/logon-logout-html.lsp | 3 | ||||
-rw-r--r-- | app/acf-util/password-html.lsp | 8 | ||||
-rw-r--r-- | app/acf-util/password-status-html.lsp | 7 | ||||
-rw-r--r-- | app/acf-util/roles-viewroles-html.lsp | 4 | ||||
-rw-r--r-- | app/acf-util/welcome-html.lsp | 7 | ||||
-rw-r--r-- | app/debug-html.lsp | 7 | ||||
-rw-r--r-- | app/dispatcherror-html.lsp | 3 | ||||
-rw-r--r-- | app/exception-html.lsp | 3 | ||||
-rw-r--r-- | lib/Makefile | 9 | ||||
-rw-r--r-- | lib/apk.lua | 44 | ||||
-rw-r--r-- | lib/date.lua | 328 | ||||
-rw-r--r-- | lib/format.lua | 512 | ||||
-rw-r--r-- | lib/fs.lua | 222 | ||||
-rw-r--r-- | lib/html.lua | 275 | ||||
-rw-r--r-- | lib/processinfo.lua | 221 | ||||
-rw-r--r-- | lib/validator.lua | 172 | ||||
-rw-r--r-- | lib/viewfunctions.lua | 11 |
18 files changed, 22 insertions, 1817 deletions
diff --git a/app/acf-util/logon-html.lsp b/app/acf-util/logon-html.lsp index 643ab86..bfb5740 100644 --- a/app/acf-util/logon-html.lsp +++ b/app/acf-util/logon-html.lsp @@ -1,8 +1,5 @@ <% local form = ... %> <% require("viewfunctions") %> -<% --[[ - io.write(html.cfe_unpack(form)) - --]] %> <h1><%= html.html_escape(form.label) %></h1> <% diff --git a/app/acf-util/logon-logout-html.lsp b/app/acf-util/logon-logout-html.lsp index b7b72f4..54aa9bb 100644 --- a/app/acf-util/logon-logout-html.lsp +++ b/app/acf-util/logon-logout-html.lsp @@ -1,6 +1,7 @@ <% local view= ... %> +<% require("viewfunctions") %> <h1>Log Out</h1> -<%= html.cfe_unpack(view) %> +<%= cfe_unpack(view) %> <%= html.html_escape(view.logout.value) %> diff --git a/app/acf-util/password-html.lsp b/app/acf-util/password-html.lsp index 7de8f88..82551fc 100644 --- a/app/acf-util/password-html.lsp +++ b/app/acf-util/password-html.lsp @@ -1,13 +1,5 @@ <% local form, viewlibrary, pageinfo = ... %> <% require("viewfunctions") %> -<% ---[[ DEBUG INFORMATION -io.write("<H1>DEBUGGING</H1><span style='color:red'><H2>DEBUG INFO: CFE</H2>") -io.write(html.cfe_unpack(form)) -io.write(html.cfe_unpack(FORM)) -io.write("</span>") ---]] -%> <H1><%= html.html_escape(form.label) %></H1> <% diff --git a/app/acf-util/password-status-html.lsp b/app/acf-util/password-status-html.lsp index eb960be..4a34fab 100644 --- a/app/acf-util/password-status-html.lsp +++ b/app/acf-util/password-status-html.lsp @@ -1,12 +1,5 @@ <% local form, viewlibrary, page_info, session = ... %> <% require("viewfunctions") %> -<% ---[[ DEBUG INFORMATION -io.write("<H1>DEBUGGING</H1><span style='color:red'><H2>DEBUG INFO: CFE</H2>") -io.write(html.cfe_unpack(form)) -io.write("</span>") ---]] -%> <% displaycommandresults({"newuser", "edituser", "deleteuser"}, session) %> diff --git a/app/acf-util/roles-viewroles-html.lsp b/app/acf-util/roles-viewroles-html.lsp index 1f8f24e..b2c5aa7 100644 --- a/app/acf-util/roles-viewroles-html.lsp +++ b/app/acf-util/roles-viewroles-html.lsp @@ -1,10 +1,6 @@ <% local view, viewlibrary, page_info, session= ... %> <% require("viewfunctions") %> -<% --[[ - io.write(html.cfe_unpack(view)) ---]] %> - <% displaycommandresults({"newrole", "editrole", "deleterole"}, session) %> <H1>Roles</H1> diff --git a/app/acf-util/welcome-html.lsp b/app/acf-util/welcome-html.lsp index 88bc934..85ff3a8 100644 --- a/app/acf-util/welcome-html.lsp +++ b/app/acf-util/welcome-html.lsp @@ -1,9 +1,10 @@ <% view = ... %> +<% require("viewfunctions") %> <h1>Alpine Configuration Framework</h1> <DL><p>Welcome.</p></DL> <% --[[ - io.write(html.cfe_unpack(view)) - io.write(html.cfe_unpack(FORM)) - io.write(html.cfe_unpack(ENV)) + io.write(cfe_unpack(view)) + io.write(cfe_unpack(FORM)) + io.write(cfe_unpack(ENV)) --]] %> diff --git a/app/debug-html.lsp b/app/debug-html.lsp index d3db3b4..f9d160b 100644 --- a/app/debug-html.lsp +++ b/app/debug-html.lsp @@ -1,8 +1,9 @@ <% local data, viewlibrary, page_info, session = ... %> +<% require("viewfunctions") %> <H1>Debugging</H1> <H2>View Data:</H2> -<%= html.cfe_unpack(data) %> +<%= cfe_unpack(data) %> <H2>Session:</H2> -<%= html.cfe_unpack(session) %> +<%= cfe_unpack(session) %> <H2>Page Info:</H2> -<%= html.cfe_unpack(page_info) %> +<%= cfe_unpack(page_info) %> diff --git a/app/dispatcherror-html.lsp b/app/dispatcherror-html.lsp index f6e0a22..fde2f03 100644 --- a/app/dispatcherror-html.lsp +++ b/app/dispatcherror-html.lsp @@ -1,7 +1,4 @@ <% view = ... %> -<% --[[ - io.write(html.cfe_unpack(view)) ---]] %> <style type="text/css"> p.hiddendetail { diff --git a/app/exception-html.lsp b/app/exception-html.lsp index 3bd6621..03bfaf8 100644 --- a/app/exception-html.lsp +++ b/app/exception-html.lsp @@ -1,7 +1,4 @@ <% view = ... %> -<% --[[ - io.write(html.cfe_unpack(view)) ---]] %> <style type="text/css"> p.hiddendetail { diff --git a/lib/Makefile b/lib/Makefile index 425b6c6..d8b1f0a 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -1,20 +1,13 @@ include ../config.mk -LIB_DIST=fs.lua\ - html.lua\ - date.lua\ - format.lua\ - menubuilder.lua\ +LIB_DIST=menubuilder.lua\ session.lua\ - validator.lua\ authenticator.lua\ authenticator-plaintext.lua\ roles.lua\ - processinfo.lua\ viewfunctions.lua\ controllerfunctions.lua\ modelfunctions.lua\ - apk.lua\ EXTRA_DIST=README Makefile DISTFILES=$(LIB_DIST) $(EXTRA_DIST) diff --git a/lib/apk.lua b/lib/apk.lua deleted file mode 100644 index b4cb6ff..0000000 --- a/lib/apk.lua +++ /dev/null @@ -1,44 +0,0 @@ --- apk library -module (..., package.seeall) - -local path = "PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin " - -delete = function(package) - local success = false - local cmdresult - local cmd = path .. "apk del " .. package .. " 2>&1" - local f = io.popen( cmd ) - cmdresult = f:read("*a") or "" - f:close() - if string.find(cmdresult, "^OK") then - cmdresult = "ERROR: Package not found\n"..cmdresult - elseif not string.find(cmdresult, "ERROR") then - success = true - end - return success, cmdresult -end - -install = function(package) - local success = true - local cmdresult - local cmd = path .. "apk add " .. package .. " 2>&1" - local f = io.popen( cmd ) - cmdresult = f:read("*a") - f:close() - if string.find(cmdresult, "^ERROR") then - success = false - end - return success, cmdresult -end - -version = function(package) - local cmdresult - local cmd = path .. "apk info -ve " .. package .. " 2>&1" - local f = io.popen( cmd ) - cmdresult = f:read("*a") - f:close() - if string.find(cmdresult, "^%s*$") then - cmdresult = nil - end - return cmdresult -end diff --git a/lib/date.lua b/lib/date.lua deleted file mode 100644 index 09592fc..0000000 --- a/lib/date.lua +++ /dev/null @@ -1,328 +0,0 @@ ---date and time functions - -module(..., package.seeall) - -require("posix") -require("format") -require("fs") - ---global for date formating see below for more information ---Mon Nov 26 19:56:10 UTC 2007 looks like most systems use this ---print(os.date(date.format)) -formats = "%a %b %d %X %Z %Y" - -months ={ {"January","Jan"}, - {"February", "Feb"}, - {"March","Mar"}, - {"April", "Apr"}, - {"May","May"}, - {"June","Jun"}, - {"July","Jul"}, - {"August","Aug"}, - {"September","Sep"}, - {"October","Oct"}, - {"November","Nov"}, - {"December","Dec"} - } - -revmonths = {["january"] = 1, ["jan"] = 1, - ["february"] = 2, ["feb"] = 2, - ["march"] = 3, ["mar"] = 3, - ["april"] = 4, ["apr"] = 4, - ["may"] = 5, - ["june"] = 6, ["jun"] = 6, - ["july"] = 7, ["jul"] = 7, - ["august"] = 8, ["aug"] = 8, - ["september"] = 9, ["sep"] = 9, - ["october"] = 10, ["oct"] = 10, - ["november"] = 11, ["nov"] = 11, - ["december"] = 12, ["dec"] = 12 - } - -dow = { {"Sunday","Sun"}, - {"Monday","Mon"}, - {"Tuesday","Tue"}, - {"Wednesday","Wed"}, - {"Thursday","Thu"}, - {"Friday","Fri"}, - {"Saturday","Sat"} - } - -revdow = { ["sunday"] = 1, ["sun"] = 2, - ["monday"] = 2, ["mon"] = 2, - ["tuesday"] = 3, ["tue"] = 3, - ["wednesday"] = 4, ["wed"] = 4, - ["thursday"] = 5, ["thu"] = 5, - ["friday"] = 6, ["fri"] = 6, - ["saturday"] = 7, ["sat"] =7 - } - --- + usually denotes right of PM and - means left. It seems that /etc/TZ needs these ---reversed for alpine/busybox. difference in col 2 and 5 ---this list is not full. May need some more added. No Africa or Asia ---Abrr TZ,Real Offset, FullName, Location, What would be put in /etc/TZ(busybox needed offset) - -timezones = { - -{"A","+1","Alpha Time Zone","Military","Alpha-1"}, -{"ACDT","+10:30","Australian Central Daylight Time","Australia","ACDT-10:30"}, -{"ACST","+9:30","Australian Central Standard Time","Australia","ACST-9:30"}, -{"ADT","-3","Atlantic Daylight Time","North America","ADT+3"}, -{"AEDT","+11","Australian Eastern Daylight Time","Australia","AEDT-11"}, -{"AEST","+10","Australian Eastern Standard Time","Australia","AEST-10"}, -{"AKDT","-8","Alaska Daylight Time","North America","AKDT+8"}, -{"AKST","-9","Alaska Standard Time","North America","AKST+9"}, -{"AST","-4","Atlantic Standard Time","North America","AST+4"}, -{"AWDT","+9","Australian Western Daylight Time","Australia","AWDT-9"}, -{"AWST","+8","Australian Western Standard Time","Australia","AWST-8"}, - -{"B","+2","Bravo Time Zone","Military","Bravo-2"}, -{"BST","+1","British Summer Time","Europe","BST-1"}, - -{"C","+3","Charlie Time Zone","Military","Charlie-3"}, -{"CDT","-5","Central Daylight Time","North America","CDT+5"}, -{"CEDT","+2","Central European Daylight Time","Europe","CEDT-2"}, -{"CEST","+2","Central European Summer Time","Europe","CEST-2"}, -{"CET","+1","Central European Time","Europe","CET-1"}, -{"CST","+10:30","Central Summer(Daylight) Time","Australia","CST-10:30"}, -{"CST","+9:30","Central Standard Time","Australia","CST-9:30"}, -{"CST","-6","Central Standard Time","North America","CST+6"}, -{"CXT","+7","Christmas Island Time","Australia","CXT-7"}, - -{"D","+4","Delta Time Zone","Military","Delta-4"}, - -{"E","+5","Echo Time Zone","Military","Echo-5"}, -{"EDT","-4","Eastern Daylight Time","North America","EDT+4"}, -{"EEDT","+3","Eastern European Daylight Time","Europe","EEDT-3"}, -{"EEST","+3","Eastern European Summer Time","Europe","EEST-3"}, -{"EET","+2","Eastern European Time","Europe","EET-2"}, -{"EST","+11","Eastern Summer(Daylight) Time","Australia","EST-11"}, -{"EST","+10","Eastern Standard Time","Australia","EST-10"}, -{"EST","-5","Eastern Standard Time","North America","EST+5"}, - -{"F","+6","Foxtrot Time Zone","Military","Foxtrot-6"}, - -{"G","+7","Golf Time Zone","Military","Golf-7"}, -{"GMT","+0","Greenwich Mean Time","Europe","GMT+0"}, - -{"H","+8","Hotel Time Zone","Military","Hotel-8"}, -{"HAA","-3","Heure Avancée de l'Atlantique","North America","HAA+3"}, -{"HAC","-5","Heure Avancée du Centre","North America","HAC+5"}, -{"HADT","-9","Hawaii-Aleutian Daylight Time","North America","HADT+9"}, -{"HAE","-4","Heure Avancée de l'Est","North America","HAE+4"}, -{"HAP","-7","Heure Avancée du Pacifique","North America","HAP+7"}, -{"HAR","-6","Heure Avancée des Rocheuses","North America","HAR+6"}, -{"HAST","-10","Hawaii-Aleutian Standard Time","North America","HAST+10"}, -{"HAT","-2:30","Heure Avancée de Terre-Neuve","North America","HAT+2:30"}, -{"HAY","-8","Heure Avancée du Yukon","North America","HAY+8"}, -{"HNA","-4","Heure Normale de l'Atlantique","North America","HNA+4"}, -{"HNC","-6","Heure Normale du Centre","North America","HNC+6"}, -{"HNE","-5","Heure Normale de l'Est","North America","HNE+5"}, -{"HNP","-8","Heure Normale du Pacifique","North America","HNP+8"}, -{"HNR","-7","Heure Normale des Rocheuses","North America","HNR+7"}, -{"HNT","-3:30","Heure Normale de Terre-Neuve","North America","HNT+3:30"}, -{"HNY","-9","Heure Normale du Yukon","North America","HNY+9"}, - -{"I","+9","India Time Zone","Military","India-9"}, -{"IST","+1","Irish Summer Time","Europe","IST-1"}, - -{"K","+10","Kilo Time Zone","Military","Kilo-10"}, - -{"L","+11","Lima Time Zone","Military","Lima-11"}, - -{"M","+12","Mike Time Zone","Military","Mike-12"}, -{"MDT","-6","Mountain Daylight Time","North America","MDT+6"}, -{"MESZ","+2","Mitteleuroäische Sommerzeit","Europe","MESZ-2"}, -{"MEZ","+1","Mitteleuropäische Zeit","Europe","MEZ-1"}, -{"MST","-7","Mountain Standard Time","North America","MST+7"}, - -{"N","-1","November Time Zone","Military","November+1"}, -{"NDT","-2:30","Newfoundland Daylight Time","North America","NDT+2:30"}, -{"NFT","+11:30","Norfolk (Island) Time","Australia","NFT-11:30"}, -{"NST","-3:30","Newfoundland Standard Time","North America","NST+3:30"}, - -{"O","-2","Oscar Time Zone","Military","Oscar+2"}, - -{"P","-3","Papa Time Zone","Military","Papa+3"}, -{"PDT","-7","Pacific Daylight Time","North America","PDT+7"}, -{"PST","-8","Pacific Standard Time","North America","PST+8"}, - -{"Q","-4","Quebec Time Zone","Military","Quebec+4"}, - -{"R","-5","Romeo Time Zone","Military","Romeo+5"}, - -{"S","-6","Sierra Time Zone","Military","Sierra+6"}, - -{"T","-7","Tango Time Zone","Military","Tango+7"}, - -{"U","-8","Uniform Time Zone","Military","Uniform+8"}, -{"UTC","+0","Coordinated Universal Time","Europe","UTC+0"}, - -{"V","-9","Victor Time Zone","Military","Victor+9"}, - -{"W","-10","Whiskey Time Zone","Military","Whiskey+10"}, -{"WEDT","+1","Western European Daylight Time","Europe","WEDT-1"}, -{"WEST","+1","Western European Summer Time","Europe","WEST-1"}, -{"WET","+0","Western European Time","Europe","WET+0"}, -{"WST","+9","Western Summer(Daylight) Time","Australia","WST-9"}, -{"WST","+8","Western Standard Time","Australia","WST-8"}, - -{"X","-11","X-ray Time Zone","Military","X-ray+11"}, - -{"Y","-12","Yankee Time Zone","Military","Yankee+12"}, - -{"Z","+0","Zulu Time Zone","Military","Zulu+0"} - -} - ---os.time() will give seconds since 1970-epoch ---os.date() will give formated time strings ---os.time{year=2007,month=1,day=1,hour=2,min=1,sec=1} ---os.date(date.format,os.time()) - ---give me a table ---t = { {year=2007,month=1,day=2,hour=2}, {year=2006,month=1,day=5} } ---will return a table sorted by oldest <-> newest ---to grab the largest and smallest a,b=g[1],g[table.maxn(g)] -function date_to_seconds (t) - g = {} - count = table.maxn(t) - for i = 1,count do - g[#g+1] = os.time(t[i]) - end - table.sort(g) - return g -end - --- the reverse of date_to_seconds. expecting a table of seconds ---format can be changed. This seems to be standard, dow,mon,dom,time,zone,year --- seems like %z- +0000 time zone format and %Z- 3 letter timezone undocumented or new - -function seconds_to_date (t) - g = {} - count = table.maxn(t) - for i = 1,count do - g[#g+1] = os.date(formats,t[i]) - end - - return g -end - ---Wed Nov 28 14:01:23 UTC 2007 ---os.date(date.formats) put into a table ---year,month,day,hour,min,sec,isdst- may need a dst table to set this automatically -function string_to_table (str) - if str == nil then str = os.date(formats) end - g = {} - temp = format.string_to_table(str,"%s") - month = abr_month_num(temp[2]) - g["month"] = month - day = temp[3] - g["day"] = day - --may do something with this if have a tz table ?? - tz = temp[5] - year = temp[6] - g["year"] = year - temp2 = format.string_to_table(temp[4],":") - hour = temp2[1] - g["hour"] = hour - min = temp2[2] - g["min"] = min - sec = temp2[3] - g["sec"] = sec - return g - -end - - ---give dates in seconds and gives the difference in years,months,days,... ---gives a table back with hour,min,month,sec,day,year to display something like ---you have 10 years, 14 hours, 10 days to renew you certificate --- in secs - year, day, hour,min,sec -t_time = { field_names = {"years","days","hours","minutes","seconds"}, - 31556926,86400,3600,60,1 - } - -function date_diff (d1, d2) - g = {} - if d2 == nil then d2 = os.time() end - --first sum of seconds - sum = math.abs(os.difftime(d1,d2)) - --going to go through and get it smaller with each pass through the table - for a,b in ipairs(t_time) do - print(sum) - hold = math.modf(sum/b) - g[t_time.field_names[a]] = hold - sum = (sum - (hold*b)) - end - - return g -end - ---give a search number and return the month name - -function num_month_name (search) - return months[search][1] -end - ---give a search number and return the month abr - -function num_month_name_abr (search) - return months[search][2] -end - -function name_month_num (search) - return revmonths[string.lower(search)] -end - -function abr_month_num (search) - return revmonths[string.lower(search)] -end - -function num_dow_name (search) - return dow[search][1] -end - -function num_dow_name_abr (search) - return dow[search][2] -end - -function name_dow_num (search) - return revdow[string.lower(search)] -end - -function abr_dow_num (search) - return revdow[string.lower(search)] -end - ---tell me what TimeZone my system is set to - -function what_tz () - f = fs.read_file_as_array("/etc/TZ") or {} - local tz = f[1] - return tz -end - ---change the timezone my system is set to - -function change_tz ( tz ) - --give us something like CET-1, this is busy box offset need to fix. - - tz = string.gsub(tz, "%+", "%%+") - tz = string.gsub(tz, "%-", "%%-") - tz = "^" .. tz .. "$" - result = {} - for a=1,table.maxn(date.timezones) do - c = string.match(date.timezones[a][5], tz) - if c ~= nil then result[#result +1] = c end - end - - if table.maxn(result) == 1 then - fs.write_file("/etc/TZ", result[1]) - mess = "Success" - else - mess = "Too many matches." - end - - return mess,date.what_tz() -end diff --git a/lib/format.lua b/lib/format.lua deleted file mode 100644 index 0076fdf..0000000 --- a/lib/format.lua +++ /dev/null @@ -1,512 +0,0 @@ ---[[ - module for format changes in tables and strings - try to keep non input specific -]]-- - -module (..., package.seeall) - --- find all return characters and removes them, may get this from a browser --- that is why didn't do file specific - -function dostounix ( str ) - local data = string.gsub(str, "\r", "") - return data -end - --- Escape Lua magic characters -function escapemagiccharacters ( str ) - return (string.gsub(str or "", "[%(%)%.%%%+%-%*%?%[%]%^%$]", "%%%1")) -end - --- Escape shell special characters -function escapespecialcharacters ( str ) - return (string.gsub(str or "", "[~`#%$&%*%(%)\\|%[%]{};\'\"<>/]", "\\%1")) -end - --- search and remove all blank and commented lines from a string or table of lines --- returns a table to iterate over without the blank or commented lines - -function parse_lines ( input, comment ) - local lines = {} - comment = comment or "#" - - function parse(line) - if not string.match(line, "^%s*$") and not string.match(line, "^%s*"..comment) then - lines[#lines + 1] = line - end - end - - if type(input) == "string" then - for line in string.gmatch(input, "([^\n]*)\n?") do - parse(line) - end - elseif type(input) == "table" then - for i,line in ipairs(input) do - parse(line) - end - end - - return lines -end - --- search and remove all blank and commented lines from a string or table of lines --- parse the lines for words, looking for quotes and removing comments --- returns a table with an array of words for each line - -function parse_linesandwords ( input, comment ) - local lines = {} - local linenum = 0 - comment = comment or "#" - - function parse(line) - linenum = linenum + 1 - if not string.match(line, "^%s*$") and not string.match(line, "^%s*"..comment) then - local linetable = {linenum=linenum, line=line} - local offset = 1 - while string.find(line, "%S", offset) do - local word = string.match(line, "%S+", offset) - local endword - if string.find(word, "^"..comment) then - break - elseif string.find(word, "^\"") then - endword = select(2, string.find(line, "\"[^\"]*\"", offset)) - word = string.sub(line, string.find(line, "\"", offset), endword) - else - endword = select(2, string.find(line, "%S+", offset)) - end - table.insert(linetable, word) - offset = endword + 1 - end - lines[#lines + 1] = linetable - end - end - - if type(input) == "string" then - for line in string.gmatch(input, "([^\n]*)\n?") do - parse(line) - end - elseif type(input) == "table" then - for i,line in ipairs(input) do - parse(line) - end - end - - return lines -end - --- returns a table with label value pairs - -function parse_configfile( input, comment ) - local config = {} - local lines = parse_linesandwords(input, comment) - - for i,linetable in ipairs(lines) do - config[linetable[1]] = table.concat(linetable, " ", 2) or "" - end - return config -end - --- search and replace through a table --- string is easy string.gsub(string, find, replace) - -function search_replace (input, find, replace) - local lines = {} - for i,line in ipairs(input) do - lines[#lines + 1] = string.gsub(line, find, replace) - end - return lines -end - --- great for line searches through a file. /etc/conf.d/ ??? --- might be looking for more than one thing so will return a table --- will likely want to match whole line entries --- so we change find to include the rest of the line --- say want all the _OPTS from a file format.search_for_lines (fs.read_file("/etc/conf.d/cron"), "OPT") --- if want to avoid commented lines, call parse_lines first - -function search_for_lines (input, find) - local lines = {} - - function findfn(line) - if string.find(line, find) then - lines[#lines + 1] = line - end - end - - if type(input) == "string" then - for line in string.gmatch(input, "([^\n]*)\n?") do - findfn(line) - end - elseif type(input) == "table" then - for i,line in ipairs(input) do - findfn(line) - end - end - - return lines -end - ---string format function to capitalize the beginging of each word. -function cap_begin_word ( str ) - --first need to do the first word - local data = string.gsub(str, "^%l", string.upper) - --word is any space cause no <> regex - data = string.gsub(data, "%s%l", string.upper) - return data -end - ---for cut functionality do something like ---print(format.string_to_table("This is a test", " ")[2]) ---gives you the second field which is .... is - --- This code comes from http://lua-users.org/wiki/SplitJoin --- example: format.string_to_table( "Anna, Bob, Charlie,Dolores", ",%s*") -function string_to_table ( text, delimiter) - local list = {} - if text then - -- this would result in endless loops - if string.find("", delimiter) then - -- delimiter matches empty string! - for i=1,#text do - list[#list + 1] = string.sub(text, i, i) - end - else - local pos = 1 - while 1 do - local first, last = string.find(text, delimiter, pos) - if first then -- found? - table.insert(list, string.sub(text, pos, first-1)) - pos = last+1 - else - table.insert(list, string.sub(text, pos)) - break - end - end - end - end - return list -end - - --- Takes a str and expands any ${...} constructs with the Lua variable --- ex: a="foo"; print(expand_bash_syntax_vars("a=${a}) - > "a=foo" -expand_bash_syntax_vars = function (str) - local deref = function (f) - local v = getfenv(3) -- get the upstream global env - for w in string.gfind(f, "[%w_]+") do - if v then v = v[w] end - end - return v - end - - for w in string.gmatch (str, "${[^}]*}" ) do - local rvar = string.sub(w,3,-2) - local rval = ( deref(rvar) or "nil" ) - str = string.gsub (str, w, escapespecialcharacters(rval)) - end - - return (str) -end - --- Removes the linenum line from str and replaces it with line. --- Do nothing if doesn't exist --- Set line to nil to remove the line -function replace_line(str, linenum, line) - -- Split the str to remove the line - local startchar, endchar = string.match(str, "^" .. string.rep("[^\n]*\n", linenum-1) .. "()[^\n]*\n?()") - if startchar and endchar then - local lines = {} - lines[1] = string.sub(str, 1, startchar-1) - lines[2] = string.sub(str, endchar, -1) - if line then - table.insert(lines, 2, line .. "\n") - end - str = table.concat(lines) - end - return str -end - --- Inserts the line into the str after the linenum (or at the end) -function insert_line(str, linenum, line) - -- Split the str to remove the line - local startchar = string.match(str, "^" .. string.rep("[^\n]*\n", linenum) .. "()") - local lines = {} - if startchar then - lines[1] = string.sub(str, 1, startchar-1) - lines[2] = string.sub(str, startchar, -1) - else - lines[1] = str - end - if line then - table.insert(lines, 2, line .. "\n") - end - str = table.concat(lines) - return str -end - -function get_line(str, linenum) - -- Split the str to remove the line - local startchar, endchar = string.match(str, "^" .. string.rep("[^\n]*\n", linenum-1) .. "()[^\n]*()") - local line - if startchar and endchar then - line = string.sub(str, startchar, endchar-1) - end - return line -end - --- Search the option string for separate options (-x or --xyz) and put them in a table -function opts_to_table ( optstring, filter ) - local optsparams - if optstring then - local optstr = optstring .. " " - for o in string.gmatch(optstr, "%-%-?%a+%s+[^-%s]*") do - local option = string.match(o, "%-%-?%a+") - if not filter or filter == option then - if not optsparams then optsparams = {} end - optsparams[option] = string.match(o, "%S*$") - end - end - end - return optsparams -end - --- Go through an options table and create the option string -function table_to_opts ( optsparams ) - local optstring = {} - for opt,val in pairs(optsparams) do - optstring[#optstring + 1] = opt - if val ~= "" then - optstring[#optstring + 1] = val - end - end - return table.concat(optstring, " ") -end - --- The following functions deal with ini files. ini files contain comments, sections, names and values --- commented lines begin with '#' or ';', in-line comments begin with '#' and run to the end of the line --- sections are defined by "[section]" on a line. Anything before the first section definition is in section "" --- name value pairs are defined by "name = value". Names and values may contain spaces but not '#' --- lines ending with '\' are continued on the next line - - --- Set a name=value pair in a string --- If search_section is undefined or "", goes in the default section --- If value is defined we put "search_name=value" into search_section --- If value is undefined, we clear search_name out of search section --- Try not to touch anything but the value we're interested in (although will combine multi-line into one) --- If the search_section is not found, we'll add it at the end of the string --- If the search_name is not found, we'll add it at the end of the section -function update_ini_file (file, search_section, search_name, value) - if not file or not search_name or search_name == "" then - return file, false - end - - search_section = search_section or "" - local new_conf_file = {} - local section = "" - local done = false - local skip_lines = {} - for l in string.gmatch(file, "([^\n]*)\n?") do - if done == false then - if string.find ( l, "\\%s*$" ) then - skip_lines[#skip_lines+1] = string.match(l, "^(.*)\\%s*$") - l = nil - else - if #skip_lines then - skip_lines[#skip_lines+1] = l - l = table.concat(skip_lines, " ") - end - -- check if comment line - if not string.find ( l, "^%s*[#;]" ) then - -- find section name - local a = string.match ( l, "^%s*%[%s*(%S+)%s*%]" ) - if a then - -- we reached a new section, if we were in the one we wanted - -- we have to add in the name:value pair now - if (search_section == section) then - new_conf_file[#new_conf_file + 1] = search_name.."="..value - done = true - end - section = a - elseif (search_section == section) then - -- find name - a = string.match ( l, "^%s*([^=]*%S)%s*=" ) - if a and (search_name == a) then - -- We found the name, change the value, keep any comment - local comment = string.match(l, " #.*$") or "" - l = search_name.."="..value..comment - skip_lines = {} -- replacing line - done = true - end - end - end - if #skip_lines > 0 then - for i,line in ipairs(skip_lines) do - new_conf_file[#new_conf_file + 1] = line - end - skip_lines = {} - l = nil - end - end - end - new_conf_file[#new_conf_file + 1] = l - end - - if done == false then - -- we didn't find the section:name, add it now - if section ~= search_section then - new_conf_file[#new_conf_file + 1] = '[' .. search_section .. ']' - end - new_conf_file[#new_conf_file + 1] = search_name.."="..value - end - - file = table.concat(new_conf_file, '\n') - - return file, true -end - --- Parse string for name=value pairs, returned in a table --- If search_section is defined, only report values in matching section --- If search_name is defined, only report matching name (possibly in multiple sections) -function parse_ini_file (file, search_section, search_name) - if not file or file == "" then - return nil - end - local opts = nil - local section = "" - local skip_lines = {} - for l in string.gmatch(file, "([^\n]*)\n?") do - if string.find ( l, "\\%s*$" ) then - skip_lines[#skip_lines+1] = string.match(l, "^(.*)\\%s*$") - else - if #skip_lines then - skip_lines[#skip_lines+1] = l - l = table.concat(skip_lines, " ") - skip_lines = {} - end - -- check if comment line - if not string.find ( l, "^%s*[#;]" ) then - -- find section name - local a = string.match ( l, "^%s*%[%s*(%S+)%s*%]" ) - if a then - if (search_section == section) then break end - section = a - elseif not (search_section) or (search_section == section) then - -- find name - a = string.match ( l, "^%s*([^=]*%S)%s*=" ) - if a and (not (search_name) or (search_name == a)) then - -- Figure out the value - local b = string.match ( l, '=%s*(.*)$' ) or "" - -- remove comments from end of line - if string.find ( b, '#' ) then - b = string.match ( b, '^(.*)#.*$' ) or "" - end - -- remove spaces from front and back - b = string.gsub ( b, '%s+$', '' ) - if not (opts) then opts = {} end - if not (opts[section]) then opts[section] = {} end - opts[section][a] = b - end - end - end - end - end - - if opts and search_section and search_name then - return opts[search_section][search_name] - elseif opts and search_section then - return opts[search_section] - end - return opts -end - -function get_ini_section (file, search_section) - if not file then - return nil - end - search_section = search_section or "" - local sectionlines = {} - local section = "" - for l in string.gmatch(file, "([^\n]*)\n?") do - -- find section name - local a = string.match ( l, "^%s*%[%s*(%S+)%s*%]" ) - if a then - if (search_section == section) then break end - section = a - elseif (search_section == section) then - sectionlines[#sectionlines + 1] = l - end - end - - return table.concat(sectionlines, "\n") -end - -function set_ini_section (file, search_section, section_content) - if not file then - return file, false - end - search_section = search_section or "" - section_content = section_content or "" - local new_conf_file = {} - local done = false - local section = "" - if search_section == "" then new_conf_file[1] = section_content end - for l in string.gmatch(file, "([^\n]*)\n?") do - -- find section name - if not done then - local a = string.match ( l, "^%s*%[%s*(%S+)%s*%]" ) - if a then - if (search_section == section) then - done = true - else - section = a - if (search_section == section) then - l = l .. "\n" .. section_content - end - end - elseif (search_section == section) then - l = nil - end - end - new_conf_file[#new_conf_file + 1] = l - end - - if not done then - -- we didn't find the section, add it now - if section ~= search_section then - new_conf_file[#new_conf_file + 1] = '[' .. search_section .. ']' - new_conf_file[#new_conf_file + 1] = section_content - end - end - - file = table.concat(new_conf_file, '\n') - - return file, true -end - --- Find the value of an entry allowing for parent section and $variables --- the file parameter can be a string or structure returned by parse_ini_file --- beginning and ending quotes are removed --- returns value or "" if not found -function get_ini_entry (file, section, value) - local opts = file - if not file or not value then - return nil - elseif type(file) == "string" then - opts = parse_ini_file(file) - end - section = section or "" - local result = opts[section][value] - if not result then - section = "" - result = opts[section][value] or "" - end - while string.find(result, "%$[%w_]+") do - local sub = string.match(result, "%$[%w_]+") - result = string.gsub(result, escapemagiccharacters(sub), get_ini_entry(opts, section, sub)) - end - if string.find(result, '^"') and string.find(result, '"$') then - result = string.sub(result, 2, -2) - end - return result -end diff --git a/lib/fs.lua b/lib/fs.lua deleted file mode 100644 index 63b996d..0000000 --- a/lib/fs.lua +++ /dev/null @@ -1,222 +0,0 @@ ---[[ - module for generic filesystem funcs - - Copyright (c) Natanael Copa 2006 - MM edited to use "posix" -]]-- - -module (..., package.seeall) - -require("posix") -require("format") - --- generic wrapper funcs -function is_dir ( pathstr ) - return posix.stat ( pathstr or "", "type" ) == "directory" -end - -function is_file ( pathstr ) - return posix.stat ( pathstr or "", "type" ) == "regular" -end - -function is_link ( pathstr ) - return posix.stat ( pathstr or "", "type" ) == "link" -end - --- Creates a directory if it doesn't exist, including the parent dirs -function create_directory ( path ) - local pos = string.find(path, "/") - while pos do - posix.mkdir(string.sub(path, 1, pos)) - pos = string.find(path, "/", pos+1) - end - posix.mkdir(path) - return is_dir(path) -end - --- Deletes a directory along with its contents -function remove_directory ( path ) - if fs.is_dir(path) then - for d in posix.files(path) do - if (d == ".") or (d == "..") then - -- ignore - elseif fs.is_dir(path .. "/" .. d) then - remove_directory(path .. "/" ..d) - else - os.remove(path .. "/" ..d) - end - end - os.remove(path) - return true - end - return false -end - --- Creates a blank file (and the directory if necessary) -function create_file ( path ) - path = path or "" - if not posix.stat(posix.dirname(path)) then create_directory(posix.dirname(path)) end - local f = io.open(path, "w") - if f then f:close() end - return is_file(path) -end - --- Copies a file to a directory or new filename (creating the directory if necessary) --- fails if new file is already a directory (this is different than cp function) --- if newpath ends in "/", will treat as a directory -function copy_file(oldpath, newpath) - local use_dir = string.find(newpath or "", "/%s*$") - if not is_file(oldpath) or not newpath or newpath == "" or (not use_dir and is_dir(newpath)) or (use_dir and is_dir(newpath .. posix.basename(oldpath))) then - return false - end - if use_dir then newpath = newpath .. posix.basename(oldpath) end - if not posix.stat(posix.dirname(newpath)) then create_directory(posix.dirname(newpath)) end - local old = io.open(oldpath, "r") - local new = io.open(newpath, "w") - new:write(old:read("*a")) - new:close() - old:close() - return is_file(newpath) -end - --- Moves a file to a directory or new filename (creating the directory if necessary) --- fails if new file is already a directory (this is different than mv function) --- if newpath ends in "/", will treat as a directory -function move_file(oldpath, newpath) - local use_dir = string.find(newpath or "", "/%s*$") - if not is_file(oldpath) or not newpath or newpath == "" or (not use_dir and is_dir(newpath)) or (use_dir and is_dir(newpath .. posix.basename(oldpath))) then - return false - end - if use_dir then newpath = newpath .. posix.basename(oldpath) end - if not posix.stat(posix.dirname(newpath)) then create_directory(posix.dirname(newpath)) end - local status, errstr, errno = os.rename(oldpath, newpath) - -- errno 18 means Invalid cross-device link - if status or errno ~= 18 then - -- successful move or failure due to something else - return (status ~= nil), errstr, errno - else - status = copy_file(oldpath, newpath) - if status then - os.remove(oldpath) - end - return status - end -end - --- Returns the contents of a file as a string -function read_file ( path ) - local file = io.open(path or "") - if ( file ) then - local f = file:read("*a") - file:close() - return f - else - return nil - end -end - --- Returns an array with the contents of a file, --- or nil and the error message -function read_file_as_array ( path ) - local file, error = io.open(path or "") - if ( file == nil ) then - return nil, error - end - local f = {} - for line in file:lines() do - table.insert ( f , line ) - --sometimes you will see it like f[#f+1] = line - end - file:close() - return f -end - --- write a string to a file, will replace file contents -function write_file ( path, str ) - path = path or "" - if not posix.stat(posix.dirname(path)) then create_directory(posix.dirname(path)) end - local file = io.open(path, "w") - --append a newline char to EOF - str = string.gsub(str or "", "\n*$", "\n") - if ( file ) then - file:write(str) - file:close() - end -end - --- this could do more than a line. This will append --- fs.write_line_file ("filename", "Line1 \nLines2 \nLines3") -function write_line_file ( path, str ) - path = path or "" - if not posix.stat(posix.dirname(path)) then create_directory(posix.dirname(path)) end - local file = io.open(path) - if ( file) then - local c = file:read("*a") or "" - file:close() - fs.write_file(path, c .. (str or "")) - end -end - --- returns an array of files under "where" that match "what" (a Lua pattern) -function find_files_as_array ( what, where, follow, t ) - where = where or posix.getcwd() - what = what or ".*" - t = t or {} - - local link - if follow and fs.is_link(where) then - link = posix.readlink(where) - if not string.find(link, "^/") then - link = posix.dirname(where).."/"..link - end - end - - if fs.is_dir(where) or (link and fs.is_dir(link)) then - for d in posix.files ( where ) do - if (d == ".") or ( d == "..") then - -- do nothing - elseif fs.is_dir ( where .. "/" .. d ) then - find_files_as_array (what, where .. "/" .. d, follow, t ) - elseif follow and fs.is_link ( where .. "/" .. d ) then - find_files_as_array (what, where .. "/" .. d, follow, t ) - elseif (string.match (d, "^" .. what .. "$" )) then - table.insert (t, ( string.gsub ( where .. "/" .. d, "/+", "/" ) ) ) - end - end - elseif (string.match (posix.basename(where), "^" .. what .. "$" )) and posix.stat(where) then - table.insert (t, where ) - end - - return (t) -end - --- iterator function for finding dir entries matching (what) (a Lua pattern) --- starting at where, or currentdir if not specified. -function find ( what, where, follow ) - local t = find_files_as_array ( what, where, follow ) - local idx = 0 - return function () - idx = idx + 1 - return t[idx] - end -end - --- This function does almost the same as posix.stat, but instead it writes the output human readable. -function stat ( path ) - local filedetails = posix.stat(path or "") - if (filedetails) then - filedetails["ctime"]=os.date("%c", filedetails["ctime"]) - filedetails["mtime"]=os.date("%c", filedetails["mtime"]) - filedetails["path"]=path - if ( filedetails["size"] > 1073741824 ) then - filedetails["size"]=((filedetails["size"]/1073741824) - (filedetails["size"]/1073741824%0.1)) .. "G" - elseif ( filedetails["size"] > 1048576 ) then - filedetails["size"]=((filedetails["size"]/1048576) - (filedetails["size"]/1048576%0.1)) .. "M" - elseif ( filedetails["size"] > 1024 ) then - filedetails["size"]=((filedetails["size"]/1024) - (filedetails["size"]/1024%0.1)) .. "k" - else - filedetails["size"]=filedetails["size"] - end - end - return filedetails -end diff --git a/lib/html.lua b/lib/html.lua deleted file mode 100644 index b27bcf1..0000000 --- a/lib/html.lua +++ /dev/null @@ -1,275 +0,0 @@ ---[[ lowlevel html functions - Written for Alpine Configuration Framework (ACF) -- see www.alpinelinux.org - Copyright (C) 2007 Nathan Angelacos - Licensed under the terms of GPL2 -]]-- -module (..., package.seeall) - ---[[ Cookie functions ]]------------------------------------------------------ -cookie={} - --- Set a cookie - returns a string suitable for setting a cookie --- if the value is the boolean "false", then set the cookie to expire -cookie.set = function ( name, value, path ) - local expires = "" - if name == nil then - return ("") - end - if value == false then - expires = 'expires=Thu Jan 1 00:00:00 EST 1970' - value = "" - end - if path == nil then - path = "/" - end - return (string.format('Set-Cookie: %s=%s; path=%s; %s\n', html_escape(tostring(name)), - html_escape(tostring(value)), html_escape(path), html_escape(expires))) -end - - --- wrapper function to clear a cookie -cookie.unset = function ( name, path) - return cookie.set (name, false, path) -end - - - --- escape unsafe html characters -function html_escape (text ) - text = text or "" - local str = string.gsub (text, "&", "&" ) - str = string.gsub (str, "<", "<" ) - str = string.gsub (str, ">", ">" ) - str = string.gsub (str, "'", "'" ) - return (string.gsub (str, '"', """ )) -end - --- return a name,value pair as a string. -local nv_pair = function ( name, value) - if ( name == nil ) then - return ( value or "" ) - end - - if ( type(value) == "boolean" ) then - value = tostring(value) - end - - if ( value == nil ) then - return ( "" ) - else - return (string.format (' %s="%s" ', html_escape(name) , html_escape(value) )) - end -end - - ---[[ - each of these functions take a table that has an associative array of - the values we might care about: - - value -- this is the value in the form element, or the selected element - name -- this is the name of the element - cols, rows - class - id - etc. -]]-- - -local generic_input = function ( field_type, v ) - if type(v.value) == "table" then - ret = {} - local vals = v.value - for n, val in ipairs(vals) do - v.value = val - table.insert(ret, generic_input(field_type, v)) - end - v.value = vals - return table.concat(ret) - end - if ( field_type == nil ) then - return nil - end - - local str = string.format ( '<input class="%s" type="%s" ', html_escape(field_type), html_escape(field_type) ) - - for i,k in ipairs ( { - "name", "size", "checked", "maxlength", - "value", "length", "class", "id", "src", - "align", "alt", "contenteditable", "readonly", - "tabindex", "accesskey", "onfocus", "onblur" - } ) do - str = str .. nv_pair ( k, v[k] ) - end - - if ( v.disabled ~= nil ) then - str = str .. " disabled" - end - - return ( str .. ">" ) -end - - ---[[ Form functions ]]------------------------------------------------------ --- These expect something like a cfe to work (see mvc.lua) - -form = {} -form.text = function ( v ) - return generic_input ( "text", v ) -end - - -form.longtext = function ( v ) - local str = "<textarea" - for i,k in ipairs ( { - "name", "rows", "cols", - "class", "id", "tabindex", "accesskey", - "onfocus", "onblur", "readonly" - } ) do - str = str .. nv_pair ( k, v[k] ) - end - str = str .. nv_pair (nil, v.disabled) - return ( str .. ">" .. html_escape(v.value) .. "</textarea>" ) -end - - -function form.password ( v ) - return generic_input ( "password", v ) -end - -function form.hidden ( v ) - return generic_input ( "hidden", v ) -end - - -function form.submit ( v ) - return generic_input ( "submit", v ) -end - - -function form.action (v) - return generic_input ("submit", v) -end - -function form.file ( v ) - return generic_input ( "file", v ) -end - -function form.image ( v ) - return generic_input ( "image", v ) -end - - --- v.value is the selected item (or an array if multiple) --- v.option is an array of valid options --- NOTE use of value and values (plural) -function form.select ( v ) - if ( v.name == nil ) then - return nil - end - local str = "<select" - for i,k in ipairs ( { - "name", "size", "tabindex", "accesskey", - "onfocus", "onblur", "onchange", "id", - "class", "multiple" - } ) do - str = str .. nv_pair ( k, v[k] ) - end - - if ( v.disabled ~= nil ) then - str = str .. " disabled" - end - str = str .. ">" - -- now the options - local reverseval = {} - if type(v.value) == "table" then - for x,val in ipairs(v.value) do - reverseval[val]=x - end - end - local selected = false - for i, k in ipairs ( v.option ) do - local val = k - local txt = nil - if type(val) == "table" then - txt=val[1] - val=val[0] - end - str = str .. "<option " - if type(v.value) == "table" then - if reverseval[val] then - str = str .. " selected" - selected = true - end - elseif ( v.value == val ) then - str = str .. " selected" - selected = true - end - str = str .. nv_pair("value", val) .. ">" .. html_escape(val) .. "</option>" - end - if not selected then - str = str .. '<option selected value="' .. html_escape(v.value) ..'">[' .. html_escape(v.value) .. ']</option>' - end - str = str .. "</select>" - return (str) -end - -function form.checkbox ( v ) - return generic_input ( "checkbox", v ) -end - - --- NOTE: VALUE of a form is a table containing the form elements ... -function form.start ( v) - if ( v.action == nil ) then - return nil - end - - local method = v.method or "get" - return ( string.format ( - '<form %s%s%s>', - nv_pair ( "class", html_escape(v.class) ), - nv_pair ( "method", html_escape(v.method) ), - nv_pair ( "action", html_escape(v.action) ) - ) ) -end - -function form.stop ( ) - return ("</form>") -end - --- For "h1, h2, p," etc --- WARNING - Text is printed verbatim - you may want to --- wrap the text in html_escape -function entity (tag, text, class, id) - return ( string.format ( - "<%s%s%s>%s</%s>", - html_escape(tag), - nv_pair ("class", class), - nv_pair("id", id), html_escape(text), html_escape(tag)) - ) -end - - -function link ( v ) - if ( v.value == nil ) then - return nil - end - local str = nv_pair ( "href", v.value ) - for i,k in ipairs( { "class", "id" }) do - str = str .. nv_pair ( k, v[k] ) - end - - return ( "<a " .. str .. ">" .. html_escape(v.label) .. "</a>" ) -end - - --- give a cfe and get back a string of what is inside --- great for troubleshotting and seeing what is really being passed to the view -function cfe_unpack ( a ) - if type(a) == "table" then - value = session.serialize("cfe", a) - value = "<pre>" .. html_escape(value) .. "</pre>" - return value - end - -end - diff --git a/lib/processinfo.lua b/lib/processinfo.lua deleted file mode 100644 index 7058b04..0000000 --- a/lib/processinfo.lua +++ /dev/null @@ -1,221 +0,0 @@ - -module(..., package.seeall) - -require("posix") -require("fs") -require("format") -require("apk") - -local path = "PATH=/usr/bin:/bin:/usr/sbin:/sbin " - -function package_version(packagename) - local result = apk.version(packagename) - local errtxt - if not result then - errtxt = "Program not installed" - end - return result,errtxt -end - -function process_autostart(servicename) - local result - local errtxt = "Not programmed to autostart" - local f = io.popen( "/sbin/rc-update show" ) - local cmdresult = f:read("*a") or "" - f:close() - for line in string.gmatch(cmdresult, "[^\n]+") do - if string.match(line, "^%s*"..format.escapemagiccharacters(servicename).."%s+|") then - local runlevels = string.match(line, "|(.*)") - -- ignore the shutdown runlevel - runlevels = string.gsub(runlevels, "%sshutdown%s", " ") - runlevels = string.gsub(runlevels, "^%s+", "") - runlevels = string.gsub(runlevels, "%s+$", "") - if runlevels ~= "" then - result = "Service will autostart at next boot (at runlevel '" .. runlevels .. "')" - errtxt = nil - end - break - end - end - return result,errtxt -end - -function read_initrunlevels() - local config = {} - local f = io.popen( "/sbin/rc-update show -v" ) - local cmdresult = f:read("*a") or "" - f:close() - for line in string.gmatch(cmdresult, "([^\n]*)\n?") do - local service = string.match(line, "^%s*(%S+)") - local runlevels = string.match(line, "|%s*(%S.*)") - if service then - local runlevel = {} - if runlevels then - runlevel = format.string_to_table(string.gsub(runlevels, "%s+$", ""), "%s+") or {} - end - config[#config+1] = {servicename=service, runlevels=runlevel} - end - end - table.sort(config, function(a,b) return a.servicename < b.servicename end) - return config -end - -function add_runlevels(servicename, runlevels) - local cmdresult,cmderrors - if not servicename then - cmderrors = "Invalid service name" - else - if runlevels and #runlevels > 0 then - local cmd = {path, "rc-update add"} - cmd[#cmd+1] = format.escapespecialcharacters(servicename) - for i,lev in ipairs(runlevels) do - cmd[#cmd+1] = lev - end - cmd[#cmd+1] = "2>&1" - local f = io.popen(table.concat(cmd, " ")) - cmdresult = f:read("*a") - f:close() - cmdresult = string.gsub(cmdresult, "\n+$", "") - else - cmdresult = "No runlevels added" - end - end - - return cmdresult,cmderrors -end - -function delete_runlevels(servicename, runlevels) - local cmdresult,cmderrors - if not servicename then - cmderrors = "Invalid service name" - else - if runlevels and #runlevels > 0 then - local cmd = {path, "rc-update del"} - cmd[#cmd+1] = format.escapespecialcharacters(servicename) - for i,lev in ipairs(runlevels) do - cmd[#cmd+1] = lev - end - cmd[#cmd+1] = "2>&1" - local f = io.popen(table.concat(cmd, " ")) - cmdresult = f:read("*a") - f:close() - cmdresult = string.gsub(cmdresult, "\n+$", "") - else - cmdresult = "No runlevels deleted" - end - end - - return cmdresult,cmderrors -end - -function daemoncontrol (process, action) - - local cmdresult = "" - local cmderrors - if not process then - cmderrors = "Invalid service name" - elseif not action then - cmderrors = "Invalid action" - else - local file = io.popen( "PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin /etc/init.d/" .. - format.escapespecialcharacters(process) .. " " .. format.escapespecialcharacters(string.lower(action)) .. " 2>&1" ) - if file ~= nil then - cmdresult = file:read( "*a" ) - file:close() - end - end - return cmdresult,cmderrors -end - --- the following methods are available: --- /proc/<pid>/stat the comm field (2nd) field contains name but only up --- to 15 chars. does not resolve links --- --- /proc/<pid>/cmdline argv[0] contains the command. However if it is a script --- then will the interpreter show up --- --- /proc/<pid>/exe link to exe file. this will resolv links --- --- returns list of all pids for given exe name - ---[[ --- gives lots of false positives for busybox -local function is_exe(path, name) - local f = posix.readlink(path.."/exe") - if f and (f == name or posix.basename(f) == name) then - return true - else - return false - end -end -]]-- - - -local function is_stat(path, name) - local f = io.open(path.."/stat") - if (f) then - local line = f:read() - local p = string.gsub(line, ".*%(", "") - p = string.gsub(p, "%).*", "") - f:close() - end - if p ~= nil then - if string.len(name) <= 15 and p == name then - return true - end - end - return false -end - -local function is_cmdline(path, name) - local f = io.open(path.."/cmdline") - if f == nil then - return false - end - local line = f:read() - f:close() - if line == nil then - return false - end - local arg0 = string.gsub(line, string.char(0)..".*", "") - if posix.basename(arg0) == name then - return true - end -end - -local function has_pidfile(name) - local pid - local file = "/var/run/"..name..".pid" - if fs.is_file(file) then - -- check to see if there's a matching proc directory and that it was created slightly after the pid file - -- this allows us to find init scripts with differing process names and avoids the problem with - -- proc numbers wrapping - local tmp = string.match(fs.read_file(file) or "", "%d+") - if tmp then - local dir = "/proc/" .. tmp - filetime = posix.stat(file, "ctime") - dirtime = posix.stat(dir, "ctime") - if dirtime and (tonumber(dirtime) - tonumber(filetime) < 100) then - pid = tmp - end - end - end - return pid -end - -function pidof(name) - local pids = {has_pidfile(name)} - local i, j - - for i,j in pairs(posix.glob("/proc/[0-9]*")) do - local pid = tonumber(posix.basename(j)) - if is_stat(j, name) or is_cmdline(j, name) then - table.insert(pids, pid) - end - end - if #pids == 0 then - pids = nil - end - return pids -end - diff --git a/lib/validator.lua b/lib/validator.lua deleted file mode 100644 index ca8ed41..0000000 --- a/lib/validator.lua +++ /dev/null @@ -1,172 +0,0 @@ --------------------------------------------------- --- Validation Functions for Alpine Linux' Webconf --------------------------------------------------- -module (..., package.seeall) - -function is_string ( str ) - return (type(str) == "string") -end - -function is_boolean ( str ) - return (type(str) == "boolean") -end - -function is_number ( str ) - return (type(str) == "number") -end - --- --- This function validates an ipv4 address. --- -function is_ipv4(ipv4) - local retval = false; - local nums = {}; - local iplen = string.len(ipv4); - - -- check the ipv4's length - if (iplen < 7 or iplen > 15) then - return false, "Invalid Length" - end - - -- NC: Split the string into an array. separate with '.' (dots) - -- ^ beginning of string - -- () capture - -- %. litteral '.' The % neutralizes the . character class. - -- %d+ one or more digits - -- $ end of string - nums = {ipv4:match ("^(%d+)%.(%d+)%.(%d+)%.(%d+)$")} - - -- check if all nums are filled - if ( nums[1] == nil or - nums[2] == nil or - nums[3] == nil or - nums[4] == nil) then - -- we have an empty number - return false, "Invalid Format" - end - - -- too big? - if (tonumber(nums[1]) > 255 or - tonumber(nums[2]) > 255 or - tonumber(nums[3]) > 255 or - tonumber(nums[4]) > 255) then - -- at least one number is too big - return false, "Invalid Value" - end - - return true -end - --- --- This function validates a partial ipv4 address. --- -function is_partial_ipv4(ipv4) - local retval = false; - local nums = {}; - - -- Check to see if any invalid characters - if not ipv4 or not ipv4:match("^[%d%.]+$") then - return false, "Invalid Format" - end - - -- NC: Split the string into an array. separate with '.' (dots) - -- %d+ one or more digits - for num in ipv4:gmatch("%d+") do - nums[#nums+1] = num - -- too big? - if tonumber(num) > 255 then - return false, "Invalid Format" - end - end - - -- too many numbers - if #nums > 4 then - return false, "Invalid Format" - end - - return true -end - -function is_mac(mac) - - local tmpmac = string.upper(mac) - - if (string.len(tmpmac) ~= 17) then - return false, "Invalid Length" - end - - -- check for valid characters - local step = 1; - while (step <= 17) do - if (string.sub(tmpmac, step, step) ~= ":") and - (string.sub(tmpmac, step, step) < "0" or string.sub(tmpmac, step, step) > "9") and - (string.sub(tmpmac, step, step) < "A" or string.sub(tmpmac, step, step) > "F") then - -- we have found an invalid character! - return false, "Invalid Chars" - end - step = step + 1; - end - - -- check for valid colon positions - if (string.sub(tmpmac, 3, 3) ~= ":" or - string.sub(tmpmac, 6, 6) ~= ":" or - string.sub(tmpmac, 9, 9) ~= ":" or - string.sub(tmpmac, 12, 12) ~= ":" or - string.sub(tmpmac, 15, 15) ~= ":") then - return false, "Invalid Format" - end - - -- check for valid non colon positions - step = 1; - while (step <= 17) do - if ((string.sub(tmpmac, step, step) == ":") and - ((step ~= 3) and (step ~= 6) and (step ~= 9) and (step ~= 12) and - (step ~= 15))) then - return false, "Invalid Value" - end - step = step + 1; - end - - return true -end - --- --- This function checks if the given input --- consists of number-chars between 0..9 only --- and eventually a leading '-' --- -function is_integer(numstr) - -- ^ beginning of string - -- -? one or zero of the char '-' - -- %d+ one or more digits - -- $ end of string - return string.find(numstr, "^-?%d+$") ~= nil -end - - --- --- This function checks if the given input --- consists of number-chars between 0..9 only --- and if it is within a given range. --- -function is_integer_in_range(numstr, min, max) - return is_integer(numstr) - and tonumber(numstr) >= min - and tonumber(numstr) <= max - -end - --- --- This function checks if the given number is an integer --- and wheter it is between 1 .. 65535 --- -function is_port(numstr) - return is_integer_in_range(numstr, 1, 65535) -end - -function is_valid_filename ( path, restriction ) - if not (path) or ((restriction) and (string.find (path, "^" .. format.escapemagiccharacters(restriction) ) == nil or string.find (path, "/", #restriction+2) )) then - return false - end - return true -end diff --git a/lib/viewfunctions.lua b/lib/viewfunctions.lua index 5965d16..a45831c 100644 --- a/lib/viewfunctions.lua +++ b/lib/viewfunctions.lua @@ -1,4 +1,5 @@ require("html") +require("session") function displayitem(myitem) if not myitem then return end @@ -241,3 +242,13 @@ function displaypagination(page_data, page_info) io.write("</div>") end end + +-- give a cfe and get back a string of what is inside +-- great for troubleshooting and seeing what is really being passed to the view +function cfe_unpack ( a ) + if type(a) == "table" then + value = session.serialize("cfe", a) + value = "<pre>" .. html.html_escape(value) .. "</pre>" + return value + end +end |