Esempio n. 1
0
class SincronizadorDeConfiguracionDeRutaSalienteEnAsterisk(
        AbstractConfiguracionAsterisk):
    def _obtener_generador_family(self):
        generador = RutaSalienteFamily()
        return generador

    def __init__(self):
        super(SincronizadorDeConfiguracionDeRutaSalienteEnAsterisk).__init__()
        self.generador_rutas_en_asterisk_conf = RutasSalientesConfigCreator()
        self.reload_asterisk_config = AsteriskConfigReloader()

    def _generar_y_recargar_archivos_conf_asterisk(self,
                                                   family_member_exclude=None):
        proceso_ok = True
        mensaje_error = ""

        try:
            self.generador_rutas_en_asterisk_conf.create_config_asterisk(
                ruta_exclude=family_member_exclude)
        except Exception as e:
            msg = _(
                "SincronizadorDeConfiguracionDeRutaSalienteEnAsterisk: error {0} al"
                .format(e)) + _("intentar create_config_asterisk()")
            logger.exception(msg)

            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion de rutas de Asterisk. ")
        if not proceso_ok:
            raise (RestablecerConfiguracionTelefonicaError(mensaje_error))
        else:
            self.reload_asterisk_config.reload_asterisk()
Esempio n. 2
0
class ActivacionQueueService(object):
    """ Sincronizador de configuracion de Campaña / Queue """
    def __init__(self):
        self.queues_config_creator = QueuesCreator()
        self.reload_asterisk_config = AsteriskConfigReloader()
        self.asterisk_database = CampanaFamily()

    def _generar_y_recargar_configuracion_asterisk(self):
        proceso_ok = True
        mensaje_error = ""

        try:
            self.queues_config_creator.create_dialplan()
        except Exception:
            logger.exception(
                _("ActivacionQueueService: error al "
                  "intentar queues_config_creator()"))

            proceso_ok = False
            mensaje_error += (_("Hubo un inconveniente al crear el archivo de "
                                "configuracion del queues de Asterisk. "))

        if not proceso_ok:
            raise (RestablecerDialplanError(mensaje_error))
        else:
            self.reload_asterisk_config.reload_asterisk()
            self.asterisk_database.regenerar_families()

    def activar(self):
        self._generar_y_recargar_configuracion_asterisk()
Esempio n. 3
0
    def delete(self, request, *args, **kwargs):
        # Borro el archivo de la carpeta de asterisk
        musica = self.get_object()
        audio_file_asterisk = AudioConfigFile(musica)
        audio_file_asterisk.delete_asterisk()

        if musica.audio_original:
            if os.path.isfile(musica.audio_original.path):
                os.remove(musica.audio_original.path)
        if musica.audio_asterisk:
            if os.path.isfile(musica.audio_asterisk.path):
                os.remove(musica.audio_asterisk.path)

        # Si esta musica es la última que había en la playlist:
        if musica.playlist.musicas.count() == 1:
            # "Reinicio" el mudulo de musiconhold en Asterisk
            reloader = AsteriskConfigReloader()
            reloader.reload_asterisk()

        super(MusicaDeEsperaDeleteView, self).delete(request, *args, **kwargs)

        message = (_('Musica de Espera eliminada con éxito'))
        messages.add_message(
            self.request,
            messages.SUCCESS,
            message,
        )
        return redirect(self.get_success_url())
Esempio n. 4
0
class ActivacionAgenteService(object):
    """Este servicio regenera y recarga los archivos de configuracion para los agentes"""
    def __init__(self):
        self.sip_config_creator = SipConfigCreator()
        self.config_file = SipConfigFile()
        self.reload_asterisk_config = AsteriskConfigReloader()
        self.asterisk_database = AgenteFamily()

    def _generar_y_recargar_configuracion_asterisk(self):
        proceso_ok = True
        mensaje_error = ""

        try:
            self.sip_config_creator.create_config_sip()
        except Exception as e:
            msg = _("Error {0}: ActivacionAgenteService: error al ".format(
                e.message) + "intentar create_config_sip()")
            logger.exception(msg)

            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion del config sip de Asterisk. ")

        if not proceso_ok:
            raise (RestablecerConfigSipError(mensaje_error))
        else:
            self.config_file.copy_asterisk()
            self.reload_asterisk_config.reload_asterisk()
            self.asterisk_database.regenerar_families()

    def activar(self):
        self._generar_y_recargar_configuracion_asterisk()
Esempio n. 5
0
    def __init__(self):
        # Sincroniza Queues de Campañas
        self.queues_config_creator = QueuesCreator()
        # Sincroniza Sip De Agentes
        self.sip_config_creator = SipConfigCreator()
        # Sincroniza Modelos de Configuracion Telefonica
        self.sincronizador_config_telefonica = SincronizadorDeConfiguracionTelefonicaEnAsterisk(
        )
        # Sincroniza en AstDB las que faltan en el Sincronizador de Configuracion Telefonica
        self.asterisk_database = RegenerarAsteriskFamilysOML()
        self.playlist_config_creator = PlaylistsConfigCreator()

        # Llama al comando que reinicia Asterisk
        self.reload_asterisk_config = AsteriskConfigReloader()

        # parámetros de script que desloguea agentes inactivos
        self.tareas_programadas_ids = [
            'asterisk_logout_script', 'queue_log_clean_job',
            'actualizar_reportes_de_entrantes_job',
            'actualizar_reporte_supervisores',
            'actualizar_reporte_dia_actual_agentes',
            'actualizar_reportes_salientes', 'actualizar_reportes_dialers'
        ]

        self.TIEMPO_CHEQUEO_CONTACTOS_INACTIVOS = 2
        self.TIEMPO_ACTUALIZAR_REPORTES_LLAMADAS_ENTRANTES = 1
        self.TIEMPO_ACTUALIZAR_REPORTE_SUPERVISORES = 5
        self.TIEMPO_ACTUALIZAR_DASHBOARD_AGENTES = 1
        self.TIEMPO_ACTUALIZAR_REPORTES_LLAMADAS_SALIENTES = 1
        self.TIEMPO_ACTUALIZAR_REPORTES_LLAMADAS_DIALERS = 1
 def __init__(self):
     self.generador_trunk_en_astdb = TrunkFamily()
     self.generador_trunk_sip_en_asterisk_conf = SipTrunksConfigCreator()
     self.config_trunk_file = SipTrunksConfigFile()
     self.generador_trunks_registration_en_asterisk_conf = SipRegistrationsConfigCreator(
     )
     self.config_trunk_registration_file = SipRegistrationsConfigFile()
     self.reload_asterisk_config = AsteriskConfigReloader()
 def handle(self, *args, **options):
     try:
         # self._actualizar_archivos_kamailio()
         self._actualizar_template_asterisk_oml_manager()
         self._actualizar_template_asterisk_oml_sip_general()
         # regeneramos asterisk con la nueva configuracion
         asterisk_reloader = AsteriskConfigReloader()
         asterisk_reloader.reload_asterisk()
     except Exception as e:
         logging.error('Fallo del comando: {0}'.format(e.message))
Esempio n. 8
0
    def form_valid(self, form):
        form.save()
        self._procesar_archivo_de_audio(form)
        # Si esta musica es la primera que se agrega a la playlist:
        if self.playlist.musicas.count() == 1:
            # "Reinicio" el mudulo de musiconhold en Asterisk
            reloader = AsteriskConfigReloader()
            reloader.reload_asterisk()

        return super(MusicaDeEsperaCreateView, self).form_valid(form)
    def __init__(self):
        # Sincroniza Queues de Campañas
        self.queues_config_creator = QueuesCreator()
        self.config_queues_file = QueuesConfigFile()
        # Sincroniza Sip De Agentes
        self.sip_config_creator = SipConfigCreator()
        self.config_sip_file = SipConfigFile()
        # Sincroniza Modelos de Configuracion Telefonica
        self.sincronizador_config_telefonica = SincronizadorDeConfiguracionTelefonicaEnAsterisk()
        # Sincroniza en AstDB las que faltan en el Sincronizador de Configuracion Telefonica
        self.asterisk_database = RegenerarAsteriskFamilysOML()

        # Llama al comando que reinicia Asterisk
        self.reload_asterisk_config = AsteriskConfigReloader()

        # parámetros de script que desloguea agentes inactivos
        self.tareas_programadas_ids = ['asterisk_logout_script', 'queue_log_clean_job']
        self.TIEMPO_CHEQUEO_CONTACTOS_INACTIVOS = 2
Esempio n. 10
0
class SincronizadorDeConfiguracionTroncalSipEnAsterisk(object):
    def __init__(self):
        self.generador_trunk_en_astdb = TrunkFamily()
        self.generador_trunk_sip_en_asterisk_conf = SipTrunksConfigCreator()
        self.generador_trunks_registration_en_asterisk_conf = SipRegistrationsConfigCreator(
        )
        self.reload_asterisk_config = AsteriskConfigReloader()

    def _generar_y_recargar_archivos_conf_asterisk(self, trunk_exclude=None):
        proceso_ok = True
        mensaje_error = ""

        try:
            self.generador_trunk_sip_en_asterisk_conf.create_config_asterisk(
                trunk_exclude=trunk_exclude)
        except Exception as e:
            msg = _(
                "SincronizadorDeConfiguracionTroncalSipEnAsterisk: error {0} al "
                .format(e)) + _("intentar create_config_asterisk()")
            logger.exception(msg)
            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion de trunks de Asterisk. ")

        try:
            self.generador_trunks_registration_en_asterisk_conf.create_config_asterisk(
                trunk_exclude=trunk_exclude)
        except Exception as e:
            msg = _(
                "SincronizadorDeConfiguracionTroncalSipEnAsterisk: error {0} al "
                .format(e)) + _("intentar create_config_asterisk()")
            logger.exception(msg)
            proceso_ok = False
            mensaje_error += _(
                "Hubo un inconveniente al crear el archivo de "
                "configuracion de trunks registration de Asterisk. ")

        if not proceso_ok:
            raise (RestablecerConfiguracionTelefonicaError(mensaje_error))
        else:
            self.reload_asterisk_config.reload_asterisk()

    def _generar_e_insertar_en_astdb(self, trunk):
        mensaje_error = ""

        try:
            if trunk is None:
                self.generador_trunk_en_astdb.regenerar_families()
            else:
                self.generador_trunk_en_astdb.regenerar_family(trunk)
        except Exception as e:
            msg = _(
                "SincronizadorDeConfiguracionTroncalSipEnAsterisk: error {0} al "
                .format(e)) + _("intentar regenerar_familys_rutas()")
            logger.exception(msg)
            mensaje_error += _(
                "Hubo un inconveniente al insertar los registros del troncal en "
                "la base de datos de Asterisk. ")
            raise (RestablecerConfiguracionTelefonicaError(mensaje_error))

    def _eliminar_trunk_en_astdb(self, trunk):
        mensaje_error = ""

        try:
            self.generador_trunk_en_astdb.delete_family(trunk)
        except Exception as e:
            msg = _(
                "SincronizadorDeConfiguracionTroncalSipEnAsterisk: error {0} al "
                .format(e)) + _("intentar delete_family_trunk()")
            logger.exception(msg)
            mensaje_error += _(
                "Hubo un inconveniente al eliminar los registros de los troncales"
                " en la base de datos de Asterisk. ")
            raise (RestablecerConfiguracionTelefonicaError(mensaje_error))

    def regenerar_troncales(self, trunk=None):
        self._generar_y_recargar_archivos_conf_asterisk()
        self._generar_e_insertar_en_astdb(trunk)

    def eliminar_troncal_y_regenerar_asterisk(self, trunk):
        self._generar_y_recargar_archivos_conf_asterisk(trunk_exclude=trunk)
        self._eliminar_trunk_en_astdb(trunk)
Esempio n. 11
0
 def __init__(self):
     super(SincronizadorDeConfiguracionDeRutaSalienteEnAsterisk).__init__()
     self.generador_rutas_en_asterisk_conf = RutasSalientesConfigCreator()
     self.reload_asterisk_config = AsteriskConfigReloader()
 def __init__(self):
     self.generador_rutas_en_astdb = RutaSalienteFamily()
     self.generador_rutas_en_asterisk_conf = RutasSalientesConfigCreator()
     self.config_rutas_file = RutasSalientesConfigFile()
     self.reload_asterisk_config = AsteriskConfigReloader()
class SincronizadorDeConfiguracionDeRutaSalienteEnAsterisk(object):
    def __init__(self):
        self.generador_rutas_en_astdb = RutaSalienteFamily()
        self.generador_rutas_en_asterisk_conf = RutasSalientesConfigCreator()
        self.config_rutas_file = RutasSalientesConfigFile()
        self.reload_asterisk_config = AsteriskConfigReloader()

    def _generar_y_recargar_archivos_conf_asterisk(self, ruta_exclude=None):
        proceso_ok = True
        mensaje_error = ""

        try:
            self.generador_rutas_en_asterisk_conf.create_config_asterisk(
                ruta_exclude=ruta_exclude)
        except Exception as e:
            msg = _(
                "SincronizadorDeConfiguracionDeRutaSalienteEnAsterisk: error {0} al"
                .format(e.message)) + _("intentar create_config_asterisk()")
            logger.exception(msg)

            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion de rutas de Asterisk. ")
        if not proceso_ok:
            raise (RestablecerConfiguracionTelefonicaError(mensaje_error))
        else:
            self.config_rutas_file.copy_asterisk()
            self.reload_asterisk_config.reload_asterisk()

    def _generar_e_insertar_en_astdb(self, ruta):
        mensaje_error = ""

        try:
            if ruta is None:
                self.generador_rutas_en_astdb.regenerar_families()
            else:
                self.generador_rutas_en_astdb.regenerar_family(ruta)
        except Exception as e:
            msg = _(
                "SincronizadorDeConfiguracionDeRutaSalienteEnAsterisk: error {0} al "
                .format(e.message)) + _("intentar regenerar_familys_rutas()")
            logger.exception(msg)
            mensaje_error += _(
                "Hubo un inconveniente al insertar los registros de las rutas en "
                "la base de datos de Asterisk. ")
            raise (RestablecerConfiguracionTelefonicaError(mensaje_error))

    def _eliminar_ruta_en_astdb(self, ruta):
        mensaje_error = ""

        try:
            self.generador_rutas_en_astdb.delete_family(ruta)
        except Exception as e:
            msg = _(
                "SincronizadorDeConfiguracionDeRutaSalienteEnAsterisk: error {0} al "
                .format(e.message)) + _("intentar delete_family_ruta()")
            logger.exception(msg)
            mensaje_error += _(
                "Hubo un inconveniente al eliminar los registros de las rutas en "
                "la base de datos de Asterisk. ")
            raise (RestablecerConfiguracionTelefonicaError(mensaje_error))

    def _regenerar_troncales_ruta_en_astdb(self, ruta):
        mensaje_error = ""

        try:
            self.generador_rutas_en_astdb.regenerar_family_trunk_ruta(ruta)
        except Exception as e:
            msg = (
                "SincronizadorDeConfiguracionDeRutaSalienteEnAsterisk: error {0} al "
                .format(e.message)) + _("intentar delete_family_ruta()")
            logger.exception(msg)
            mensaje_error += _(
                "Hubo un inconveniente al eliminar los registros de las rutas en "
                "la base de datos de Asterisk. ")
            raise (RestablecerConfiguracionTelefonicaError(mensaje_error))

    def regenerar_rutas_salientes(self, ruta=None):
        """regenera la ruta saliente pasada por parametro y si la ruta es none regenera todas las
        rutas salientes """
        self._generar_y_recargar_archivos_conf_asterisk()
        self._generar_e_insertar_en_astdb(ruta)

    def eliminar_ruta_y_regenerar_asterisk(self, ruta):
        self._generar_y_recargar_archivos_conf_asterisk(ruta_exclude=ruta)
        self._eliminar_ruta_en_astdb(ruta)

    def regenerar_troncales_en_ruta_asterisk(self, ruta):
        self._regenerar_troncales_ruta_en_astdb(ruta)
Esempio n. 14
0
class RegeneracionAsteriskService(object):
    def __init__(self):
        # Sincroniza Queues de Campañas
        self.queues_config_creator = QueuesCreator()
        # Sincroniza Sip De Agentes
        self.sip_config_creator = SipConfigCreator()
        # Sincroniza Modelos de Configuracion Telefonica
        self.sincronizador_config_telefonica = SincronizadorDeConfiguracionTelefonicaEnAsterisk(
        )
        # Sincroniza en AstDB las que faltan en el Sincronizador de Configuracion Telefonica
        self.asterisk_database = RegenerarAsteriskFamilysOML()
        self.playlist_config_creator = PlaylistsConfigCreator()

        # Llama al comando que reinicia Asterisk
        self.reload_asterisk_config = AsteriskConfigReloader()

        # parámetros de script que desloguea agentes inactivos
        self.tareas_programadas_ids = [
            'asterisk_logout_script', 'queue_log_clean_job',
            'actualizar_reportes_de_entrantes_job',
            'actualizar_reporte_supervisores',
            'actualizar_reporte_dia_actual_agentes',
            'actualizar_reportes_salientes', 'actualizar_reportes_dialers'
        ]

        self.TIEMPO_CHEQUEO_CONTACTOS_INACTIVOS = 2
        self.TIEMPO_ACTUALIZAR_REPORTES_LLAMADAS_ENTRANTES = 1
        self.TIEMPO_ACTUALIZAR_REPORTE_SUPERVISORES = 5
        self.TIEMPO_ACTUALIZAR_DASHBOARD_AGENTES = 1
        self.TIEMPO_ACTUALIZAR_REPORTES_LLAMADAS_SALIENTES = 1
        self.TIEMPO_ACTUALIZAR_REPORTES_LLAMADAS_DIALERS = 1

    def _generar_y_recargar_configuracion_asterisk(self):
        proceso_ok = True
        mensaje_error = ""

        try:
            self.queues_config_creator.create_dialplan()
        except Exception:
            logger.exception(
                _("ActivacionQueueService: error al "
                  "intentar queues_config_creator()"))

            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion del queues de Asterisk. ")

        try:
            self.sip_config_creator.create_config_sip()
        except Exception:
            logger.exception(
                _("ActivacionAgenteService: error al "
                  "intentar create_config_sip()"))

            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion del config sip de Asterisk. ")

        try:
            self.playlist_config_creator.create_config_asterisk()
        except Exception:
            logger.exception(
                _("PlaylistsConfigCreator: error al "
                  "intentar create_config_sip()"))

            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion Playlists (MOH) en Asterisk. ")

        if not proceso_ok:
            raise (RestablecerDialplanError(mensaje_error))
        else:
            self.sincronizador_config_telefonica.sincronizar_en_asterisk()
            self.asterisk_database.regenerar_asterisk()
            self.reload_asterisk_config.reload_asterisk()

    def _generar_tarea_script_logout_agentes_inactivos(self):
        """Adiciona una tarea programada que llama al script de que desloguea
        agentes inactivos
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_source_envars = 'source /etc/profile.d/omnileads_envars.sh;'
        ruta_python_virtualenv = os.path.join(sys.prefix, 'bin/python3')
        ruta_script_logout = os.path.join(
            settings.INSTALL_PREFIX,
            'ominicontacto/manage.py logout_unavailable_agents')
        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[0])
        crontab.remove_all(comment=self.tareas_programadas_ids[0])
        if list(job) == []:
            job = crontab.new(command='{0} {1} {2}'.format(
                ruta_source_envars, ruta_python_virtualenv,
                ruta_script_logout),
                              comment=self.tareas_programadas_ids[0])
            # adicionar tiempo de periodicidad al cron job
            job.minute.every(self.TIEMPO_CHEQUEO_CONTACTOS_INACTIVOS)
            crontab.write_to_user(user=getpass.getuser())

    def _generar_tarea_limpieza_diaria_queuelog(self):
        """Adiciona una tarea programada para limpiar la tabla queue_log
        diariamente
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_psql = os.popen('which psql').read()[:-1]
        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[1])
        crontab.remove_all(comment=self.tareas_programadas_ids[1])
        if list(job) == []:
            postgres_user = settings.POSTGRES_USER
            postgres_host = settings.POSTGRES_HOST
            postgres_database = settings.POSTGRES_DATABASE
            postgres_password = '******'.format(
                os.getenv('PGPASSWORD'))
            job = crontab.new(
                command=
                '{0} {1} -U {2} -h {3} -d {4} -c \'DELETE FROM queue_log\''.
                format(postgres_password, ruta_psql, postgres_user,
                       postgres_host, postgres_database),
                comment=self.tareas_programadas_ids[1])
            # adicionar tiempo de periodicidad al cron job
            job.hour.on(2)
            crontab.write_to_user(user=getpass.getuser())

    def _generar_tarea_script_actualizar_reportes_llamadas_entrantes(self):
        """Adiciona una tarea programada que llama al script de que calcula reportes de llamadas
        entrantes
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_source_envars = 'source /etc/profile.d/omnileads_envars.sh;'
        ruta_python_virtualenv = os.path.join(sys.prefix, 'bin/python3')
        ruta_script_logout = os.path.join(
            settings.INSTALL_PREFIX,
            'ominicontacto/manage.py actualizar_reportes_llamadas_entrantes')
        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[2])
        crontab.remove_all(comment=self.tareas_programadas_ids[2])
        if list(job) == []:
            job = crontab.new(command='{0} {1} {2}'.format(
                ruta_source_envars, ruta_python_virtualenv,
                ruta_script_logout),
                              comment=self.tareas_programadas_ids[2])
            # adicionar tiempo de periodicidad al cron job
            job.minute.every(
                self.TIEMPO_ACTUALIZAR_REPORTES_LLAMADAS_ENTRANTES)
            crontab.write_to_user(user=getpass.getuser())

    def _generar_tarea_script_actualizar_reporte_datos_supervisores(self):
        """Adiciona una tarea programada que llama al script de que calcula el reportes
        los agentes y campanas asociados a cada supervisor
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_source_envars = 'source /etc/profile.d/omnileads_envars.sh;'
        ruta_python_virtualenv = os.path.join(sys.prefix, 'bin/python3')
        ruta_script = os.path.join(
            settings.INSTALL_PREFIX,
            'ominicontacto/manage.py actualizar_reporte_supervisores')
        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[3])
        crontab.remove_all(comment=self.tareas_programadas_ids[3])
        if list(job) == []:
            job = crontab.new(command='{0} {1} {2}'.format(
                ruta_source_envars, ruta_python_virtualenv, ruta_script),
                              comment=self.tareas_programadas_ids[3])
            # adicionar tiempo de periodicidad al cron job
            job.minute.every(self.TIEMPO_ACTUALIZAR_REPORTE_SUPERVISORES)
            crontab.write_to_user(user=getpass.getuser())

    def _generar_tarea_script_actualizar_reporte_agentes_dia_actual(self):
        """Adiciona una tarea programada que llama al script de que calcula el reportes
        los agentes y campanas asociados a cada supervisor
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_source_envars = 'source /etc/profile.d/omnileads_envars.sh;'
        ruta_python_virtualenv = os.path.join(sys.prefix, 'bin/python3')
        ruta_script = os.path.join(
            settings.INSTALL_PREFIX,
            'ominicontacto/manage.py actualizar_reporte_dia_actual_agentes')
        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[4])
        crontab.remove_all(comment=self.tareas_programadas_ids[4])
        if list(job) == []:
            job = crontab.new(command='{0} {1} {2}'.format(
                ruta_source_envars, ruta_python_virtualenv, ruta_script),
                              comment=self.tareas_programadas_ids[4])
            # adicionar tiempo de periodicidad al cron job
            job.minute.every(self.TIEMPO_ACTUALIZAR_DASHBOARD_AGENTES)
            crontab.write_to_user(user=getpass.getuser())

    def _generar_tarea_script_actualizar_reportes_llamadas_salientes(self):
        """Adiciona una tarea programada que llama al script de que calcula reportes de llamadas
        salientes
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_source_envars = 'source /etc/profile.d/omnileads_envars.sh;'
        ruta_python_virtualenv = os.path.join(sys.prefix, 'bin/python3')
        ruta_script_logout = os.path.join(
            settings.INSTALL_PREFIX,
            'ominicontacto/manage.py actualizar_reportes_llamadas_salientes')

        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[5])
        crontab.remove_all(comment=self.tareas_programadas_ids[5])
        if list(job) == []:
            job = crontab.new(command='{0} {1} {2}'.format(
                ruta_source_envars, ruta_python_virtualenv,
                ruta_script_logout),
                              comment=self.tareas_programadas_ids[5])
            # adicionar tiempo de periodicidad al cron job
            job.minute.every(
                self.TIEMPO_ACTUALIZAR_REPORTES_LLAMADAS_SALIENTES)
            crontab.write_to_user(user=getpass.getuser())

    def _generar_tarea_script_actualizar_reportes_llamadas_dialers(self):
        """Adiciona una tarea programada que llama al script de que calcula reportes de llamadas
        dialers
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_source_envars = 'source /etc/profile.d/omnileads_envars.sh;'
        ruta_python_virtualenv = os.path.join(sys.prefix, 'bin/python3')
        ruta_script_logout = os.path.join(
            settings.INSTALL_PREFIX,
            'ominicontacto/manage.py actualizar_reportes_llamadas_dialers')

        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[6])
        crontab.remove_all(comment=self.tareas_programadas_ids[6])
        if list(job) == []:
            job = crontab.new(command='{0} {1} {2}'.format(
                ruta_source_envars, ruta_python_virtualenv,
                ruta_script_logout),
                              comment=self.tareas_programadas_ids[6])
            # adicionar tiempo de periodicidad al cron job
            job.minute.every(self.TIEMPO_ACTUALIZAR_REPORTES_LLAMADAS_DIALERS)
            crontab.write_to_user(user=getpass.getuser())

    def _reenviar_archivos_playlist_asterisk(self):
        playlists = Playlist.objects.all()
        for playlist in playlists:
            musica_espera_list = MusicaDeEspera.objects.filter(
                playlist=playlist.pk)
            print(list(musica_espera_list))
            for musica in musica_espera_list:
                audio_file_asterisk = AudioConfigFile(musica)
                audio_file_asterisk.copy_asterisk()

    def _reenviar_paquetes_idioma(self):
        ASTERISK_SOUNDS_URL = 'https://downloads.asterisk.org/pub/telephony/sounds/'
        audios_asterisk_conf_list = AudiosAsteriskConf.objects.filter(
            esta_instalado=True)
        print("Descargando paquete de idiomas instalados....")
        for audio_conf in audios_asterisk_conf_list:
            language = audio_conf.paquete_idioma
            filename = 'asterisk-core-sounds-{0}-wav-current.tar.gz'.format(
                language)
            url = ASTERISK_SOUNDS_URL + filename
            response = requests.get(url, stream=True)
            filename_full_path = os.path.join(tempfile.gettempdir(), filename)
            handle = open(filename_full_path, "wb")
            for chunk in response.iter_content(chunk_size=512):
                if chunk:
                    handle.write(chunk)
            handle.close()

            print(f'   {language}...')
            __, nombre_archivo = os.path.split(filename_full_path)
            sound_tar_data = Path(filename_full_path).read_bytes()
            res = base64.b64encode(sound_tar_data)
            res = res.decode('utf-8')
            redis_stream = RedisStreams()
            content = {
                'archivo': nombre_archivo,
                'type': 'ASTERISK_SOUNDS',
                'action': 'COPY',
                'language': language,
                'content': res
            }
            redis_stream.write_stream('asterisk_conf_updater',
                                      json.dumps(content))
        print('Completada descarga de paquetes de idioma')

    def regenerar(self):
        self._generar_y_recargar_configuracion_asterisk()
        self._reenviar_archivos_playlist_asterisk()
        self._reenviar_paquetes_idioma()
        self._generar_tarea_script_logout_agentes_inactivos()
        self._generar_tarea_limpieza_diaria_queuelog()
        self._generar_tarea_script_actualizar_reportes_llamadas_entrantes()
        self._generar_tarea_script_actualizar_reportes_llamadas_salientes()
        self._generar_tarea_script_actualizar_reportes_llamadas_dialers()
        self._generar_tarea_script_actualizar_reporte_datos_supervisores()
        self._generar_tarea_script_actualizar_reporte_agentes_dia_actual()
Esempio n. 15
0
 def __init__(self):
     self.queues_config_creator = QueuesCreator()
     self.reload_asterisk_config = AsteriskConfigReloader()
     self.asterisk_database = CampanaFamily()
class RegeneracionAsteriskService(object):

    def __init__(self):
        # Sincroniza Queues de Campañas
        self.queues_config_creator = QueuesCreator()
        self.config_queues_file = QueuesConfigFile()
        # Sincroniza Sip De Agentes
        self.sip_config_creator = SipConfigCreator()
        self.config_sip_file = SipConfigFile()
        # Sincroniza Modelos de Configuracion Telefonica
        self.sincronizador_config_telefonica = SincronizadorDeConfiguracionTelefonicaEnAsterisk()
        # Sincroniza en AstDB las que faltan en el Sincronizador de Configuracion Telefonica
        self.asterisk_database = RegenerarAsteriskFamilysOML()

        # Llama al comando que reinicia Asterisk
        self.reload_asterisk_config = AsteriskConfigReloader()

        # parámetros de script que desloguea agentes inactivos
        self.tareas_programadas_ids = ['asterisk_logout_script', 'queue_log_clean_job']
        self.TIEMPO_CHEQUEO_CONTACTOS_INACTIVOS = 2

    def _generar_y_recargar_configuracion_asterisk(self):
        proceso_ok = True
        mensaje_error = ""

        try:
            self.queues_config_creator.create_dialplan()
        except Exception:
            logger.exception(_("ActivacionQueueService: error al "
                               "intentar queues_config_creator()"))

            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion del queues de Asterisk. ")

        try:
            self.sip_config_creator.create_config_sip()
        except Exception:
            logger.exception(_("ActivacionAgenteService: error al "
                               "intentar create_config_sip()"))

            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion del config sip de Asterisk. ")

        if not proceso_ok:
            raise(RestablecerDialplanError(mensaje_error))
        else:
            self.config_queues_file.copy_asterisk()
            self.config_sip_file.copy_asterisk()
            self.sincronizador_config_telefonica.sincronizar_en_asterisk()
            self.asterisk_database.regenerar_asterisk()
            self.reload_asterisk_config.reload_asterisk()

    def _generar_tarea_script_logout_agentes_inactivos(self):
        """Adiciona una tarea programada que llama al script de que desloguea
        agentes inactivos
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_python_virtualenv = os.path.join(sys.prefix, 'bin/python')
        ruta_script_logout = os.path.join(settings.INSTALL_PREFIX, 'bin/omni-asterisk-logout.py')
        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[0])
        if list(job) == []:
            install_prefix = 'INSTALL_PREFIX={0}'.format(settings.INSTALL_PREFIX)
            ami_user = '******'.format(settings.AMI_USER)
            ami_password = '******'.format(settings.AMI_PASSWORD)
            asterisk_hostname = 'ASTERISK_HOSTNAME={0}'.format(settings.ASTERISK_HOSTNAME)
            job = crontab.new(
                command='{0} {1} {2} {3} {4} {5}'.format(
                    install_prefix, ami_user, ami_password, asterisk_hostname,
                    ruta_python_virtualenv, ruta_script_logout),
                comment=self.tareas_programadas_ids[0])
            # adicionar tiempo de print()eriodicidad al cron job
            job.minute.every(self.TIEMPO_CHEQUEO_CONTACTOS_INACTIVOS)
            crontab.write_to_user(user=getpass.getuser())

    def _generar_tarea_limpieza_diaria_queuelog(self):
        """Adiciona una tarea programada para limpiar la tabla queue_log
        diariamente
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_psql = os.popen('which psql').read()[:-1]
        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[1])
        if list(job) == []:
            postgres_user = settings.POSTGRES_USER
            postgres_host = settings.POSTGRES_HOST
            postgres_database = settings.POSTGRES_DATABASE
            postgres_password = '******'.format(os.getenv('PGPASSWORD'))
            job = crontab.new(
                command='{0} {1} -U {2} -h {3} -d {4} -c \'DELETE FROM queue_log\''.format(
                    postgres_password, ruta_psql, postgres_user, postgres_host,
                    postgres_database),
                comment=self.tareas_programadas_ids[1])
            # adicionar tiempo de print()eriodicidad al cron job
            job.hour.on(2)
            crontab.write_to_user(user=getpass.getuser())

    def regenerar(self):
        self._generar_y_recargar_configuracion_asterisk()
        self._generar_tarea_script_logout_agentes_inactivos()
        self._generar_tarea_limpieza_diaria_queuelog()
Esempio n. 17
0
 def __init__(self):
     self.sip_config_creator = SipConfigCreator()
     self.reload_asterisk_config = AsteriskConfigReloader()
     self.asterisk_database = AgenteFamily()
class RegeneracionAsteriskService(object):
    def __init__(self):
        # Sincroniza Queues de Campañas
        self.queues_config_creator = QueuesCreator()
        # Sincroniza Sip De Agentes
        self.sip_config_creator = SipConfigCreator()
        # Sincroniza Modelos de Configuracion Telefonica
        self.sincronizador_config_telefonica = SincronizadorDeConfiguracionTelefonicaEnAsterisk(
        )
        # Sincroniza en AstDB las que faltan en el Sincronizador de Configuracion Telefonica
        self.asterisk_database = RegenerarAsteriskFamilysOML()
        self.playlist_config_creator = PlaylistsConfigCreator()

        # Llama al comando que reinicia Asterisk
        self.reload_asterisk_config = AsteriskConfigReloader()

        # parámetros de script que desloguea agentes inactivos
        self.tareas_programadas_ids = [
            'asterisk_logout_script', 'queue_log_clean_job',
            'actualizar_reportes_de_entrantes_job',
            'actualizar_reporte_supervisores'
        ]
        self.TIEMPO_CHEQUEO_CONTACTOS_INACTIVOS = 2
        self.TIEMPO_ACTUALIZAR_REPORTES_LLAMADAS_ENTRANTES = 1
        self.TIEMPO_ACTUALIZAR_REPORTE_SUPERVISORES = 5

    def _generar_y_recargar_configuracion_asterisk(self):
        proceso_ok = True
        mensaje_error = ""

        try:
            self.queues_config_creator.create_dialplan()
        except Exception:
            logger.exception(
                _("ActivacionQueueService: error al "
                  "intentar queues_config_creator()"))

            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion del queues de Asterisk. ")

        try:
            self.sip_config_creator.create_config_sip()
        except Exception:
            logger.exception(
                _("ActivacionAgenteService: error al "
                  "intentar create_config_sip()"))

            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion del config sip de Asterisk. ")

        try:
            self.playlist_config_creator.create_config_asterisk()
        except Exception:
            logger.exception(
                _("PlaylistsConfigCreator: error al "
                  "intentar create_config_sip()"))

            proceso_ok = False
            mensaje_error += _("Hubo un inconveniente al crear el archivo de "
                               "configuracion Playlists (MOH) en Asterisk. ")

        if not proceso_ok:
            raise (RestablecerDialplanError(mensaje_error))
        else:
            self.sincronizador_config_telefonica.sincronizar_en_asterisk()
            self.asterisk_database.regenerar_asterisk()
            self.reload_asterisk_config.reload_asterisk()

    def _generar_tarea_script_logout_agentes_inactivos(self):
        """Adiciona una tarea programada que llama al script de que desloguea
        agentes inactivos
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_source_envars = 'source /etc/profile.d/omnileads_envars.sh;'
        ruta_python_virtualenv = os.path.join(sys.prefix, 'bin/python3')
        ruta_script_logout = os.path.join(
            settings.INSTALL_PREFIX,
            'ominicontacto/manage.py logout_unavailable_agents')
        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[0])
        crontab.remove_all(comment=self.tareas_programadas_ids[0])
        if list(job) == []:
            job = crontab.new(command='{0} {1} {2}'.format(
                ruta_source_envars, ruta_python_virtualenv,
                ruta_script_logout),
                              comment=self.tareas_programadas_ids[0])
            # adicionar tiempo de periodicidad al cron job
            job.minute.every(self.TIEMPO_CHEQUEO_CONTACTOS_INACTIVOS)
            crontab.write_to_user(user=getpass.getuser())

    def _generar_tarea_limpieza_diaria_queuelog(self):
        """Adiciona una tarea programada para limpiar la tabla queue_log
        diariamente
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_psql = os.popen('which psql').read()[:-1]
        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[1])
        crontab.remove_all(comment=self.tareas_programadas_ids[1])
        if list(job) == []:
            postgres_user = settings.POSTGRES_USER
            postgres_host = settings.POSTGRES_HOST
            postgres_database = settings.POSTGRES_DATABASE
            postgres_password = '******'.format(
                os.getenv('PGPASSWORD'))
            job = crontab.new(
                command=
                '{0} {1} -U {2} -h {3} -d {4} -c \'DELETE FROM queue_log\''.
                format(postgres_password, ruta_psql, postgres_user,
                       postgres_host, postgres_database),
                comment=self.tareas_programadas_ids[1])
            # adicionar tiempo de periodicidad al cron job
            job.hour.on(2)
            crontab.write_to_user(user=getpass.getuser())

    def _generar_tarea_script_actualizar_reportes_llamadas_entrantes(self):
        """Adiciona una tarea programada que llama al script de que calcula reportes de llamadas
        entrantes
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_source_envars = 'source /etc/profile.d/omnileads_envars.sh;'
        ruta_python_virtualenv = os.path.join(sys.prefix, 'bin/python3')
        ruta_script_logout = os.path.join(
            settings.INSTALL_PREFIX,
            'ominicontacto/manage.py actualizar_reportes_llamadas_entrantes')
        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[2])
        crontab.remove_all(comment=self.tareas_programadas_ids[2])
        if list(job) == []:
            job = crontab.new(command='{0} {1} {2}'.format(
                ruta_source_envars, ruta_python_virtualenv,
                ruta_script_logout),
                              comment=self.tareas_programadas_ids[2])
            # adicionar tiempo de periodicidad al cron job
            job.minute.every(
                self.TIEMPO_ACTUALIZAR_REPORTES_LLAMADAS_ENTRANTES)
            crontab.write_to_user(user=getpass.getuser())

    def _generar_tarea_script_actualizar_reporte_datos_supervisores(self):
        """Adiciona una tarea programada que llama al script de que calcula el reportes
        los agentes y campanas asociados a cada supervisor
        """
        # conectar con cron
        crontab = CronTab(user=getpass.getuser())
        ruta_source_envars = 'source /etc/profile.d/omnileads_envars.sh;'
        ruta_python_virtualenv = os.path.join(sys.prefix, 'bin/python3')
        ruta_script = os.path.join(
            settings.INSTALL_PREFIX,
            'ominicontacto/manage.py actualizar_reporte_supervisores')
        # adicionar nuevo cron job para esta tarea si no existe anteriormente
        job = crontab.find_comment(self.tareas_programadas_ids[3])
        crontab.remove_all(comment=self.tareas_programadas_ids[3])
        if list(job) == []:
            job = crontab.new(command='{0} {1} {2}'.format(
                ruta_source_envars, ruta_python_virtualenv, ruta_script),
                              comment=self.tareas_programadas_ids[2])
            # adicionar tiempo de periodicidad al cron job
            job.minute.every(self.TIEMPO_ACTUALIZAR_REPORTE_SUPERVISORES)
            crontab.write_to_user(user=getpass.getuser())

    def regenerar(self):
        self._generar_y_recargar_configuracion_asterisk()
        self._generar_tarea_script_logout_agentes_inactivos()
        self._generar_tarea_limpieza_diaria_queuelog()
        self._generar_tarea_script_actualizar_reportes_llamadas_entrantes()
        self._generar_tarea_script_actualizar_reporte_datos_supervisores()