applications/luci-asterisk: begin reworking dialplan stuff to separate dialzones...
[project/luci.git] / applications / luci-asterisk / luasrc / controller / asterisk.lua
1 --[[
2 LuCI - Lua Configuration Interface
3
4 Copyright 2008 Steven Barth <steven@midlink.org>
5 Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
6
7 Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
10
11         http://www.apache.org/licenses/LICENSE-2.0
12
13 $Id$
14 ]]--
15
16 module("luci.controller.asterisk", package.seeall)
17
18 function index()
19
20         entry({"admin", "services", "asterisk"},                                  cbi("asterisk"),                        "Asterisk",                           80).i18n = "asterisk"
21
22         entry({"admin", "services", "asterisk", "voice"},         cbi("asterisk-voice"),      "Voice Functions",        1)
23         entry({"admin", "services", "asterisk", "meetme"},        cbi("asterisk-meetme"),     "Meetme Conferences",     2)
24
25         entry({"admin", "services", "asterisk", "iax-conns"},     cbi("asterisk-iax-connections"), "IAX Connections",   3)
26         entry({"admin", "services", "asterisk", "sip-conns"},     cbi("asterisk-sip-connections"), "SIP Connections",   4)
27
28         entry({"admin", "services", "asterisk", "dialplans"},     cbi("asterisk-dialplans"),  "Dial Plans",                     5)
29
30         entry({"admin", "services", "asterisk", "mod"},           cbi("asterisk-mod-app"),    "Modules",                                4)
31         entry({"admin", "services", "asterisk", "mod", "app"},    cbi("asterisk-mod-app"),    "Applications",                   1)
32         entry({"admin", "services", "asterisk", "mod", "cdr"},    cbi("asterisk-mod-cdr"),    "Call Detail Records",    2)
33         entry({"admin", "services", "asterisk", "mod", "chan"},   cbi("asterisk-mod-chan"),   "Channels",                               3)
34         entry({"admin", "services", "asterisk", "mod", "codec"},  cbi("asterisk-mod-codec"),  "Codecs",                                 4)
35         entry({"admin", "services", "asterisk", "mod", "format"}, cbi("asterisk-mod-format"), "Format",                                 5)
36         entry({"admin", "services", "asterisk", "mod", "func"},   cbi("asterisk-mod-func"),   "Functions",                              6)
37         entry({"admin", "services", "asterisk", "mod", "pbx"},    cbi("asterisk-mod-pbx"),    "PBX",                                    7)
38         entry({"admin", "services", "asterisk", "mod", "res"},    cbi("asterisk-mod-res"),    "Resources",                              8)
39         entry({"admin", "services", "asterisk", "mod", "res", "feature"},
40                 cbi("asterisk-mod-res-feature"), "Feature Module Configuration", 9 )
41
42
43         entry({"admin", "asterisk"},                            cbi("asterisk/main"),        "Asterisk",  99).i18n = "asterisk"
44
45         entry({"admin", "asterisk", "phones"},                  cbi("asterisk/phones"),      "Phones",       1)
46         entry({"admin", "asterisk", "phones", "sip"},           cbi("asterisk/phone_sip"),   nil,            1).leaf = true
47         --entry({"admin", "asterisk", "phones", "exten"},       cbi("asterisk/phone_exten"), "Extensions",   2).leaf = true
48
49         entry({"admin", "asterisk", "trunks"},                  cbi("asterisk/trunks"),      "Trunks",       2)
50         entry({"admin", "asterisk", "trunks", "sip"},           cbi("asterisk/trunk_sip"),   nil,            1).leaf = true
51
52         --entry({"admin", "asterisk", "dialplans"},                     cbi("asterisk/dialplans"),   "Call Routing", 3)
53         entry({"admin", "asterisk", "dialplans"},                       call("handle_dialplan"),     "Call Routing", 3)
54         entry({"admin", "asterisk", "dialplans", "out"},        cbi("asterisk/dialplan_out"),     nil,            1).leaf = true
55         entry({"admin", "asterisk", "dialplans", "zones"},      cbi("asterisk/dialzones"),              "Dial Zones",   2).leaf = true
56
57 end
58
59
60 function handle_dialplan()
61         local uci = luci.model.uci.cursor()
62
63         if luci.http.formvalue("delete") then
64                 local del = luci.http.formvalue("delete")
65                 if #del > 0 and not del:match("[^a-zA-Z0-9_]") then
66                         uci:delete("asterisk", del)
67                         uci:foreach("asterisk", "dialplan",
68                                 function(s)
69                                         if s.include then
70                                                 local inc = type(s.include) == "table" and s.include or
71                                                         luci.util.split(s.include, "%s+", nil, true)
72
73                                                 local inc2 = { }
74                                                 for _, v in ipairs(inc) do
75                                                         if v ~= del then
76                                                                 inc2[#inc2+1] = v
77                                                         end
78                                                 end
79
80                                                 uci:set("asterisk", s['.name'], "include", inc2)
81                                         end
82                                 end)
83
84                         uci:save("asterisk")
85                         uci:commit("asterisk")
86                 end
87         end
88
89         for k, v in pairs(luci.http.formvaluetable("create_entry")) do
90                 if #v > 0 and not v:match("[^a-zA-Z0-9_]") then
91                         uci:section("asterisk", "dialzone", v, {
92                                 context = k
93                         } )
94
95                         local inc = uci:get("asterisk", k, "include")
96                         inc = type(inc) == "table" and inc or
97                                 type(inc) == "string" and #inc > 0 and
98                                         luci.util.split(inc, "%s+", nil, true) or { }
99
100                         inc[#inc+1] = v
101
102                         uci:set("asterisk", k, "include", inc)
103                         uci:save("asterisk")
104                         uci:commit("asterisk")
105
106                         luci.http.redirect(luci.dispatcher.build_url(
107                                 "asterisk", "dialplans", "out", v
108                         ))
109
110                         return
111                 end
112         end
113
114         luci.template.render("asterisk/dialplans")
115 end