applications/luci-asterisk: fix copy & paste error
[project/luci.git] / applications / luci-asterisk / luasrc / asterisk.lua
index c1b099d..5e22454 100644 (file)
@@ -15,8 +15,10 @@ $Id$
 ]]--
 
 module("luci.asterisk", package.seeall)
+require("luci.asterisk.cc_idd")
 
 local _io  = require("io")
+local uci  = require("luci.model.uci").cursor()
 local sys  = require("luci.sys")
 local util = require("luci.util")
 
@@ -24,6 +26,11 @@ AST_BIN   = "/usr/sbin/asterisk"
 AST_FLAGS = "-r -x"
 
 
+--- LuCI Asterisk - Resync uci context
+function uci_resync()
+       uci = luci.model.uci.cursor()
+end
+
 --- LuCI Asterisk io interface
 -- Handles low level io.
 -- @type       module
@@ -196,3 +203,284 @@ function sip.peer(peer)
 
        return info, keys
 end
+
+
+--- LuCI Asterisk - Internal helpers
+-- @type module
+tools = luci.util.class()
+
+--- Convert given value to a list of tokens. Split by white space.
+-- @param val  String or table value
+-- @return             Table containing tokens
+function tools.parse_list(v)
+       local tokens = { }
+
+       v = type(v) == "table" and v or { v }
+       for _, v in ipairs(v) do
+               if type(v) == "string" then
+                       for v in v:gmatch("(%S+)") do
+                               tokens[#tokens+1] = v
+                       end
+               end
+       end
+
+       return tokens
+end
+
+--- Convert given list to a collection of hyperlinks
+-- @param list Table of tokens
+-- @param url  String pattern or callback function to construct urls (optional)
+-- @param sep  String containing the seperator (optional, default is ", ")
+-- @return             String containing the html fragment
+function tools.hyperlinks(list, url, sep)
+       local html
+
+       local function mkurl(p, t)
+               if type(p) == "string" then
+                       return p:format(t)
+               elseif type(p) == "function" then
+                       return p(t)
+               else
+                       return '#'
+               end
+       end
+
+       list = list or { }
+       url  = url  or "%s"
+       sep  = sep  or ", "
+
+       for _, token in ipairs(list) do
+               html = ( html and html .. sep or '' ) ..
+                       '<a href="%s">%s</a>' %{ mkurl(url, token), token }
+       end
+
+       return html or ''
+end
+
+
+--- LuCI Asterisk - International Direct Dialing Prefixes
+-- @type module
+idd = luci.util.class()
+
+--- Lookup the country name for the given IDD code.
+-- @param country      String containing IDD code
+-- @return                     String containing the country name
+function idd.country(c)
+       for _, v in ipairs(cc_idd.CC_IDD) do
+               if type(v[3]) == "table" then
+                       for _, v2 in ipairs(v[3]) do
+                               if v2 == tostring(c) then
+                                       return v[1]
+                               end
+                       end
+               elseif v[3] == tostring(c) then
+                       return v[1]
+               end
+       end
+end
+
+--- Lookup the country code for the given IDD code.
+-- @param country      String containing IDD code
+-- @return                     Table containing the country code(s)
+function idd.cc(c)
+       for _, v in ipairs(cc_idd.CC_IDD) do
+               if type(v[3]) == "table" then
+                       for _, v2 in ipairs(v[3]) do
+                               if v2 == tostring(c) then
+                                       return type(v[2]) == "table"
+                                               and v[2] or { v[2] }
+                               end
+                       end
+               elseif v[3] == tostring(c) then
+                       return type(v[2]) == "table"
+                               and v[2] or { v[2] }
+               end
+       end
+end
+
+--- Lookup the IDD code(s) for the given country.
+-- @param idd          String containing the country name
+-- @return                     Table containing the IDD code(s)
+function idd.idd(c)
+       for _, v in ipairs(cc_idd.CC_IDD) do
+               if v[1]:lower():match(c:lower()) then
+                       return type(v[3]) == "table"
+                               and v[3] or { v[3] }
+               end
+       end
+end
+
+
+--- LuCI Asterisk - Country Code Prefixes
+-- @type module
+cc = luci.util.class()
+
+--- Lookup the country name for the given CC code.
+-- @param country      String containing CC code
+-- @return                     String containing the country name
+function cc.country(c)
+       for _, v in ipairs(cc_idd.CC_IDD) do
+               if type(v[2]) == "table" then
+                       for _, v2 in ipairs(v[2]) do
+                               if v2 == tostring(c) then
+                                       return v[1]
+                               end
+                       end
+               elseif v[2] == tostring(c) then
+                       return v[1]
+               end
+       end
+end
+
+--- Lookup the international dialing code for the given CC code.
+-- @param cc           String containing CC code
+-- @return                     String containing IDD code
+function cc.idd(c)
+       for _, v in ipairs(cc_idd.CC_IDD) do
+               if type(v[2]) == "table" then
+                       for _, v2 in ipairs(v[2]) do
+                               if v2 == tostring(c) then
+                                       return type(v[3]) == "table"
+                                               and v[3] or { v[3] }
+                               end
+                       end
+               elseif v[2] == tostring(c) then
+                       return type(v[3]) == "table"
+                               and v[3] or { v[3] }
+               end
+       end
+end
+
+--- Lookup the CC code(s) for the given country.
+-- @param country      String containing the country name
+-- @return                     Table containing the CC code(s)
+function cc.cc(c)
+       for _, v in ipairs(cc_idd.CC_IDD) do
+               if v[1]:lower():match(c:lower()) then
+                       return type(v[2]) == "table"
+                               and v[2] or { v[2] }
+               end
+       end
+end
+
+
+--- LuCI Asterisk - Dialzone
+-- @type       module
+dialzone = luci.util.class()
+
+--- Parse a dialzone section
+-- @param zone Table containing the zone info
+-- @return             Table with parsed information
+function dialzone.parse(z)
+       if z['.name'] then
+               return {
+                       trunks          = tools.parse_list(z.uses),
+                       name            = z['.name'],
+                       description     = z.description or z['.name'],
+                       addprefix       = z.addprefix,
+                       matches         = tools.parse_list(z.match),
+                       intlmatches     = tools.parse_list(z.international),
+                       countrycode     = z.countrycode,
+                       localzone       = z.localzone,
+                       localprefix     = z.localprefix
+               }
+       end
+end
+
+--- Get a list of known dial zones
+-- @return             Associative table of zones and table of zone names
+function dialzone.zones()
+       local zones  = { }
+       local znames = { }
+       uci:foreach("asterisk", "dialzone",
+               function(z)
+                       zones[z['.name']] = dialzone.parse(z)
+                       znames[#znames+1] = z['.name']
+               end)
+       return zones, znames
+end
+
+--- Get a specific dial zone
+-- @param name Name of the dial zone
+-- @return             Table containing zone information
+function dialzone.zone(n)
+       local zone
+       uci:foreach("asterisk", "dialzone",
+               function(z)
+                       if z['.name'] == n then
+                               zone = dialzone.parse(z)
+                       end
+               end)
+       return zone
+end
+
+--- Find uci section hash for given zone number
+-- @param idx  Zone number
+-- @return             String containing the uci hash pointing to the section
+function dialzone.ucisection(i)
+       local hash
+       local index = 1
+       i = tonumber(i)
+       uci:foreach("asterisk", "dialzone",
+               function(z)
+                       if not hash and index == i then
+                               hash = z['.name']
+                       end
+                       index = index + 1
+               end)
+       return hash
+end
+
+
+--- LuCI Asterisk - Dialplan
+-- @type       module
+dialplan = luci.util.class()
+
+--- Parse a dialplan section
+-- @param plan Table containing the plan info
+-- @return             Table with parsed information
+function dialplan.parse(z)
+       if z['.name'] then
+               local plan = {
+                       zones           = { },
+                       name            = z['.name'],
+                       description     = z.description or z['.name']
+               }
+
+               for _, name in ipairs(tools.parse_list(z.include)) do
+                       local zone = dialzone.zone(name)
+                       if zone then
+                               plan.zones[#plan.zones+1] = zone
+                       end
+               end
+
+               return plan
+       end
+end
+
+--- Get a list of known dial plans
+-- @return             Associative table of plans and table of plan names
+function dialplan.plans()
+       local plans  = { }
+       local pnames = { }
+       uci:foreach("asterisk", "dialplan",
+               function(p)
+                       plans[p['.name']] = dialplan.parse(p)
+                       pnames[#pnames+1] = p['.name']
+               end)
+       return plans, pnames
+end
+
+--- Get a specific dial plan
+-- @param name Name of the dial plan
+-- @return             Table containing plan information
+function dialplan.plan(n)
+       local plan
+       uci:foreach("asterisk", "dialplan",
+               function(p)
+                       if p['.name'] == n then
+                               plan = dialplan.parse(p)
+                       end
+               end)
+       return plan
+end