To put this dial plan example into context, I have the following providers:
Provider1: Outgoing Calls only, mostly North America
Provider2: Outgoing Calls only, mostly International
Provider3: Incoming DID calls (Contact field for registration set as sip:provider3.mssusername@sip.mysipswitch.com)
Provider4: Incoming DID calls (Contact field for registration set as sip:provider4.mssusername@sip.mysipswitch.com)
Provider 5: Incoming DID calls (Contact field for registration set as sip:provider5.mssusername@sip.mysipswitch.com)
SipBroker: Set up as a provider with anon username and no password
PhoneGnome: For calls to PG users
VoXalot: Default provider
The entire following Ruby script is what I am using, however I have divided in in parts to make it easier to understand how to accomplish each part.
Note that except #Ruby, everything else after a # is a comment and does not affect the program but simply is there for guidance
The whole script is one large If-else statement with more if and case statements embedded.
By dividing it into parts, it also helps for you to see a scaffold. For example, if you do not require the "#****Route Calls based on Caller ID Only****" section, simply do not use it, as long as you remember to remove the end statement corresponding to the case statement in that section:
- Code: Select all
#Ruby
sys.log("***Starting New Call Event***")
#********Incoming Calls********
- Code: Select all
#****This Part collects call information for the log****
if sys.In then
sys.log("***Incoming Call Starting***")
sys.log("Incoming Call From #{req.Header.From.FromName} at #{req.Header.From.FromURI.User}@#{req.Header.From.FromURI.Host}")
sys.log("Call is for #{req.URI.User}")
cid = req.Header.From.FromURI.User
trunk = req.URI.User
sys.log("*** CID: #{cid} | Trunk: #{trunk} ***")
- Code: Select all
#****Route Calls based on Caller ID + Trunk****
if sys.RegexMatch(trunk, "provider3.mssuser") and sys.RegexMatch(cid, "4169391212") then
sys.log("Routing CallBack for 4169391212")
sys.Callback("14169391212@Provider1" , "*774914166239612@SipBroker" , 15)
else
if sys.RegexMatch(trunk, "provider3.mssuser") and sys.RegexMatch(cid, "6478959191") then
sys.log("Routing CallBack for 6478959191")
sys.Callback("16478959191@Provider1" , "*774914166239612@SipBroker" , 15)
- Code: Select all
else
- Code: Select all
#****Route Calls based on Caller ID Only****
case cid
when /^4168882222/ then
sys.log("Rejecting call from #{req.Header.From.FromURI.User}")
sys.Respond(488, "Your call is not welcome")
when /^8883334545/ then
sys.Log("Rejecting call from #{req.Header.From.FromURI.User}")
sys.Respond(488, "Your call is not welcome")
when /^4162223333/ then
sys.Log("Forwarding call from #{req.Header.From.FromURI.User} to Mobile")
sys.Dial("14169392323@Provider1")
- Code: Select all
else
- Code: Select all
#****Route calls based on Trunk Only****
case trunk
when /provider3.mssuser/ then
sys.Log("Initiating Call Forward-1")
sys.dial("**466@PhoneGnome")
when /provider5.mssuser/ then
sys.Log("Initiating Call Forward-2")
sys.dial("14169392424@Provider1")
- Code: Select all
else
- Code: Select all
#****Have Calls Ring ATA or Forward if Offline****
sys.Log("Accepting Call")
if sys.IsAvailable() then
sys.Log("The ATA is online.")
sys.Dial("local")
else
sys.Log("The ATA is off-line.")
sys.Dial("165528@us.voxalot.com")
end
- Code: Select all
#****End Statements****
end #cid+trunk rule 1
end #cid+trunk rule 2
end #case trunk
end #case cid
- Code: Select all
else
#********Outgoing Calls********
- Code: Select all
sys.log("***Outgoing Call Starting***")
number_called = req.URI.User
- Code: Select all
#****Block Calls to certain numbers****
case number_called
when /^1900/
sys.Log("Call to #{req.URI.User} not allowed")
sys.Respond(488, "Call not allowed")
when /^900/
sys.Log("Call to #{req.URI.User} not allowed")
sys.Respond(488, "Call not allowed")
- Code: Select all
else
- Code: Select all
#****Adjust for 7 digit and 10 digit Dialing****
number_length = req.URI.User.Length.to_s
sys.log("Number is #{number_length} digits long")
case number_length
when /^7/
sys.Log("Local Call to 416#{req.URI.User}")
sys.Dial("1416${dst}@Provider1")
when /^10/
sys.Log("National Call to 1#{req.URI.User}")
sys.Dial("1${dst}@Provider1")
- Code: Select all
else
- Code: Select all
#****Outgoing Dial Plans****
case number_called
when /^\*1/
sys.Log("Dialing #{req.URI.User} via Provider1.")
sys.Dial("${dst:2}@Provider1")
when /^\*2/ then
sys.Log("Dialing #{req.URI.User} via VoXPG.")
sys.Dial("${dst:2}@Provider2")
when /^\*500/ then
sys.Log("Dialing VoXalot VoiceMail.")
sys.Dial("*010*500@sipbroker.com")
when /^1/ then
sys.Log("Dialing North American Number #{req.URI.User}.")
sys.Dial("Provider1")
when /^011/ then
sys.Log("Dialing International Number #{req.URI.User}.")
sys.Dial("Provider2")
- Code: Select all
else
- Code: Select all
#****If there is no other match****
sys.Log("No Dial Plan Match: Trying Default Rule")
sys.Dial("VoXalot")
- Code: Select all
#****End Statements****
end # case for outgoing dialplans
end # case for number length
end # case for blocked numbers
end
2. Regular Expression examples for Ruby
This is to further help as you write your own Ruby plan:
Example 1
Regular Syntax:
exten => _*1X.,1,Switch(${EXTEN:2}@provider)
Can be written in Ruby within a case statement as:
- Code: Select all
when /^\*1/ then sys.Dial("${dst:2}@provider")
or
when /^\*1.*$/ then sys.Dial("${dst:2}@provider")
or
when /\*1.*/ then sys.Dial("${dst:2}@provider")
or within an if statement as:
- Code: Select all
if req.URI.User.StartsWith("*1") then
sys.Dial("${dst:2}@provider")
end
Example 2
Regular Syntax:
exten => _11X.,1,Switch(${EXTEN:2}@provider)
Can be written in Ruby within a case statement as:
- Code: Select all
when /^11/ then sys.Dial("${dst:2}@provider")
or
when /^11.*$/ then sys.Dial("${dst:2}@provider")
or
when /11.*/ then sys.Dial("${dst:2}@provider")
or within an if statement as:
- Code: Select all
if req.URI.User.StartsWith("11") then
sys.Dial("${dst:2}@provider")
end
Example 3
Regular Syntax:
exten => _12,1,Switch(12@provider)
can be written in Ruby as:
- Code: Select all
when /^12$/ then sys.Dial("12@provider")
See https://www.mysipswitch.com/forum/viewtopic.php?t=579
Example 4
Regular Syntax:
exten => _13.,1,Switch(${EXTEN:2}@provider)
Can be written in Ruby as:
when /^13.*$/ then sys.Dial("${dst:2}@provider")
Regular Syntax
exten => _13x.,1,Switch(${EXTEN:2}@provider)
Can be written in Ruby as:
when /^13.+$/ then sys.Dial("${dst:2}@provider")
Regular Syntax
exten => _13xxxx,1,Switch(${EXTEN:2}@provider)
Can be written in Ruby as:
when /^13.{4}$/ then sys.Dial("${dst:2}@provider")
See https://www.mysipswitch.com/forum/viewtopic.php?t=598
