diff options
-rw-r--r-- | config/determine_class.lua | 2 | ||||
-rw-r--r-- | provisioning-controller.lua | 17 | ||||
-rw-r--r-- | provisioning-listrequests-html.lsp | 66 | ||||
-rw-r--r-- | provisioning-model.lua | 114 | ||||
-rw-r--r-- | provisioning.menu | 1 | ||||
-rw-r--r-- | provisioning.roles | 4 |
6 files changed, 197 insertions, 7 deletions
diff --git a/config/determine_class.lua b/config/determine_class.lua index 297422d..ad32266 100644 --- a/config/determine_class.lua +++ b/config/determine_class.lua @@ -18,7 +18,7 @@ APP.logevent("Found "..(manufacture or "").." model "..(model or "")) if manufacture and model then for i,c in ipairs(classes.value) do if string.match(c.label, manufacture) and string.match(c.label, model) then - return c.class_id + return c.class_id, c.name end end end diff --git a/provisioning-controller.lua b/provisioning-controller.lua index f4386d9..faa46ee 100644 --- a/provisioning-controller.lua +++ b/provisioning-controller.lua @@ -152,3 +152,20 @@ end putfile = function( self ) return self.model.put_file(self.clientdata.mac, self.clientdata.data) end + +listrequests = function( self ) + return self.model.list_requests() +end + +deleterequest = function( self ) + return self:redirect_to_referrer(self.model.delete_request(self.clientdata.mac)) +end + +createdevicefromrequest = function( self ) + local retval = controllerfunctions.handle_form(self, self.model.get_request, self.model.create_from_request, self.clientdata, "Create", "Create Device", "Device Created") + if retval.value.device_id and retval.value.device_id.value ~= "" and not retval.errtxt then + -- Successfully created a device, redirect to edit it + self:redirect("editdevice?device_id="..retval.value.device_id.value.."&redir=".. (self.clientdata.redir or "listdevices")) + end + return retval +end diff --git a/provisioning-listrequests-html.lsp b/provisioning-listrequests-html.lsp new file mode 100644 index 0000000..b2c1e6e --- /dev/null +++ b/provisioning-listrequests-html.lsp @@ -0,0 +1,66 @@ +<% local view, viewlibrary, page_info, session = ... +require("viewfunctions") +%> + +<script type="text/javascript" src="<%= html.html_escape(page_info.wwwprefix) %>/js/jquery-latest.js"></script> +<script type="text/javascript" src="<%= html.html_escape(page_info.wwwprefix) %>/js/jquery.tablesorter.js"></script> +<script type="text/javascript"> +<% -- Since we're including a submission of searchdevices, we need to overcome the automatic redirect + if session.searchdevicesresult then + -- Use JavaScript to redirect to the searchdevices page +%> + window.location.assign("<%= html.html_escape(page_info.script..page_info.prefix..page_info.controller) %>/searchdevices"); +<% + end + -- Since we're including a submission of createdevicefromrequest, we need to overcome the automatic redirect + if session.createdevicefromrequestresult then + -- Use JavaScript to redirect to the createdevicefromrequest page +%> + window.location.assign("<%= html.html_escape(page_info.script..page_info.prefix..page_info.controller) %>/createdevicefromrequest"); +<% + end +%> + + $(document).ready(function() { + $("#list").tablesorter(); + $(".deleterequest").click(function(){ return confirm("Are you sure you want to delete this request?")}); + }); +</script> + +<% displaycommandresults({"deleterequest"}, session) %> + +<h1>Requests</h1> +<DL> +<TABLE id="list" class="tablesorter"><THEAD> + <TR style="background:#eee;font-weight:bold;"> + <TH>Action</TH> + <TH>Timestamp</TH> + <TH>MAC Address</TH> + <TH>IP Address</TH> + <TH>User Agent</TH> + </TR> +</THEAD><TBODY> +<% for k,v in ipairs( view.value ) do %> + <TR> + <TD> + <% if viewlibrary.check_permission("deleterequest") then %> + <%= html.link{value=page_info.script..page_info.prefix..page_info.controller.."/deleterequest?mac="..v.mac, label="Delete ", class="deleterequest"} %> + <% end %> + <% if v.device_id then %> + <% if viewlibrary.check_permission("searchdevices") then %> + <%= html.link{value=page_info.script..page_info.prefix..page_info.controller.."/searchdevices?id=device_id&value="..v.device_id.."&redir=searchdevices&Search=Search", label="Search "} %> + <% end %> + <% else %> + <% if viewlibrary.check_permission("createdevicefromrequest") then %> + <%= html.link{value=page_info.script..page_info.prefix..page_info.controller.."/createdevicefromrequest?mac="..v.mac.."&Create=Create", label="Create "} %> + <% end %> + <% end %> + </TD> + <TD><%= html.html_escape(v.date) %></TD> + <TD><%= html.html_escape(v.mac) %></TD> + <TD><%= html.html_escape(v.ip) %></TD> + <TD><%= html.html_escape(v.agent) %></TD> + </TR> +<% end %> +</TBODY> +</TABLE> diff --git a/provisioning-model.lua b/provisioning-model.lua index da39fb1..f96da7e 100644 --- a/provisioning-model.lua +++ b/provisioning-model.lua @@ -260,7 +260,7 @@ validateparamcoded = function(p, top) end local function callscript(script, ...) - local result, errtxt + local result local env = {} setmetatable (env, {__index = _G}) -- loadfile loads into the global environment @@ -269,14 +269,14 @@ local function callscript(script, ...) local f = loadfile(script) if f then local res, err = pcall(function(...) - result, errtxt = f(functions, ...) + result = { f(functions, ...) } end, ...) if not res and err then assert(res, "Exception in "..script.." script\n"..err) end end setfenv (0, _G) - return result, errtxt + return unpack(result) end local function validateluacode(code) @@ -635,7 +635,7 @@ list_classes = function() -- Get the classes from the DB local res, err = pcall(function() local connected = databaseconnect() - local sql = "SELECT class_id, g.label AS group, c.label, c.seq FROM provisioning_classes c JOIN provisioning_class_groups g USING(class_group_id) ORDER BY g.seq ASC, g.label ASC, c.seq ASC, c.label ASC" + local sql = "SELECT class_id, g.label AS group, g.name, c.label, c.seq FROM provisioning_classes c JOIN provisioning_class_groups g USING(class_group_id) ORDER BY g.seq ASC, g.label ASC, c.seq ASC, c.label ASC" retval = getselectresponse(sql) if connected then databasedisconnect() end end) @@ -1953,3 +1953,109 @@ functions = { get_device_params=get_device_params, set_device_params=set_device_params, } + +list_requests = function() + local retval = {} + local errtxt + -- Get the templates from the DB + local res, err = pcall(function() + local connected = databaseconnect() + local sql = "SELECT * FROM provisioning_requests ORDER BY date DESC" + retval = getselectresponse(sql) + -- Get the corresponding device_id's for each request + sql = "SELECT * FROM provisioning_values WHERE param_id=(SELECT param_id FROM provisioning_params WHERE name='mac')" + local ids = getselectresponse(sql) + local reverseids = {} + for i,v in ipairs(ids) do + reverseids[v.value] = v.device_id + end + for i,v in ipairs(retval) do + v.device_id = reverseids[v.mac] + end + if connected then databasedisconnect() end + end) + if not res and err then + errtxt = err + end + + return cfe({ type="structure", value=retval, label="List of Requests", errtxt=errtxt }) +end + +delete_request = function(mac) + local result = "" + local errtxt + local res, err = pcall(function() + local connected = databaseconnect() + local sql = "SELECT * FROM provisioning_requests WHERE mac='"..escape(string.upper(mac)).."'" + local tmp = getselectresponse(sql) + if #tmp == 0 then + errtxt = "Request does not exist" + else + -- Remove the request + sql = "DELETE FROM provisioning_requests WHERE mac='"..escape(string.upper(mac)).."'" + runsqlcommand(sql) + result = "Request Deleted" + end + if connected then databasedisconnect() end + end) + if not res and err then + errtxt = err + end + + return cfe({ value=result, errtxt=errtxt, label="Delete Request Result" }) +end + +get_request = function(mac) + local retval = {} + retval.mac = cfe({ value=mac or "", label="MAC Address" }) + return cfe({ type="group", value=retval, label="Create Device from Request" }) +end + +create_from_request = function(request) + success = false + local res, err = pcall(function() + local connected = databaseconnect() + local sql = "SELECT * FROM provisioning_requests WHERE mac='"..escape(string.upper(request.value.mac.value)).."'" + local tmp = getselectresponse(sql) + if #tmp == 0 then + request.value.mac.errtxt = "Request does not exist" + else + -- Determine which class to use (need a class that specifies a template) + local c = list_classes() + local class, group = callscript(determineclassscriptfile, tmp[1].agent, c) + + -- Create the device + local device = get_device() + if class and group and device.value.classes.value[group] then + device.value.classes.value[group].value = class + end + device = create_device(device) + if device.errtxt then + request.errtxt = device.errtxt + else + local params = get_device_params(device.value.device_id.value) + -- Set the MAC Address + if params.value.device and params.value.device.value.mac then + params.value.device.value.mac.value = string.upper(request.value.mac.value) + params = set_device_params(params) + end + if params.errtxt then + request.errtxt = params.errtxt + delete_device(device.value.device_id.value) + else + success = true + request.value.device_id = device.value.device_id + end + end + end + if connected then databasedisconnect() end + end) + if not res and err then + request.errtxt = err + end + + if not success and not request.errtxt then + request.errtxt = "Failed to create device" + end + return request +end diff --git a/provisioning.menu b/provisioning.menu index 3396a1b..e496c3d 100644 --- a/provisioning.menu +++ b/provisioning.menu @@ -4,6 +4,7 @@ Applications 89Provisioning Extension searchbyextension Applications 89Provisioning MAC_Address searchbymac Applications 89Provisioning Search searchdevices Applications 89Provisioning Devices listdevices +Applications 89Provisioning Requests listrequests Applications 89Provisioning Templates listtemplates Applications 89Provisioning Class_Groups listclassgroups Applications 89Provisioning Classes listclasses diff --git a/provisioning.roles b/provisioning.roles index bce76cb..ce3b85e 100644 --- a/provisioning.roles +++ b/provisioning.roles @@ -1,3 +1,3 @@ -EDITOR=provisioning:searchdevices,provisioning:listdevices,provisioning:editdevice,provisioning:createdevice,provisioning:duplicatedevice,provisioning:deletedevice,provisioning:searchbyextension,provisioning:searchbymac,provisioning:editdeviceparams +EDITOR=provisioning:searchdevices,provisioning:listdevices,provisioning:editdevice,provisioning:createdevice,provisioning:duplicatedevice,provisioning:deletedevice,provisioning:searchbyextension,provisioning:searchbymac,provisioning:editdeviceparams,provisioning:listrequests,provisioning:deleterequest,provisioning:createdevicefromrequest EXPERT=provisioning:listtemplates,provisioning:edittemplate,provisioning:createtemplate,provisioning:deletetemplate,provisioning:listclassgroups,provisioning:editclassgroup,provisioning:createclassgroup,provisioning:deleteclassgroup,provisioning:listclasses,provisioning:editclass,provisioning:createclass,provisioning:deleteclass,provisioning:listgroups,provisioning:editgroup,provisioning:creategroup,provisioning:deletegroup,provisioning:listparams,provisioning:editparam,provisioning:createparam,provisioning:deleteparam,provisioning:overridedeviceparams,provisioning:editoptions,provisioning:listfiles,provisioning:editfile,provisioning:getdevicevalues -ADMIN=provisioning:listtemplates,provisioning:edittemplate,provisioning:createtemplate,provisioning:deletetemplate,provisioning:searchdevices,provisioning:listdevices,provisioning:editdevice,provisioning:createdevice,provisioning:duplicatedevice,provisioning:deletedevice,provisioning:listclassgroups,provisioning:editclassgroup,provisioning:createclassgroup,provisioning:deleteclassgroup,provisioning:listclasses,provisioning:editclass,provisioning:createclass,provisioning:deleteclass,provisioning:listgroups,provisioning:editgroup,provisioning:creategroup,provisioning:deletegroup,provisioning:listparams,provisioning:editparam,provisioning:createparam,provisioning:deleteparam,provisioning:editdeviceparams,provisioning:overridedeviceparams,provisioning:editoptions,provisioning:listfiles,provisioning:editfile,provisioning:searchbyextension,provisioning:searchbymac,provisioning:getdevicevalues,provisioning:dumpdatabase,provisioning:getclassvalues +ADMIN=provisioning:listtemplates,provisioning:edittemplate,provisioning:createtemplate,provisioning:deletetemplate,provisioning:searchdevices,provisioning:listdevices,provisioning:editdevice,provisioning:createdevice,provisioning:duplicatedevice,provisioning:deletedevice,provisioning:listclassgroups,provisioning:editclassgroup,provisioning:createclassgroup,provisioning:deleteclassgroup,provisioning:listclasses,provisioning:editclass,provisioning:createclass,provisioning:deleteclass,provisioning:listgroups,provisioning:editgroup,provisioning:creategroup,provisioning:deletegroup,provisioning:listparams,provisioning:editparam,provisioning:createparam,provisioning:deleteparam,provisioning:editdeviceparams,provisioning:overridedeviceparams,provisioning:editoptions,provisioning:listfiles,provisioning:editfile,provisioning:searchbyextension,provisioning:searchbymac,provisioning:getdevicevalues,provisioning:dumpdatabase,provisioning:getclassvalues,provisioning:listrequests,provisioning:deleterequest,provisioning:createdevicefromrequest |