示例#1
0
 def on_session_heartbeat(self, event):
     """Capture every heartbeat event in a session and post info
     """
     params = {}
     answer_seconds_since_epoch = float(event['Caller-Channel-Answered-Time'])/1000000
     # using UTC here .. make sure FS is using UTC also
     params['AnsweredTime'] = str(answer_seconds_since_epoch)
     heartbeat_seconds_since_epoch = float(event['Event-Date-Timestamp'])/1000000
     # using UTC here .. make sure FS is using UTC also
     params['HeartbeatTime'] = str(heartbeat_seconds_since_epoch)
     params['ElapsedTime'] = str(heartbeat_seconds_since_epoch - answer_seconds_since_epoch)
     params['To'] = event['Caller-Destination-Number'].lstrip('+')
     params['From'] = event['Caller-Caller-ID-Number'].lstrip('+')
     params['CallUUID'] = event['Unique-ID']
     params['Direction'] = event['Call-Direction']
     forwarded_from = get_substring(':', '@',
                         event['variable_sip_h_Diversion'])
     if forwarded_from:
         params['ForwardedFrom'] = forwarded_from.lstrip('+')
     if event['Channel-State'] == 'CS_EXECUTE':
         params['CallStatus'] = 'in-progress'
     # RequestUUID through which this call was initiated if outbound
     request_uuid = event['variable_plivo_request_uuid']
     if request_uuid:
         params['RequestUUID'] = request_uuid
         
     self.log.debug("Got Session Heartbeat from Freeswitch: %s" % params)
     
     if self.call_heartbeat_url:
         self.log.debug("Sending heartbeat to callback: %s" % self.call_heartbeat_url)
         spawn_raw(self.send_to_url, self.call_heartbeat_url, params)
示例#2
0
    def on_session_heartbeat(self, event):
        """Capture every heartbeat event in a session and post info
        """
        params = {}
        answer_seconds_since_epoch = float(
            event['Caller-Channel-Answered-Time']) / 1000000
        # using UTC here .. make sure FS is using UTC also
        params['AnsweredTime'] = str(answer_seconds_since_epoch)
        heartbeat_seconds_since_epoch = float(
            event['Event-Date-Timestamp']) / 1000000
        # using UTC here .. make sure FS is using UTC also
        params['HeartbeatTime'] = str(heartbeat_seconds_since_epoch)
        params['ElapsedTime'] = str(heartbeat_seconds_since_epoch -
                                    answer_seconds_since_epoch)
        called_num = event['variable_plivo_destination_number']
        if not called_num or called_num == '_undef_':
            called_num = event['Caller-Destination-Number'] or ''
        called_num = called_num.lstrip('+')
        params['To'] = called_num
        params['From'] = event['Caller-Caller-ID-Number'].lstrip('+')
        params['CallUUID'] = event['Unique-ID']
        params['Direction'] = event['Call-Direction']
        forwarded_from = get_substring(':', '@',
                                       event['variable_sip_h_Diversion'])
        if forwarded_from:
            params['ForwardedFrom'] = forwarded_from.lstrip('+')
        if event['Channel-State'] == 'CS_EXECUTE':
            params['CallStatus'] = 'in-progress'
        # RequestUUID through which this call was initiated if outbound
        request_uuid = event['variable_plivo_request_uuid']
        if request_uuid:
            params['RequestUUID'] = request_uuid
        accountsid = event['variable_plivo_accountsid']
        if accountsid:
            params['AccountSID'] = accountsid

        self.log.debug("Got Session Heartbeat from Freeswitch: %s" % params)

        if self.get_server().call_heartbeat_url:
            self.log.debug("Sending heartbeat to callback: %s" %
                           self.get_server().call_heartbeat_url)
            spawn_raw(self.send_to_url,
                      self.get_server().call_heartbeat_url, params)
示例#3
0
    def on_session_heartbeat(self, event):
        """Capture every heartbeat event in a session and post info
        """
        params = {}
        answer_seconds_since_epoch = float(event["Caller-Channel-Answered-Time"]) / 1000000
        # using UTC here .. make sure FS is using UTC also
        params["AnsweredTime"] = str(answer_seconds_since_epoch)
        heartbeat_seconds_since_epoch = float(event["Event-Date-Timestamp"]) / 1000000
        # using UTC here .. make sure FS is using UTC also
        params["HeartbeatTime"] = str(heartbeat_seconds_since_epoch)
        params["ElapsedTime"] = str(heartbeat_seconds_since_epoch - answer_seconds_since_epoch)
        called_num = event["variable_plivo_destination_number"]
        if not called_num or called_num == "_undef_":
            called_num = event["Caller-Destination-Number"] or ""
        called_num = called_num.lstrip("+")
        params["To"] = called_num
        params["From"] = event["Caller-Caller-ID-Number"].lstrip("+")
        params["CallUUID"] = event["Unique-ID"]
        params["Direction"] = event["Call-Direction"]
        forwarded_from = get_substring(":", "@", event["variable_sip_h_Diversion"])
        if forwarded_from:
            params["ForwardedFrom"] = forwarded_from.lstrip("+")
        if event["Channel-State"] == "CS_EXECUTE":
            params["CallStatus"] = "in-progress"
        # RequestUUID through which this call was initiated if outbound
        request_uuid = event["variable_plivo_request_uuid"]
        if request_uuid:
            params["RequestUUID"] = request_uuid
        accountsid = event["variable_plivo_accountsid"]
        if accountsid:
            params["AccountSID"] = accountsid

        self.log.debug("Got Session Heartbeat from Freeswitch: %s" % params)

        if self.get_server().call_heartbeat_url:
            self.log.debug("Sending heartbeat to callback: %s" % self.get_server().call_heartbeat_url)
            spawn_raw(self.send_to_url, self.get_server().call_heartbeat_url, params)
示例#4
0
    def _run(self):
        self.connect()
        self.resume()
        # Linger to get all remaining events before closing
        self.linger()
        self.myevents()
        self.divert_events('on')
        if self._is_eventjson:
            self.eventjson('CUSTOM conference::maintenance plivo::dial')
        else:
            self.eventplain('CUSTOM conference::maintenance plivo::dial')
        # Set plivo app flag
        self.set('plivo_app=true')
        # Don't hangup after bridge
        self.set('hangup_after_bridge=false')
        channel = self.get_channel()
        self.call_uuid = self.get_channel_unique_id()
        called_no = channel.get_header("variable_plivo_destination_number")
        if not called_no or called_no == '_undef_':
            called_no = channel.get_header('Caller-Destination-Number')
        called_no = called_no or ''
        from_no = channel.get_header('Caller-Caller-ID-Number') or ''
        from_caller_name = channel.get_header('Caller-Caller-ID-Name') or ''
        # Set To to Session Params
        self.session_params['To'] = called_no.lstrip('+')
        # Set From to Session Params
        self.session_params['From'] = from_no.lstrip('+')
        # Set CallerName to Session Params
        self.session_params['CallerName'] = from_caller_name
        # Set CallUUID to Session Params
        self.session_params['CallUUID'] = self.call_uuid
        # Set Direction to Session Params
        self.session_params['Direction'] = channel.get_header('Call-Direction')
        aleg_uuid = ''
        aleg_request_uuid = ''
        forwarded_from = get_substring(':', '@',
                            channel.get_header('variable_sip_h_Diversion'))

        if self.session_params['Direction'] == 'outbound':
            # Look for variables in channel headers
            aleg_uuid = channel.get_header('Caller-Unique-ID')
            aleg_request_uuid = channel.get_header('variable_plivo_request_uuid')
            # Look for target url in order below :
            #  get plivo_transfer_url from channel var
            #  get plivo_answer_url from channel var
            xfer_url = channel.get_header('variable_plivo_transfer_url')
            answer_url = channel.get_header('variable_plivo_answer_url')
            if xfer_url:
                self.target_url = xfer_url
                self.log.info("Using TransferUrl %s" % self.target_url)
            elif answer_url:
                self.target_url = answer_url
                self.log.info("Using AnswerUrl %s" % self.target_url)
            else:
                self.log.error('Aborting -- No Call Url found !')
                if not self.has_hangup():
                    self.hangup()
                    raise RESTHangup()
                return
            # Look for a sched_hangup_id
            sched_hangup_id = channel.get_header('variable_plivo_sched_hangup_id')
            # Don't post hangup in outbound direction
            # because it is handled by inboundsocket
            self.default_hangup_url = None
            self.hangup_url = None
            # Set CallStatus to Session Params
            self.session_params['CallStatus'] = 'in-progress'
            accountsid = channel.get_header("variable_plivo_accountsid")
            if accountsid:
                self.session_params['AccountSID'] = accountsid

        else:
            # Look for target url in order below :
            #  get plivo_transfer_url from channel var
            #  get plivo_answer_url from channel var
            #  get default answer_url from config
            xfer_url = self.get_var('plivo_transfer_url')
            answer_url = self.get_var('plivo_answer_url')
            if xfer_url:
                self.target_url = xfer_url
                self.log.info("Using TransferUrl %s" % self.target_url)
            elif answer_url:
                self.target_url = answer_url
                self.log.info("Using AnswerUrl %s" % self.target_url)
            elif self.default_answer_url:
                self.target_url = self.default_answer_url
                self.log.info("Using DefaultAnswerUrl %s" % self.target_url)
            else:
                self.log.error('Aborting -- No Call Url found !')
                if not self.has_hangup():
                    self.hangup()
                    raise RESTHangup()
                return
            # Look for a sched_hangup_id
            sched_hangup_id = self.get_var('plivo_sched_hangup_id')
            # Set CallStatus to Session Params
            self.session_params['CallStatus'] = 'ringing'

        if not sched_hangup_id:
            sched_hangup_id = ''

        # Add more Session Params if present
        if aleg_uuid:
            self.session_params['ALegUUID'] = aleg_uuid
        if aleg_request_uuid:
            self.session_params['ALegRequestUUID'] = aleg_request_uuid
        if sched_hangup_id:
            self.session_params['ScheduledHangupId'] = sched_hangup_id
        if forwarded_from:
            self.session_params['ForwardedFrom'] = forwarded_from.lstrip('+')

        # Remove sched_hangup_id from channel vars
        if sched_hangup_id:
            self.unset('plivo_sched_hangup_id')

        # Run application
        self.log.info('Processing Call')
        try:
            self.process_call()
        except RESTHangup:
            self.log.warn('Channel has hung up, breaking Processing Call')
        except Exception, e:
            self.log.error('Processing Call Failure !')
            # If error occurs during xml parsing
            # log exception and break
            self.log.error(str(e))
            [ self.log.error(line) for line in \
                        traceback.format_exc().splitlines() ]
    def _run(self):
        self.connect()
        self.resume()
        # Linger to get all remaining events before closing
        self.linger()
        self.myevents()
        self.divert_events('on')
        if self._is_eventjson:
            self.eventjson('CUSTOM conference::maintenance plivo::dial')
        else:
            self.eventplain('CUSTOM conference::maintenance plivo::dial')
        # Set plivo app flag
        self.set('plivo_app=true')
        # Don't hangup after bridge
        self.set('hangup_after_bridge=false')
        channel = self.get_channel()
        self.call_uuid = self.get_channel_unique_id()
        # Set CallerName to Session Params
        self.session_params['CallerName'] = channel.get_header(
            'Caller-Caller-ID-Name') or ''
        # Set CallUUID to Session Params
        self.session_params['CallUUID'] = self.call_uuid
        # Set Direction to Session Params
        self.session_params['Direction'] = channel.get_header('Call-Direction')
        aleg_uuid = ''
        aleg_request_uuid = ''
        forwarded_from = get_substring(
            ':', '@', channel.get_header('variable_sip_h_Diversion'))

        # Case Outbound
        if self.session_params['Direction'] == 'outbound':
            # Set To / From
            called_no = channel.get_header("variable_plivo_to")
            if not called_no or called_no == '_undef_':
                called_no = channel.get_header('Caller-Destination-Number')
            called_no = called_no or ''
            from_no = channel.get_header("variable_plivo_from")
            if not from_no or from_no == '_undef_':
                from_no = channel.get_header('Caller-Caller-ID-Number') or ''
            # Set To to Session Params
            self.session_params['To'] = called_no.lstrip('+')
            # Set From to Session Params
            self.session_params['From'] = from_no.lstrip('+')

            # Look for variables in channel headers
            aleg_uuid = channel.get_header('Caller-Unique-ID')
            aleg_request_uuid = channel.get_header(
                'variable_plivo_request_uuid')
            # Look for target url in order below :
            #  get plivo_transfer_url from channel var
            #  get plivo_answer_url from channel var
            xfer_url = channel.get_header('variable_plivo_transfer_url')
            answer_url = channel.get_header('variable_plivo_answer_url')
            if xfer_url:
                self.target_url = xfer_url
                self.log.info("Using TransferUrl %s" % self.target_url)
            elif answer_url:
                self.target_url = answer_url
                self.log.info("Using AnswerUrl %s" % self.target_url)
            else:
                self.log.error('Aborting -- No Call Url found !')
                if not self.has_hangup():
                    self.hangup()
                    raise RESTHangup()
                return
            # Look for a sched_hangup_id
            sched_hangup_id = channel.get_header(
                'variable_plivo_sched_hangup_id')
            # Don't post hangup in outbound direction
            # because it is handled by inboundsocket
            self.default_hangup_url = None
            self.hangup_url = None
            # Set CallStatus to Session Params
            self.session_params['CallStatus'] = 'in-progress'
            # Set answered flag to true in case outbound call
            self.answered = True
            accountsid = channel.get_header("variable_plivo_accountsid")
            if accountsid:
                self.session_params['AccountSID'] = accountsid
        # Case Inbound
        else:
            # Set To / From
            called_no = channel.get_header("variable_plivo_destination_number")
            if not called_no or called_no == '_undef_':
                called_no = channel.get_header('Caller-Destination-Number')
            called_no = called_no or ''
            from_no = channel.get_header('Caller-Caller-ID-Number') or ''
            # Set To to Session Params
            self.session_params['To'] = called_no.lstrip('+')
            # Set From to Session Params
            self.session_params['From'] = from_no.lstrip('+')

            # Look for target url in order below :
            #  get plivo_transfer_url from channel var
            #  get plivo_answer_url from channel var
            #  get default answer_url from config
            xfer_url = self.get_var('plivo_transfer_url')
            answer_url = self.get_var('plivo_answer_url')
            if xfer_url:
                self.target_url = xfer_url
                self.log.info("Using TransferUrl %s" % self.target_url)
            elif answer_url:
                self.target_url = answer_url
                self.log.info("Using AnswerUrl %s" % self.target_url)
            elif self.default_answer_url:
                self.target_url = self.default_answer_url
                self.log.info("Using DefaultAnswerUrl %s" % self.target_url)
            else:
                self.log.error('Aborting -- No Call Url found !')
                if not self.has_hangup():
                    self.hangup()
                    raise RESTHangup()
                return
            # Look for a sched_hangup_id
            sched_hangup_id = self.get_var('plivo_sched_hangup_id')
            # Set CallStatus to Session Params
            self.session_params['CallStatus'] = 'ringing'

        if not sched_hangup_id:
            sched_hangup_id = ''

        # Add more Session Params if present
        if aleg_uuid:
            self.session_params['ALegUUID'] = aleg_uuid
        if aleg_request_uuid:
            self.session_params['ALegRequestUUID'] = aleg_request_uuid
        if sched_hangup_id:
            self.session_params['ScheduledHangupId'] = sched_hangup_id
        if forwarded_from:
            self.session_params['ForwardedFrom'] = forwarded_from.lstrip('+')

        # Remove sched_hangup_id from channel vars
        if sched_hangup_id:
            self.unset('plivo_sched_hangup_id')

        # Run application
        self.log.info('Processing Call')
        try:
            self.process_call()
        except RESTHangup:
            self.log.warn('Channel has hung up, breaking Processing Call')
        except Exception, e:
            self.log.error('Processing Call Failure !')
            # If error occurs during xml parsing
            # log exception and break
            self.log.error(str(e))
            [ self.log.error(line) for line in \
                        traceback.format_exc().splitlines() ]
    def set_hangup_complete(self, request_uuid, call_uuid, reason, event, hangup_url):
        params = {}
        # add extra params
        params = self.get_extra_fs_vars(event)

        # case incoming call
        if not request_uuid:
            self.log.info("Hangup for Incoming CallUUID %s Completed, HangupCause %s" \
                                                        % (call_uuid, reason))
            # get hangup url
            hangup_url = event['variable_plivo_hangup_url']
            if hangup_url:
                self.log.debug("Using HangupUrl for CallUUID %s" \
                                                        % call_uuid)
            else:
                if self.get_server().default_hangup_url:
                    hangup_url = self.get_server().default_hangup_url
                    self.log.debug("Using HangupUrl from DefaultHangupUrl for CallUUID %s" \
                                                        % call_uuid)
                elif event['variable_plivo_answer_url']:
                    hangup_url = event['variable_plivo_answer_url']
                    self.log.debug("Using HangupUrl from AnswerUrl for CallUUID %s" \
                                                        % call_uuid)
                elif self.get_server().default_answer_url:
                    hangup_url = self.get_server().default_answer_url
                    self.log.debug("Using HangupUrl from DefaultAnswerUrl for CallUUID %s" \
                                                        % call_uuid)
            if not hangup_url:
                self.log.debug("No HangupUrl for Incoming CallUUID %s" % call_uuid)
                return
            called_num = event['variable_plivo_destination_number']
            if not called_num or called_num == '_undef_':
                called_num = event['Caller-Destination-Number'] or ''
            called_num = called_num.lstrip('+')
            caller_num = event['Caller-Caller-ID-Number']
            direction = event['Call-Direction']
        # case outgoing call, add params
        else:
            self.log.info("Hangup for Outgoing CallUUID %s Completed, HangupCause %s, RequestUUID %s"
                                        % (call_uuid, reason, request_uuid))
            try:
                call_req = self.call_requests[request_uuid]
                called_num = call_req.to.lstrip('+')
                caller_num = call_req._from
                if call_req._accountsid:
                    params['AccountSID'] = call_req._accountsid
                direction = "outbound"
                self.call_requests[request_uuid] = None
                del self.call_requests[request_uuid]
            except (KeyError, AttributeError):
                called_num = ''
                caller_num = ''
                direction = "outbound"

            self.log.debug("Call Cleaned up for RequestUUID %s" % request_uuid)

            if not hangup_url:
                self.log.debug("No HangupUrl for Outgoing Call %s, RequestUUID %s" % (call_uuid, request_uuid))
                return

            forwarded_from = get_substring(':', '@', event['variable_sip_h_Diversion'])
            aleg_uuid = event['Caller-Unique-ID']
            aleg_request_uuid = event['variable_plivo_request_uuid']
            sched_hangup_id = event['variable_plivo_sched_hangup_id']
            params['RequestUUID'] = request_uuid
            if forwarded_from:
                params['ForwardedFrom'] = forwarded_from.lstrip('+')
            if aleg_uuid:
                params['ALegUUID'] = aleg_uuid
            if aleg_request_uuid:
                params['ALegRequestUUID'] = aleg_request_uuid
            if sched_hangup_id:
                params['ScheduledHangupId'] = sched_hangup_id
        # if hangup url, handle http request
        if hangup_url:
            sip_uri = event['variable_plivo_sip_transfer_uri'] or ''
            if sip_uri:
                params['SIPTransfer'] = 'true'
                params['SIPTransferURI'] = sip_uri
            params['CallUUID'] = call_uuid or ''
            params['HangupCause'] = reason
            params['To'] = called_num or ''
            params['From'] = caller_num or ''
            params['Direction'] = direction or ''
            params['CallStatus'] = 'completed'
            spawn_raw(self.send_to_url, hangup_url, params)
    def set_hangup_complete(self, request_uuid, call_uuid, reason, event, hangup_url):
        params = {}
        # add extra params
        params = self.get_extra_fs_vars(event)

        # case incoming call
        if not request_uuid:
            self.log.info("Hangup for Incoming CallUUID %s Completed, HangupCause %s" \
                                                        % (call_uuid, reason))
            # get hangup url
            hangup_url = event['variable_plivo_hangup_url']
            if hangup_url:
                self.log.debug("Using HangupUrl for CallUUID %s" \
                                                        % call_uuid)
            else:
                if self.get_server().default_hangup_url:
                    hangup_url = self.get_server().default_hangup_url
                    self.log.debug("Using HangupUrl from DefaultHangupUrl for CallUUID %s" \
                                                        % call_uuid)
                elif event['variable_plivo_answer_url']:
                    hangup_url = event['variable_plivo_answer_url']
                    self.log.debug("Using HangupUrl from AnswerUrl for CallUUID %s" \
                                                        % call_uuid)
                elif self.get_server().default_answer_url:
                    hangup_url = self.get_server().default_answer_url
                    self.log.debug("Using HangupUrl from DefaultAnswerUrl for CallUUID %s" \
                                                        % call_uuid)
            if not hangup_url:
                self.log.debug("No HangupUrl for Incoming CallUUID %s" % call_uuid)
                return
            called_num = event['variable_plivo_destination_number']
            if not called_num or called_num == '_undef_':
                called_num = event['Caller-Destination-Number'] or ''
            called_num = called_num.lstrip('+')
            caller_num = event['Caller-Caller-ID-Number']
            direction = event['Call-Direction']
        # case outgoing call, add params
        else:
            self.log.info("Hangup for Outgoing CallUUID %s Completed, HangupCause %s, RequestUUID %s"
                                        % (call_uuid, reason, request_uuid))
            try:
                call_req = self.call_requests[request_uuid]
                called_num = call_req.to.lstrip('+')
                caller_num = call_req._from
                if call_req._accountsid:
                    params['AccountSID'] = call_req._accountsid
                direction = "outbound"
                self.call_requests[request_uuid] = None
                del self.call_requests[request_uuid]
            except (KeyError, AttributeError):
                called_num = ''
                caller_num = ''
                direction = "outbound"

            self.log.debug("Call Cleaned up for RequestUUID %s" % request_uuid)

            if not hangup_url:
                self.log.debug("No HangupUrl for Outgoing Call %s, RequestUUID %s" % (call_uuid, request_uuid))
                return

            forwarded_from = get_substring(':', '@', event['variable_sip_h_Diversion'])
            aleg_uuid = event['Caller-Unique-ID']
            aleg_request_uuid = event['variable_plivo_request_uuid']
            sched_hangup_id = event['variable_plivo_sched_hangup_id']
            params['RequestUUID'] = request_uuid
            if forwarded_from:
                params['ForwardedFrom'] = forwarded_from.lstrip('+')
            if aleg_uuid:
                params['ALegUUID'] = aleg_uuid
            if aleg_request_uuid:
                params['ALegRequestUUID'] = aleg_request_uuid
            if sched_hangup_id:
                params['ScheduledHangupId'] = sched_hangup_id
        # if hangup url, handle http request
        if hangup_url:
            sip_uri = event['variable_plivo_sip_transfer_uri'] or ''
            if sip_uri:
                params['SIPTransfer'] = 'true'
                params['SIPTransferURI'] = sip_uri
            params['CallUUID'] = call_uuid or ''
            params['HangupCause'] = reason
            params['To'] = called_num or ''
            params['From'] = caller_num or ''
            params['Direction'] = direction or ''
            params['CallStatus'] = 'completed'
            spawn_raw(self.send_to_url, hangup_url, params)
示例#8
0
    def _run(self):
        self.connect()
        # self.filter('Event-Name /(CHANNEL_HANGUP|CHANNEL_EXECUTE_COMPLETE|CUSTOM)/')
        self.resume()
        # Linger to get all remaining events before closing
        self.linger()
        self.myevents()
        if self._is_eventjson:
            self.eventjson("DTMF CUSTOM conference::maintenance")
        else:
            self.eventplain("DTMF CUSTOM conference::maintenance")
        # Set plivo app flag
        self.set("plivo_app=true")
        # Don't hangup after bridge
        self.set("hangup_after_bridge=false")
        channel = self.get_channel()
        self.call_uuid = self.get_channel_unique_id()
        called_no = channel.get_header("Caller-Destination-Number")
        from_no = channel.get_header("Caller-Caller-ID-Number")
        # Set To to Session Params
        self.session_params["To"] = called_no.lstrip("+")
        # Set From to Session Params
        self.session_params["From"] = from_no.lstrip("+")
        # Set CallUUID to Session Params
        self.session_params["CallUUID"] = self.call_uuid
        # Set Direction to Session Params
        self.session_params["Direction"] = channel.get_header("Call-Direction")
        aleg_uuid = ""
        aleg_request_uuid = ""
        forwarded_from = get_substring(":", "@", channel.get_header("variable_sip_h_Diversion"))

        if self.session_params["Direction"] == "outbound":
            # Look for variables in channel headers
            aleg_uuid = channel.get_header("Caller-Unique-ID")
            aleg_request_uuid = channel.get_header("variable_plivo_request_uuid")
            # Look for target url in order below :
            #  get plivo_transfer_url from channel var
            #  get plivo_answer_url from channel var
            xfer_url = channel.get_header("variable_plivo_transfer_url")
            answer_url = channel.get_header("variable_plivo_answer_url")
            if xfer_url:
                self.target_url = xfer_url
                self.log.info("Using TransferUrl %s" % self.target_url)
            elif answer_url:
                self.target_url = answer_url
                self.log.info("Using AnswerUrl %s" % self.target_url)
            else:
                self.log.error("Aborting -- No Call Url found !")
                return
            # Look for a sched_hangup_id
            sched_hangup_id = channel.get_header("variable_plivo_sched_hangup_id")
            # Don't post hangup in outbound direction
            # because it is handled by inboundsocket
            self.default_hangup_url = None
            self.hangup_url = None
            self.log.info("HangupUrl not set for outbound call")
            # Set CallStatus to Session Params
            self.session_params["CallStatus"] = "in-progress"
        else:
            # Look for target url in order below :
            #  get plivo_transfer_url from channel var
            #  get plivo_answer_url from channel var
            #  get default answer_url from config
            xfer_url = self.get_var("plivo_transfer_url")
            answer_url = self.get_var("plivo_answer_url")
            if xfer_url:
                self.target_url = xfer_url
                self.log.info("Using TransferUrl %s" % self.target_url)
            elif answer_url:
                self.target_url = answer_url
                self.log.info("Using AnswerUrl %s" % self.target_url)
            elif self.default_answer_url:
                self.target_url = self.default_answer_url
                self.log.info("Using DefaultAnswerUrl %s" % self.target_url)
            else:
                self.log.error("Aborting -- No Call Url found !")
                return
            # Look for a sched_hangup_id
            sched_hangup_id = self.get_var("plivo_sched_hangup_id")
            # Look for hangup_url in order below :
            # get plivo_hangup_url from channel var if found
            # get default_hangup_url from config if found
            # get plivo_answer_url from channel var if found
            # get default_answer_url from config if found
            hangup_url = self.get_var("plivo_hangup_url")
            if hangup_url:
                self.hangup_url = hangup_url
                self.log.info("Using HangupUrl %s from plivo_hangup_url channel var" % self.hangup_url)
            elif self.default_hangup_url:
                self.hangup_url = self.default_hangup_url
                self.log.info("Using HangupUrl %s from hangup url in config" % self.hangup_url)
            elif answer_url:
                self.hangup_url = answer_url
                self.log.info("Using HangupUrl %s from plivo_answer_url channel var" % self.hangup_url)
            elif self.default_answer_url:
                self.hangup_url = self.default_answer_url
                self.log.info("Using HangupUrl %s from answer url in config" % self.hangup_url)
            # Set CallStatus to Session Params
            self.session_params["CallStatus"] = "ringing"

        if not sched_hangup_id:
            sched_hangup_id = ""

        # Add more Session Params if present
        if aleg_uuid:
            self.session_params["ALegUUID"] = aleg_uuid
        if aleg_request_uuid:
            self.session_params["ALegRequestUUID"] = aleg_request_uuid
        if sched_hangup_id:
            self.session_params["ScheduledHangupId"] = sched_hangup_id
        if forwarded_from:
            self.session_params["ForwardedFrom"] = forwarded_from.lstrip("+")

        self.get_extra_fs_vars()

        # Remove sched_hangup_id from channel vars
        if sched_hangup_id:
            self.unset("plivo_sched_hangup_id")

        # Run application
        self.log.info("Processing Call")
        try:
            self.process_call()
        except RESTHangup:
            self.log.warn("Channel has hung up, breaking Processing Call")
        except Exception, e:
            self.log.error("Processing Call Failure !")
            # If error occurs during xml parsing
            # log exception and break
            self.log.error(str(e))
            [self.log.error(line) for line in traceback.format_exc().splitlines()]
    def _run(self):
        self.connect()
        self.resume()
        # Linger to get all remaining events before closing
        self.linger()
        self.myevents()
        self.divert_events("on")
        if self._is_eventjson:
            self.eventjson("CUSTOM conference::maintenance plivo::dial")
        else:
            self.eventplain("CUSTOM conference::maintenance plivo::dial")
        # Set plivo app flag
        self.set("plivo_app=true")
        # Don't hangup after bridge
        self.set("hangup_after_bridge=false")
        channel = self.get_channel()
        self.call_uuid = self.get_channel_unique_id()
        # Set CallerName to Session Params
        self.session_params["CallerName"] = channel.get_header("Caller-Caller-ID-Name") or ""
        # Set CallUUID to Session Params
        self.session_params["CallUUID"] = self.call_uuid
        # Set Direction to Session Params
        self.session_params["Direction"] = channel.get_header("Call-Direction")
        aleg_uuid = ""
        aleg_request_uuid = ""
        forwarded_from = get_substring(":", "@", channel.get_header("variable_sip_h_Diversion"))

        # Case Outbound
        if self.session_params["Direction"] == "outbound":
            # Set To / From
            called_no = channel.get_header("variable_plivo_to")
            if not called_no or called_no == "_undef_":
                called_no = channel.get_header("Caller-Destination-Number")
            called_no = called_no or ""
            from_no = channel.get_header("variable_plivo_from")
            if not from_no or from_no == "_undef_":
                from_no = channel.get_header("Caller-Caller-ID-Number") or ""
            # Set To to Session Params
            self.session_params["To"] = called_no.lstrip("+")
            # Set From to Session Params
            self.session_params["From"] = from_no.lstrip("+")

            # Look for variables in channel headers
            aleg_uuid = channel.get_header("Caller-Unique-ID")
            aleg_request_uuid = channel.get_header("variable_plivo_request_uuid")
            # Look for target url in order below :
            #  get plivo_transfer_url from channel var
            #  get plivo_answer_url from channel var
            xfer_url = channel.get_header("variable_plivo_transfer_url")
            answer_url = channel.get_header("variable_plivo_answer_url")
            if xfer_url:
                self.target_url = xfer_url
                self.log.info("Using TransferUrl %s" % self.target_url)
            elif answer_url:
                self.target_url = answer_url
                self.log.info("Using AnswerUrl %s" % self.target_url)
            else:
                self.log.error("Aborting -- No Call Url found !")
                if not self.has_hangup():
                    self.hangup()
                    raise RESTHangup()
                return
            # Look for a sched_hangup_id
            sched_hangup_id = channel.get_header("variable_plivo_sched_hangup_id")
            # Don't post hangup in outbound direction
            # because it is handled by inboundsocket
            self.default_hangup_url = None
            self.hangup_url = None
            # Set CallStatus to Session Params
            self.session_params["CallStatus"] = "in-progress"
            # Set answered flag to true in case outbound call
            self.answered = True
            accountsid = channel.get_header("variable_plivo_accountsid")
            if accountsid:
                self.session_params["AccountSID"] = accountsid
        # Case Inbound
        else:
            # Set To / From
            called_no = channel.get_header("variable_plivo_destination_number")
            if not called_no or called_no == "_undef_":
                called_no = channel.get_header("Caller-Destination-Number")
            called_no = called_no or ""
            from_no = channel.get_header("Caller-Caller-ID-Number") or ""
            # Set To to Session Params
            self.session_params["To"] = called_no.lstrip("+")
            # Set From to Session Params
            self.session_params["From"] = from_no.lstrip("+")

            # Look for target url in order below :
            #  get plivo_transfer_url from channel var
            #  get plivo_answer_url from channel var
            #  get default answer_url from config
            xfer_url = self.get_var("plivo_transfer_url")
            answer_url = self.get_var("plivo_answer_url")
            if xfer_url:
                self.target_url = xfer_url
                self.log.info("Using TransferUrl %s" % self.target_url)
            elif answer_url:
                self.target_url = answer_url
                self.log.info("Using AnswerUrl %s" % self.target_url)
            elif self.default_answer_url:
                self.target_url = self.default_answer_url
                self.log.info("Using DefaultAnswerUrl %s" % self.target_url)
            else:
                self.log.error("Aborting -- No Call Url found !")
                if not self.has_hangup():
                    self.hangup()
                    raise RESTHangup()
                return
            # Look for a sched_hangup_id
            sched_hangup_id = self.get_var("plivo_sched_hangup_id")
            # Set CallStatus to Session Params
            self.session_params["CallStatus"] = "ringing"

        if not sched_hangup_id:
            sched_hangup_id = ""

        # Add more Session Params if present
        if aleg_uuid:
            self.session_params["ALegUUID"] = aleg_uuid
        if aleg_request_uuid:
            self.session_params["ALegRequestUUID"] = aleg_request_uuid
        if sched_hangup_id:
            self.session_params["ScheduledHangupId"] = sched_hangup_id
        if forwarded_from:
            self.session_params["ForwardedFrom"] = forwarded_from.lstrip("+")

        # Remove sched_hangup_id from channel vars
        if sched_hangup_id:
            self.unset("plivo_sched_hangup_id")

        # Run application
        self.log.info("Processing Call")
        try:
            self.process_call()
        except RESTHangup:
            self.log.warn("Channel has hung up, breaking Processing Call")
        except Exception, e:
            self.log.error("Processing Call Failure !")
            # If error occurs during xml parsing
            # log exception and break
            self.log.error(str(e))
            [self.log.error(line) for line in traceback.format_exc().splitlines()]
    def _run(self):
        self.connect()
        #self.resume()
        # Linger to get all remaining events before closing
        self.linger()
        self.myevents()
        self.divert_events('on')
        if self._is_eventjson:
            self.eventjson('CUSTOM conference::maintenance plivo::dial')
        else:
            self.eventplain('CUSTOM conference::maintenance plivo::dial')
        # Set plivo app flag
        self.set('plivo_app=true')
        # Don't hangup after bridge
        self.set('hangup_after_bridge=false')
        channel = self.get_channel()
        self.call_uuid = self.get_channel_unique_id()
        # Set CallerName to Session Params
        self.session_params['CallerName'] = channel.get_header('Caller-Caller-ID-Name') or ''
        # Set CallUUID to Session Params
        self.session_params['CallUUID'] = self.call_uuid
        # Set Direction to Session Params
        self.session_params['Direction'] = channel.get_header('Call-Direction')
        aleg_uuid = ''
        aleg_request_uuid = ''
        forwarded_from = get_substring(':', '@',
                            channel.get_header('variable_sip_h_Diversion'))

        start_time = channel.get_header('Channel-Channel-Created-Time')
        if start_time:
            self.session_params['StartTime'] = start_time

        answer_time = channel.get_header('Channel-Channel-Answered-Time')
        if answer_time:
            self.session_params['AnswerTime'] = answer_time

        assimilate_xml_vars(self, channel.get_header('variable_plivo_xml_vars'))

        self.domain_flags = int(channel.get_header('variable_domain_flags'))

        # Case Outbound
        if self.session_params['Direction'] == 'outbound':
            # Set To / From
            called_no = channel.get_header("variable_plivo_to")
            if not called_no or called_no == '_undef_':
                called_no = channel.get_header('Caller-Destination-Number')
            called_no = called_no or ''
            from_no = channel.get_header("variable_plivo_from")
            if not from_no or from_no == '_undef_':
                from_no = channel.get_header('Caller-Caller-ID-Number') or ''
            # Set To to Session Params
            self.session_params['To'] = called_no.lstrip('+')
            # Set From to Session Params
            self.session_params['From'] = from_no.lstrip('+')

            # Look for variables in channel headers
            aleg_uuid = channel.get_header('Caller-Unique-ID')
            aleg_request_uuid = channel.get_header('variable_plivo_request_uuid')
            # Look for target url in order below :
            #  get plivo_transfer_url from channel var
            #  get plivo_answer_url from channel var
            plivo_config = channel.get_header('variable_plivo_config')

            assimilate_plivo_config(self, plivo_config)
            assimilate_ivr_transfer_params(self, channel.get_header('variable_ivr_transfer_params'))

            assimilate_user_var(self, channel.get_header("variable_basix_user"))
            assimilate_group_var(self, channel.get_header("variable_basix_group"))

            check_transfer_failure_action(self)


            domain = channel.get_header('variable_basix_domain')
            domain_id, domain_name = domain.split("*")
            self.session_params['DomainName'] = domain_name
            self.log.info("DomainName %s" % self.session_params['DomainName'])

            if self.target_url:
                self.log.info("Using AnswerUrl %s" % self.target_url)
            else:
                self.log.error('Aborting -- No Call Url found !')
                if not self.has_hangup():
                    self.hangup()
                    raise RESTHangup()
                return
            # Look for a sched_hangup_id
            sched_hangup_id = channel.get_header('variable_plivo_sched_hangup_id')
            # Don't post hangup in outbound direction
            # because it is handled by inboundsocket
            self.default_hangup_url = None
            self.hangup_url = None
            # Set CallStatus to Session Params
            self.session_params['CallStatus'] = 'in-progress'
            # Set answered flag to true in case outbound call
            self.answered = True
            accountsid = channel.get_header("variable_plivo_accountsid")
            if accountsid:
                self.session_params['AccountSID'] = accountsid
        # Case Inbound
        else:
            # Set To / From
            #called_no = channel.get_header("variable_plivo_destination_number")
            #if not called_no or called_no == '_undef_':
            #    called_no = channel.get_header('Caller-Destination-Number')
            #called_no = called_no or ''
            called_no = channel.get_header('variable_sip_to_user')

            from_no = channel.get_header('Caller-Caller-ID-Number') or ''
            # Set To to Session Params
            self.session_params['To'] = called_no.lstrip('+')
            # Set From to Session Params
            self.session_params['From'] = from_no.lstrip('+')
            caller_name = self.session_params['CallerName']

            plivo_config = self.get_var('plivo_config')

            assimilate_plivo_config(self, plivo_config)
            assimilate_ruri_params(self, channel.get_header("variable_sip_req_params"))
            assimilate_ivr_transfer_params(self, channel.get_header('variable_ivr_transfer_params'))

            assimilate_user_var(self, channel.get_header("variable_basix_user"))
            assimilate_group_var(self, channel.get_header("variable_basix_group"))

            check_transfer_failure_action(self)


            if is_anonymous(caller_name):
                self.session_params['Anonymous'] = 'true'
                if not (self.flags & PLIVO_FLAG_RELAY_ANONYMOUS_ANI): 
                    self.session_params['From'] = 'Anonymous'
                    self.session_params['CallerName'] = 'Anonymous'
            else:
                self.session_params['Anonymous'] = 'false'
            
            # Look for target url in order below :
            #  get plivo_transfer_url from channel var
            #  get plivo_answer_url from channel var
            #  get default answer_url from config

            domain = channel.get_header('variable_basix_domain')
            domain_id, domain_name = domain.split("*")
            self.session_params['DomainName'] = domain_name
            self.log.info("DomainName %s" % self.session_params['DomainName'])

            if self.target_url:
                self.log.info("Using AnswerUrl %s" % self.target_url)
            elif self.default_answer_url:
                self.target_url = self.default_answer_url
                self.log.info("Using DefaultAnswerUrl %s" % self.target_url)
            else:
                self.log.error('Aborting -- No Call Url found !')
                if not self.has_hangup():
                    self.hangup()
                    raise RESTHangup()
                return
            # Look for a sched_hangup_id
            sched_hangup_id = self.get_var('plivo_sched_hangup_id')
            # Set CallStatus to Session Params
            if channel.get_header('Caller-Channel-Answered-Time') == '0':
                self.session_params['CallStatus'] = 'ringing'
            else:
                self.session_params['CallStatus'] = 'in-progress'

        if not sched_hangup_id:
            sched_hangup_id = ''

        # Add more Session Params if present
        if aleg_uuid:
            self.session_params['ALegUUID'] = aleg_uuid
        if aleg_request_uuid:
            self.session_params['ALegRequestUUID'] = aleg_request_uuid
        if sched_hangup_id:
            self.session_params['ScheduledHangupId'] = sched_hangup_id
        if forwarded_from:
            self.session_params['ForwardedFrom'] = forwarded_from.lstrip('+')

        # Remove sched_hangup_id from channel vars
        if sched_hangup_id:
            self.unset('plivo_sched_hangup_id')

        # Run application
        self.log.info('Processing Call')
        try:
            self.process_call()
        except RESTHangup:
            self.log.warn('Channel has hung up, breaking Processing Call')
        except Exception, e:
            err = str(e)
            self.log.error('Processing Call Failure !')
            # If error occurs during xml parsing
            # log exception and break
            self.log.error(err)
            [ self.log.error(line) for line in \
                        traceback.format_exc().splitlines() ]


            self.set('plivo_error=' + err)

            params = {}
            params['CallUUID'] = self.session_params['CallUUID']
            params['CallStatus'] = 'error'
            params['Error'] = err
            
            spawn_raw(self.notify_error, self.error_url, params)
示例#11
0
    def set_hangup_complete(self, request_uuid, call_uuid, reason, event, hangup_url):
        params = {}
        # add extra params
        params = self.get_extra_fs_vars(event)

        # case incoming call
        if not request_uuid:
            self.log.info("Hangup for Incoming CallUUID %s Completed, HangupCause %s" % (call_uuid, reason))
            # get hangup url
            hangup_url = event["variable_plivo_hangup_url"]
            if hangup_url:
                self.log.debug("Using HangupUrl for CallUUID %s" % call_uuid)
            else:
                if self.get_server().default_hangup_url:
                    hangup_url = self.get_server().default_hangup_url
                    self.log.debug("Using HangupUrl from DefaultHangupUrl for CallUUID %s" % call_uuid)
                elif event["variable_plivo_answer_url"]:
                    hangup_url = event["variable_plivo_answer_url"]
                    self.log.debug("Using HangupUrl from AnswerUrl for CallUUID %s" % call_uuid)
                elif self.get_server().default_answer_url:
                    hangup_url = self.get_server().default_answer_url
                    self.log.debug("Using HangupUrl from DefaultAnswerUrl for CallUUID %s" % call_uuid)
            if not hangup_url:
                self.log.debug("No HangupUrl for Incoming CallUUID %s" % call_uuid)
                return
            called_num = event["variable_plivo_destination_number"]
            if not called_num or called_num == "_undef_":
                called_num = event["Caller-Destination-Number"] or ""
            called_num = called_num.lstrip("+")
            caller_num = event["Caller-Caller-ID-Number"]
            direction = event["Call-Direction"]
        # case outgoing call, add params
        else:
            self.log.info(
                "Hangup for Outgoing CallUUID %s Completed, HangupCause %s, RequestUUID %s"
                % (call_uuid, reason, request_uuid)
            )
            try:
                call_req = self.call_requests[request_uuid]
                called_num = call_req.to.lstrip("+")
                caller_num = call_req._from
                if call_req._accountsid:
                    params["AccountSID"] = call_req._accountsid
                direction = "outbound"
                self.call_requests[request_uuid] = None
                del self.call_requests[request_uuid]
            except (KeyError, AttributeError):
                called_num = ""
                caller_num = ""
                direction = "outbound"

            self.log.debug("Call Cleaned up for RequestUUID %s" % request_uuid)

            if not hangup_url:
                self.log.debug("No HangupUrl for Outgoing Call %s, RequestUUID %s" % (call_uuid, request_uuid))
                return

            forwarded_from = get_substring(":", "@", event["variable_sip_h_Diversion"])
            aleg_uuid = event["Caller-Unique-ID"]
            aleg_request_uuid = event["variable_plivo_request_uuid"]
            sched_hangup_id = event["variable_plivo_sched_hangup_id"]
            params["RequestUUID"] = request_uuid
            if forwarded_from:
                params["ForwardedFrom"] = forwarded_from.lstrip("+")
            if aleg_uuid:
                params["ALegUUID"] = aleg_uuid
            if aleg_request_uuid:
                params["ALegRequestUUID"] = aleg_request_uuid
            if sched_hangup_id:
                params["ScheduledHangupId"] = sched_hangup_id
        # if hangup url, handle http request
        if hangup_url:
            sip_uri = event["variable_plivo_sip_transfer_uri"] or ""
            if sip_uri:
                params["SIPTransfer"] = "true"
                params["SIPTransferURI"] = sip_uri
            params["CallUUID"] = call_uuid or ""
            params["HangupCause"] = reason
            params["To"] = called_num or ""
            params["From"] = caller_num or ""
            params["Direction"] = direction or ""
            params["CallStatus"] = "completed"
            spawn_raw(self.send_to_url, hangup_url, params)