def _obtener_agentes_activos_ami(self): manager = Manager() ami_manager_user = settings.ASTERISK['AMI_USERNAME'] ami_manager_pass = settings.ASTERISK['AMI_PASSWORD'] ami_manager_host = str( settings.OML_ASTERISK_HOSTNAME.replace('root@', '')) agentes_activos = [] try: manager.connect(ami_manager_host) manager.login(ami_manager_user, ami_manager_pass) agentes_activos_raw = self._parsear_datos_agentes_pasada_1( self._ami_obtener_agentes(manager)) agentes_activos = self._parsear_datos_agentes_pasada_2( agentes_activos_raw) except ManagerSocketException as e: logger.exception("Error connecting to the manager: {0}".format( e.message)) except ManagerAuthException as e: logger.exception("Error logging in to the manager: {0}".format( e.message)) except ManagerException as e: logger.exception("Error {0}".format(e.message)) finally: manager.close() return agentes_activos
def _obtener_llamadas_en_espera_raw(self): manager = Manager() ami_manager_user = settings.ASTERISK['AMI_USERNAME'] ami_manager_pass = settings.ASTERISK['AMI_PASSWORD'] ami_manager_host = str(settings.OML_ASTERISK_HOSTNAME.replace('root@', '')) queue_status_raw = {} try: manager.connect(ami_manager_host) manager.login(ami_manager_user, ami_manager_pass) queue_status_raw = manager.send_action({"Action": "QueueStatus"}).data except ManagerSocketException as e: logger.exception("Error connecting to the manager: {0}".format(e.message)) except ManagerAuthException as e: logger.exception("Error logging in to the manager: {0}".format(e.message)) except ManagerException as e: logger.exception("Error {0}".format(e.message)) finally: manager.close() return queue_status_raw
def _ami_manager(self, action, content): error = False data_returned = '' manager = Manager() ami_manager_user = settings.ASTERISK['AMI_USERNAME'] ami_manager_pass = settings.ASTERISK['AMI_PASSWORD'] ami_manager_host = str(settings.ASTERISK_HOSTNAME) try: manager.connect(ami_manager_host) manager.login(ami_manager_user, ami_manager_pass) data_returned = self._ami_action(manager, action, content) manager.close() except ManagerSocketException as e: logger.exception("Error connecting to the manager: {0}".format(e)) error = True except ManagerAuthException as e: logger.exception("Error logging in to the manager: {0}".format(e)) error = True except ManagerException as e: logger.exception("Error {0}".format(e)) error = True return data_returned, error
class AMIManagerConnector(object): """Establece la conexión AMI utilizando la librería pyst2, para manipular asterisk """ def __init__(self): self.manager = Manager() self.disconnected = False def connect(self): error = False ami_manager_user = settings.ASTERISK['AMI_USERNAME'] ami_manager_pass = settings.ASTERISK['AMI_PASSWORD'] ami_manager_host = str(settings.ASTERISK_HOSTNAME) try: self.manager.connect(ami_manager_host) self.manager.login(ami_manager_user, ami_manager_pass) except ManagerSocketException as e: logger.exception("Error connecting to the manager: {0}".format(e)) error = True except ManagerAuthException as e: logger.exception("Error logging in to the manager: {0}".format(e)) error = True except ManagerException as e: logger.exception("Error {0}".format(e)) error = True return error def disconnect(self): # Atención: El Manager solo permite una sola conexión self.manager.close() self.disconnected = True # TODO: Refactorizar esta clase. Nombres mas descriptivos. # Permitir ejecutar varios comandos con la misma sesion. def _ami_manager(self, action, content): if self.disconnected: raise OmlError( message='La conexión del Asterisk Manager ya ha sido cerrada') if not self.manager.connected(): raise OmlError(message='El Asterisk Manager no ha sido conectado') error = False data_returned = '' try: data_returned = self._ami_action(action, content) except ManagerSocketException as e: logger.exception("Error connecting to the manager: {0}".format(e)) error = True except ManagerAuthException as e: logger.exception("Error logging in to the manager: {0}".format(e)) error = True except ManagerException as e: logger.exception("Error {0}".format(e)) error = True return data_returned, error def _ami_action(self, action, content): if action == 'command': data_returned = self.manager.command(content).data elif action == 'QueueAdd': event_queuelog = 'ADDMEMBER' for i in range(len(content[2])): dict = { 'Action': action, 'Queue': content[2][i], 'Interface': content[4], 'Penalty': content[3][i], 'Paused': 0, 'MemberName': content[1] } data_returned = self.manager.send_action(dict) elif action == 'QueueRemove': event_queuelog = 'REMOVEMEMBER' for i in range(len(content[2])): dict = { 'Action': action, 'Queue': content[2][i], 'Interface': content[4], } data_returned = self.manager.send_action(dict) elif action == 'QueuePause': if content[6] == 'true': event_queuelog = 'PAUSEALL' elif content[6] == 'false': event_queuelog = 'UNPAUSEALL' dict = { 'Action': action, 'Interface': content[4], 'Paused': content[6], } data_returned = self.manager.send_action(dict) elif action == 'dbput': family = content[0] key = content[1] value = content[2] data_returned = self.manager.dbput(family, key, value) elif action == 'originate': channel = content[0] exten = content[1] data_returned = self.manager.originate(channel, exten, context=content[2], priority=1, timeout='25000', variables=content[3]) if action == 'QueueAdd' or action == 'QueueRemove' or action == 'QueuePause': dict = { 'Action': 'QueueLog', 'Queue': 'ALL', 'Event': event_queuelog, 'Uniqueid': 'MANAGER', 'Interface': content[0] } if action == 'QueuePause': dict['Message'] = content[5] data_returned = self.manager.send_action(dict) return data_returned