1) Massive whitespace reorganization (untabified, and made consistent everything).

2) Dropped some currently unneeded, commented-out, code from pbx-users.lua.
This commit is contained in:
Iordan Iordanov 2011-11-05 18:34:12 +00:00
parent f976533433
commit 5cd67479c3
8 changed files with 804 additions and 818 deletions

View file

@ -20,10 +20,10 @@
module("luci.controller.pbx", package.seeall)
function index()
entry({"admin", "services", "pbx"}, cbi("pbx"), "PBX", 80)
entry({"admin", "services", "pbx", "pbx-google"}, cbi("pbx-google"), "Google Accounts", 1)
entry({"admin", "services", "pbx", "pbx-voip"}, cbi("pbx-voip"), "SIP Accounts", 2)
entry({"admin", "services", "pbx", "pbx-users"}, cbi("pbx-users"), "User Accounts", 3)
entry({"admin", "services", "pbx", "pbx-calls"}, cbi("pbx-calls"), "Call Routing", 4)
entry({"admin", "services", "pbx", "pbs-advanced"}, cbi("pbx-advanced"), "Advanced Settings", 5)
entry({"admin", "services", "pbx"}, cbi("pbx"), "PBX", 80)
entry({"admin", "services", "pbx", "pbx-google"}, cbi("pbx-google"), "Google Accounts", 1)
entry({"admin", "services", "pbx", "pbx-voip"}, cbi("pbx-voip"), "SIP Accounts", 2)
entry({"admin", "services", "pbx", "pbx-users"}, cbi("pbx-users"), "User Accounts", 3)
entry({"admin", "services", "pbx", "pbx-calls"}, cbi("pbx-calls"), "Call Routing", 4)
entry({"admin", "services", "pbx", "pbs-advanced"}, cbi("pbx-advanced"), "Advanced Settings", 5)
end

View file

@ -33,194 +33,194 @@ defaultrtpend = 19900
-- Returns all the network related settings, including a constructed RTP range
function get_network_info()
externhost = m.uci:get(modulename, "advanced", "externhost")
ipaddr = m.uci:get("network", "lan", "ipaddr")
bindport = m.uci:get(modulename, "advanced", "bindport")
rtpstart = m.uci:get(modulename, "advanced", "rtpstart")
rtpend = m.uci:get(modulename, "advanced", "rtpend")
externhost = m.uci:get(modulename, "advanced", "externhost")
ipaddr = m.uci:get("network", "lan", "ipaddr")
bindport = m.uci:get(modulename, "advanced", "bindport")
rtpstart = m.uci:get(modulename, "advanced", "rtpstart")
rtpend = m.uci:get(modulename, "advanced", "rtpend")
if bindport == nil then bindport = defaultbindport end
if rtpstart == nil then rtpstart = defaultrtpstart end
if rtpend == nil then rtpend = defaultrtpend end
if bindport == nil then bindport = defaultbindport end
if rtpstart == nil then rtpstart = defaultrtpstart end
if rtpend == nil then rtpend = defaultrtpend end
if rtpstart == nil or rtpend == nil then
rtprange = nil
else
rtprange = rtpstart .. "-" .. rtpend
end
if rtpstart == nil or rtpend == nil then
rtprange = nil
else
rtprange = rtpstart .. "-" .. rtpend
end
return bindport, rtprange, ipaddr, externhost
return bindport, rtprange, ipaddr, externhost
end
-- If not present, insert empty rules in the given config & section named PBX-SIP and PBX-RTP
function insert_empty_sip_rtp_rules(config, section)
-- Add rules named PBX-SIP and PBX-RTP if not existing
found_sip_rule = false
found_rtp_rule = false
m.uci:foreach(config, section,
function(s1)
if s1._name == 'PBX-SIP' then
found_sip_rule = true
elseif s1._name == 'PBX-RTP' then
found_rtp_rule = true
end
end)
if found_sip_rule ~= true then
newrule=m.uci:add(config, section)
m.uci:set(config, newrule, '_name', 'PBX-SIP')
end
if found_rtp_rule ~= true then
newrule=m.uci:add(config, section)
m.uci:set(config, newrule, '_name', 'PBX-RTP')
end
-- Add rules named PBX-SIP and PBX-RTP if not existing
found_sip_rule = false
found_rtp_rule = false
m.uci:foreach(config, section,
function(s1)
if s1._name == 'PBX-SIP' then
found_sip_rule = true
elseif s1._name == 'PBX-RTP' then
found_rtp_rule = true
end
end)
if found_sip_rule ~= true then
newrule=m.uci:add(config, section)
m.uci:set(config, newrule, '_name', 'PBX-SIP')
end
if found_rtp_rule ~= true then
newrule=m.uci:add(config, section)
m.uci:set(config, newrule, '_name', 'PBX-RTP')
end
end
-- Delete rules in the given config & section named PBX-SIP and PBX-RTP
function delete_sip_rtp_rules(config, section)
-- Remove rules named PBX-SIP and PBX-RTP
commit = false
m.uci:foreach(config, section,
function(s1)
if s1._name == 'PBX-SIP' or s1._name == 'PBX-RTP' then
m.uci:delete(config, s1['.name'])
commit = true
end
end)
-- Remove rules named PBX-SIP and PBX-RTP
commit = false
m.uci:foreach(config, section,
function(s1)
if s1._name == 'PBX-SIP' or s1._name == 'PBX-RTP' then
m.uci:delete(config, s1['.name'])
commit = true
end
end)
-- If something changed, then we commit the config.
if commit == true then m.uci:commit(config) end
-- If something changed, then we commit the config.
if commit == true then m.uci:commit(config) end
end
-- Deletes QoS rules associated with this PBX.
function delete_qos_rules()
delete_sip_rtp_rules ("qos", "classify")
delete_sip_rtp_rules ("qos", "classify")
end
function insert_qos_rules()
-- Insert empty PBX-SIP and PBX-RTP rules if not present.
insert_empty_sip_rtp_rules ("qos", "classify")
-- Insert empty PBX-SIP and PBX-RTP rules if not present.
insert_empty_sip_rtp_rules ("qos", "classify")
-- Get the network information
bindport, rtprange, ipaddr, externhost = get_network_info()
-- Get the network information
bindport, rtprange, ipaddr, externhost = get_network_info()
-- Iterate through the QoS rules, and if there is no other rule with the same port
-- range at the express service level, insert this rule.
commit = false
m.uci:foreach("qos", "classify",
function(s1)
if s1._name == 'PBX-SIP' then
if s1.ports ~= bindport or s1.target ~= "Express" or s1.proto ~= "udp" then
m.uci:set("qos", s1['.name'], "ports", bindport)
m.uci:set("qos", s1['.name'], "proto", "udp")
m.uci:set("qos", s1['.name'], "target", "Express")
commit = true
end
elseif s1._name == 'PBX-RTP' then
if s1.ports ~= rtprange or s1.target ~= "Express" or s1.proto ~= "udp" then
m.uci:set("qos", s1['.name'], "ports", rtprange)
m.uci:set("qos", s1['.name'], "proto", "udp")
m.uci:set("qos", s1['.name'], "target", "Express")
commit = true
end
end
end)
-- Iterate through the QoS rules, and if there is no other rule with the same port
-- range at the express service level, insert this rule.
commit = false
m.uci:foreach("qos", "classify",
function(s1)
if s1._name == 'PBX-SIP' then
if s1.ports ~= bindport or s1.target ~= "Express" or s1.proto ~= "udp" then
m.uci:set("qos", s1['.name'], "ports", bindport)
m.uci:set("qos", s1['.name'], "proto", "udp")
m.uci:set("qos", s1['.name'], "target", "Express")
commit = true
end
elseif s1._name == 'PBX-RTP' then
if s1.ports ~= rtprange or s1.target ~= "Express" or s1.proto ~= "udp" then
m.uci:set("qos", s1['.name'], "ports", rtprange)
m.uci:set("qos", s1['.name'], "proto", "udp")
m.uci:set("qos", s1['.name'], "target", "Express")
commit = true
end
end
end)
-- If something changed, then we commit the qos config.
if commit == true then m.uci:commit("qos") end
-- If something changed, then we commit the qos config.
if commit == true then m.uci:commit("qos") end
end
-- This function is a (so far) unsuccessful attempt to manipulate the firewall rules from here
-- Need to do more testing and eventually move to this mode.
function maintain_firewall_rules()
-- Get the network information
bindport, rtprange, ipaddr, externhost = get_network_info()
-- Get the network information
bindport, rtprange, ipaddr, externhost = get_network_info()
commit = false
-- Only if externhost is set, do we control firewall rules.
if externhost ~= nil and bindport ~= nil and rtprange ~= nil then
-- Insert empty PBX-SIP and PBX-RTP rules if not present.
insert_empty_sip_rtp_rules ("firewall", "rule")
commit = false
-- Only if externhost is set, do we control firewall rules.
if externhost ~= nil and bindport ~= nil and rtprange ~= nil then
-- Insert empty PBX-SIP and PBX-RTP rules if not present.
insert_empty_sip_rtp_rules ("firewall", "rule")
-- Iterate through the firewall rules, and if the dest_port and dest_ip setting of the\
-- SIP and RTP rule do not match what we want configured, set all the entries in the rule\
-- appropriately.
m.uci:foreach("firewall", "rule",
function(s1)
if s1._name == 'PBX-SIP' then
if s1.dest_port ~= bindport then
m.uci:set("firewall", s1['.name'], "dest_port", bindport)
m.uci:set("firewall", s1['.name'], "src", "wan")
m.uci:set("firewall", s1['.name'], "proto", "udp")
m.uci:set("firewall", s1['.name'], "target", "ACCEPT")
commit = true
end
elseif s1._name == 'PBX-RTP' then
if s1.dest_port ~= rtprange then
m.uci:set("firewall", s1['.name'], "dest_port", rtprange)
m.uci:set("firewall", s1['.name'], "src", "wan")
m.uci:set("firewall", s1['.name'], "proto", "udp")
m.uci:set("firewall", s1['.name'], "target", "ACCEPT")
commit = true
end
end
end)
else
-- We delete the firewall rules if one or more of the necessary parameters are not set.
sip_rule_name=nil
rtp_rule_name=nil
-- First discover the configuration names of the rules.
m.uci:foreach("firewall", "rule",
function(s1)
if s1._name == 'PBX-SIP' then
sip_rule_name = s1['.name']
elseif s1._name == 'PBX-RTP' then
rtp_rule_name = s1['.name']
end
end)
-- Then, using the names, actually delete the rules.
if sip_rule_name ~= nil then
m.uci:delete("firewall", sip_rule_name)
commit = true
end
if rtp_rule_name ~= nil then
m.uci:delete("firewall", rtp_rule_name)
commit = true
end
end
-- Iterate through the firewall rules, and if the dest_port and dest_ip setting of the\
-- SIP and RTP rule do not match what we want configured, set all the entries in the rule\
-- appropriately.
m.uci:foreach("firewall", "rule",
function(s1)
if s1._name == 'PBX-SIP' then
if s1.dest_port ~= bindport then
m.uci:set("firewall", s1['.name'], "dest_port", bindport)
m.uci:set("firewall", s1['.name'], "src", "wan")
m.uci:set("firewall", s1['.name'], "proto", "udp")
m.uci:set("firewall", s1['.name'], "target", "ACCEPT")
commit = true
end
elseif s1._name == 'PBX-RTP' then
if s1.dest_port ~= rtprange then
m.uci:set("firewall", s1['.name'], "dest_port", rtprange)
m.uci:set("firewall", s1['.name'], "src", "wan")
m.uci:set("firewall", s1['.name'], "proto", "udp")
m.uci:set("firewall", s1['.name'], "target", "ACCEPT")
commit = true
end
end
end)
else
-- We delete the firewall rules if one or more of the necessary parameters are not set.
sip_rule_name=nil
rtp_rule_name=nil
-- First discover the configuration names of the rules.
m.uci:foreach("firewall", "rule",
function(s1)
if s1._name == 'PBX-SIP' then
sip_rule_name = s1['.name']
elseif s1._name == 'PBX-RTP' then
rtp_rule_name = s1['.name']
end
end)
-- Then, using the names, actually delete the rules.
if sip_rule_name ~= nil then
m.uci:delete("firewall", sip_rule_name)
commit = true
end
if rtp_rule_name ~= nil then
m.uci:delete("firewall", rtp_rule_name)
commit = true
end
end
-- If something changed, then we commit the firewall config.
if commit == true then m.uci:commit("firewall") end
-- If something changed, then we commit the firewall config.
if commit == true then m.uci:commit("firewall") end
end
m = Map (modulename, translate("Advanced Settings"),
translate("This section contains settings which do not need to be changed under\
normal circumstances. In addition, here you can configure your system\
for use with remote SIP devices, and resolve call quality issues by enabling\
the insertion of QoS rules."))
translate("This section contains settings which do not need to be changed under\
normal circumstances. In addition, here you can configure your system\
for use with remote SIP devices, and resolve call quality issues by enabling\
the insertion of QoS rules."))
-- Recreate the voip server config, and restart necessary services after changes are commited
-- to the advanced configuration. The firewall must restart because of "Remote Usage".
function m.on_after_commit(self)
-- Make sure firewall rules are in place
maintain_firewall_rules()
-- Make sure firewall rules are in place
maintain_firewall_rules()
-- If insertion of QoS rules is enabled
if m.uci:get(modulename, "advanced", "qos_enabled") == "yes" then
insert_qos_rules()
else
delete_qos_rules()
end
-- If insertion of QoS rules is enabled
if m.uci:get(modulename, "advanced", "qos_enabled") == "yes" then
insert_qos_rules()
else
delete_qos_rules()
end
luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null")
luci.sys.call("/etc/init.d/firewall restart 1\>/dev/null 2\>/dev/null")
luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null")
luci.sys.call("/etc/init.d/firewall restart 1\>/dev/null 2\>/dev/null")
end
-----------------------------------------------------------------------------
@ -230,45 +230,46 @@ s.anonymous = true
s:tab("general", translate("General Settings"))
s:tab("remote_usage", translate("Remote Usage"),
translatef("You can use your SIP devices/softphones with this system from a remote location\
as well, as long as your Internet Service Provider gives you a public IP.\
You will be able to call other local users for free (e.g. other Analog Telephone Adapters (ATAs))\
and use your VoIP providers to make calls as if you were at local to the PBX.\
After configuring this tab, go back to where users are configured and see the new\
Server and Port setting you need to configure the SIP devices with. Please note that by default\
%s uses UDP port range %d to %d for RTP traffic (which carries voice), in case you need to configure\
NAT or QoS on another device.", appname, defaultrtpstart, defaultrtpend))
as well, as long as your Internet Service Provider gives you a public IP.\
You will be able to call other local users for free (e.g. other Analog Telephone Adapters (ATAs))\
and use your VoIP providers to make calls as if you were at local to the PBX.\
After configuring this tab, go back to where users are configured and see the new\
Server and Port setting you need to configure the SIP devices with. Please note that by default\
%s uses UDP port range %d to %d for RTP traffic (which carries voice), in case you need to configure\
NAT or QoS on another device.", appname, defaultrtpstart, defaultrtpend))
s:tab("qos", translate("QoS Settings"),
translate("If you experience jittery or high latency audio during heavy downloads, you may want to enable QoS.\
QoS prioritizes traffic to and from your network for specified ports and IP addresses, resulting in\
better latency and throughput for sound in our case. If enabled below, a QoS rule for this service will\
be configured by the PBX automatically, but you must visit the QoS configuration page (Network->QoS) to\
configure other critical QoS settings like Download and Upload speed."))
translate("If you experience jittery or high latency audio during heavy downloads, you may want \
to enable QoS. QoS prioritizes traffic to and from your network for specified ports and IP \
addresses, resulting in better latency and throughput for sound in our case. If enabled below, \
a QoS rule for this service will be configured by the PBX automatically, but you must visit the \
QoS configuration page (Network->QoS) to configure other critical QoS settings like Download \
and Upload speed."))
ua = s:taboption("general", Value, "useragent", translate("User Agent String"),
translate("This is the name that the VoIP server will use to identify itself when\
registering to VoIP (SIP) providers. Some providers require this to a specific\
string matching a hardware SIP device."))
translate("This is the name that the VoIP server will use to identify itself when\
registering to VoIP (SIP) providers. Some providers require this to a specific\
string matching a hardware SIP device."))
ua.default = appname
h = s:taboption("remote_usage", Value, "externhost", translate("Domain Name/Dynamic Domain Name"),
translate("You should either have registered a domain name and have a static IP\
address, or have configured Dynamic DNS on this router. Enter a\
domain name which resolves to your external IP address."))
translate("You should either have registered a domain name and have a static IP\
address, or have configured Dynamic DNS on this router. Enter a\
domain name which resolves to your external IP address."))
h.datatype = "hostname"
p = s:taboption("remote_usage", Value, "bindport", translate("External SIP Port"),
translate("Pick a random port number between 6500 and 9500 for the service to listen on.\
Do not pick the standard 5060, because it is often subject to brute-force attacks.\
When finished, (1) click \"Save and Apply\", and (2) click the \"Restart VoIP Service\"\
button above. Finally, (3) look in the \"SIP Device/Softphone Accounts\" section for\
updated Server and Port settings for your SIP Devices/Softphones."))
translate("Pick a random port number between 6500 and 9500 for the service to listen on.\
Do not pick the standard 5060, because it is often subject to brute-force attacks.\
When finished, (1) click \"Save and Apply\", and (2) click the \"Restart VoIP Service\"\
button above. Finally, (3) look in the \"SIP Device/Softphone Accounts\" section for\
updated Server and Port settings for your SIP Devices/Softphones."))
p.datatype = "port"
p = s:taboption("remote_usage", Value, "rtpstart", translate("RTP Port Range Start"),
translate("RTP traffic carries actual voice packets. This is the start of the port range\
which will be used for setting up RTP communication. It's usually OK to leave this\
at the default value."))
translate("RTP traffic carries actual voice packets. This is the start of the port range\
which will be used for setting up RTP communication. It's usually OK to leave this\
at the default value."))
p.datatype = "port"
p.default = defaultrtpstart

View file

@ -39,245 +39,245 @@ end
m = Map (modulename, translate("Call Routing"),
translate("This is where you indicate which Google/SIP accounts are used to call what \
country/area codes, which users can use which SIP/Google accounts, how incoming\
calls are routed, what numbers can get into this PBX with a password, and what\
numbers are blacklisted."))
translate("This is where you indicate which Google/SIP accounts are used to call what \
country/area codes, which users can use which SIP/Google accounts, how incoming\
calls are routed, what numbers can get into this PBX with a password, and what\
numbers are blacklisted."))
-- Recreate the config, and restart services after changes are commited to the configuration.
function m.on_after_commit(self)
luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null")
luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null")
end
----------------------------------------------------------------------------------------------------
s = m:section(NamedSection, "outgoing_calls", "call_routing", translate("Outgoing Calls"),
translate("If you have more than one account which can make outgoing calls, you\
should enter a list of phone numbers and prefixes in the following fields for each\
provider listed. Invalid prefixes are removed silently, and only 0-9, X, Z, N, #, *,\
and + are valid characters. The letter X matches 0-9, Z matches 1-9, and N matches 2-9.\
For example to make calls to Germany through a provider, you can enter 49. To make calls\
to North America, you can enter 1NXXNXXXXXX. If one of your providers can make \"local\"\
calls to an area code like New York's 646, you can enter 646NXXXXXX for that\
provider. You should leave one account with an empty list to make calls with\
it by default, if no other provider's prefixes match. The system will automatically\
replace an empty list with a message that the provider dials all numbers. Be as specific as\
possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international dial codes\
are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a\
space-separated list, and/or one per line by hitting enter after every one."))
translate("If you have more than one account which can make outgoing calls, you\
should enter a list of phone numbers and prefixes in the following fields for each\
provider listed. Invalid prefixes are removed silently, and only 0-9, X, Z, N, #, *,\
and + are valid characters. The letter X matches 0-9, Z matches 1-9, and N matches 2-9.\
For example to make calls to Germany through a provider, you can enter 49. To make calls\
to North America, you can enter 1NXXNXXXXXX. If one of your providers can make \"local\"\
calls to an area code like New York's 646, you can enter 646NXXXXXX for that\
provider. You should leave one account with an empty list to make calls with\
it by default, if no other provider's prefixes match. The system will automatically\
replace an empty list with a message that the provider dials all numbers. Be as specific as\
possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international dial codes\
are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a space-separated\
list, and/or one per line by hitting enter after every one."))
s.anonymous = true
m.uci:foreach(googlemodulename, "gtalk_jabber",
function(s1)
if s1.username ~= nil and s1.name ~= nil and
s1.make_outgoing_calls == "yes" then
patt = s:option(DynamicList, s1.name, s1.username)
-- Add provider to the associative array of valid accounts.
validoutaccounts[s1.name] = s1.username
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function patt.cfgvalue(self, section)
value = self.map:get(section, self.option)
if value == nil then
return {"Dials any number"}
else
return value
end
end
-- Write only valid extensions into the config file.
function patt.write(self, section, value)
newvalue = {}
nindex = 1
for index, field in ipairs(value) do
val = luci.util.trim(value[index])
if is_valid_extension(val) == true then
newvalue[nindex] = val
nindex = nindex + 1
end
end
DynamicList.write(self, section, newvalue)
end
end
end)
function(s1)
if s1.username ~= nil and s1.name ~= nil and
s1.make_outgoing_calls == "yes" then
patt = s:option(DynamicList, s1.name, s1.username)
-- Add provider to the associative array of valid accounts.
validoutaccounts[s1.name] = s1.username
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function patt.cfgvalue(self, section)
value = self.map:get(section, self.option)
if value == nil then
return {"Dials any number"}
else
return value
end
end
-- Write only valid extensions into the config file.
function patt.write(self, section, value)
newvalue = {}
nindex = 1
for index, field in ipairs(value) do
val = luci.util.trim(value[index])
if is_valid_extension(val) == true then
newvalue[nindex] = val
nindex = nindex + 1
end
end
DynamicList.write(self, section, newvalue)
end
end
end)
m.uci:foreach(voipmodulename, "voip_provider",
function(s1)
if s1.defaultuser ~= nil and s1.host ~= nil and
s1.name ~= nil and s1.make_outgoing_calls == "yes" then
patt = s:option(DynamicList, s1.name, s1.defaultuser .. "@" .. s1.host)
function(s1)
if s1.defaultuser ~= nil and s1.host ~= nil and
s1.name ~= nil and s1.make_outgoing_calls == "yes" then
patt = s:option(DynamicList, s1.name, s1.defaultuser .. "@" .. s1.host)
-- Add provider to the associative array of valid accounts.
validoutaccounts[s1.name] = s1.defaultuser .. "@" .. s1.host
-- Add provider to the associative array of valid accounts.
validoutaccounts[s1.name] = s1.defaultuser .. "@" .. s1.host
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function patt.cfgvalue(self, section)
value = self.map:get(section, self.option)
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function patt.cfgvalue(self, section)
value = self.map:get(section, self.option)
if value == nil then
return {"Dials any number"}
else
return value
end
end
if value == nil then
return {"Dials any number"}
else
return value
end
end
-- Write only valid extensions into the config file.
function patt.write(self, section, value)
newvalue = {}
nindex = 1
for index, field in ipairs(value) do
val = luci.util.trim(value[index])
if is_valid_extension(val) == true then
newvalue[nindex] = val
nindex = nindex + 1
end
end
DynamicList.write(self, section, newvalue)
end
end
end)
-- Write only valid extensions into the config file.
function patt.write(self, section, value)
newvalue = {}
nindex = 1
for index, field in ipairs(value) do
val = luci.util.trim(value[index])
if is_valid_extension(val) == true then
newvalue[nindex] = val
nindex = nindex + 1
end
end
DynamicList.write(self, section, newvalue)
end
end
end)
----------------------------------------------------------------------------------------------------
s = m:section(NamedSection, "incoming_calls", "call_routing", translate("Incoming Calls"),
translate("For each provider that receives calls, here you can restrict which users to ring\
on incoming calls. If the list is empty, the system will indicate that all users\
which are enabled for incoming calls will ring. Invalid usernames will be rejected\
silently. Also, entering a username here overrides the user's setting to not receive\
incoming calls, so this way, you can make users ring only for select providers.\
Entries can be made in a space-separated list, and/or one per\
line by hitting enter after every one."))
translate("For each provider that receives calls, here you can restrict which users to ring\
on incoming calls. If the list is empty, the system will indicate that all users\
which are enabled for incoming calls will ring. Invalid usernames will be rejected\
silently. Also, entering a username here overrides the user's setting to not receive\
incoming calls, so this way, you can make users ring only for select providers.\
Entries can be made in a space-separated list, and/or one per\
line by hitting enter after every one."))
s.anonymous = true
m.uci:foreach(googlemodulename, "gtalk_jabber",
function(s1)
if s1.username ~= nil and s1.register == "yes" then
field_name=string.gsub(s1.username, "%W", "_")
gtalkaccts = s:option(DynamicList, field_name, s1.username)
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function gtalkaccts.cfgvalue(self, section)
value = self.map:get(section, self.option)
if value == nil then
return {"Rings all users"}
else
return value
end
end
function(s1)
if s1.username ~= nil and s1.register == "yes" then
field_name=string.gsub(s1.username, "%W", "_")
gtalkaccts = s:option(DynamicList, field_name, s1.username)
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function gtalkaccts.cfgvalue(self, section)
value = self.map:get(section, self.option)
if value == nil then
return {"Rings all users"}
else
return value
end
end
-- Write only valid user names.
function gtalkaccts.write(self, section, value)
newvalue = {}
nindex = 1
for index, field in ipairs(value) do
trimuser = luci.util.trim(value[index])
if allvalidusers[trimuser] == true then
newvalue[nindex] = trimuser
nindex = nindex + 1
end
end
DynamicList.write(self, section, newvalue)
end
end
end)
-- Write only valid user names.
function gtalkaccts.write(self, section, value)
newvalue = {}
nindex = 1
for index, field in ipairs(value) do
trimuser = luci.util.trim(value[index])
if allvalidusers[trimuser] == true then
newvalue[nindex] = trimuser
nindex = nindex + 1
end
end
DynamicList.write(self, section, newvalue)
end
end
end)
m.uci:foreach(voipmodulename, "voip_provider",
function(s1)
if s1.defaultuser ~= nil and s1.host ~= nil and s1.register == "yes" then
field_name=string.gsub(s1.defaultuser .. "_" .. s1.host, "%W", "_")
voipaccts = s:option(DynamicList, field_name, s1.defaultuser .. "@" .. s1.host)
function(s1)
if s1.defaultuser ~= nil and s1.host ~= nil and s1.register == "yes" then
field_name=string.gsub(s1.defaultuser .. "_" .. s1.host, "%W", "_")
voipaccts = s:option(DynamicList, field_name, s1.defaultuser .. "@" .. s1.host)
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function voipaccts.cfgvalue(self, section)
value = self.map:get(section, self.option)
if value == nil then
return {"Rings all users"}
else
return value
end
end
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function voipaccts.cfgvalue(self, section)
value = self.map:get(section, self.option)
if value == nil then
return {"Rings all users"}
else
return value
end
end
-- Write only valid user names.
function voipaccts.write(self, section, value)
newvalue = {}
nindex = 1
for index, field in ipairs(value) do
trimuser = luci.util.trim(value[index])
if allvalidusers[trimuser] == true then
newvalue[nindex] = trimuser
nindex = nindex + 1
end
end
DynamicList.write(self, section, newvalue)
end
end
end)
-- Write only valid user names.
function voipaccts.write(self, section, value)
newvalue = {}
nindex = 1
for index, field in ipairs(value) do
trimuser = luci.util.trim(value[index])
if allvalidusers[trimuser] == true then
newvalue[nindex] = trimuser
nindex = nindex + 1
end
end
DynamicList.write(self, section, newvalue)
end
end
end)
----------------------------------------------------------------------------------------------------
s = m:section(NamedSection, "providers_user_can_use", "call_routing",
translate("Providers Used for Outgoing Calls"),
translate("If you would like, you could restrict which providers users are allowed to use for outgoing\
calls. By default all users can use all providers. To show up in the list below the user should\
be allowed to make outgoing calls in the \"User Accounts\" page. Enter VoIP providers in the format\
username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste\
the providers from above. Invalid entries will be rejected silently. Entries can be made in a \
space-separated list, and/or one per line by hitting enter after every one."))
calls. By default all users can use all providers. To show up in the list below the user should\
be allowed to make outgoing calls in the \"User Accounts\" page. Enter VoIP providers in the format\
username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste\
the providers from above. Invalid entries will be rejected silently. Entries can be made in a \
space-separated list, and/or one per line by hitting enter after every one."))
s.anonymous = true
m.uci:foreach(usersmodulename, "local_user",
function(s1)
-- Add user to list of all valid users.
if s1.defaultuser ~= nil then allvalidusers[s1.defaultuser] = true end
function(s1)
-- Add user to list of all valid users.
if s1.defaultuser ~= nil then allvalidusers[s1.defaultuser] = true end
if s1.defaultuser ~= nil and s1.can_call == "yes" then
providers = s:option(DynamicList, s1.defaultuser, s1.defaultuser)
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function providers.cfgvalue(self, section)
value = self.map:get(section, self.option)
if s1.defaultuser ~= nil and s1.can_call == "yes" then
providers = s:option(DynamicList, s1.defaultuser, s1.defaultuser)
-- If the saved field is empty, we return a string
-- telling the user that this account would dial any exten.
function providers.cfgvalue(self, section)
value = self.map:get(section, self.option)
if value == nil then
return {"Uses all provider accounts"}
else
newvalue = {}
-- Convert internal names to user@host values.
for i,v in ipairs(value) do
newvalue[i] = validoutaccounts[v]
end
return newvalue
end
end
-- Cook the new values prior to entering them into the config file.
-- Also, enter them only if they are valid.
function providers.write(self, section, value)
cookedvalue = {}
cindex = 1
for index, field in ipairs(value) do
cooked = string.gsub(luci.util.trim(value[index]), "%W", "_")
if validoutaccounts[cooked] ~= nil then
cookedvalue[cindex] = cooked
cindex = cindex + 1
end
end
DynamicList.write(self, section, cookedvalue)
end
end
end)
if value == nil then
return {"Uses all provider accounts"}
else
newvalue = {}
-- Convert internal names to user@host values.
for i,v in ipairs(value) do
newvalue[i] = validoutaccounts[v]
end
return newvalue
end
end
-- Cook the new values prior to entering them into the config file.
-- Also, enter them only if they are valid.
function providers.write(self, section, value)
cookedvalue = {}
cindex = 1
for index, field in ipairs(value) do
cooked = string.gsub(luci.util.trim(value[index]), "%W", "_")
if validoutaccounts[cooked] ~= nil then
cookedvalue[cindex] = cooked
cindex = cindex + 1
end
end
DynamicList.write(self, section, cookedvalue)
end
end
end)
----------------------------------------------------------------------------------------------------
s = m:section(TypedSection, "callthrough_numbers", translate("Call-through Numbers"),
translate("Designate numbers which will be allowed to call through this system and which user's\
privileges it will have."))
translate("Designate numbers which will be allowed to call through this system and which user's\
privileges it will have."))
s.anonymous = true
s.addremove = true
@ -290,8 +290,8 @@ p:value("no", translate("No"))
p.default = "yes"
user = s:option(Value, "defaultuser", translate("User Name"),
translate("The number(s) specified above will be able to dial out with this user's providers.\
Invalid usernames are dropped silently, please verify that the entry was accepted."))
translate("The number(s) specified above will be able to dial out with this user's providers.\
Invalid usernames are dropped silently, please verify that the entry was accepted."))
function user.write(self, section, value)
trimuser = luci.util.trim(value)
if allvalidusers[trimuser] == true then
@ -300,9 +300,9 @@ function user.write(self, section, value)
end
pwd = s:option(Value, "pin", translate("PIN"),
translate("Your PIN disappears when saved for your protection. It will be changed\
only when you enter a value different from the saved one. Leaving the PIN\
empty is possible, but please beware of the security implications."))
translate("Your PIN disappears when saved for your protection. It will be changed\
only when you enter a value different from the saved one. Leaving the PIN\
empty is possible, but please beware of the security implications."))
pwd.password = true
pwd.rmempty = false
@ -322,19 +322,19 @@ end
----------------------------------------------------------------------------------------------------
s = m:section(NamedSection, "blacklisting", "call_routing", translate("Blacklisted Numbers"),
translate("Enter phone numbers that you want to decline calls from automatically.\
You should probably omit the country code and any leading\
zeroes, but please experiment to make sure you are blocking numbers from your\
desired area successfully."))
translate("Enter phone numbers that you want to decline calls from automatically.\
You should probably omit the country code and any leading\
zeroes, but please experiment to make sure you are blocking numbers from your\
desired area successfully."))
s.anonymous = true
b = s:option(DynamicList, "blacklist1", translate("Dynamic List of Blacklisted Numbers"),
translate("Specify numbers individually here. Press enter to add more numbers."))
translate("Specify numbers individually here. Press enter to add more numbers."))
b.cast = "string"
b.datatype = "uinteger"
b = s:option(Value, "blacklist2", translate("Space-Separated List of Blacklisted Numbers"),
translate("Copy-paste large lists of numbers here."))
translate("Copy-paste large lists of numbers here."))
b.template = "cbi/tvalue"
b.rows = 3

View file

@ -31,24 +31,24 @@ defaultstatus = "dnd"
defaultstatusmessage = "PBX online, may lose messages"
m = Map (modulename, translate("Google Accounts"),
translate("This is where you set up your Google (Talk and Voice) Accounts, in order to start\
using them for dialing and receiving calls (voice chat and real phone calls). Click \"Add\"\
to add as many accounts as you wish."))
translate("This is where you set up your Google (Talk and Voice) Accounts, in order to start\
using them for dialing and receiving calls (voice chat and real phone calls). Click \"Add\"\
to add as many accounts as you wish."))
-- Recreate the config, and restart services after changes are commited to the configuration.
function m.on_after_commit(self)
-- Create a field "name" for each account which identifies the account in the backend.
commit = false
m.uci:foreach(modulename, "gtalk_jabber",
function(s1)
if s1.username ~= nil then
name=string.gsub(s1.username, "%W", "_")
if s1.name ~= name then
m.uci:set(modulename, s1['.name'], "name", name)
commit = true
end
end
end)
function(s1)
if s1.username ~= nil then
name=string.gsub(s1.username, "%W", "_")
if s1.name ~= name then
m.uci:set(modulename, s1['.name'], "name", name)
commit = true
end
end
end)
if commit == true then m.uci:commit(modulename) end
luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
@ -63,9 +63,9 @@ s.addremove = true
s:option(Value, "username", translate("Email"))
pwd = s:option(Value, "secret", translate("Password"),
translate("When your password is saved, it disappears from this field and is not displayed\
for your protection. The previously saved password will be changed only when you\
enter a value different from the saved one."))
translate("When your password is saved, it disappears from this field and is not displayed\
for your protection. The previously saved password will be changed only when you\
enter a value different from the saved one."))
pwd.password = true
pwd.rmempty = false
@ -85,22 +85,22 @@ end
p = s:option(ListValue, "register",
translate("Enable Incoming Calls (See Status, Message below)"),
translate("When somebody starts voice chat with your GTalk account or calls the GVoice,\
number (if you have Google Voice), the call will be forwarded to any users\
that are online (registered using a SIP device or softphone) and permitted to\
receive the call. If you have Google Voice, you must go to your GVoice settings and\
forward calls to Google chat in order to actually receive calls made to your\
GVoice number. If you have trouble receiving calls from GVoice, experiment\
with the Call Screening option in your GVoice Settings. Finally, make sure no other\
client is online with this account (browser in gmail, mobile/desktop Google Talk\
App) as it may interfere."))
translate("Enable Incoming Calls (See Status, Message below)"),
translate("When somebody starts voice chat with your GTalk account or calls the GVoice,\
number (if you have Google Voice), the call will be forwarded to any users\
that are online (registered using a SIP device or softphone) and permitted to\
receive the call. If you have Google Voice, you must go to your GVoice settings and\
forward calls to Google chat in order to actually receive calls made to your\
GVoice number. If you have trouble receiving calls from GVoice, experiment\
with the Call Screening option in your GVoice Settings. Finally, make sure no other\
client is online with this account (browser in gmail, mobile/desktop Google Talk\
App) as it may interfere."))
p:value("yes", translate("Yes"))
p:value("no", translate("No"))
p.default = "yes"
p = s:option(ListValue, "make_outgoing_calls", translate("Enable Outgoing Calls"),
translate("Use this account to make outgoing calls as configured in the \"Call Routing\" section."))
translate("Use this account to make outgoing calls as configured in the \"Call Routing\" section."))
p:value("yes", translate("Yes"))
p:value("no", translate("No"))
p.default = "yes"
@ -113,7 +113,7 @@ st:value("available", translate("Available"))
st.default = defaultstatus
stm = s:option(Value, "statusmessage", translate("Account Status Message"),
translate("Avoid using anything but alpha-numeric characters, space, comma, and period."))
translate("Avoid using anything but alpha-numeric characters, space, comma, and period."))
stm:depends("register", "yes")
stm.default = defaultstatusmessage

View file

@ -28,35 +28,20 @@ end
modulename = "pbx-users"
modulenamecalls = "pbx-calls"
modulenameadvanced = "pbx-advanced"
m = Map (modulename, translate("User Accounts"),
translate("Here you must configure at least one SIP account, which you\
will use to register with this service. Use this account either in an analog telephony\
adapter (ATA), or in a SIP softphone like CSipSimple, Linphone, or Sipdroid on your\
Android smartphone, or X-lite or Ekiga on your computer. By default, all SIP accounts\
will ring simultaneously if a call is made to one of your VoIP provider accounts or GV\
numbers."))
translate("Here you must configure at least one SIP account, which you\
will use to register with this service. Use this account either in an analog telephony\
adapter (ATA), or in a SIP softphone like CSipSimple, Linphone, or Sipdroid on your\
Android smartphone, or X-lite or Ekiga on your computer. By default, all SIP accounts\
will ring simultaneously if a call is made to one of your VoIP provider accounts or GV\
numbers."))
-- Recreate the config, and restart services after changes are commited to the configuration.
function m.on_after_commit(self)
--allusers = ""
--ringusers = ""
--
---- Create two lists of users - one of all users and one of users enabled for incoming calls.
--m.uci:foreach(modulename, "local_user",
-- function(s1)
-- allusers = allusers .. " " .. s1.defaultuser
-- if s1.ring == "yes" then
-- ringusers = ringusers .. " " .. s1.defaultuser
-- end
-- end)
--
--m.uci:set (modulenamecalls, "valid_users", "allusers", allusers)
--m.uci:set (modulenamecalls, "valid_users", "ringusers", ringusers)
--m.uci:commit (modulenamecalls)
luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null")
luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null")
end
externhost = m.uci:get(modulenameadvanced, "advanced", "externhost")
@ -77,8 +62,8 @@ if bindport ~= nil then
end
s:option(DummyValue, "ipaddr", translate("Server Setting for Local SIP Devices"),
translate("Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices you will\
use ONLY locally and never from a remote location.")).default = ipaddr
translate("Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices you will\
use ONLY locally and never from a remote location.")).default = ipaddr
if externhost ~= nil then
if bindport ~= nil then
@ -86,20 +71,20 @@ if externhost ~= nil then
externhost = externhost .. ":" .. bindport
end
s:option(DummyValue, "externhost", translate("Server Setting for Remote SIP Devices"),
translate("Enter this hostname (or hostname:port) in the Server/Registrar setting of SIP\
devices you will use from a remote location (they will work locally too).")
).default = externhost
translate("Enter this hostname (or hostname:port) in the Server/Registrar setting of SIP\
devices you will use from a remote location (they will work locally too).")
).default = externhost
end
if bindport ~= nil then
s:option(DummyValue, "bindport", translate("Port Setting for SIP Devices"),
translatef("If setting Server/Registrar to %s or %s does not work for you, try setting\
it to %s or %s and entering this port number in a separate field which specifies the\
Server/Registrar port number. Beware that some devices have a confusing\
setting which sets the port where SIP requests originate from on the SIP\
device itself (bind port). The port specified on this page is NOT this bind port\
but the this service listens on.",
ipaddr, externhost, just_ipaddr, just_externhost)).default = bindport
s:option(DummyValue, "bindport", translate("Port Setting for SIP Devices"),
translatef("If setting Server/Registrar to %s or %s does not work for you, try setting\
it to %s or %s and entering this port number in a separate field which specifies the\
Server/Registrar port number. Beware that some devices have a confusing\
setting which sets the port where SIP requests originate from on the SIP\
device itself (bind port). The port specified on this page is NOT this bind port\
but the this service listens on.",
ipaddr, externhost, just_ipaddr, just_externhost)).default = bindport
end
-----------------------------------------------------------------------------
@ -108,16 +93,16 @@ s.anonymous = true
s.addremove = true
s:option(Value, "fullname", translate("Full Name"),
translate("You can specify a real name to show up in the Caller ID here."))
translate("You can specify a real name to show up in the Caller ID here."))
du = s:option(Value, "defaultuser", translate("User Name"),
translate("Use (four to five digit) numeric user name if you are connecting normal telephones\
with ATAs to this system (so they can dial user names)."))
translate("Use (four to five digit) numeric user name if you are connecting normal telephones\
with ATAs to this system (so they can dial user names)."))
du.datatype = "uciname"
pwd = s:option(Value, "secret", translate("Password"),
translate("Your password disappears when saved for your protection. It will be changed\
only when you enter a value different from the saved one."))
translate("Your password disappears when saved for your protection. It will be changed\
only when you enter a value different from the saved one."))
pwd.password = true
pwd.rmempty = false

View file

@ -28,25 +28,25 @@ end
modulename = "pbx-voip"
m = Map (modulename, translate("SIP Accounts"),
translate("This is where you set up your SIP (VoIP) accounts ts like Sipgate, SipSorcery,\
the popular Betamax providers, and any other providers with SIP settings in order to start \
using them for dialing and receiving calls (SIP uri and real phone calls). Click \"Add\" to\
add as many accounts as you wish."))
translate("This is where you set up your SIP (VoIP) accounts ts like Sipgate, SipSorcery,\
the popular Betamax providers, and any other providers with SIP settings in order to start \
using them for dialing and receiving calls (SIP uri and real phone calls). Click \"Add\" to\
add as many accounts as you wish."))
-- Recreate the config, and restart services after changes are commited to the configuration.
function m.on_after_commit(self)
commit = false
-- Create a field "name" for each account which identifies the account in the backend.
m.uci:foreach(modulename, "voip_provider",
function(s1)
if s1.defaultuser ~= nil and s1.host ~= nil then
name=string.gsub(s1.defaultuser.."_"..s1.host, "%W", "_")
if s1.name ~= name then
m.uci:set(modulename, s1['.name'], "name", name)
commit = true
end
end
end)
function(s1)
if s1.defaultuser ~= nil and s1.host ~= nil then
name=string.gsub(s1.defaultuser.."_"..s1.host, "%W", "_")
if s1.name ~= name then
m.uci:set(modulename, s1['.name'], "name", name)
commit = true
end
end
end)
if commit == true then m.uci:commit(modulename) end
luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
@ -60,9 +60,9 @@ s.addremove = true
s:option(Value, "defaultuser", translate("User Name"))
pwd = s:option(Value, "secret", translate("Password"),
translate("When your password is saved, it disappears from this field and is not displayed\
for your protection. The previously saved password will be changed only when you\
enter a value different from the saved one."))
translate("When your password is saved, it disappears from this field and is not displayed\
for your protection. The previously saved password will be changed only when you\
enter a value different from the saved one."))
@ -87,21 +87,21 @@ h = s:option(Value, "host", translate("SIP Server/Registrar"))
h.datatype = "host"
p = s:option(ListValue, "register", translate("Enable Incoming Calls (Register via SIP)"),
translate("This option should be set to \"Yes\" if you have a DID \(real telephone number\)\
associated with this SIP account or want to receive SIP uri calls through this\
provider."))
translate("This option should be set to \"Yes\" if you have a DID \(real telephone number\)\
associated with this SIP account or want to receive SIP uri calls through this\
provider."))
p:value("yes", translate("Yes"))
p:value("no", translate("No"))
p.default = "yes"
p = s:option(ListValue, "make_outgoing_calls", translate("Enable Outgoing Calls"),
translate("Use this account to make outgoing calls."))
translate("Use this account to make outgoing calls."))
p:value("yes", translate("Yes"))
p:value("no", translate("No"))
p.default = "yes"
from = s:option(Value, "fromdomain",
translate("SIP Realm (needed by some providers)"))
translate("SIP Realm (needed by some providers)"))
from.optional = true
from.datatype = "host"

View file

@ -52,16 +52,16 @@ function format_indices(string, indices)
for lpos,splitline in ipairs(splitlines) do
loutput = ""
for ipos,index in ipairs(indices) do
if splitline[index] ~= nil then
loutput = loutput .. string.format("%-50s", splitline[index])
else
loutput = nil
break
end
if splitline[index] ~= nil then
loutput = loutput .. string.format("%-50s", splitline[index])
else
loutput = nil
break
end
end
if loutput ~= nil then
output = output .. loutput .. "\n"
output = output .. loutput .. "\n"
end
end
return output
@ -69,7 +69,7 @@ end
m = Map (modulename, translate("PBX Main Page"),
translate("This configuration page allows you to configure a phone system (PBX) service which\
translate("This configuration page allows you to configure a phone system (PBX) service which\
permits making phone calls through multiple Google and SIP (like Sipgate,\
SipSorcery, and Betamax) accounts and sharing them among many SIP devices. \
Note that Google accounts, SIP accounts, and local user accounts are configured in the \
@ -84,7 +84,7 @@ m = Map (modulename, translate("PBX Main Page"),
-----------------------------------------------------------------------------------------
s = m:section(NamedSection, "connection_status", "main",
translate("Service Control and Connection Status"))
translate("Service Control and Connection Status"))
s.anonymous = true
s:option (DummyValue, "status", translate("Service Status"))
@ -103,7 +103,7 @@ function sts.cfgvalue(self, section)
return format_indices(regs, {1, 5}) ..
format_indices(jabs, {2, 4}) .. "\n" ..
format_indices(usrs, {1} ) .. "\n" .. chan
format_indices(usrs, {1} ) .. "\n" .. chan
elseif server == "freeswitch" then
return "Freeswitch is not supported yet.\n"

View file

@ -88,6 +88,7 @@ INCLUDED_FILES="$WORKDIR/extensions_blacklist.conf $WORKDIR/extensions_callthrou
# In this string, we concatenate all local users enabled to receive calls
# readily formatted for the Dial command.
localusers_to_ring=""
# In this string, we keep a list of all users that are enabled for outgoing
# calls. It is used at the end to create the user contexts.
localusers_can_dial=""
@ -101,12 +102,12 @@ outbound_providers=""
# Copies the template files which we don't edit.
copy_unedited_templates_over()
{
cp $TMPL_ASTERISK $WORKDIR/asterisk.conf
cp $TMPL_GTALK $WORKDIR/gtalk.conf
cp $TMPL_INDICATIONS $WORKDIR/indications.conf
cp $TMPL_LOGGER $WORKDIR/logger.conf
cp $TMPL_MANAGER $WORKDIR/manager.conf
cp $TMPL_MODULES $WORKDIR/modules.conf
cp $TMPL_ASTERISK $WORKDIR/asterisk.conf
cp $TMPL_GTALK $WORKDIR/gtalk.conf
cp $TMPL_INDICATIONS $WORKDIR/indications.conf
cp $TMPL_LOGGER $WORKDIR/logger.conf
cp $TMPL_MANAGER $WORKDIR/manager.conf
cp $TMPL_MODULES $WORKDIR/modules.conf
}
# Touches all the included files, to prevent asterisk from refusing to
@ -119,48 +120,48 @@ create_included_files()
# Puts together all the extensions.conf related configuration.
pbx_create_extensions_config()
{
sed "s/|LOCALUSERS|/$localusers_to_ring/g" $TMPL_EXTENSIONS > $WORKDIR/extensions.conf
mv $WORKDIR/inext.TMP $WORKDIR/extensions_incoming.conf
cp $TMPL_EXTINCNTXTGTALKHDR $WORKDIR/extensions_incoming_gtalk.conf
cat $WORKDIR/outextgtalk.TMP >> $WORKDIR/extensions_incoming_gtalk.conf 2>/dev/null
rm -f $WORKDIR/outextgtalk.TMP
mv $WORKDIR/blacklist.TMP $WORKDIR/extensions_blacklist.conf
mv $WORKDIR/userext.TMP $WORKDIR/extensions_user.conf
cp $TMPL_EXTCTHRUHDR $WORKDIR/extensions_callthrough.conf
cat $WORKDIR/callthrough.TMP >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
rm -f $WORKDIR/callthrough.TMP
cat $TMPL_EXTCTHRUCHECKHDR >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
cat $WORKDIR/callthroughcheck.TMP >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
rm -f $WORKDIR/callthroughcheck.TMP
cat $TMPL_EXTCTHRUCHECKFTR >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
rm -f $WORKDIR/outext-*.TMP
rm -f $WORKDIR/localext.TMP
sed "s/|LOCALUSERS|/$localusers_to_ring/g" $TMPL_EXTENSIONS > $WORKDIR/extensions.conf
mv $WORKDIR/inext.TMP $WORKDIR/extensions_incoming.conf
cp $TMPL_EXTINCNTXTGTALKHDR $WORKDIR/extensions_incoming_gtalk.conf
cat $WORKDIR/outextgtalk.TMP >> $WORKDIR/extensions_incoming_gtalk.conf 2>/dev/null
rm -f $WORKDIR/outextgtalk.TMP
mv $WORKDIR/blacklist.TMP $WORKDIR/extensions_blacklist.conf
mv $WORKDIR/userext.TMP $WORKDIR/extensions_user.conf
cp $TMPL_EXTCTHRUHDR $WORKDIR/extensions_callthrough.conf
cat $WORKDIR/callthrough.TMP >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
rm -f $WORKDIR/callthrough.TMP
cat $TMPL_EXTCTHRUCHECKHDR >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
cat $WORKDIR/callthroughcheck.TMP >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
rm -f $WORKDIR/callthroughcheck.TMP
cat $TMPL_EXTCTHRUCHECKFTR >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
rm -f $WORKDIR/outext-*.TMP
rm -f $WORKDIR/localext.TMP
}
# Puts together all the sip.conf related configuration.
pbx_create_sip_config()
{
mv $WORKDIR/sip_regs.TMP $WORKDIR/sip_registrations.conf
mv $WORKDIR/sip_peers.TMP $WORKDIR/sip_peers.conf
mv $WORKDIR/sip_users.TMP $WORKDIR/sip_users.conf
mv $WORKDIR/sip_regs.TMP $WORKDIR/sip_registrations.conf
mv $WORKDIR/sip_peers.TMP $WORKDIR/sip_peers.conf
mv $WORKDIR/sip_users.TMP $WORKDIR/sip_users.conf
}
# Creates the jabber.conf related config
pbx_create_jabber_config()
{
cp $TMPL_JABBER $WORKDIR/jabber.conf
mv $WORKDIR/jabber.TMP $WORKDIR/jabber_users.conf
cp $TMPL_JABBER $WORKDIR/jabber.conf
mv $WORKDIR/jabber.TMP $WORKDIR/jabber_users.conf
}
# Gets rid of any config files from $ASTERISKDIR not found in $WORKDIR.
clean_up_asterisk_config_dir()
{
for f in $ASTERISKDIR/* ; do
basef="`basename $f`"
if [ ! -e "$WORKDIR/$basef" ] ; then
rm -rf "$f"
fi
done
for f in $ASTERISKDIR/* ; do
basef="`basename $f`"
if [ ! -e "$WORKDIR/$basef" ] ; then
rm -rf "$f"
fi
done
}
# Compares md5sums of the config files in $WORKDIR to those
@ -168,22 +169,22 @@ clean_up_asterisk_config_dir()
# wear on flash in embedded devices.
compare_configs_and_copy_changed()
{
# First, compute md5sums of the config files in $WORKDIR.
cd $WORKDIR/
md5sum * > $MD5SUMSFILE
# First, compute md5sums of the config files in $WORKDIR.
cd $WORKDIR/
md5sum * > $MD5SUMSFILE
# Now, check the files in $ASTERISKDIR against the md5sums.
cd $ASTERISKDIR/
changed_files="`md5sum -c $MD5SUMSFILE 2>/dev/null | fgrep ": FAILED" | awk -F: '{print $1}'`"
# Now, check the files in $ASTERISKDIR against the md5sums.
cd $ASTERISKDIR/
changed_files="`md5sum -c $MD5SUMSFILE 2>/dev/null | fgrep ": FAILED" | awk -F: '{print $1}'`"
rm -f $MD5SUMSFILE
rm -f $MD5SUMSFILE
[ -z "$changed_files" ] && return
[ -z "$changed_files" ] && return
# Now copy over the changed files.
for f in $changed_files ; do
cp "$WORKDIR/$f" "$ASTERISKDIR/$f"
done
# Now copy over the changed files.
for f in $changed_files ; do
cp "$WORKDIR/$f" "$ASTERISKDIR/$f"
done
}
# Calls the functions that create the final config files
@ -192,72 +193,72 @@ compare_configs_and_copy_changed()
# Gets rid of $WORKDIR
pbx_assemble_and_copy_config()
{
mkdir -p $ASTERISKDIR
mkdir -p $ASTERISKDIR
copy_unedited_templates_over
create_included_files
pbx_create_extensions_config
pbx_create_sip_config
pbx_create_jabber_config
copy_unedited_templates_over
create_included_files
pbx_create_extensions_config
pbx_create_sip_config
pbx_create_jabber_config
touch $WORKDIR/features.conf
touch $WORKDIR/features.conf
# At this point, $WORKDIR should contain a complete, working config.
clean_up_asterisk_config_dir
# At this point, $WORKDIR should contain a complete, working config.
clean_up_asterisk_config_dir
compare_configs_and_copy_changed
compare_configs_and_copy_changed
[ ! -d $ASTERISKDIR/manager.d ] && mkdir -p $ASTERISKDIR/manager.d/
[ ! -d $ASTERISKDIR/manager.d ] && mkdir -p $ASTERISKDIR/manager.d/
# Get rid of the working directory
rm -rf $WORKDIR/
# Get rid of the working directory
rm -rf $WORKDIR/
}
# Creates configuration for a user and adds it to the temporary file that holds
# all users configured so far.
pbx_add_user()
{
local fullname
local defaultuser
local secret
local ring
local can_call
local fullname
local defaultuser
local secret
local ring
local can_call
config_get fullname $1 fullname
config_get defaultuser $1 defaultuser
config_get secret $1 secret
config_get ring $1 ring
config_get can_call $1 can_call
config_get fullname $1 fullname
config_get defaultuser $1 defaultuser
config_get secret $1 secret
config_get ring $1 ring
config_get can_call $1 can_call
[ -z "$defaultuser" -o -z "$secret" ] && return
[ -z "$fullname" ] && fullname="$defaultuser"
[ -z "$defaultuser" -o -z "$secret" ] && return
[ -z "$fullname" ] && fullname="$defaultuser"
sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPUSR > $WORKDIR/sip_user.tmp
sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPUSR > $WORKDIR/sip_user.tmp
if [ "$can_call" = "yes" ] ; then
# Add user to list of all users that are allowed to make calls.
localusers_can_dial="$localusers_can_dial $defaultuser"
sed -i "s/|CONTEXTNAME|/$defaultuser/g" $WORKDIR/sip_user.tmp
else
sed -i "s/|CONTEXTNAME|/$HANGUPCNTXT/g" $WORKDIR/sip_user.tmp
fi
if [ "$can_call" = "yes" ] ; then
# Add user to list of all users that are allowed to make calls.
localusers_can_dial="$localusers_can_dial $defaultuser"
sed -i "s/|CONTEXTNAME|/$defaultuser/g" $WORKDIR/sip_user.tmp
else
sed -i "s/|CONTEXTNAME|/$HANGUPCNTXT/g" $WORKDIR/sip_user.tmp
fi
# Add this user's configuration to the temp file containing all user configs.
sed "s/|FULLNAME|/$fullname/" $WORKDIR/sip_user.tmp |\
sed "s/|SECRET|/$secret/g" >> $WORKDIR/sip_users.TMP
# Add this user's configuration to the temp file containing all user configs.
sed "s/|FULLNAME|/$fullname/" $WORKDIR/sip_user.tmp |\
sed "s/|SECRET|/$secret/g" >> $WORKDIR/sip_users.TMP
if [ "$ring" = "yes" ] ; then
if [ -z "$localusers_to_ring" ] ; then
localusers_to_ring="SIP\/$defaultuser"
else
localusers_to_ring="$localusers_to_ring\&SIP\/$defaultuser"
fi
fi
if [ "$ring" = "yes" ] ; then
if [ -z "$localusers_to_ring" ] ; then
localusers_to_ring="SIP\/$defaultuser"
else
localusers_to_ring="$localusers_to_ring\&SIP\/$defaultuser"
fi
fi
# Add configuration which allows local users to call each other.
sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_EXTOUTLOCAL >> $WORKDIR/localext.TMP
# Add configuration which allows local users to call each other.
sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_EXTOUTLOCAL >> $WORKDIR/localext.TMP
rm -f $WORKDIR/sip_user.tmp
rm -f $WORKDIR/sip_user.tmp
}
# Creates configuration for a Google account, and adds it to the temporary file that holds
@ -265,84 +266,84 @@ pbx_add_user()
# Also creates the outgoing extensions which are used in users' outgoing contexts.
pbx_add_jabber()
{
local username
local secret
local numprefix
local register
local make_outgoing_calls
local name
local users_to_ring
local status
local statusmessage
local username
local secret
local numprefix
local register
local make_outgoing_calls
local name
local users_to_ring
local status
local statusmessage
config_get username $1 username
config_get secret $1 secret
config_get numprefix $1 numprefix
config_get register $1 register
config_get make_outgoing_calls $1 make_outgoing_calls
config_get name $1 name
config_get status $1 status
config_get statusmessage $1 statusmessage
config_get username $1 username
config_get secret $1 secret
config_get numprefix $1 numprefix
config_get register $1 register
config_get make_outgoing_calls $1 make_outgoing_calls
config_get name $1 name
config_get status $1 status
config_get statusmessage $1 statusmessage
[ -z "$username" -o -z "$secret" ] && return
[ -z "$username" -o -z "$secret" ] && return
# Construct a jabber entry for this provider.
sed "s/|USERNAME|/$username/g" $TMPL_JABBERUSER |\
sed "s/|NAME|/$name/g" > $WORKDIR/jabber.tmp
# Construct a jabber entry for this provider.
sed "s/|USERNAME|/$username/g" $TMPL_JABBERUSER |\
sed "s/|NAME|/$name/g" > $WORKDIR/jabber.tmp
if [ "$register" = yes ] ; then
# If this provider is enabled for incoming calls, we need to set the
# status of the user to something other than unavailable in order to receive calls.
sed -i "s/|STATUS|/$status/g" $WORKDIR/jabber.tmp
sed -i "s/|STATUSMESSAGE|/\"$statusmessage\"/g" $WORKDIR/jabber.tmp
if [ "$register" = yes ] ; then
# If this provider is enabled for incoming calls, we need to set the
# status of the user to something other than unavailable in order to receive calls.
sed -i "s/|STATUS|/$status/g" $WORKDIR/jabber.tmp
sed -i "s/|STATUSMESSAGE|/\"$statusmessage\"/g" $WORKDIR/jabber.tmp
users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`"
# If no users have been specified to ring, we ring all users enabled for incoming calls.
if [ -z "$users_to_ring" ] ; then
users_to_ring=$localusers_to_ring
else
# Else, we cook up a string formatted for the Dial command
# with the specified users (SIP/user1&SIP/user2&...). We do it
# with set, shift and a loop in order to be more tolerant of ugly whitespace
# messes entered by users.
set $users_to_ring
users_to_ring="SIP\/$1" && shift
for u in $@ ; do users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done
fi
users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`"
# If no users have been specified to ring, we ring all users enabled for incoming calls.
if [ -z "$users_to_ring" ] ; then
users_to_ring=$localusers_to_ring
else
# Else, we cook up a string formatted for the Dial command
# with the specified users (SIP/user1&SIP/user2&...). We do it
# with set, shift and a loop in order to be more tolerant of ugly whitespace
# messes entered by users.
set $users_to_ring
users_to_ring="SIP\/$1" && shift
for u in $@ ; do users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done
fi
# Now, we add this account to the gtalk incoming context.
sed "s/|USERNAME|/$username/g" $TMPL_EXTINCNTXTGTALK |\
sed "s/|LOCALUSERS|/$users_to_ring/g" >> $WORKDIR/outextgtalk.TMP
else
sed -i "s/|STATUS|/$GTALKUNVL/g" $WORKDIR/jabber.tmp
sed -i "s/|STATUSMESSAGE|/\"\"/g" $WORKDIR/jabber.tmp
fi
# Now, we add this account to the gtalk incoming context.
sed "s/|USERNAME|/$username/g" $TMPL_EXTINCNTXTGTALK |\
sed "s/|LOCALUSERS|/$users_to_ring/g" >> $WORKDIR/outextgtalk.TMP
else
sed -i "s/|STATUS|/$GTALKUNVL/g" $WORKDIR/jabber.tmp
sed -i "s/|STATUSMESSAGE|/\"\"/g" $WORKDIR/jabber.tmp
fi
# Add this account's configuration to the temp file containing all account configs.
sed "s/|SECRET|/$secret/g" $WORKDIR/jabber.tmp >> $WORKDIR/jabber.TMP
# Add this account's configuration to the temp file containing all account configs.
sed "s/|SECRET|/$secret/g" $WORKDIR/jabber.tmp >> $WORKDIR/jabber.TMP
# If this provider is enabled for outgoing calls.
if [ "$make_outgoing_calls" = "yes" ] ; then
# If this provider is enabled for outgoing calls.
if [ "$make_outgoing_calls" = "yes" ] ; then
numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`"
numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`"
# If no prefixes are specified, then we use "X" which matches any prefix.
[ -z "$numprefix" ] && numprefix="X"
# If no prefixes are specified, then we use "X" which matches any prefix.
[ -z "$numprefix" ] && numprefix="X"
for p in $numprefix ; do
sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTGTALK |\
sed "s/|NAME|/$name/g" >> $WORKDIR/outext-$name.TMP
done
for p in $numprefix ; do
sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTGTALK |\
sed "s/|NAME|/$name/g" >> $WORKDIR/outext-$name.TMP
done
# Add this provider to the list of enabled outbound providers.
if [ -z "$outbound_providers" ] ; then
outbound_providers="$name"
else
outbound_providers="$outbound_providers $name"
fi
fi
# Add this provider to the list of enabled outbound providers.
if [ -z "$outbound_providers" ] ; then
outbound_providers="$name"
else
outbound_providers="$outbound_providers $name"
fi
fi
rm -f $WORKDIR/jabber.tmp
rm -f $WORKDIR/jabber.tmp
}
# Creates configuration for a SIP provider account, and adds it to the temporary file that holds
@ -350,92 +351,92 @@ pbx_add_jabber()
# Also creates the outgoing extensions which are used in users' outgoing contexts.
pbx_add_peer()
{
local defaultuser
local secret
local host
local fromdomain
local register
local numprefix
local make_outgoing_calls
local name
local users_to_ring
local port
local outboundproxy
local defaultuser
local secret
local host
local fromdomain
local register
local numprefix
local make_outgoing_calls
local name
local users_to_ring
local port
local outboundproxy
config_get defaultuser $1 defaultuser
config_get secret $1 secret
config_get host $1 host
config_get port $1 port
config_get outbountproxy $1 outboundproxy
config_get fromdomain $1 fromdomain
config_get register $1 register
config_get numprefix $1 numprefix
config_get make_outgoing_calls $1 make_outgoing_calls
config_get name $1 name
config_get defaultuser $1 defaultuser
config_get secret $1 secret
config_get host $1 host
config_get port $1 port
config_get outbountproxy $1 outboundproxy
config_get fromdomain $1 fromdomain
config_get register $1 register
config_get numprefix $1 numprefix
config_get make_outgoing_calls $1 make_outgoing_calls
config_get name $1 name
[ -z "$defaultuser" -o -z "$secret" -o -z "$host" ] && return
[ -z "$fromdomain" ] && fromdomain=$host
[ -n "$port" ] && port="port=$port"
[ -n "$outboundproxy" ] && outboundproxy="outboundproxy=$outboundproxy"
[ -z "$defaultuser" -o -z "$secret" -o -z "$host" ] && return
[ -z "$fromdomain" ] && fromdomain=$host
[ -n "$port" ] && port="port=$port"
[ -n "$outboundproxy" ] && outboundproxy="outboundproxy=$outboundproxy"
# Construct a sip peer entry for this provider.
sed "s/|DEFAULTUSER|/$defaultuser/" $TMPL_SIPPEER > $WORKDIR/sip_peer.tmp
sed -i "s/|NAME|/$name/" $WORKDIR/sip_peer.tmp
sed -i "s/|FROMUSER|/$defaultuser/" $WORKDIR/sip_peer.tmp
sed -i "s/|SECRET|/$secret/" $WORKDIR/sip_peer.tmp
sed -i "s/|HOST|/$host/" $WORKDIR/sip_peer.tmp
sed -i "s/|PORT|/$port/" $WORKDIR/sip_peer.tmp
sed -i "s/|OUTBOUNDPROXY|/$outboundproxy/" $WORKDIR/sip_peer.tmp
# Add this account's configuration to the temp file containing all account configs.
sed "s/|FROMDOMAIN|/$host/" $WORKDIR/sip_peer.tmp >> $WORKDIR/sip_peers.TMP
# Construct a sip peer entry for this provider.
sed "s/|DEFAULTUSER|/$defaultuser/" $TMPL_SIPPEER > $WORKDIR/sip_peer.tmp
sed -i "s/|NAME|/$name/" $WORKDIR/sip_peer.tmp
sed -i "s/|FROMUSER|/$defaultuser/" $WORKDIR/sip_peer.tmp
sed -i "s/|SECRET|/$secret/" $WORKDIR/sip_peer.tmp
sed -i "s/|HOST|/$host/" $WORKDIR/sip_peer.tmp
sed -i "s/|PORT|/$port/" $WORKDIR/sip_peer.tmp
sed -i "s/|OUTBOUNDPROXY|/$outboundproxy/" $WORKDIR/sip_peer.tmp
# Add this account's configuration to the temp file containing all account configs.
sed "s/|FROMDOMAIN|/$host/" $WORKDIR/sip_peer.tmp >> $WORKDIR/sip_peers.TMP
# If this provider is enabled for incoming calls.
if [ "$register" = "yes" ] ; then
# Then we create a registration string for this provider.
sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPREG > $WORKDIR/sip_reg.tmp
sed -i "s/|SECRET|/$secret/g" $WORKDIR/sip_reg.tmp
sed "s/|NAME|/$name/g" $WORKDIR/sip_reg.tmp >> $WORKDIR/sip_regs.TMP
# If this provider is enabled for incoming calls.
if [ "$register" = "yes" ] ; then
# Then we create a registration string for this provider.
sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPREG > $WORKDIR/sip_reg.tmp
sed -i "s/|SECRET|/$secret/g" $WORKDIR/sip_reg.tmp
sed "s/|NAME|/$name/g" $WORKDIR/sip_reg.tmp >> $WORKDIR/sip_regs.TMP
users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`"
# If no users have been specified to ring, we ring all users enabled for incoming calls.
if [ -z "$users_to_ring" ] ; then
users_to_ring=$localusers_to_ring
else
# Else, we cook up a string formatted for the Dial command
# with the specified users (SIP/user1&SIP/user2&...). We do it
# with set, shift and a loop in order to be more tolerant of ugly whitespace
# messes entered by users.
set $users_to_ring
users_to_ring="SIP\/$1" && shift
for u in $@ ; do users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done
fi
users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`"
# If no users have been specified to ring, we ring all users enabled for incoming calls.
if [ -z "$users_to_ring" ] ; then
users_to_ring=$localusers_to_ring
else
# Else, we cook up a string formatted for the Dial command
# with the specified users (SIP/user1&SIP/user2&...). We do it
# with set, shift and a loop in order to be more tolerant of ugly whitespace
# messes entered by users.
set $users_to_ring
users_to_ring="SIP\/$1" && shift
for u in $@ ; do users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done
fi
# And we create an incoming calls context for this provider.
sed "s/|NAME|/$name/g" $TMPL_EXTINCNTXTSIP |\
sed "s/|LOCALUSERS|/$users_to_ring/g" >> $WORKDIR/inext.TMP
fi
# And we create an incoming calls context for this provider.
sed "s/|NAME|/$name/g" $TMPL_EXTINCNTXTSIP |\
sed "s/|LOCALUSERS|/$users_to_ring/g" >> $WORKDIR/inext.TMP
fi
# If this provider is enabled for outgoing calls.
if [ "$make_outgoing_calls" = "yes" ] ; then
# If this provider is enabled for outgoing calls.
if [ "$make_outgoing_calls" = "yes" ] ; then
numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`"
# If no prefixes are specified, then we use "X" which matches any prefix.
[ -z "$numprefix" ] && numprefix="X"
for p in $numprefix ; do
sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTSIP |\
sed "s/|NAME|/$name/g" >> $WORKDIR/outext-$name.TMP
done
numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`"
# If no prefixes are specified, then we use "X" which matches any prefix.
[ -z "$numprefix" ] && numprefix="X"
for p in $numprefix ; do
sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTSIP |\
sed "s/|NAME|/$name/g" >> $WORKDIR/outext-$name.TMP
done
# Add this provider to the list of enabled outbound providers.
if [ -z "$outbound_providers" ] ; then
outbound_providers="$name"
else
outbound_providers="$outbound_providers $name"
fi
fi
# Add this provider to the list of enabled outbound providers.
if [ -z "$outbound_providers" ] ; then
outbound_providers="$name"
else
outbound_providers="$outbound_providers $name"
fi
fi
rm -f $WORKDIR/sip_peer.tmp
rm -f $WORKDIR/sip_reg.tmp
rm -f $WORKDIR/sip_peer.tmp
rm -f $WORKDIR/sip_reg.tmp
}
# For all local users enabled for outbound calls, creates a context
@ -443,93 +444,93 @@ pbx_add_peer()
# allowed to use.
pbx_create_user_contexts()
{
local providers
local providers
for u in $localusers_can_dial ; do
sed "s/|DEFAULTUSER|/$u/g" $TMPL_EXTUSERCNTXTHDR >> $WORKDIR/userext.TMP
cat $WORKDIR/localext.TMP >> $WORKDIR/userext.TMP
providers="`uci -q get ${MODULENAME}-calls.providers_user_can_use.$u`"
[ -z "$providers" ] && providers="$outbound_providers"
for u in $localusers_can_dial ; do
sed "s/|DEFAULTUSER|/$u/g" $TMPL_EXTUSERCNTXTHDR >> $WORKDIR/userext.TMP
cat $WORKDIR/localext.TMP >> $WORKDIR/userext.TMP
providers="`uci -q get ${MODULENAME}-calls.providers_user_can_use.$u`"
[ -z "$providers" ] && providers="$outbound_providers"
# For each provider, cat the contents of outext-$name.TMP into the user's outgoing calls extension
for p in $providers ; do
[ -f $WORKDIR/outext-$p.TMP ] && cat $WORKDIR/outext-$p.TMP >> $WORKDIR/userext.TMP
done
cat $TMPL_EXTUSERCNTXTFTR >> $WORKDIR/userext.TMP
done
# For each provider, cat the contents of outext-$name.TMP into the user's outgoing calls extension
for p in $providers ; do
[ -f $WORKDIR/outext-$p.TMP ] && cat $WORKDIR/outext-$p.TMP >> $WORKDIR/userext.TMP
done
cat $TMPL_EXTUSERCNTXTFTR >> $WORKDIR/userext.TMP
done
}
# Creates the blacklist context which hangs up on blacklisted numbers.
pbx_add_blacklist()
{
local blacklist1
local blacklist2
local blacklist1
local blacklist2
config_get blacklist1 blacklisting blacklist1
config_get blacklist2 blacklisting blacklist2
config_get blacklist1 blacklisting blacklist1
config_get blacklist2 blacklisting blacklist2
# We create the blacklist context no matter whether the blacklist
# actually contains entries or not, since the PBX will send calls
# to the context for a check against the list anyway.
cp $TMPL_EXTBLKLISTHDR $WORKDIR/blacklist.TMP
for n in $blacklist1 $blacklist2 ; do
sed "s/|BLACKLISTITEM|/$n/g" $TMPL_EXTBLKLIST >> $WORKDIR/blacklist.TMP
done
cat $TMPL_EXTBLKLISTFTR >> $WORKDIR/blacklist.TMP
# We create the blacklist context no matter whether the blacklist
# actually contains entries or not, since the PBX will send calls
# to the context for a check against the list anyway.
cp $TMPL_EXTBLKLISTHDR $WORKDIR/blacklist.TMP
for n in $blacklist1 $blacklist2 ; do
sed "s/|BLACKLISTITEM|/$n/g" $TMPL_EXTBLKLIST >> $WORKDIR/blacklist.TMP
done
cat $TMPL_EXTBLKLISTFTR >> $WORKDIR/blacklist.TMP
}
# Creates the callthrough context which allows specified numbers to get
# into the PBX and dial out as the configured user.
pbx_add_callthrough()
{
local callthrough_number_list
local defaultuser
local pin
local enabled
local callthrough_number_list
local defaultuser
local pin
local enabled
config_get callthrough_number_list $1 callthrough_number_list
config_get defaultuser $1 defaultuser
config_get pin $1 pin
config_get enabled $1 enabled
config_get callthrough_number_list $1 callthrough_number_list
config_get defaultuser $1 defaultuser
config_get pin $1 pin
config_get enabled $1 enabled
[ "$enabled" = "no" ] && return
[ "$defaultuser" = "" ] && return
[ "$enabled" = "no" ] && return
[ "$defaultuser" = "" ] && return
for callthrough_number in $callthrough_number_list ; do
sed "s/|NUMBER|/$callthrough_number/g" $TMPL_EXTCTHRUCHECK >> $WORKDIR/callthroughcheck.TMP
for callthrough_number in $callthrough_number_list ; do
sed "s/|NUMBER|/$callthrough_number/g" $TMPL_EXTCTHRUCHECK >> $WORKDIR/callthroughcheck.TMP
sed "s/|NUMBER|/$callthrough_number/g" $TMPL_EXTCTHRU |\
sed "s/|DEFAULTUSER|/$defaultuser/" |\
sed "s/|PIN|/$pin/" >> $WORKDIR/callthrough.TMP
done
sed "s/|NUMBER|/$callthrough_number/g" $TMPL_EXTCTHRU |\
sed "s/|DEFAULTUSER|/$defaultuser/" |\
sed "s/|PIN|/$pin/" >> $WORKDIR/callthrough.TMP
done
}
# Creates sip.conf from its template.
pbx_cook_sip_template()
{
local useragent
local externhost
local bindport
local useragent
local externhost
local bindport
config_get useragent advanced useragent
config_get externhost advanced externhost
config_get bindport advanced bindport
config_get useragent advanced useragent
config_get externhost advanced externhost
config_get bindport advanced bindport
[ -z "$useragent" ] && useragent="$USERAGENT"
[ -z "$useragent" ] && useragent="$USERAGENT"
sed "s/|USERAGENT|/$useragent/g" $TMPL_SIP > $WORKDIR/sip.conf
sed "s/|USERAGENT|/$useragent/g" $TMPL_SIP > $WORKDIR/sip.conf
if [ -z "$externhost" ] ; then
sed -i "s/externhost=|EXTERNHOST|//g" $WORKDIR/sip.conf
else
sed -i "s/|EXTERNHOST|/$externhost/g" $WORKDIR/sip.conf
fi
if [ -z "$externhost" ] ; then
sed -i "s/externhost=|EXTERNHOST|//g" $WORKDIR/sip.conf
else
sed -i "s/|EXTERNHOST|/$externhost/g" $WORKDIR/sip.conf
fi
if [ -z "$bindport" ] ; then
sed -i "s/bindport=|BINDPORT|//g" $WORKDIR/sip.conf
else
sed -i "s/|BINDPORT|/$bindport/g" $WORKDIR/sip.conf
fi
if [ -z "$bindport" ] ; then
sed -i "s/bindport=|BINDPORT|//g" $WORKDIR/sip.conf
else
sed -i "s/|BINDPORT|/$bindport/g" $WORKDIR/sip.conf
fi
}
@ -537,58 +538,57 @@ pbx_cook_sip_template()
# Creates rtp.conf from its template.
pbx_cook_rtp_template()
{
local rtpstart
local rtpend
local rtpstart
local rtpend
config_get rtpstart advanced rtpstart
config_get rtpend advanced rtpend
config_get rtpstart advanced rtpstart
config_get rtpend advanced rtpend
sed "s/|RTPSTART|/$rtpstart/" $TMPL_RTP |\
sed "s/|RTPEND|/$rtpend/" > $WORKDIR/rtp.conf
sed "s/|RTPSTART|/$rtpstart/" $TMPL_RTP |\
sed "s/|RTPEND|/$rtpend/" > $WORKDIR/rtp.conf
}
# Makes sure the ownership of specified directories is proper.
pbx_fix_ownership()
{
chown $ASTUSER:$ASTGROUP $ASTDIRS
chown $ASTUSER:$ASTGROUP -R $ASTDIRSRECURSIVE
chown $ASTUSER:$ASTGROUP $ASTDIRS
chown $ASTUSER:$ASTGROUP -R $ASTDIRSRECURSIVE
}
start() {
mkdir -p $WORKDIR
mkdir -p $WORKDIR
# Create the users.
config_load ${MODULENAME}-users
config_foreach pbx_add_user local_user
# Create the users.
config_load ${MODULENAME}-users
config_foreach pbx_add_user local_user
# Create configuration for each google account.
config_unset
config_load ${MODULENAME}-google
config_foreach pbx_add_jabber gtalk_jabber
# Create configuration for each google account.
config_unset
config_load ${MODULENAME}-google
config_foreach pbx_add_jabber gtalk_jabber
# Create configuration for each voip provider.
config_unset
config_load ${MODULENAME}-voip
config_foreach pbx_add_peer voip_provider
# Create configuration for each voip provider.
config_unset
config_load ${MODULENAME}-voip
config_foreach pbx_add_peer voip_provider
# Create the user contexts, and phone blacklist.
config_unset
config_load ${MODULENAME}-calls
pbx_create_user_contexts
pbx_add_blacklist
config_foreach pbx_add_callthrough callthrough_numbers
# Create the user contexts, and phone blacklist.
config_unset
config_load ${MODULENAME}-calls
pbx_create_user_contexts
pbx_add_blacklist
config_foreach pbx_add_callthrough callthrough_numbers
# Prepare sip.conf using settings from the "advanced" section.
config_unset
config_load ${MODULENAME}-advanced
pbx_cook_sip_template
pbx_cook_rtp_template
# Prepare sip.conf using settings from the "advanced" section.
config_unset
config_load ${MODULENAME}-advanced
pbx_cook_sip_template
pbx_cook_rtp_template
# Assemble the configuration, and copy changed files over.
pbx_assemble_and_copy_config
# Enforce ownership of specified files and directories.
pbx_fix_ownership
}
# Assemble the configuration, and copy changed files over.
pbx_assemble_and_copy_config
# Enforce ownership of specified files and directories.
pbx_fix_ownership
}