PDA

Voir la version complète : Arreter à distant son serveur domotique depuis asterisk



xunil2003
23/07/2018, 20h08
Bonjour
Je posséde un Rapberry PI 3 avec asterisk d'installé.
Hier soir, il y avez de l'orage, et je n'est pas pu arrêter mon serveur à distance avec asterisk.
J'ai donc réaliser un script agi pour l'arrêter à distance quand il y a de la foudre et que je suis pas chez moi mais au resto.

Fichier : arret-serveur.agi

#!/bin/bash
#Emplacement fichier : /var/lib/asterisk/agi-bin/reboot-serveur.agi
#Arrêt du Serveur

a=$1
b="1234" # Mot de passe a comparer avec la variable $1 des touches clavier de asterisk

if [ "$a" = "$b" ]
then
echo "Le mot de passe est correct."
sleep 30 # Marque un temps d’arrêt 30 secondes pour que asterisk est le temps de raccrocher.
sudo poweroff
else
echo "Le mot de passe $a est faux."
fi

echo
exit 0


Fichier : extensions.conf


;# arrêter le serveur
; Fichier : /var/lib/asterisk/agi-bin/arret-serveur.agi
exten => 563,1,Answer()
exten => 563,n,Playtones(ring)
exten => 563,n,wait(10)
exten => 563,n,Playback(/var/lib/asterisk/sounds/custom/bonjour)
exten => 563,n,Playback(/var/lib/asterisk/sounds/custom/message-bienvenue-arret-serveur)
exten => 563,n,Playback(/var/lib/asterisk/sounds/custom/message-mdp-4x-chiffres)
exten => 563,n,Playback(/var/lib/asterisk/sounds/custom/message_c-est-a-vous)
exten => 563,n,Read(MDP,,4)
exten => 563,n,SayNumber(${MDP}
exten => 563,n,Playback(/var/lib/asterisk/sounds/custom/message-arret-serveur-poweroff)
exten => 563,n,agi(/var/lib/asterisk/agi-bin/arret-serveur.agi,${MDP})
exten => 563,n,Playback(/var/lib/asterisk/sounds/custom/aurevoir)
exten => 563,n,HangUp() ; racroche

Le console de asterisk CLI me dit :

serveur@raspberrypi:~ $ sudo asterisk -rvvv
Asterisk 13.14.1~dfsg-2+deb9u3, Copyright (C) 1999 - 2014, Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
================================================== =======================
Connected to Asterisk 13.14.1~dfsg-2+deb9u3 currently running on raspberrypi (pid = 26486)
== Using SIP RTP CoS mark 5
-- Executing [563@maison:1] Answer("SIP/11-00000001", "") in new stack
-- Executing [563@maison:2] PlayTones("SIP/11-00000001", "ring") in new stack
-- Executing [563@maison:3] Wait("SIP/11-00000001", "10") in new stack
-- Executing [563@maison:4] Playback("SIP/11-00000001", "/var/lib/asterisk/sounds/custom/bonjour") in new stack
-- <SIP/11-00000001> Playing '/var/lib/asterisk/sounds/custom/bonjour.slin' (language 'fr')
-- Executing [563@maison:5] Playback("SIP/11-00000001", "/var/lib/asterisk/sounds/custom/message-bienvenue-arret-serveur") in new stack
-- <SIP/11-00000001> Playing '/var/lib/asterisk/sounds/custom/message-bienvenue-arret-serveur.slin' (language 'fr')
-- Executing [563@maison:6] Playback("SIP/11-00000001", "/var/lib/asterisk/sounds/custom/message-mdp-4x-chiffres") in new stack
-- <SIP/11-00000001> Playing '/var/lib/asterisk/sounds/custom/message-mdp-4x-chiffres.slin' (language 'fr')
-- Executing [563@maison:7] Playback("SIP/11-00000001", "/var/lib/asterisk/sounds/custom/message_c-est-a-vous") in new stack
-- <SIP/11-00000001> Playing '/var/lib/asterisk/sounds/custom/message_c-est-a-vous.slin' (language 'fr')
-- Executing [563@maison:8] Read("SIP/11-00000001", "MDP,,4") in new stack
-- Accepting a maximum of 4 digits.
-- User entered '1234'
-- Executing [563@maison:9] SayNumber("SIP/11-00000001", "1234") in new stack
-- <SIP/11-00000001> Playing 'digits/thousand.slin' (language 'fr')
-- <SIP/11-00000001> Playing 'digits/2.slin' (language 'fr')
-- <SIP/11-00000001> Playing 'digits/hundred.slin' (language 'fr')
-- <SIP/11-00000001> Playing 'digits/30.slin' (language 'fr')
-- <SIP/11-00000001> Playing 'digits/4.slin' (language 'fr')
-- Executing [563@maison:10] Playback("SIP/11-00000001", "/var/lib/asterisk/sounds/custom/message-arret-serveur-poweroff") in new stack
-- <SIP/11-00000001> Playing '/var/lib/asterisk/sounds/custom/message-arret-serveur-poweroff.slin' (language 'fr')
-- Executing [563@maison:11] AGI("SIP/11-00000001", "/var/lib/asterisk/agi-bin/arret-serveur.agi,1234") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/arret-serveur.agi
-- <SIP/11-00000001>AGI Script /var/lib/asterisk/agi-bin/arret-serveur.agi completed, returning 0
-- Executing [563@maison:12] Playback("SIP/11-00000001", "/var/lib/asterisk/sounds/custom/aurevoir") in new stack
-- <SIP/11-00000001> Playing '/var/lib/asterisk/sounds/custom/aurevoir.slin' (language 'fr')
-- Executing [563@maison:13] Hangup("SIP/11-00000001", "") in new stack
== Spawn extension (maison, 563, 13) exited non-zero on 'SIP/11-00000001'
[Jul 23 18:59:03] NOTICE[26551]: chan_sip.c:29976 sip_poke_noanswer: Peer '11' is now UNREACHABLE! Last qualify: 68
[Jul 23 18:59:55] NOTICE[26551]: chan_sip.c:24457 handle_response_peerpoke: Peer '11' is now Reachable. (545ms / 2000ms)
[Jul 23 19:00:59] NOTICE[26551]: chan_sip.c:29976 sip_poke_noanswer: Peer '11' is now UNREACHABLE! Last qualify: 545
[Jul 23 19:02:20] NOTICE[26551]: chan_sip.c:29976 sip_poke_noanswer: Peer '11' is now UNREACHABLE! Last qualify: 3174
[Jul 23 19:02:30] NOTICE[26551]: chan_sip.c:24457 handle_response_peerpoke: Peer '11' is now Reachable. (6ms / 2000ms)
[Jul 23 19:04:34] NOTICE[26551]: chan_sip.c:29976 sip_poke_noanswer: Peer '11' is now UNREACHABLE! Last qualify: 7
[Jul 23 19:04:45] NOTICE[26551]: chan_sip.c:24457 handle_response_peerpoke: Peer '11' is now Reachable. (1764ms / 2000ms)
[Jul 23 19:07:50] NOTICE[26551]: chan_sip.c:29976 sip_poke_noanswer: Peer '11' is now UNREACHABLE! Last qualify: 165
[Jul 23 19:08:01] NOTICE[26551]: chan_sip.c:24457 handle_response_peerpoke: Peer '11' is now Reachable. (663ms / 2000ms)
[Jul 23 19:09:05] NOTICE[26551]: chan_sip.c:29976 sip_poke_noanswer: Peer '11' is now UNREACHABLE! Last qualify: 663
[Jul 23 19:09:16] NOTICE[26551]: chan_sip.c:24457 handle_response_peerpoke: Peer '11' is now Reachable. (1558ms / 2000ms)
[Jul 23 19:10:20] NOTICE[26551]: chan_sip.c:29976 sip_poke_noanswer: Peer '11' is now UNREACHABLE! Last qualify: 1558
[Jul 23 19:10:30] NOTICE[26551]: chan_sip.c:24457 handle_response_peerpoke: Peer '11' is now Reachable. (289ms / 2000ms)
[Jul 23 19:11:34] NOTICE[26551]: chan_sip.c:29976 sip_poke_noanswer: Peer '11' is now UNREACHABLE! Last qualify: 289
[Jul 23 19:11:54] NOTICE[26551]: chan_sip.c:24457 handle_response_peerpoke: Peer '11' is now Reachable. (15ms / 2000ms)

Donne les drois au fichier

$ sudo chown asterisk:asterisk /var/lib/asterisk/agi-bin/arret-serveur.agi

sudo chmod +x /var/lib/asterisk/agi-bin/arret-serveur.agi

Droit du fichier

serveur@raspberrypi:~ $ ls -alh /var/lib/asterisk/agi-bin/arret-serveur.agi
-rwxr-xr-x 1 asterisk asterisk 674 juil. 23 19:37 /var/lib/asterisk/agi-bin/arret-serveur.agi
serveur@raspberrypi:~ $

Le problème est que le script ne s'execute pas depuis Asterisk ou la variable de asterisk des touches clavier n'est pas transmis au script agi via $1 ?
Pouvez-vous m'aider ?
Merci.

olppp
24/07/2018, 14h07
la solution est peut-être là : https://wiki.archlinux.org/index.php/allow_users_to_shutdown

jean
24/07/2018, 15h02
- le user unix asterisk (qui execute le process asterisk) peut il faire un sudo sans mdp ? cf sudoers

xunil2003
25/07/2018, 02h30
Bonjour

Pour vérifier si asterisk passe la variable vers le fichier agi et si le fichier est bien executer par asterisk, j'ai créer un fichier test.agi.
Que le code soit faux ou vrai un fichier test.txt doit être créé dans /home/serveur afin de vérifier que le fichier agi est bien exécuté par Asterisk.

/var/lib/asterisk/agi-bin/test.agi


#!/bin/bash
#Emplacement fichier : /var/lib/asterisk/agi-bin/test.agi
#Permet de verifierr si asterisk passe la variable vers fichier agi et si le fichier est executer par asterisk

MDP_ASTERISK=$1
MDP_IDENTIQUE="1234" # Mot de passe a comparer
#MDP_IDENTIQUE="1234"

if [ "$MDP_ASTERISK" = "$MDP_IDENTIQUE" ]
then
echo "Le mot de passe est correct."
echo "MDP_ASTERISK : $MDP_ASTERISK"
touch /home/serveur/test.txt
echo "Le mot de passe saissi au clavier est : $MDP_ASTERISK" > /home/serveur/test.txt
echo "Le code est vrai ---> fichier : /var/lib/asterisk/agi-bin/test.agi" >> /home/serveur/test.txt

sudo touch /home/serveur/test.txt
sudo bash -c 'echo "(sudo) Le mot de passe saissi sur le clavier de asterisk est : $MDP_ASTERISK" >> /home/serveur/test.txt'
sudo bash -c 'echo "(sudo) Le code est vrai ---> fichier : /var/lib/asterisk/agi-bin/test.agi" >> /home/serveur/test.txt'
else
echo "Le mot de passe est faux."
echo "MDP_ASTERISK : $MDP_ASTERISK"
touch /home/serveur/test.txt
echo "Le mot de passe saissi au clavier de asterisk est : $MDP_ASTERISK" > /home/serveur/test.txt
echo "Le code est faux ---> fichier : /var/lib/asterisk/agi-bin/test.agi" >> /home/serveur/test.txt

sudo touch /home/serveur/test.txt
sudo bash -c 'echo "(sudo) Le mot de passe saissi au clavier de asterisk est : $MDP_ASTERISK" >> /home/serveur/test.txt'
sudo bash -c 'echo "(sudo) Le code est faux ---> fichier : /var/lib/asterisk/agi-bin/test.agi" >> /home/serveur/test.txt'
fi

echo
exit 0

/etc/asterisk/extensions.conf

; Pour effectuer des tests
exten => 551,1,Answer()
exten => 551,n,Playtones(ring)
exten => 551,n,wait(10)
exten => 551,n,Playback(/var/lib/asterisk/sounds/custom/bonjour)
exten => 551,n,Playback(/var/lib/asterisk/sounds/custom/message_c-est-a-vous)
exten => 551,n,Read(TOUCHE,,4)
exten => 551,n,SayNumber(${TOUCHE})
exten => 551,n,AGI(/var/lib/asterisk/agi-bin/test.agi,${TOUCHE})
exten => 551,n,wait(1)
exten => 551,n,HangUp()

Donne les droits au fichier

sudo chown asterisk:asterisk /var/lib/asterisk/agi-bin/test.agi

sudo chmod +x /var/lib/asterisk/agi-bin/arret-serveur.agi

Droit du fichier

serveur@raspberrypi:~ $ ls -alh /var/lib/asterisk/agi-bin/test.agi
-rwxr-xr-x 1 asterisk asterisk 1,5K juil. 24 20:01 /var/lib/asterisk/agi-bin/test.agi
serveur@raspberrypi:~ $

Puis je compose le 551 et je vérifie si le fichier test.txt est créé. Rien .

serveur@raspberrypi:~ $ ls
Bureau Documents Images Langages Modèles Musique Public Téléchargements Vidéos
serveur@raspberrypi:~ $

La console CLI de Asterisk

serveur@raspberrypi:~ $ sudo asterisk -rvvv
Asterisk 13.14.1~dfsg-2+deb9u3, Copyright (C) 1999 - 2014, Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
================================================== =======================
Connected to Asterisk 13.14.1~dfsg-2+deb9u3 currently running on raspberrypi (pid = 30309)
== Using SIP RTP CoS mark 5
-- Executing [551@maison:1] Answer("SIP/11-00000000", "") in new stack
-- Executing [551@maison:2] PlayTones("SIP/11-00000000", "ring") in new stack
-- Executing [551@maison:3] Wait("SIP/11-00000000", "10") in new stack
-- Executing [551@maison:4] Playback("SIP/11-00000000", "/var/lib/asterisk/sounds/custom/bonjour") in new stack
-- <SIP/11-00000000> Playing '/var/lib/asterisk/sounds/custom/bonjour.slin' (language 'fr')
-- Executing [551@maison:5] Playback("SIP/11-00000000", "/var/lib/asterisk/sounds/custom/message_c-est-a-vous") in new stack
-- <SIP/11-00000000> Playing '/var/lib/asterisk/sounds/custom/message_c-est-a-vous.slin' (language 'fr')
-- Executing [551@maison:6] Read("SIP/11-00000000", "TOUCHE,,4") in new stack
-- Accepting a maximum of 4 digits.
-- User entered '1234'
-- Executing [551@maison:7] SayNumber("SIP/11-00000000", "1234") in new stack
-- <SIP/11-00000000> Playing 'digits/thousand.slin' (language 'fr')
-- <SIP/11-00000000> Playing 'digits/2.slin' (language 'fr')
-- <SIP/11-00000000> Playing 'digits/hundred.slin' (language 'fr')
-- <SIP/11-00000000> Playing 'digits/30.slin' (language 'fr')
-- <SIP/11-00000000> Playing 'digits/4.slin' (language 'fr')
-- Executing [551@maison:8] AGI("SIP/11-00000000", "/var/lib/asterisk/agi-bin/test.agi,1234") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/test.agi
-- <SIP/11-00000000>AGI Script /var/lib/asterisk/agi-bin/test.agi completed, returning 0
-- Executing [551@maison:9] Wait("SIP/11-00000000", "1") in new stack
-- Executing [551@maison:10] Hangup("SIP/11-00000000", "") in new stack
== Spawn extension (maison, 551, 10) exited non-zero on 'SIP/11-00000000'
raspberrypi*CLI>

Quand j’exécute le fichier en console ça marche, le fichier est créé.

serveur@raspberrypi:~ $ bash /var/lib/asterisk/agi-bin/test.agi
Le mot de passe est faux.
MDP_ASTERISK :

serveur@raspberrypi:~ $

Liste des fichiers

serveur@raspberrypi:~ $ ls
Bureau Documents Images Langages Modèles Musique Public Téléchargements test.txt Vidéos
serveur@raspberrypi:~ $

Contenue du fichier /home/serveur/test.txt

serveur@raspberrypi:~ $ cat test.txt
Le mot de passe saissi sur sur le clavier de asterisk est :
Le code est faux ---> fichier : /var/lib/asterisk/agi-bin/test.agi
(sudo) Le mot de passe saissi sur sur le clavier de asterisk est :
(sudo) Le code est faux ---> fichier : /var/lib/asterisk/agi-bin/test.agi
serveur@raspberrypi:~ $

Quand j'exexute le fichier comme ceci

serveur@raspberrypi:~ $ sudo bash /var/lib/asterisk/agi-bin/test.agi 1234
Le mot de passe est correct.
MDP_ASTERISK : 1234

serveur@raspberrypi:~ $

Le fichier est créé

serveur@raspberrypi:~ $ ls -alh test.txt
-rw-r--r-- 1 root root 254 juil. 25 14:28 test.txt
serveur@raspberrypi:~ $

le fichier contient bien le contenue du test, sauf qu'avec la partie sudo la variable ne se marque pas.

serveur@raspberrypi:~ $ cat test.txt
Le mot de passe saissi sur lr clavier est : 1234
Le code est vrai ---> fichier : /var/lib/asterisk/agi-bin/test.agi
(sudo) Le mot de passe saissi sur le clavier de asterisk est :
(sudo) Le code est vrai ---> fichier : /var/lib/asterisk/agi-bin/test.agi
serveur@raspberrypi:~ $


Lors de l'installation de asterisk j'ai juste fait ceci :

sudo apt-get install asterisk-core-sounds-fr
sudo apt install asterisk-mp3
sudo apt install asterisk-espeak
Puis j'ai configurer le fichier extensions.conf et sip.conf.
Et j'ai redémarré Asterisk

sudo /etc/init.d/asterisk restart


Y a t'il un problème de droit au fichier agi ?
Y a t'il autre chose à installer pour Asterisk ?
Y a t'il autre chose à configurer pour Asterisk ?
Pouvez vous m'aider a résoudre le problème ?

Merci.

jean
26/07/2018, 15h10
tu ne peux pas faire de echo sur stdin/out dans les agi, sinon c'est interprété comme des commandes vers asterisk (ou leur résultat)

fastm3
27/07/2018, 09h59
Si tu veux faire du bash. Un petit coup de system sera plus adapté. Ici , l'agi ne te sert a rien puisque tu n'interagis pas avec asterisk.

exten => _.,n,System(${ASTVARLIBDIR}/bin/myscript.sh ${CALLERID(num) } ${mavariable})