Cette page, ce script sont une ebauche…. un poc. Et tout ca va etre refait en utilisant le linphoncsh… ca sera plus kewl^propre


    offhook - non connecté.
    Dialing - le démon compose un numéro.
    Rien du tout (c'est à dire aucun résultat) - ça sonne.
    Call out, hook=0102030405 duration=28, muted=no rtp-xmit-muted=no - Un appel émis est en cours. On le destinataire et la durée ce qui est sympa pour l'injecter dans du time tracking.
    Incoming call from "33123456454" <sip:33123456454@asterisk> - Quelqu'un nous appel, on a son numéro pour chercher son nom.
    hook=answered duration=3 - On a décroché un appel, la durée est indiquée mais malheureusement par le numéro de l'appelant.

Objectif

Etre capable de lancer des taches automatiquement sur un appel SIP en fonction, via un client SIP et non plus en imposant de modifier la configuration d'un asterisk

Exemple

  • Creation d'une sonnerie SIP (Si l'extension configures ici lance un script qui joue un fichier son)
  • Creation d'une sonnerie SIP “intelligente” : cette sonnerie pourra lire le nom present dans le caller id, sinon jouer un mp3
  • Creation d'un systeme de remontée de fiche d'appelant qui ne dependras pas de l'IpBX : c'est du pure SIP
  • Ouverture de porte sur un IPBX SIP :
    • cet outils est posé sur un raspberry
    • le script appele par cet outils actionne un GPIO branché a un relais qui declanche un ouvre porte

Futur

  • Etant donne que ce linphone sait aussi directement decrocher une ligne et jouer un mp3 je me demande si je ne vais pas l'utiliser pour que ce soit lui qui gere mes black et white listes…

Le machin

Les particularite

  • Je en voulais pas assumer la maintenance ⇒ pas de compilation
  • il ne fallait pas d'interface x11, ncurses, etc…

⇒ linphone-nogtk sur un raspberry fait parfaitement l'affaire

  • linephonec, helas, loggue (de facon hesoterique) dans son fichier de conf, il a fallut hacker cet aspect la

/!\ Cet outils ne decroche PAS, il ne fait que lancer un script lorsqu'il est appelé.

Le code

fichier : /usr/local/bin/SipCliClaScr

/usr/local/bin/SipCliClaScr
#!/usr/bin/perl
 
### Antoine DELAPORTE - GPL(2)
use strict;
#use warnings;
use IPC::Open3;
use Sys::Syslog qw(:DEFAULT :standard :macros);
use Getopt::Std;
use File::Temp qw/ tempfile tempdir /;
 
my $sipgw="";
my $cont=1;
my ($cacuna,$cacuex,$cacude)=("","","");
 
my %opt;
getopts('c:l:r:',\%opt);
# c = config file
# l = linphonec
# r = quel script appeler en cas de ring "Exemaple -r "/usr/local/bin/log __CID__ __EXTENSION__ __DEVICE__"
 
#print "Pour les tests aller sur la console de test hein : channel originate SIP/e62pr1fq extension SIP/toto\@10.0.10.21\n";
 
$opt{c}='~/.linphonerc' if(!defined($opt{c}));
$opt{l}='linphonec' if(!defined($opt{l}));
 
openlog("SipCliClaScr[$$]{".$opt{c}."}", 'ndelay', 'local2');
 
# Cet ensemble (et plus bas) de code est un AFFREUX cludge due au fait que linphonec :
# 1. loggues les appels dans le fichier de conf
# 2. ecris dans le fichier (et le regenere) a chaques fin d'appels
#    ce qui laisse presager d'un affreux bonheur cote contenu memoire
my ($fh, $tmpfilename) = tempfile(UNLINK => 1,SUFFIX => "-$$.tel" );
my $null=$opt{c};
`cp $null $tmpfilename`;
 
my $ringcmd;
my $ringret;
 
my $pid = open3(\*CHLD_IN, \*CHLD_OUT, \*CHLD_ERR, 'LANG=C '.$opt{'l'}.' -c '.$tmpfilename) or $cont=0;
close($fh);
 
while($cont) {          # Cette methode de lecture de la sortie me permet en fait de sortir violement
        $_=<CHLD_OUT>;
        if(!defined($_)) { $_=""; }
        chomp();
        #linphonec> "Anonymous" <sip:anonymous@anonymous.invalid> is contacting you.
        #linphonec> Receiving new incoming call from "Anonymous" <sip:anonymous@anonymous.invalid>, assigned id 1
        # failed: Forbiden
        # failed: no response timeout
        if(/^$/) {
                syslog('info', "Sip client shut(ting) down");
                $cont=0;
                print CHLD_IN "quit\n";
                }
        elsif(/Registration on <sip:(\S+)> (.*)/) {
                $sipgw=$1;
                if($2 =~ /successful.$/) { syslog('info', "Sip client connected onto $sipgw sucessfully tmpfile $tmpfilename"); }
                else {  
                        syslog('Info',"Sip client close sip connection or unable to start connection [$2]");
                        ###$cont=0;
                        ###print CHLD_IN "help\n";
                        }
                unlink($tmpfilename);
                }
        elsif(/\"(.*)\" <sip:(.*)\@(.*)> is contacting you.$/) {
                $cacuna=$1;
                $cacuex=$2;
                $cacude=$3;
                syslog('Info',"Call received from $cacuna (Sip identity $cacuex\@$cacude)");
                if(defined($opt{r})) {
                        $ringcmd=$opt{r};
                        $ringcmd=~ s/__CID__/$cacuna/g;
                        $ringcmd=~ s/__EXTENSION__/$cacuex/g;
                        $ringcmd=~ s/__DEVICE__/$cacude/g;
                        $ringret=1;
                        syslog('Info',"?? Running $ringcmd");
                        open(RING,"$ringcmd |") or $ringret=0; while(<RING>) {} close(RING);
                        if($ringret)    {syslog('Info',"OK $ringcmd"); }
                        else            {syslog('Info',"KO $ringcmd"); }
                        }
                }
        elsif(/Call (terminated\.|ended)$/) {
                syslog('Info',"Call finished for $cacuna (Sip identity $cacuex\@$cacude)");
                sleep(1); #Without this, no unlink :-/ ok cludge
                unlink($tmpfilename);
                ($cacuna,$cacuex,$cacude)=("","","");
                }
        elsif(/^(linphonec> Receiving new incoming call from |linphonec> You have missed |linphonec> Call .* with)|Ready$|Warning: video is disabled in linphonec/) {
                # Trapping signals
                }
        else {
                syslog('Info',"Bad Analyse : $_");
                }
        }
 
unlink($tmpfilename);
syslog('Info',"Sip client terminated, SipCliClaScr too, unlink of $tmpfilename");

La mise en place

Dans le fichier /etc/systemd/system/SipCliClaScr.service

/etc/systemd/system/SipCliClaScr.service
[Unit]
Description=SipCliClaScr
After=network.target auditd.service
 
[Service]
EnvironmentFile=-/etc/default/SipCliClaScr
User=pi
ExecStart=/usr/local/bin/SipCliClaScr $PARAMS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
#Restart=on-failure
Restart=always
 
[Install]
WantedBy=multi-user.target
#Alias=SipCliClaScr.service

Puis lancer la commande

zigzog:~#> systemctl enable SipCliClaScr.service 
un exemple de /etc/default/SipCliClaScr

/etc/default/SipCliClaScr
PARAMS=-c /usr/local/etc/linphonerc00 -r \"pouette '__CID__' -h '__DEVICE__' -e '__EXTENSION__'\"

A savoir

  • Cette configuration permet evidement de lancer plusieurs client SIP differents :)

Configuration de LinPhoneC

Je ne vais pas vous donner a proprement la configuration, mais juste des indications

  • le fichier (ici /usr/local/etc/linphonerc00 ) ne devrait etre lisible qu'en lecture seul pour l'utilisateur concerné (pi ici)
  • il faut avoir charge le module kernel snd-dummy ( echo “snd-dummy” »/etc/modules; modprobe snd-dummy )
  • il faut evidement avoir activé linphonec sur cette carte dummy
  • il ne faut pas que linphonec soit en auto answer
  • detail interessant lorsqu'on le lance sans fichier de conf, il sera generer pendant l'usage de linphonec
  • a verifier, mais dans le shell je crois que la commande de configuration de la regustration est
    • register sip:USER@GATEWAYSIP sip:GATEWAYSIP PWDSIP
docs/linuxeries/asterisk/sip_client_script_launcher.txt · Dernière modification: 2018/01/12 08:46 (édition externe)
Recent changes RSS feed Debian Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki