diff options
Diffstat (limited to 'quagga-model.lua')
-rw-r--r-- | quagga-model.lua | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/quagga-model.lua b/quagga-model.lua new file mode 100644 index 0000000..c9ef9d1 --- /dev/null +++ b/quagga-model.lua @@ -0,0 +1,187 @@ +module(..., package.seeall) + +require("fs") +require("procps") +require("getopts") +require("format") +require("daemoncontrol") +require("validator") + +local configfile = "/etc/quagga/bgpd.conf" +local processname = "bgpd" +local baseurl = "/etc/quagga/" + +local descr = { + Type = { + ['incomplete']="The protocol address is being resolved", + ['negative']="This protocol address is not available", + ['cached']="Protocol address was resolved successfully", + ['route']="This is a dynamic shortcut", + ['dynamic']="This entry is from a node that connected to us", + ['local']="Local interface address", + ['static']="Static mapping from configuration file (e.g. address of core)", + }, + Flags= { +-- ['up']="Connection is fully usable", + ['lower-up']="ipsec connections is up, but registration is not yet done", + }, +} + +local function get_version() + local cmd_output_result, cmd_output_error + local cmd = "/sbin/apk_version -vs " .. processname .." 2>/dev/null" + local f = io.popen( cmd ) + local cmdresult = f:read("*l") + if (cmdresult) and (#cmdresult > 0) then + cmd_output_result = string.match(cmdresult,"^%S*") or "Unknown" + else + cmd_output_error = "Program not installed" + end + f:close() + return cmd_output_result,cmd_output_error +end + +local function autostarts() + local cmd_output_result, cmd_output_error + local cmd = "/sbin/rc_status | egrep '^S' | egrep '" .. processname .."' 2>/dev/null" + local f = io.popen( cmd ) + local cmdresult = f:read("*a") + if (cmdresult) and (#cmdresult > 0) then + cmd_output_result = "Process will autostart at next boot (at sequence '" .. string.match(cmdresult,"^%a+(%d%d)") .. "')" + else + cmd_output_error = "Not programmed to autostart" + end + f:close() + return cmd_output_result,cmd_output_error +end + +local function opennhrpctl_show() + local cmd_output_result={} + local cmd_output_result_table={} + local cmd_output_error, opennhrpstatus + local cmd = "/usr/sbin/opennhrpctl show 2>/dev/null" + local f = io.popen( cmd ) + for line in f:lines() do + if string.find(line, "^Status:") then + opennhrpstatus=line + else + table.insert(cmd_output_result, line) + end + end + f:close() + local cnt = 0 + for k,v in pairs(cmd_output_result) do + if string.find(v,"^Interface") then + cnt = cnt + 1 + cmd_output_result_table[cnt] = {} + end + if ( cnt > 0 ) and (v ~= "") then + local k = string.match(v,"^(.-):%s?.*") + cmd_output_result_table[cnt][k]=cfe({value=string.match(v,"^.-:%s?(.*)")}) + local statusdescription = string.lower(string.match(v,"^.-:%s?(.*)")) + if (type(descr[k]) == "table") then + cmd_output_result_table[cnt][k]['descr']=descr[k][statusdescription] + end + end + end + + local peers_list = {} + for k,v in pairs(cmd_output_result_table) do + if (v.Interface.value) and not (peers_list[v.Interface.value]) then + peers_list[v.Interface.value] = {} + end + table.insert(peers_list[v.Interface.value], v) + end + + return peers_list,opennhrpstatus,cmd_output_error +end + + +function process_status_text(procname) + local t = procps.pidof(procname) + if (t) and (#t > 0) then + return "Enabled" + else + return "Disabled" + end +end + +-- ################################################################################ +-- PUBLIC FUNCTIONS + +function startstop_service ( self, action ) + local cmd = action.value + local cmdresult,cmdmessage,cmderror,cmdaction = daemoncontrol.daemoncontrol(processname, cmd) + action.descr=cmdmessage + action.errtxt=cmderror + -- Reporting back (true|false, the original acition) + return cmdresult,action +end + +function getstatus() + local status = {} + local value, errtxt = get_version() + status.version = cfe({ name = "version", + label="Program version", + value=value, + errtxt=errtxt, + }) + + status.status = cfe({ name="status", + label="Program status", + value=process_status_text(processname), + }) + local autostart_sequense, autostart_errtxt = autostarts() + status.autostart = cfe({ name="autostart", + label="Autostart sequence", + value=autostart_sequense, + errtxt=autostart_errtxt, + }) + + local opennhrpctl_show, opennhrpctl_status = opennhrpctl_show() + status.stats = cfe({ name="stats", + label="Programstatus reports", + value=opennhrpctl_status, + }) + + status.show = cfe({ name="show", + label="Peers", + option=opennhrpctl_show, + }) + + return status +end + +function get_filedetails() + local path = configfile + local filedetails = fs.stat(path) + local file = {} + + file["filename"] = cfe({ + name="filename", + label="File name", + value=path, + }) + file["filesize"] = cfe({ + name="filesize", + label="File size", + value=filedetails.size or 0, + }) + file["mtime"] = cfe({ + name="mtime", + label="File date", + value=filedetails.mtime or "---", + }) + file["filecontent"] = cfe({ + type="longtext", + name="filecontent", + label="File content", + value=fs.read_file(path), + }) + return file +end +function update_filecontent (self, modifications) + local path = configfile + local file_result,err = fs.write_file(path, format.dostounix(modifications)) + return file_result +end |