X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=applications%2Fluci-asterisk%2Fluasrc%2Fasterisk.lua;h=5e224544924dccb87cfa2117392facb5c3e35bb3;hb=67dc7bb52b3d6e7e8cfdc7e613725f6bc601a21a;hp=c1b099dc5a7f13918f88eb8324b3668d172709b1;hpb=e6fc123a0a46e101a1c2ee8734bc333f7f62f506;p=project%2Fluci.git diff --git a/applications/luci-asterisk/luasrc/asterisk.lua b/applications/luci-asterisk/luasrc/asterisk.lua index c1b099dc5..5e2245449 100644 --- a/applications/luci-asterisk/luasrc/asterisk.lua +++ b/applications/luci-asterisk/luasrc/asterisk.lua @@ -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 '' ) .. + '%s' %{ 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