diff options
author | Ted Trask <ttrask01@yahoo.com> | 2014-08-19 00:18:48 +0000 |
---|---|---|
committer | Ted Trask <ttrask01@yahoo.com> | 2014-08-19 00:18:48 +0000 |
commit | afd9299582949522d1344afc5beade4d6348ad47 (patch) | |
tree | 43cbbda4c817f59547c6d438eca5ea4368d97e75 /config | |
parent | bdc961508e79bbd6c13c8a74431fdff475cb16b5 (diff) | |
download | acf-provisioning-afd9299582949522d1344afc5beade4d6348ad47.tar.bz2 acf-provisioning-afd9299582949522d1344afc5beade4d6348ad47.tar.xz |
Add support for Cisco 2 Port Phone Adapter SPA112
Diffstat (limited to 'config')
-rw-r--r-- | config/acl.conf | 1 | ||||
-rw-r--r-- | config/determine_class.lua | 3 | ||||
-rw-r--r-- | config/templates/ciscoata-template.lua | 241 |
3 files changed, 245 insertions, 0 deletions
diff --git a/config/acl.conf b/config/acl.conf index 9ce181f..46fb83b 100644 --- a/config/acl.conf +++ b/config/acl.conf @@ -1,3 +1,4 @@ Linksys +Cisco Polycom snom diff --git a/config/determine_class.lua b/config/determine_class.lua index 80830fa..5bc4ecd 100644 --- a/config/determine_class.lua +++ b/config/determine_class.lua @@ -11,6 +11,9 @@ if string.match(agent, "Polycom") then elseif string.match(agent, "Linksys") then manufacture = "Linksys" model = string.match(agent, "Linksys/(%P+)") +elseif string.match(agent, "Cisco") then + manufacture = "Cisco" + model = string.match(agent, "Cisco/(%P+)") elseif string.match(agent, "snom") then manufacture = "Snom" model = string.match(agent, "snom(%d+)") diff --git a/config/templates/ciscoata-template.lua b/config/templates/ciscoata-template.lua new file mode 100644 index 0000000..2238686 --- /dev/null +++ b/config/templates/ciscoata-template.lua @@ -0,0 +1,241 @@ +<% +-- Cisco ATA Configuration File Template +local values = ... + +--[[ -- Parameters +values["device"]["adminpassword"] = "" +values["device"]["digitmap"] = "" +values["device"]["mac"] = "" +values["device"]["musiconhold"] = "" +values["device"]["registrar"] = "" +values["device"]["sntpserver"] = "" +values["device"]["template"] = "/etc/provisioning/templates/ciscoata-template.lua" +values["device"]["timezone"] = "" +values["regX"]["callerid"] = "" +values["regX"]["extension"] = "" +values["regX"]["forwardall"] = "" +values["regX"]["forwardallenable"] = boolean +values["regX"]["forwardbusy"] = "" +values["regX"]["forwardbusyenable"] = boolean +values["regX"]["forwardnoanswer"] = "" +values["regX"]["forwardnoanswerenable"] = boolean +values["regX"]["password"] = "" +-- Unimplemented -- values["services"]["callhistoryenable"] = boolean +values["services"]["callwaitingenable"] = boolean +values["services"]["forwarding"] = boolean +values["services"]["hotlineenable"] = boolean +-- Unimplemented -- values["services"]["mailbox"] = "" +-- Unimplemented -- values["services"]["mailcallback"] = "" +-- Unimplemented -- values["services"]["speeddialenable"] = boolean +--]] + +local function yesno ( bool ) + if bool then + return "Yes" + else + return "No" + end +end + +local function xml_elem(elem,value,permissions,i) + local e = elem + if i then e = elem.."_"..tostring(i).."_" end + local output = {"<", e, ' ua="'} + output[#output+1] = (permissions or "na")..'">' + if type(value) == "boolean" then + output[#output+1] = yesno(value) + elseif value then + output[#output+1] = value + end + output[#output+1] = "</"..e..">" + io.write(table.concat(output).."\n") +end +%> + +<?xml version="1.0" encoding="utf-8"?> + +<flat-profile> + +<% +-- Device parameters +xml_elem("Web_Login_Admin_Passwd", values.device.adminpassword, "na") +xml_elem("Web_Login_Guest_Password", values.device.adminpassword, "na") +xml_elem("IVR_Admin_Password", values.device.adminpassword, "na") +%> + +<Time_Setup> +<% +xml_elem("Time_Server", values.device.sntpserver, "na") +-- Handle Time Zone parameter +-- See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html +-- TZ variable, with no leading colon +-- Syntax: stdoffset[dst[offset][,start[/time],end[/time]]] +-- Examples: 'GMT0' 'EST5EDT,M3.2.0,M11.1.0' '<GMT+5>5' +-- Parse time zone variable +posixtz = require('posixtz') +local tz = posixtz.parse(values.device.timezone) +if tz then + -- The Cisco doc gives a static list of 42 possible timezones with no explanations + -- First is obviously offset from GMT (with reverse sign from posixtz) + -- Second seems to be enumeration of entries with same offset + -- Third must be the start/stop of daylight saving time (0-10, no 3) + -- Just pick the closest + local dst = { [1] = {start="M3.2.0", stop="M11.1.0"}, -- 1 -- United States + [2] = {start="M3.5.0", stop="M10.5.0"}, -- 2 -- Europe + -- 4 is used for several locations that don't do dst from what I can tell + [4] = {start="M9.5.0", stop="M4.1.0"}, -- 4 -- New Zealand + [5] = {start="M4.1.0", stop="M10.5.0"}, -- 5 -- Mexico + -- [10] = {start="M10.1.0", stop="M4.1.0"}, -- 10 -- South Australia -- Not needed + -- Don't know what 6-9 are for, since those locations don't have dst from what I can tell + } + + -- Here are the 42 possible timezones -- UI Name Value Corresponding parameter + local timezones = {["-11"] = {0}, -- Midway Island, Samoa "-11 1 0" 0 + ["-10"] = {0}, -- Hawaii "-10 1 0" 0 + ["-09"] = {1}, -- Alaska "-09 1 1" AKST9AKDT,M3.2.0,M11.1.0 + ["-08"] = {1}, -- Pacific Time (USA & Canada) "-08 1 1" PST8PDT,M3.2.0,M11.1.0 + ["-07"] = {0, 1}, -- Arizona "-07 1 0" 0 + -- Mountain Time (USA & Canada) "-07 2 1", MST7MDT,M3.2.0,M11.1.0 + ["-06"] = {5, 1}, -- Mexico "-06 1 5" CST6CDT,M4.1.0,M10.5.0 + -- Central Time (USA & Canada) "-06 2 1" CST6CDT,M3.2.0,M11.1.0 + ["-05"] = {0, 1}, -- Indiana East, Columbia, Panama "-05 1 0" 0 + -- Eastern Time (USA & Canada) "-05 2 1" EST5EDT,M3.2.0,M11.1.0 + ["-04"] = {0, 1, 0}, -- Bolivia, Venezuela "-04 1 0" 0 + -- Atlantic Time (Canada), Brazil West "-04 2 1" AST4ADT,M3.2.0,M11.1.0 + -- Guyana "-04 3 0" 0 + -- ["-03.5"] = {1}, -- Newfoundland "-03.5 1 1" NST3:30NDT,M3.2.0,M11.1.0 + ["-03"] = {1}, -- Brazil East, Greenland "-03 1 1" ? + ["-02"] = {0}, -- Mid-Atlantic "-02 1 0" 0 + ["-01"] = {2}, -- Azores "-01 1 2" AZOT1AZOST,M3.5.0/0,M10.5.0/1 + ["+00"] = {0, 2}, -- Gambia, Liberia, Morocco "+00 1 0" 0 + -- England "+00 2 2" GMT0BST,M3.5.0/1,M10.5.0 + ["+01"] = {6, 2}, -- Tunisia "+01 1 6" 0 + -- France, Germany, Italy "+01 2 2" CET-1CEST,M3.5.0,M10.5.0/3 + ["+02"] = {0, 2}, -- South Africa "+02 1 0" 0 + -- Greece, Ukraine, Romania, Turkey "+02 2 2" EET-2EEST,M3.5.0/3,M10.5.0/4 + ["+03"] = {8, 9}, -- Iraq, Kuwait "+03 1 8" 0 + -- Jordan "+03 2 9" ? + ["+04"] = {0}, -- ABU Dhabi, Muscat, Armenia "+04 1 0" 0 + ["+05"] = {7}, -- Pakistan, Russia "+05 1 7" 0 + -- ["+05.5"] = {0}, -- Bombay, Calcutta, Madras, New Delhi "+05.5 1 0" 0 + ["+06"] = {7}, -- Bangladesh, Russia "+06 1 7" 0 + ["+07"] = {7}, -- Thailand, Russia "+07 1 7" 0 + ["+08"] = {4, 7, 0, 0}, -- Australia Western "+08 1 4" 0 + -- Russia "+08 2 7" ? + -- China, Hong Kong "+08 3 0" 0 + -- Singapore, Taiwan "+08 4 0" 0 + ["+09"] = {0}, -- Japan, Korea "+09 1 0" 0 + -- ["+09.5"] = {10}, -- South Australia "+09.5 1 10" CST-9:30CST,M10.1.0,M4.1.0/3 + ["+10"] = {7, 4}, -- Guam, Russia "+10 1 7" 0 + -- Australia "+10 2 4" + ["+11"] = {0}, -- Soloman Islands "+11 1 0" 0 + ["+12"] = {0, 4, 0}, -- Fiji "+12 1 0" ? + -- New Zealand "+12 2 4" NZST-12NZDT,M9.5.0,M4.1.0/3 + -- Kwajalein "+12 3 0" 0 + } + -- convert POSIX sign (W of GMT is '+') to Cisco (E of GMT is '+') + if tonumber(tz.offset.hour) == 0 then + tz.offset.sign = "+" + else + if tz.offset.sign == "-" then + tz.offset.sign = "+" + else + tz.offset.sign = "-" + end + end + + local offset = string.format("%s%02i", tz.offset.sign, tz.offset.hour) + + if timezones[offset] and #timezones[offset] == 1 then + xml_elem("Time_Zone", offset.." 1 "..timezones[offset][1], "na") + elseif timezones[offset] then + -- We need to pick the dst that matches the closest + local match = 0 -- default to no dst + if tz.dst then + for i,t in ipairs(dst) do + if string.find(values.device.timezone, t.start) and string.find(values.device.timezone, t.stop) then + match = i + break + end + end + end + local index = 1 -- default to first option in this timezone + for i,t in ipairs(timezones[offset]) do + if t == match then + index = i + break + end + end + xml_elem("Time_Zone", offset.." "..index.." "..timezones[offset][index], "na") + else + -- Just don't set it + end + + if tz.dst then + xml_elem("Auto_Adjust_Clock", true, "na") + else + xml_elem("Auto_Adjust_Clock", false, "na") + end +end +%> +</Time_Setup> + +<% +for pg, pg_t in pairs(values) do + -- Is it of the form regX ? + local num = string.match(pg, 'reg(%d+)') + if num then + if pg_t.extension ~= "" then + xml_elem("Line_Enable", true, "na", num) + xml_elem("MOH_Server", values.device.musiconhold, "na", num) + xml_elem("Proxy", values.device.registrar, "na", num) + xml_elem("Call_Waiting_Serv", (values.services and values.services.callwaitingenable), "na", num) + xml_elem("CW_Setting", (values.services and values.services.callwaitingenable), "na", num) + if values.services and values.services.hotlineenable then + -- Need to escape < and > + xml_elem("Dial_Plan", "( P1<:"..values.services.hotlinedestination.."> )", "na", num) + elseif values.device and values.device.digitmap and values.device.digitmap ~= "" then + xml_elem("Dial_Plan", "( "..values.device.digitmap.." )", "na", num) + else + xml_elem("Dial_Plan", "( x. )", "na", num) + end + + if pg_t.callerid == "" then + pg_t.callerid = pg_t.extension + end + xml_elem("Display_Name", pg_t.callerid, "na", num) + xml_elem("User_ID", pg_t.extension, "na", num) + xml_elem("Password", pg_t.password, "na", num) + + local forwarding = { {param="forwardall", xml="Cfwd_All_"}, + {param="forwardbusy", xml="Cfwd_Busy_"}, + {param="forwardnoanswer", xml="Cfwd_No_Ans_"} } + for i,f in ipairs(forwarding) do + if values.services and values.services.forwarding and pg_t[f.param.."enable"] then + xml_elem(f.xml.."Serv", true, "na", num) + xml_elem(f.xml.."Dest", pg_t[f.param], "na", num) + else + xml_elem(f.xml.."Serv", false, "na", num) + xml_elem(f.xml.."Dest", "", "na", num) + end + end + if values.services and values.services.forwarding and pg_t.forwardnoanswerenable then + xml_elem("Cfwd_No_Ans_Delay", "20", "na", num) + else + xml_elem("Cfwd_No_Ans_Delay", "", "na", num) + end + else + -- Cannot disable the lines, or check-sync will not work, just set User ID to "" + xml_elem("Line_Enable", true, "na", num) + xml_elem("User_ID", "", "na", num) + end + end +end %> + +</flat-profile> + +<% +-- DEBUGGING +--require("session") +--io.write(session.serialize("values", values)) +%> |