Δευτέρα 9 Μαρτίου 2015

Getting a SIP call whenever an IFTTT recipe is triggered

In my previous post I explained how to run a custom script triggered by an IFTTT reipe.
In this post I will explain how to get a SIP call when an IFTTT action is triggered.

I assume you have created the recipe, linked Dropbox and configured incrontab as explained here.

Requirements:
-A cli SIP client, pjsua (from the pjsip library) is perfect for this job
-expect package (in order to "talk" to pjsua with spawn)
-festival package (this includes text2wave for text-to-speech)

I didn't find pjsip as a package for Debian, so I had to download it from http://www.pjsip.org and compile it manually, it's straightforward (configure-make dep-make).
pjsua is located inside the /pjsip-apps folder so you may either copy it somewhere convenient or create a soflink in order to run it.

Create your pjsip conf file (this may depend on your SIP provider) and paste:

--null-audio
--registrar sip:your.sip.provider.com
--realm=*
--id sip:sipuser@your.sip.provider.com
--username sipuser
--password yourpass
--auto-play
--max-calls 1

You may at first check that you can make a SIP call:
pjsua sip:1234567890@your.sip.provider.com --config-file /home/bob/pjsip.conf 

Then edit your script.sh file: (I found this script somewhere on the web and did slight modifications to it)

#! /bin/bash

EXPECT=/usr/bin/expect
SOUNDFILE=/tmp/alert.wav
TEXT2WAVE=/usr/bin/text2wave
DURATION=20
MESSAGE="Monitoring Alert"
PJSUACONFIG=/home/bob/pjsip.conf
CALLNUMB=1234567890

locked=false
 while [[ $locked == false ]]; do
     if [[ ! -f /tmp/caller.lock ]]; then
         touch /tmp/caller.lock
         locked=true
     else
         sleep 5
     fi
 done

# Generating the message
$TEXT2WAVE -o $SOUNDFILE -f 8000 << EOF
$MESSAGE
EOF

$EXPECT << EOF
spawn pjsua sip:$CALLNUMB@your.sip.provider.com --config-file $PJSUACONFIG --play-file $SOUNDFILE --duration $DURATION
expect "VAD re-enabled"
sleep 1
send "q\n"
EOF

# Cleaning up
rm $SOUNDFILE

# Removing the lock file and IFTTT file
rm /tmp/caller.lock
rm /home/bob/Dropbox/IFTTT/runme*

That's it!


Using IFTTT recipe to run a shell script

Requirements:

-an IFTTT account
-a Dropbpx account linked to your IFTTT account
-a server running linux (mine runs Debian linux).
- incrontab package, available on most linux distros.

First of all, install Dropbox on your linux box. You may find instructions here:
https://www.dropbox.com/install?os=lnx
Run Dropbox and create a folder named IFTTT on your home Dropbox folder.

mkdir ~/Dropbox/IFTTT

Then, you have to create your IFTTT recipe at ifttt.com. You may use whatever "this" statement you wish. On "that" statement you chose Dropbox, and create a file. Give a name to your file, for my example I use "runme". In the content you may put whatever you want. In Dropbox folder path you use IFTTT.

Create your script file on your home folder named "script.sh" and make it executable: chmod +x script.sh. Make sure your script executes properly:

./script.sh

Add the user that has both rights to run the script and to write into the Dropbox folder in the incrontab allow list:

echo bob >/etc/incron.allow

Then modify your incrontab. This package continuously checks a folder for changes. In my example it will check my IFTTT folder for modifications.

incrontab -e

inside your incrontab file paste:

/home/bob/Dropbox/IFTTT/ IN_MODIFY,IN_CREATE,IN_MOVED_TO /home/bob/script.sh

Checking that incrond is working:

Open a new terminal window and run:
sudo tail -f /var/log/syslog | grep incrond

Then, create a file inside your /home/bob/Dropbox/IFTTT folder:

touch /home/bob/Dropbox/IFTTT/lala

You will instantly see on your logs:

Mar  9 15:50:03 linuxbox2 incrond[361]: (bob) CMD (/home/bob/script.sh)

This means that your script just triggered and will trigger every time your recipe runs!