summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Trask <ttrask01@yahoo.com>2011-10-14 13:35:23 +0000
committerTed Trask <ttrask01@yahoo.com>2011-10-14 13:35:23 +0000
commit83657e146b87a2318c6fe0da349c8b54d0efe07f (patch)
treecfe86e9d541611b5119cf1257887a9e029b50c03
parentee94e970f43e462f6ad44cbe9ede26ca2471a894 (diff)
downloadacf-provisioning-83657e146b87a2318c6fe0da349c8b54d0efe07f.tar.bz2
acf-provisioning-83657e146b87a2318c6fe0da349c8b54d0efe07f.tar.xz
Added new listrequests, deleterequest, and createdevicefromrequest actions
-rw-r--r--config/determine_class.lua2
-rw-r--r--provisioning-controller.lua17
-rw-r--r--provisioning-listrequests-html.lsp66
-rw-r--r--provisioning-model.lua114
-rw-r--r--provisioning.menu1
-rw-r--r--provisioning.roles4
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