Asterisk

Asterisk Redes Multimedia Sergio Herrería Alonso Curso 2019/2020 Departamento de Enxeñaría Telemática Universidade de V

Views 136 Downloads 0 File size 421KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

  • Author / Uploaded
  • C
Citation preview

Asterisk Redes Multimedia

Sergio Herrería Alonso Curso 2019/2020 Departamento de Enxeñaría Telemática Universidade de Vigo

Contenido

1. Asterisk 2. Configuración básica 3. Configuración de canales 4. Dialplan 5. Funcionalidades avanzadas

1

Asterisk

¿Qué es Asterisk? Asterisk Open Source IP PBX (Private Branch Exchange) • So tware que permite convertir un servidor en una centralita telefónica • Solución escalable para el despliegue de sistemas de VoIP (y videoconferencia) de mediana y gran escala • So tware multiplataforma • Linux, FreeBSD, OpenBSD, macOS, Solaris • Licencia de producto GNU GPLv2 • Permiso para ejecutar, modificar, redistribuir y publicar mejoras del código fuente • Base para el desarrollo de productos comerciales Asterisk

2

IP PBX

Asterisk

3

Un poco de historia… • Creado originalmente por Mark Spencer en 1999 • Necesitaba una PBX para su empresa pero no disponía del dinero suficiente…

• En 2002 Mark Spencer funda Digium, empresa encargada de administrar y mantener el código fuente de Asterisk • Soporte técnico, certificaciones dCAA y dCAP…

• Digium también vende hardware compatible con Asterisk • Tarjetas PCI para conectar líneas telefónicas analógicas y digitales a Asterisk • Hardphones, VoIP gateways, servicios cloud…

• En la actualidad Asterisk es una solución VoIP robusta, tanto para empresas como para proveedores Asterisk

4

Versiones

• 1.0 (Septiembre 2004) • 1.4 (Diciembre 2006) • 1.6 (Octubre 2008) • 1.8 (Octubre 2010) • … • 13.0 LTS (Octubre 2014) • 16.0 LTS (Octubre 2018) • Última versión: 16.8.0 (Febrero 2020)

• 17.0 Standard (Septiembre 2019) • Última versión: 17.2.0 (Febrero 2020)

Asterisk

5

Funcionalidades básicas 1. Soporte de protocolos VoIP • SIP, IAX, SCCP, H.323, Google Talk, MGCP…

2. Soporte de telefonía tradicional • Líneas analógicas y digitales (acceso BRI y PRI E1/T1)

3. Funciones de centralita • • • • • • • • • Asterisk

Buzón de voz Desvío de llamadas Conferencias Colas de llamadas Transferencia de llamadas Música en espera Registro de llamadas Envío y recepción de faxes … 6

Funcionalidades avanzadas

• IVR (Interactive Voice Response) • Gestión de llamadas a través de un menú interactivo

• AstDB (Asterisk Database) • Registro y consulta de datos en tiempo de ejecución

• AGI (Asterisk Gateway Interface) • Invocación de aplicaciones externas (Python, Ruby, PHP…) desde Asterisk

• AMI (Asterisk Management Interface) • Administración y control remoto de un servidor Asterisk

• ARI (Asterisk REST Interface) • API REST para construir aplicaciones basadas en Asterisk

Asterisk

7

Software relacionado • Proxy SIP • Kamailio • OpenSIPS • Brekeke SIP Server

• So tswitch • • • • •

3CX Phone System Brekeke PBX FreeSWITCH MediaCore SBC Yate

• Distribuciones Linux • FreePBX Distro • CentOS + Asterisk + FreePBX (GUI)

• Elastix Asterisk

8

Requisitos del sistema • Asterisk es intensivo en CPU • Instalación sobre plataformas BSD y GNU/Linux • Configuración server (servidor dedicado o alta prioridad) • Asterisk en la “nube”

• Factores que afectan al rendimiento • Número de llamadas simultáneas • Códecs utilizados (G.711, G.729, GSM…) • Compromiso entre ancho de banda y uso del procesador

• Provisión de conferencias • Transcodificación y mezcla de flujos de audio

• Cancelación de eco (PSTN) • Llamadas a programas externos • Interrupciones IRQ Asterisk

9

Referencias

• Libros • R. Bryant, L. Madsen, J. Van Meggelen. “Asterisk: The Definitive Guide”, 5/e. O’Reilly, 2019 • F. Goncalves. “Complete Asterisk Training”. 2019 • L. Madsen, R. Bryant. “Asterisk Cookbook”. O’Reilly, 2011

• Recursos electrónicos • • • •

Asterisk

http://www.asterisk.org http://wiki.asterisk.org/wiki/display/AST/Home http://www.digium.com http://www.voip-info.org

10

Instalación

• A partir de paquetes • Disponibles para Debian, Ubuntu, Fedora, CentOS… • Ubuntu: > apt-get install asterisk

• A partir del código fuente • • • •

Asterisk DAHDI: drivers de control de las tarjetas telefónicas libpri: conexión de Asterisk con líneas digitales RDSI Instalación previa de varias librerías dependientes • gcc, ncurses, OpenSSL, newt, libxml2, Kernel headers…

• Conjuntamente con una distribución Linux preparada • FreePBX Distro, Elastix

Asterisk

11

Arranque y detención CLI (Command Line Interface) Consola desde la que controlar y monitorizar la centralita • Arranque • > asterisk: ejecución en segundo plano • > asterisk -c: ejecución en primer plano (inicia la CLI) • > asterisk -r: conexión a la CLI cuando Asterisk ya se esté ejecutando en segundo plano

• Detención • CLI> core stop now: detención inmediata • CLI> core stop when convenient: detención cuando no haya llamadas en curso • CLI> core stop gracefully: detención cuando no haya llamadas en curso (y no se aceptan nuevas llamadas) • CLI> Ctrl+C : solo desconexión de la CLI Asterisk

12

Niveles de verbosidad • Nivel de verbosidad • Cuanto mayor sea, más mensajes se mostrarán en la CLI sobre lo que sucede en la centralita • > asterisk -vvvc • CLI> core set verbose 3

• Nivel de depuración • Cuanto mayor sea, más mensajes de depuración se mostrarán en la CLI (para desarrolladores) • > asterisk -dddc • CLI> core set debug 3

• Trucos CLI • Tecla : completar/mostrar comandos disponibles • Tecla : mostrar comandos introducidos anteriormente • Ejecución de comandos de consola Linux: CLI> !ls Asterisk

13

Configuración básica

Arquitectura modular

Configuración básica

14

Canales Una llamada es una concatenación de canales punto a punto Canal Toda conexión entre Asterisk y cualquier otro dispositivo (terminal, centralita, otro servidor) • Canales VoIP: SIP, IAX, H.323, MGCP… • Canales hardware: DAHDI (analógicos/digitales) • Canales de consola: dispositivos OSS/ALSA como so tphones Asterisk Canal SIP

Configuración básica

Asterisk Canal IAX

Canal DAHDI

15

Dialplan Dialplan Plan de marcación que define el comportamiento lógico de la centralita • Define el itinerario que han de seguir las llamadas desde que llegan a la centralita hasta que finalizan • Se compone de varios contextos y extensiones • Una extensión es la lista de acciones (un programa) que hay que ejecutar para cada llamada entrante o saliente • Identificadas mediante cadenas alfanuméricas: 101, luis… • Un contexto es una colección de extensiones bajo un mismo identificador • Aplicación de distintas políticas de seguridad • Diferenciación de servicios por extensiones Configuración básica

16

Dialplan Aplicación Cada una de las posibles acciones individuales asociadas a una extensión • Asterisk ejecuta secuencialmente (dependiendo de su prioridad) las aplicaciones asociadas a cada extensión • Ejemplos: • • • • •

Dial(): realizar una llamada Hangup(): colgar una llamada Answer(): contestar a una llamada Playback(): reproducir un fichero de audio …

Configuración básica

17

Estructura del dialplan

DIALPLAN Context A

Context B

Extension 100

Extension 100

Priority 1: Application 1 Priority 2: Application 2 Priority 3: Application 3

Priority 1: Application 1 Priority 2: Application 2 Priority 3: Application 3

Extension 101

Extension 101

Priority 1: Application 1 Priority 2: Application 2

Priority 1: Application 1 Priority 2: Application 2

Extension 200 Priority 1: Application 1 Priority 2: Application 2 Priority 3: Application 3

Configuración básica

18

Ficheros de configuración Habitualmente residen en /etc/asterisk • Configuración general • asterisk.conf • modules.conf • Configuración de canales • pjsip.conf • iax.conf • chan_dahdi.conf • Configuración del dialplan • extensions.conf • Configuración de funcionalidades adicionales • voicemail.conf • musiconhold.conf • … Configuración básica

19

pjsip.conf [transport-udp] type = transport protocol = udp bind = 0.0.0.0:5020 [acl-subnet] type = acl deny = 0.0.0.0/0.0.0.0 permit = 172.19.46.0/23

[100] type = auth auth_type = userpass username = 100 password = querty [100] type = aor max_contacts = 1 qualify_frequency = 30

[100] type = endpoint context = phones acl = acl-subnet language = es disallow = all allow = alaw,gsm auth = 100 aors = 100 Configuración básica

20

extensions.conf El fichero extensions.conf contiene el dialplan [general] [phones] exten => _10X,1,Dial(PJSIP/${EXTEN}) exten => _10X,2,Hangup exten exten exten exten exten

=> => => => =>

Configuración básica

600,1,Answer 600,2,Playback(demo-echotest) 600,3,Echo 600,4,Playback(demo-echodone) 600,5,Hangup

21

Rangos de extensiones Asterisk permite especificar rangos de extensiones mediante los patrones de coincidencia • Los patrones comienzan por el carácter _ • • • • • • •

X representa cualquier dígito entre 0 y 9 Z representa cualquier dígito entre 1 y 9 N representa cualquier dígito entre 2 y 9 [ij] representa el dígito i o el dígito j [i-j] representa cualquier dígito entre el i y el j . representa cualquier cadena no nula de caracteres ! representa cualquier cadena de caracteres

• Ejemplos: • Teléfonos fijos de Galicia: _[89]8[1268]XXXXXX • Teléfonos móviles: _[67]XXXXXXXX • Cualquier número: _.! Configuración básica

22

Control del flujo Asterisk ejecuta en orden estricto de prioridad las aplicaciones asociadas a cada extensión • La prioridad n (next) es equivalente a sumar uno a la prioridad anterior • Facilita la escritura e interpretación del dialplan

• Con el prefijo same evitamos repetir la extensión • Ejemplo: exten same same same same

Configuración básica

=> => => => =>

600,1,Answer n,Playback(demo-echotest) n,Echo n,Playback(demo-echodone) n,Hangup

23

Comandos CLI

• CLI> module reload res_pjsip.so • CLI> pjsip list endpoints|auths|aors|channels • CLI> pjsip show endpoints|auths|aors|channels • CLI> pjsip show endpoint|auth|aor name • CLI> dialplan reload • CLI> dialplan show context • CLI> core reload

Configuración básica

24

Configuración de canales

SIP SIP (Session Initiation Protocol) Protocolo de señalización genérico diseñado específicamente para Internet (RFC 3261) • Gestión de llamadas: inicio, finalización, transferencia… • Localización y disponibilidad de usuarios • Protocolo “fuera de banda” • Señalización: udp/5060 (pjsip.conf) • Audio: udp/10000–20000 (rtp.conf)

• Protocolo textual • Problemas con NAT • Cambios en las direcciones IP y/o números de puerto Configuración de canales

25

Plantillas Las plantillas permiten definir opciones comunes para varios canales [codecs](!) disallow = all allow = alaw,gsm

[100](softphones) auth = 100 aors = 100

[softphones](!,codecs) type = endpoint context = phones acl = acl-subnet language = es

[100](auth-userpass) username = 100 password = qwerty

[auth-userpass](!) type = auth auth_type = userpass

[101](softphones) auth = 101 aors = 101

[aor-single-reg](!) type = aor max_contacts = 1 qualify_frequency = 30

[101](auth-userpass) username = 101 password = asdfg

[100](aor-single-reg)

[101](aor-single-reg)

Configuración de canales

26

Autenticación MD5

Es más seguro guardar las contraseñas cifradas (hash MD5) [auth100] type = auth auth_type = md5 realm = eetlabs.local.rmm ; asterisk by default username = 100 ; echo -n "100:eetlabs.local.rmm:qwerty" | md5sum md5_cred = 90f00e866b7cf724b2be465c63a5ab84

Configuración de canales

27

Conexión a un proveedor SIP 1. Configurar el canal SIP con el proveedor (pjsip.conf) [mytrunk] type = registration outbound_auth = mytrunk server_uri = sip:[email protected] client_uri = sip:[email protected] [mytrunk] type = auth auth_type = userpass username = account password = 1234567890

[mytrunk] type = aor contact = sip:203.0.113.1 [mytrunk] type = endpoint context = from-external outbound_auth = mytrunk aors = mytrunk [mytrunk] type = identify endpoint = mytrunk match = 203.0.113.1

2. Configurar las extensiones (extensions.conf) [phones] exten => _[67]XXXXXXXX,1,Dial(PJSIP/${EXTEN}@mytrunk) [from-external] exten => _.!,1,Dial(PJSIP/100)

Configuración de canales

28

IAX IAX (Inter Asterisk eXchange) Protocolo de señalización propio de Asterisk utilizado en la interconexión de centralitas Asterisk • Protocolo “dentro de banda” • Audio y señalización a través de un único canal (udp/4569)

• Protocolo binario (no textual) • Soporta trunking: múltiples llamadas por el mismo flujo • Ahorro de ancho de banda (sobrecarga de cabeceras)

• Soporta cifrado (AES128) y autenticación (MD5, RSA) • Transparente a NAT • So tphones detrás de NAT: Zoiper, KIAX Configuración de canales

29

IAX El fichero iax.conf contiene una lista con los canales IAX configurados y una serie de opciones generales [general] autokill=yes jitterbuffer=yes [centralita] type=friend host=192.168.0.33 auth=plaintext secret=querty context=entrantes encryption=yes

Configuración de canales

30

IAX • Trunking • trunk=yes • Requiere temporizador (módulo dahdi_dummy)

• Autenticación • auth=md5,rsa • Las claves RSA se generan con el comando astgenkey y se almacenan en /usr/share/asterisk/keys

• Dialplan • Dial(IAX2/[user:pass@host]/exten[@context])

• Comandos CLI • • • •

CLI> CLI> CLI> CLI>

iax2 iax2 iax2 iax2

Configuración de canales

reload show peers show peer name show channels 31

Dialplan

Elementos El dialplan está compuesto por: • Contextos: grupo de extensiones bajo un mismo identificador • Extensiones: lista de acciones a ejecutar para cada llamada entrante o saliente • • • • • •

Identificadas mediante cadena alfanumérica: 101, ana… s: para las llamadas sin extensión o para subrutinas i: extensión inválida, no definida o desconocida t: extensión de temporización en IVRs h: extensión de finalización de llamada fax: detección de fax en canales DAHDI

• Aplicaciones: cada una de las acciones individuales que es posible asociar a una extensión • CLI> core show application appname Dialplan

32

Aplicaciones: Gestión de llamadas • Answer([delay]) • Responde a la llamada tras esperar delay milisegundos

• Busy([timeout]) • Envía al llamante la señal de ocupado durante timeout segundos y finaliza la llamada

• Dial(tech/resource[&...][,timeout[,opt]]) • • • •

Realiza una llamada Dial(PJSIP/juan) Dial(IAX2/luis:qwerty@proveedor/juan,10) Dial(PJSIP/juan&PJSIP/pedro&PJSIP/luis)

• Hangup([cause]) • Finaliza la llamada Dialplan

33

Aplicación Dial() • Si la llamada se realiza con éxito, finaliza la ejecución del dialplan (o se salta a la extensión h) • Si no, se continúa con el dialplan en la siguiente prioridad • Opciones: • A(file): reproduce el fichero de audio al llamado antes de establecer la comunicación • L(t): limita la duración de la llamada a t milisegundos • m: reproduce música al llamante mientras no se responde a la llamada • t: la llamada puede ser transferida por el llamado • T: la llamada puede ser transferida por el llamante • w: el llamado puede grabar la llamada • W: el llamante puede grabar la llamada • … Dialplan

34

Aplicaciones: Reproducción de audio

• PlayBack(filename) • Reproduce el fichero de audio

• Background(filename) • Reproduce el fichero de audio mientras espera a que se intoduzca una extensión

• SayDigits(digits) • Reproduce los dígitos de uno en uno

• SayNumber(number) • Reproduce el número

• SayAlpha(string) • Reproduce los caracteres de la cadena

Dialplan

35

Aplicaciones: Grabación de audio

• Monitor(format,filename) • Graba la llamada: filename-in.format (audio de entrada), filename-out.format (audio de salida)

• MixMonitor(filename.format) • Graba la llamada completa en un único fichero

• StopMonitor(), StopMixMonitor() • Detiene la grabación iniciada con Monitor, MixMonitor

• Record(filename.format[,silence[,maxdur]]) • Graba mensajes de voz • Permite especificar los segundos en silencio antes de que se detenga la grabación o la duración máxima del mensaje

Dialplan

36

Más aplicaciones… • Verbose([level,]message) • Muestra el mensaje en la CLI si el nivel de verbosidad es igual o superior al indicado (herramienta de depuración)

• Wait(t) • Espera t segundos

• WaitExten(t) • Espera t segundos a que se introduzca una extensión

• Authenticate(password) • Espera a que el usuario introduzca una contraseña para continuar la ejecución

• System(command) • Ejecuta un comando del sistema Dialplan

37

Variables

Asterisk permite el empleo de variables • Inicialización: Set(VARNAME=value) • Uso: ${VARNAME} • Manipulación: ${VARNAME[:skip[:length]]} • Ejemplo: exten same same same

Dialplan

=> => => =>

700,1,Set(NUMBER=98765) n,Verbose(${NUMBER:2}) ; 765 n,Verbose(${NUMBER:-2}) ; 65 n,Verbose(${NUMBER:1:3}) ; 876

38

Variables • Variables globales • Válidas en todos los contextos y extensiones • Se declaran en el [globals] del extensions.conf • Set(GLOBAL(VARNAME)=value)

• Variables de canal • Válidas únicamente durante la llamada • Variables predefinidas: • • • •

${CONTEXT}, ${EXTEN}, ${PRIORITY} ${UNIQUEID}, ${CHANNEL} ${CALLERID(name)}, ${CALLERID(num)} ${DIALSTATUS}: CHANUNAVAIL, CONGESTION, BUSY, NOANSWER, ANSWER, CANCEL • ${DIALEDTIME}, ${ANSWEREDTIME} • ${SYSTEMSTATUS}: FAILURE, SUCCESS, APPERROR • ${EPOCH} Dialplan

39

Expresiones

Las variables se pueden combinar en expresiones aritméticas y lógicas • Operadores lógicos: |, &, =, >, =, => => =>

700,1,Set(NUM=10) n,Set(NUM=$[${NUM}*2]) n,Set(COND1=$[${NUM}>10]) n,Set(COND2=$[${COND1} & (${NUM} => => =>

700,1,Set(TEXT=Hola mundo) n,Set(L=${LEN(${TEXT})}) n,Set(COND=${ISNULL(${TEXT})}) n,Set(TEXT=${CUT(TEXT, ,1)})

41

Control del flujo

• Saltos incondicionales • Goto([[context,]extension,]priority) • Se pueden asignar etiquetas a las prioridades para facilitar la programación del dialplan • Goto(label)

• Ejemplo: exten same same same same

Dialplan

=> => => => =>

700,1,Answer(1000) n,Set(COUNT=1) n(repeat),SayNumber(${COUNT}) n,Verbose(${INC(COUNT)}) n,Goto(repeat)

42

Control del flujo • Saltos condicionales • • • •

GotoIf(condition?label1:label2) Si la condición se cumple, se salta a label1 Si no se cumple, se salta a label2 Si se omite alguna de las etiquetas, se continúa con la ejecución secuencial de prioridades

• Ejemplo: exten same same same same same same Dialplan

=> => => => => => =>

700,1,Answer(1000) n,Set(COUNT=1) n(repeat),GotoIf($[${COUNT} => => => => => =>

700,1,Answer(1000) n,Set(COUNT=1) n,While($[${COUNT} s,1,Verbose(Llamada desde ${ARG1}) same => n,Playback(tt-weasels) same => n,Return(123) [phones] exten => 700,1,Gosub(gosub-test,s,1(${EXTEN})) same => n,Verbose(Devuelve ${GOSUB_RETVAL}) same => n,Hangup Dialplan

45

AstDB AstDB Asterisk incluye una base de datos interna donde se puede almacenar datos de manera persistente • Los datos se agrupan formando familias • Dentro de una familia, a los datos se accede por su clave o identificador • Gestión desde la CLI: • • • • • Dialplan

CLI> CLI> CLI> CLI> CLI>

database database database database database

put family key value show [family [key]] get family key del family key deltree family 46

AstDB Gestión de la AstDB desde el dialplan: • Guardar: Set(DB(family/key)=value) • Recuperar: ${DB(family/key)} • Eliminar: ${DB_DELETE(family/key)} • Eliminar familia: DBdeltree(family) • Comprobar existencia: ${DB_EXISTS(family/key)} • Ejemplo: exten same same same same same Dialplan

=> => => => => =>

700,1,Answer(1000) n,GotoIf($[${DB_EXISTS(test/num)}]?cont) n,Set(DB(test/num)=1) n(cont),SayNumber(${DB(test/num)}) n,Set(DB(test/num)=$[${DB(test/num)}+1]) n,Hangup 47

Funcionalidades avanzadas

IVR (Interactive Voice Response) exten => 800,1,Goto(menu,s,1) [menu] exten => s,1,Answer(1000) same => n(loop),Background(press-1&or&press-2) same => n,WaitExten(5) exten => 1,1,SayNumber(${EXTEN}) same => n,Goto(s,loop) exten => 2,1,SayNumber(${EXTEN}) same => n,Goto(s,loop) exten => i,1,Playback(invalid) same => n,Goto(s,loop) exten => t,1,Playback(vm-goodbye) same => n,Hangup Funcionalidades avanzadas

48

Buzón de voz Voicemail Asterisk permite la creación de buzones de voz como simples extensiones individuales • Asociación de varios buzones a un único teléfono • Asociación de un único buzón a varios teléfonos • Acceso a los buzones protegido mediante contraseña • Alocuciones personalizadas dependiendo del estado • Notificación a través del correo electrónico • Posibilidad de enviar el mensaje de voz como adjunto • Requiere configurar un servidor de correo (postfix…) • Notificación mediante indicador luminoso o tono especial Funcionalidades avanzadas

49

Buzón de voz El fichero voicemail.conf contiene la lista con los buzones de voz configurados y una serie de opciones generales [general] format = alaw ; Formats for writing Voicemail maxmsg = 100 ; Max number of messages per folder maxsecs = 180 ; Max length of a voicemail message in seconds maxsilence = 10 ; Seconds of silence before ending recording maxlogins = 3 ; Max number of failed login attempts [zonemessages] european = Europe/Copenhagen|'vm-received' a d b 'digits/at' HM [vmphones] ;mailbox => pin,name[,email[,short email[,options]]] 100 => 1234,Aitor Menta,[email protected] 101 => 5678,Elena Nito,[email protected],[email protected],tz=european Funcionalidades avanzadas

50

Buzón de voz • Comandos CLI: • CLI> voicemail reload • CLI> voicemail show users • CLI> voicemail show zones

• Asociación de los buzones de voz a las extensiones correspondientes en el fichero pjsip.conf [100] type = endpoint context = phones aors = 100 auth = auth100 mailboxes = 100@vmphones

Funcionalidades avanzadas

51

Buzón de voz • VoiceMail(mailbox[@context][&...][,opt]) • Reenvía la llamada al buzón de voz

• VoiceMailMain(mailbox[@context][,opt]) • Acceso y configuración del buzón de voz exten same same same same same

=> => => => => =>

_1XX,1,Dial(PJSIP/${EXTEN},20) n,GotoIf($[${DIALSTATUS}=BUSY]?busy) n,VoiceMail(${EXTEN}@vmphones,u) n,Hangup n(busy),VoiceMail(${EXTEN}@vmphones,b) n,Hangup

exten => 800,1,Answer(1000) same => n,VoiceMailMain(${CALLERID(num)}@vmphones) same => n,Hangup Funcionalidades avanzadas

52

Música en espera Asterisk puede amenizar (o torturar) la espera del llamante con una agradable música de fondo • Conviene evitar códecs complejos para no sobrecargar el procesador (MP3, Opus…) • Se recomienda utilizar formatos nativos de Asterisk para evitar transcodificaciones durante la reproducción • SoX (Sound eXchange) > sox file.mp3 -r 8000 -c 1 -e a-law file.wav • Fichero de configuración: musiconhold.conf [default] mode = files directory = moh sort = random

• CLI> moh reload Funcionalidades avanzadas

53