From c21e2e45a83d7735cbf086142e021193b07efe3f Mon Sep 17 00:00:00 2001 From: Rusty Newton Date: Fri, 27 Mar 2015 21:21:05 +0000 Subject: configs/basic-pbx - Super Awesome Company example configs Phase 1, Patch 2 Example configuration files for a "basic PBX" deployment for the fictitious Super Awesome Company. Details at https://reviewboard.asterisk.org/r/4488/ and https://wiki.asterisk.org/wiki/display/AST/Super+Awesome+Company Patch 4488 includes all functionality needed for SAC's outside connectivity and some externally accessed features, as well as outbound dialing. Reported by: Malcolm Davenport Tested by: Rusty Newton Review: https://reviewboard.asterisk.org/r/4488/ ........ Merged revisions 433624 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@433637 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- configs/basic-pbx/cdr.conf | 7 ++ configs/basic-pbx/cdr_custom.conf | 4 + configs/basic-pbx/extensions.conf | 165 +++++++++++++++++++++++++++++++------- configs/basic-pbx/logger.conf | 2 +- configs/basic-pbx/modules.conf | 10 +++ configs/basic-pbx/pjsip.conf | 49 ++++++++++- 6 files changed, 207 insertions(+), 30 deletions(-) create mode 100644 configs/basic-pbx/cdr.conf create mode 100644 configs/basic-pbx/cdr_custom.conf (limited to 'configs') diff --git a/configs/basic-pbx/cdr.conf b/configs/basic-pbx/cdr.conf new file mode 100644 index 000000000..e8749e37d --- /dev/null +++ b/configs/basic-pbx/cdr.conf @@ -0,0 +1,7 @@ +[general] +enable=yes + +[custom] +; We log the unique ID as it can be useful for troubleshooting any issues +; that arise. +loguniqueid=yes diff --git a/configs/basic-pbx/cdr_custom.conf b/configs/basic-pbx/cdr_custom.conf new file mode 100644 index 000000000..12ad24fe4 --- /dev/null +++ b/configs/basic-pbx/cdr_custom.conf @@ -0,0 +1,4 @@ +[mappings] +; Our CDR log will be written to /var/log/asterisk/cdr-custom/Master.csv +; with the following schema. +Master.csv => ${CSV_QUOTE(${CDR(clid)})},${CSV_QUOTE(${CDR(src)})},${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(dcontext)})},${CSV_QUOTE(${CDR(channel)})},${CSV_QUOTE(${CDR(dstchannel)})},${CSV_QUOTE(${CDR(lastapp)})},${CSV_QUOTE(${CDR(lastdata)})},${CSV_QUOTE(${CDR(start)})},${CSV_QUOTE(${CDR(answer)})},${CSV_QUOTE(${CDR(end)})},${CSV_QUOTE(${CDR(duration)})},${CSV_QUOTE(${CDR(billsec)})},${CSV_QUOTE(${CDR(disposition)})},${CSV_QUOTE(${CDR(amaflags)})},${CSV_QUOTE(${CDR(accountcode)})},${CSV_QUOTE(${CDR(uniqueid)})},${CSV_QUOTE(${CDR(userfield)})},${CDR(sequence)} diff --git a/configs/basic-pbx/extensions.conf b/configs/basic-pbx/extensions.conf index ec4b0bd94..9212ff11d 100644 --- a/configs/basic-pbx/extensions.conf +++ b/configs/basic-pbx/extensions.conf @@ -1,58 +1,169 @@ [globals] -; General internal dialing options used in context Internal at -; extension dial_internal_exten. See the Dial app documentation for options. -INTERNAL_DIAL_OPT=,10 +; General internal dialing options used in context Dial-Users. +; Only the timeout is defined here. See the Dial app documentation for +; additional options. +INTERNAL_DIAL_OPT=,30 [Hints] -;Allow dynamic hint creation for every extension. +; Allow dynamic hint creation for every extension. exten = _11XX,hint,PJSIP/${EXTEN} [Features] -;Extension to check user voicemail. +; Extension to check user voicemail. We don't requre the user to enter +; their pincode. exten = 8000,1,Verbose(1, "User ${CALLERID(num)} dialed the voicemail feature.") same = n,VoiceMailMain(${CALLERID(num)}@example,s) same = n,Hangup() -[DialingErrors] -; Handle any extensions dialed that don't otherwise exist. +; Exten to dial the main IVR internally. +exten = 1100,1,Verbose(1, "User ${CALLERID(num)} dialed the IVR.") + same = n,Goto(Main-IVR,2565551100,1) + +[External-Features] +; Extension for users to remotely check voicemail. Here we require the caller to +; enter their mailbox and pincode. +exten = 2565551234,1,Verbose(1, "User ${CALLERID(num)} dialed into remote voicemail.") + same = n,VoiceMailMain(example) + same = n,Hangup() + +[Dialing-Errors] +; Handle any extensions dialed internally that don't otherwise exist. ; Comment out or remove this extension if you would rather have the calls ; ignored. exten = _X.,1,Verbose(1, "User ${CALLERID(num)} dialed an invalid number.") same = n,Playback(pbx-invalid) same = n,Hangup() -[Internal] -; Include other contexts providing specific functionality for internal users. +[Internal-Setup] +; Here we capture internal calls to do anything we need to do before sending +; them onto all the possible internal locations. Such as disabling CDR on +; internal to internal calls. +exten = _X.,1,NoOp() + same = n,Set(CDR_PROP(disable)=1) + same = n,Goto(Internal-Main,${EXTEN},1) + +; The Internal-Main context provides a way for internal callers to get access to most +; features and functions configured for them. External callers may be sent +; directly to some of the contexts you see included here, so the included +; contexts are not necessarily internal only. +[Internal-Main] +; The order of includes here is important for matching the right extensions. include = Hints include = Features -include = DialingErrors - -; Handle internal calling between user extensions. -exten = _11XX,1,Verbose(1, "User ${CALLERID(num)} dialed internally to ${EXTEN}.") - same = n,Gosub(Internal,dial_internal_exten,1(${EXTEN})) - same = n,Hangup() - -; Internal Dialing Subroutine -; -; ARG1 will be the extension number dialed. +include = Dial-Users +include = Dialing-Errors -exten = dial_internal_exten,1,Verbose(1, "Entering internal dialing gosub.") - same = n,Gotoif($[${DEVICE_STATE(PJSIP/${ARG1})} = BUSY]?dialed-BUSY,1:) - same = n,Dial(PJSIP/${ARG1}${INTERNAL_DIAL_OPT}) +; Dial-Users handles calls to internal extensions. +; Calls coming into this context may be *external* or *internal* in origin. +[Dial-Users] +exten = _11XX,1,Verbose(1, "User ${CALLERID(num)} dialed ${EXTEN}.") + same = n,Set(SAC_DIALED_EXTEN=${EXTEN}) + same = n,Gotoif($[${DEVICE_STATE(PJSIP/${EXTEN})} = BUSY]?dialed-BUSY,1:) + same = n,Dial(PJSIP/${EXTEN}${INTERNAL_DIAL_OPT}) same = n,Goto(dialed-${DIALSTATUS},1) exten = dialed-NOANSWER,1,NoOp() - same = n,Voicemail(${ARG1}@example,u) - same = n,Return() + same = n,Voicemail(${SAC_DIALED_EXTEN}@example,u) + same = n,Hangup() exten = dialed-BUSY,1,NoOp() - same = n,Voicemail(${ARG1}@example,b) - same = n,Return() + same = n,Voicemail(${SAC_DIALED_EXTEN}@example,b) + same = n,Hangup() exten = dialed-CHANUNAVAIL,1,NoOp() same = n,Playback(pbx-invalid) - same = n,Return() + same = n,Hangup() exten = _dialed-.,1,Goto(dialed-NOANSWER,1) exten = h,1,Hangup() + +; Callers in the directory may dial 0 which will jump to the +; 'o' extension. +exten = o,1,Goto(1111) + +; Outbound-Dial +; +; Before we dial, see if the extension matches our restricted number patterns. +; Note that this is a basic set of numbers which could incur a fee if dialed. +; The NANP includes many other numbers that you may want to block. If you feel +; it is necessary to block further number patterns you'll have to add them below +; or you may consider implementing a blacklist via methods beyond the scope of +; this example. +[Outbound-Dial] +exten = _011.,1,Hangup() +exten = _900NXXXXXX,1,Hangup() +exten = _1900NXXXXXX,1,Hangup() +exten = _976XXXX,1,Hangup() +exten = _NXX976XXXX,1,Hangup() +exten = _1NXX976XXXX,1,Hangup() +; Dial outbound through our SIP ITSP. +exten = _X.,1,Verbose(1, "Didn't match any restricted numbers, proceeding with outbound dial.") + same = n,Set(CALLERID(num)=256555${CALLERID(num)}) + same = n,Dial(PJSIP/${EXTEN}@dcs-endpoint) + same = n,Hangup() + +; Calls from internal endpoints will enter into one of the two following +; contexts based on their dialing privilege. +[Local] +include = Internal-Setup + +exten = _NXXXXXX,1,Goto(Outbound-Dial,1256${EXTEN},1) +exten = _256NXXXXXX,1,Goto(Outbound-Dial,1${EXTEN},1) +exten = _1256NXXXXXX,1,Goto(Outbound-Dial,${EXTEN},1) + +[Long-Distance] +include = Local + +exten = _NXXNXXXXXX,1,Goto(Outbound-Dial,1${EXTEN},1) +exten = _1NXXNXXXXXX,1,Goto(Outbound-Dial,${EXTEN},1) + +; The DID-Extensions context captures inbound calls from our ITSP that have a +; DID number where the last four digits matches an internal extension. +[DID-Extensions] +exten = _25655511XX,1,Verbose(1, "External caller dialed inbound to DID ${EXTEN})") + same = n,Goto(Dial-Users,${EXTEN:6},1) + +; Our main IVR program for receiving inbound callers. +; The IVR script reads “Thank you for calling Super Awesome Company, Waldo’s +; premier provider of perfect products. If you know your party’s extension, +; you may dial it at any time. To establish a sales partnership, press one. To +; speak with a customer advocate, press two. For accounting and other +; receivables, press three. For a company directory, press four. For an +; operator, press zero.” +; demo-congrats is currently used as a placeholder. +[Main-IVR] +exten = 2565551100,1,Verbose(1, "New caller, ${CALLERID(num)} dialed into the IVR.") + same = n,Answer() + same = n(start),Background(demo-congrats) + same = n,WaitExten(10) + same = n,Background(demo-congrats) + same = n,Hangup() + +exten = 0,1,Verbose(1, "Caller ${CALLERID(num)} dialed the operator.") + same = n,Goto(Dial-Users,1111,1) +exten = 1,1,Verbose(1, "Caller ${CALLERID(num)} dialed the Sales queue.") + same = n,Goto(External-Features,2565551200,1) +exten = 2,1,Verbose(1, "Caller ${CALLERID(num)} dialed the Customer Experience queue.") + same = n,Goto(External-Features,2565551250,1) +exten = 3,1,Verbose(1, "Caller ${CALLERID(num)} dialed Accounting and Receivables.") + same = n,Goto(Dial-Users,1106,1) +exten = 4,1,Verbose(1, "Caller ${CALLERID(num)} dialed the directory.") + same = n,Directory(example,Dial-Users) + +exten = i,1,Playback(option-is-invalid) + same = n,Goto(2565551100,start) + +exten = t,1,Playback(are-you-still-there) + same = n,Goto(2565551100,start) + +; Calls from our ITSP SIP account arrive in DCS-Incoming. We should be careful +; to route calls very explicitly so as to avoid any security issues, such as +; accidentally giving outbound dial access to inbound callers. +; +; Each context includes extension pattern matching to match the inbound DID +; dialed appropriately. +[DCS-Incoming] +include = Main-IVR +include = DID-Extensions +include = External-Features diff --git a/configs/basic-pbx/logger.conf b/configs/basic-pbx/logger.conf index 13290a237..8b0a1c19d 100644 --- a/configs/basic-pbx/logger.conf +++ b/configs/basic-pbx/logger.conf @@ -5,5 +5,5 @@ console = verbose,notice,warning,error ;messages = notice,warning,error -;full = verbose,debug,notice,warning,error +;full = verbose,notice,warning,error,debug ;security = security diff --git a/configs/basic-pbx/modules.conf b/configs/basic-pbx/modules.conf index 082bddeb6..9abcf493c 100644 --- a/configs/basic-pbx/modules.conf +++ b/configs/basic-pbx/modules.conf @@ -1,6 +1,9 @@ [modules] autoload = no +; This is a minimal module load. We are loading only the modules required for +; the Asterisk features used in the Super Awesome Company configuration. + ; Applications load = app_bridgewait.so @@ -9,6 +12,7 @@ load = app_playback.so load = app_stack.so load = app_verbose.so load = app_voicemail.so +load = app_directory.so ; Bridging @@ -19,6 +23,10 @@ load = bridge_native_rtp.so load = bridge_simple.so load = bridge_softmix.so +; Call Detail Records + +load = cdr_custom.so + ; Channel Drivers load = chan_bridge_media.so @@ -41,9 +49,11 @@ load = format_wav.so ; Functions load = func_callerid.so +load = func_cdr.so load = func_pjsip_endpoint.so load = func_sorcery.so load = func_devstate.so +load = func_strings.so ; Core/PBX diff --git a/configs/basic-pbx/pjsip.conf b/configs/basic-pbx/pjsip.conf index 3d9805c0c..00e386a73 100644 --- a/configs/basic-pbx/pjsip.conf +++ b/configs/basic-pbx/pjsip.conf @@ -9,13 +9,58 @@ bind = 0.0.0.0 ;external_media_address = 203.0.113.1 ;external_signaling_address = 203.0.113.1 +;================================ CONFIG FOR SIP ITSP == + +; Registration for Digium Cloud Services Account + +[dcs-trunk] +type = registration +transport = transport-udp-nat +outbound_auth = dcs-trunk-auth +server_uri = sip:sip.digiumcloud.net +;client_uri = sip:myaccountID@sip.digiumcloud.net +retry_interval = 60 + +[dcs-trunk-auth] +type = auth +auth_type = userpass +;username = myaccountID +;password = ASTRONGPASSWORD + +; Endpoint for Digium Cloud Services account + +[dcs-endpoint] +type=endpoint +transport = transport-udp-nat +context = DCS-Incoming +allow = !all,g722,ulaw +outbound_auth = dcs-auth +aors = dcs-aor +direct_media = no +from_domain = sip.digiumcloud.net + +[dcs-auth] +type = auth +auth_type = userpass +;username = myaccountID +;password = ASTRONGPASSWORD +realm = sip.digiumcloud.net + +[dcs-aor] +type = aor +contact = sip:sip.digiumcloud.net + +[dcs-identify] +type=identify +endpoint = dcs-endpoint +;match = 8.17.32.12 ;================================ ENDPOINT TEMPLATES == ; Our primary endpoint template for internal desk phones. [endpoint-internal-d70](!) type = endpoint transport = transport-udp-nat -context = Internal +context = Long-Distance allow = !all,g722,ulaw direct_media = no trust_id_outbound = yes @@ -110,7 +155,7 @@ mailboxes = 1101@example [1103](endpoint-internal-d70) auth = 1103 aors = 1103 -callerid = Penelope Bronte <103> +callerid = Penelope Bronte <1103> [1103](auth-userpass) password = zutAnacHe8ewuWr -- cgit v1.2.3