Provya

Expertise pfSense

Sommaire des articles  -  Liens & Actualités  -  Firewall pour pfSense

[Asterisk] Les commandes utiles pour Asterisk

icon 24/06/2018 - 7 commentaires

En cas de problème sur Asterisk, il est pratique de connaître les commandes de base à utiliser pour établir un premier diagnostique.

Nous présentons ici les principales commandes utiles et les explications pour bien les comprendre.



Connexion à la console Asterisk


Nous partons du principe que le service Asterisk tourne en tâche de fond sur nos serveurs.

Pour se connecter à la console Asterisk, la commande est la suivante :
root@asterisk1:~# asterisk -rvvv

Une fois connecté à la console, pour connaître la liste des commandes disponibles il suffit de saisir « ? ».



Lister tous les comptes SIP


Pour lister toutes les entités SIP, c'est-à-dire tous les téléphones et les trunks SIP, la commande est la suivante :
asterisk*CLI> sip show peers

Cette commande précise notamment le username SIP, l'adresse IP associée, l'état de l'entité et le ping SIP.

Le résultat de la commande ressemble à ceci :
Name/username      Host              Dyn   Forcerport        Comedia           ACL         Port        Status            Description
1001/s             Unspecified       D     Yes               Yes                           11475       UNKNOW            
1002/s             192.168.11.1      D     Yes               No                A           1024        OK (29 ms)            
1003/s             192.168.11.2      D     Yes               No                            5060        OK (14 ms)            
3 sip peers [Monitored: 2 online, 1 offline Unmonitored: 0 online, 0 offline]

La lecture du résultat de la commande est la suivante :
  • Le poste « 1001 » n'est pas enregistré sur le serveur Asterisk :
  • Son adresse IP n'est pas connue : elle vaut « Unspecified »
  • Son état est à « UNKNOW »
  • Le poste « 1002 » est bien enregistré sur le serveur Asterisk :
  • Son état est à « OK »
  • Son adresse IP est 192.168.11.1
  • Sa latence SIP est de « 29ms »
  • Le poste « 1003 » est bien enregistré sur le serveur Asterisk :
  • Son état est à « OK »
  • Son adresse IP est 192.168.11.2
  • Sa latence SIP est de « 14ms »

La commande nous renseigne aussi sur le fait qu'il y a 3 comptes SIP de créés sur le serveur Asterisk, dont 2 qui sont connectés et 1 qui ne l'est pas.



Détailler les paramètres d'un compte SIP


La commande suivante permet de lister les paramètres détaillés d'un compte SIP :
asterisk*CLI> sip show peer 1001



Voir les communications en cours


Pour visualiser les communications en cours :
asterisk*CLI> core show channels

Le résultat de la commande ressemble à ceci :
Channel              Location   State   Application(Data)
SIP/1001-00009867  s@user:36  Up      Dial(SIP/1002,15,hHtT)
SIP/1002-00009876  (None)     Up      AppDial((Outgoing Line))
2 active channels
1 active call
4012 calls processed

La lecture du résultat est la suivante :
  • Les postes « 1001 » et « 1002 » sont en communication (l'un avec l'autre)
  • C'est le poste « 1001 » qui appelle l'autre poste (la dernière application lancée étant « Dial(SIP/1002,15,hHtT) » qui se traduit par « appeler le poste SIP 1002, laisser sonner 15 secondes avant de passer à l'étape suivante du dialplan s'il ne décroche pas »).
  • On observe qu'il y a 1 appel en cours (1001 vers 1002) et qu'il y a eu 4012 appels passés depuis que le service Asterisk est démarré.



Connaître le détail d'une communication en cours


Pour connaître le détail d'une communication en cours, la commande est la suivante :
asterisk*CLI> core show channel SIP/1001-00009867

Le résultat de cette commande est très verbeux. Plusieurs parties peuvent nous intéresser.
Les lignes suivantes nous renseigne sur le codec utilisé :
NativeFormats: (alaw)
WriteFormat: alaw
ReadFormat: alaw

Les variables CDR nous renseigne notamment sur la durée de l'appel (peut être très utile pour détecter les appels fantômes, c'est-à-dire mal raccrochés) :
level 1: start=2015-06-09 15:44:26
level 1: answer=2015-06-09 15:44:47
level 1: duration=774
level 1: billsec=753



Observer la perte de paquets sur une communication


La commande suivante est utile pour s'assurer qu'il n'y a pas de pertes de paquets RTP (c'est-à-dire de paquets audios) lors d'une communication :
asterisk*CLI> sip show channelstats

Le résultat est de la forme suivante :
Peer             Call ID      Duration Recv: Pack  Lost       (     %) Jitter Send: Pack  Lost       (     %) Jitter
192.168.11.1     4d67bf4946f           0000002619  0000000000 ( 0.00%) 0.0000 0000002626  0000000000 ( 0.00%) 0.0001
192.168.11.2     3560b15a896  00:02:22 0000007095  0000000000 ( 0.00%) 0.0000 0000007096  0000000000 ( 0.00%) 0.0001
192.168.10.1     2f10b98f723  00:43:18 0000000129K 0000000001 ( 0.00%) 0.0000 0000000129K 0000000003 ( 0.00%) 0.0000
3 active SIP channels

La lecture du résultat est la suivante :
  • Il n'y a pas de perte de paquets sur ces appels concernant les peer SIP 1001 et 1002 (que ce soit pour les paquets reçus (Recv Pack Lost) comme pour les paquets émis (Send Pack Lost))
  • Le peer 1003 rencontre très peu de perte de paquets (quantité totalement négligeable)
  • La variation de la latence (Jitter) est faible : cela signifie que la qualité du lien réseau est stable.



Saisir les commandes Asterisk directement depuis le SHELL Linux


Il est à noter que l'ensemble des commandes présentées peuvent être saisies directement depuis un shell Linux de la manière suivante :
root@asterisk1:~# asterisk -rx 'ma commande Asterisk'

Cette possibilité s'avère particulièrement utile pour combiner le résultat d'une commande Asterisk avec d'autres commandes SHELL.
Par exemple, pour lister tous les postes SIP connectés depuis un site dont le sous-réseau est 192.168.11.x :

root@asterisk1:~# asterisk -rx 'sip show peers' | grep 192.168.11.

Exemple de résultat :
1002/s             192.168.11.1      D     Yes               No                A           1024        OK (29 ms)            
1003/s             192.168.11.2      D     Yes               No                            5060        OK (14 ms)  

Seuls les postes 1002 et 1003 ressortent.



Dans un prochain article, nous aborderons les clés de lecture nécessaires à l'analyse des fichiers de log Asterisk.



Pour aller plus loin


[Asterisk] Connaître son nombre d'appels simultanés
[Asterisk] Mettre à jour son serveur Asterisk
Tous nos articles classés par thème
Voir un article au hasard


Vous avez aimé cet article ? Vous cherchez un support professionnel ? Alors contactez-nous.

Retrouvez nos services et firewall pour pfSense


Formation pfSense     Formation OPNsense     Liste de filtrage des IP malveillantes     Firewall pro-Large pour pfSense et OPNsense     Firewall pro-Xtend pour pfSense et OPNsense     Firewall pro-Xtra-SFP+ pour pfSense et OPNsense    

store.provya.fr

icon Tags de l'article :

[Asterisk] Connaître son nombre d'appels simultanés

icon 17/06/2018 - 2 commentaires

Il est utile de connaître le nombre d'appels simultanés transitant sur sa plateforme Asterisk.
Nous présentons dans cet article comment connaître son nombre d'appels simultanés en temps réel, ainsi que le nombre exact d'appels simultanés qu'il y a eu sur une plage de temps donnée.



Nombre d'appels simultanés en temps réel


Connaître son nombre d'appels simultanés en temps réel est très simple : Asterisk fournit directement une commande pour ça :

asterisk*CLI> core show channels

Le résultat de la commande ressemble à ceci :

Channel              Location   State   Application(Data)
SIP/1001-00009867  s@user:36  Up      Dial(SIP/1002,15,hHtT)
SIP/1002-00009876  (None)     Up      AppDial((Outgoing Line))
2 active channels
1 active calls
4012 calls processed

Cette commande permet de lister les appels en cours. Elle précise également le nombre d'appels passés depuis le démarrage du service Asterisk. Dans notre exemple, on y apprend qu'il y a un appel en cours (1 active calls).

Dans notre cas, l'information que nous cherchons à récupérer est simplement la valeur de la ligne "active calls". Pour cela, nous proposons de passer par un script SHELL :

root@asterisk1:~# asterisk -rx 'core show channels' | grep 'active calls' | cut -f 1 -d ' '

Dans le code ci-dessus, si l'on détaille chaque étape (séparée par un pipe), nous avons :

asterisk -rx 'core show channels'
Exécute la commande "core show channels" et retourne le résultat dans le SHELL

grep 'active calls'
Ne récupère que la ligne comportant la mention "active calls" (c'est uniquement elle qui nous intéresse).

cut -f 1 -d ' '
Permet de découper l'affichage en prenant les espaces comme marque de délimitation (option -d ' ') et de n'afficher que le premier segment (option -f 1).

Pour reprendre notre exemple, le résultat de la commande sera alors :

root@asterisk1:~# asterisk -rx 'core show channels' | grep 'active calls' | cut -f 1 -d ' '
1



Nombre d'appels simultanés sur une période donnée


Pour obtenir le nombre d'appels simultanés sur une période de temps donnée, nous proposons d'utiliser la ligne de commande fournie par Jean du forum asterifk-france.org.

La commande est la suivante :

awk 'BEGIN{FS=",\""} /ANSWERED/{split($11, a, "\""); split($12, b, "\"");printf ("%s,1\n%s,-1\n", a[1],b[1]); }' /var/log/asterisk/cdr-csv/Master.csv | sort | awk -F , '{cpt=cpt+$2; printf ("%s %03d\n", $1, cpt);}'

Cette commande filtre le contenu du fichier Master.csv sur chaque changement du nombre d'appels simultanés. Le résultat est affiché dans la console. Il est de la forme suivante :

2015-06-11 08:38:19 004
2015-06-11 08:38:30 005
2015-06-11 08:38:55 004
2015-06-11 08:39:10 003
2015-06-11 08:39:13 004
2015-06-11 08:39:42 003
2015-06-11 08:41:42 002
2015-06-11 08:42:35 001
2015-06-11 08:42:46 002
2015-06-11 08:43:50 001

Le premier champ indique la date, le second l'horaire auquel le changement du nombre d'appels simultanés a eu lieu et le troisième le nombre d'appels simultanés.


Limiter le résultat à un contexte


Si l'on souhaite, nous pouvons également limiter le résultat à un contexte en particulier. Exemple :

awk 'BEGIN{FS=",\""} /monContexte/*/ANSWERED/{split($11, a, "\""); split($12, b, "\"");printf ("%s,1\n%s,-1\n", a[1],b[1]); }' /var/log/asterisk/cdr-csv/Master.csv | sort | awk -F , '{cpt=cpt+$2; printf ("%s;%03d\n", $1, cpt);}'

Le décompte ne se fera alors que sur le nombre d'appels simultanés du contexte "monContexte".


Écrire le résultat dans un fichier pour l'exploiter


Plutôt que d'afficher les résultats à l'écran, nous les écrivons dans un fichier texte :

awk 'BEGIN{FS=",\""} /ANSWERED/{split($11, a, "\""); split($12, b, "\"");printf ("%s,1\n%s,-1\n", a[1],b[1]); }' /var/log/asterisk/cdr-csv/Master.csv | sort | awk -F , '{cpt=cpt+$2; printf ("%s %03d\n", $1, cpt);}' > monFichier.csv

Ce fichier peut ensuite être importé dans un tableur type LibreOffice ou Excel, en précisant que la séparation des champs se fait sur les espaces :

Dans LibreOffice :

Import CSV LibreOffice



Dans Excel :

Import CSV Excel



On peut ensuite faire des tris ou appliquer des filtres sur ces données !



Pour aller plus loin


[Asterisk] Les commandes utiles pour Asterisk
[Asterisk] Mettre à jour son serveur Asterisk
Tous nos articles classés par thème
Voir un article au hasard


Vous avez aimé cet article ? Vous cherchez un support professionnel ? Alors contactez-nous.

Retrouvez nos services et firewall pour pfSense


Formation pfSense     Formation OPNsense     Liste de filtrage des IP malveillantes     Firewall pro-Large pour pfSense et OPNsense     Firewall pro-Xtend pour pfSense et OPNsense     Firewall pro-Xtra-SFP+ pour pfSense et OPNsense    

store.provya.fr

icon Tags de l'article :

[Asterisk] Superviser son service

icon 10/06/2018 - 3 commentaires

Un service Asterisk qui tombe, ça peut arriver. C'est la panne et il faut le relancer.

Nous proposons un script shell qui s'occupe de vérifier à intervalle régulier l'état du service Asterisk. Si le service est DOWN, celui-ci est relancé et un e-mail d'alerte est envoyé.

Vérifier l'état du service


Une première solution peut consister à s'assurer que le service soit bien lancé. Cela s'opère depuis la commande suivante :
myserver# ps ax | grep 'asterisk

Si le service Asterisk tourne, il nous est retourné quelque chose comme :
12039 ?        Ssl    7:13 /usr/sbin/asterisk

De notre expérience, cette vérification ne suffit pas : nous avons déjà rencontré des services Asterisk qui était lancé (service UP), mais qui était en défaut de fonctionnement (impossible de connecter à la console, impossible d'enregistrer un peer, etc.).
Pour cette raison, nous préférons utiliser la commande suivante qui a pour intérêt de se connecter à la console Asterisk :
asterisk -rx 'test'

Si le service Asterisk est démarré et pleinement fonctionnel, le message suivant est retourné :
No such command 'test' (type 'core show help test' for other possible commands)

Si le service est arrêté ou qu'il ne répond plus, nous recevrons le message suivant :
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)


On script !


On crée un script shell qui vérifie si le service Asterisk est OK ou KO :

#!/bin/bash
#
# Commande Asterisk
testAsterisk=$(asterisk -rx 'test')

# On compte le nombre de caractères retournés
nombre=${#testAsterisk}
case $nombre in
        81)
                #Asterisk OUT, on le redémarre
                /etc/init.d/asterisk restart
                ;;
        79)
                #Asterisk est OK
                ;;
esac

Ce script pose néanmoins deux problèmes :

  1. Que se passe-t-il si Asterisk retourne autre chose que l'un des deux messages prévus ?
  2. Il peut être intéressant d'être prévenu par e-mail !

On améliore donc tout ça...


Script final


On ajoute la possibilité que le message retourné puisse être autre chose que ceux prévus. On alerte par e-mail :
#!/bin/bash
#
# Fonctionnement :
# Vérification de l'état du service Asterisk - toutes les minutes (job cron)
# 1) Asterisk est KO : on redémarre et on envoie un e-mail au support
# 2) Asterisk est OK : on ne fait rien...
# 3) On ne sait pas : on envoie un e-mail au support

# Commande Asterisk
testAsterisk=$(asterisk -rx 'test')

# On compte le nombre de caractères retournés
nombre=${#testAsterisk}
case $nombre in
        81)
                #Asterisk OUT, on le redémarre
                /etc/init.d/asterisk restart

                SUBJECT="[URGENT] Serveur Asterisk KO"
                EMAIL="support@example.com, john.doe@example.com, paul.smith@example.com"
                EMAILMESSAGE="/tmp/emailmessage.txt"
                echo "Le service Asterisk est KO" > $EMAILMESSAGE
                echo "Il vient d'être redémarré automatiquement..." >> $EMAILMESSAGE
                echo "Merci de vérifier !" >> $EMAILMESSAGE
                echo "Bonne journée" >> $EMAILMESSAGE
                echo "--" >> $EMAILMESSAGE
                echo "La commande asterisk -rx 'test' a renvoyée le message suivant :" >> $EMAILMESSAGE
                echo $testAsterisk >> $EMAILMESSAGE
                mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
                ;;
        79)
                #Asterisk est OK
                ;;
        *)
                #Retour inattendu
                SUBJECT="Serveur Asterisk -> État inconnu"
                EMAIL="support@example.com"
                EMAILMESSAGE="/tmp/emailmessage.txt"
                echo "L'état du service Asterisk n'est pas connu." > $EMAILMESSAGE
                echo "La commande asterisk -rx 'test' a renvoyée le message suivant :" >> $EMAILMESSAGE
                echo $testAsterisk >> $EMAILMESSAGE
                echo "Bonne journée" >> $EMAILMESSAGE
                mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
                ;;
esac

On automatise l'exécution de ce script
On édite le fichier /etc/crontab pour y ajouter les lignes suivantes :
# Verifie que le service Asterisk soit bien OK - toutes les minutes
* * * * *       root /home/supervision/verifAsteriskStart.sh > /dev/null 2> /dev/null


Vous avez aimé cet article ? Vous cherchez un support professionnel ? Alors contactez-nous

Retrouvez nos services et firewall pour pfSense


Formation pfSense     Formation OPNsense     Liste de filtrage des IP malveillantes     Firewall pro-Large pour pfSense et OPNsense     Firewall pro-Xtend pour pfSense et OPNsense     Firewall pro-Xtra-SFP+ pour pfSense et OPNsense    

store.provya.fr

icon Tags de l'article :