After running into permission issues trying to get PHP’s shell_exec command to chown call files as the asterisk user(which only root can do), I decided to make this script.
As a side note, you should be able to get the shell_exec command to work using sudo by adding the www-data user to the sudoer’s file without a password but that wouldn’t work in my particular environment. The server I was working on was extremely outdated and didn’t even have sudo installed.
Add this to /etc/sudoers www-data ALL=NOPASSWD: /path/to/script
The following code runs the script as a daemon. You will need to update rc to start this script at default run levels and also make sure to chmod +x this file to make it executable.
filename: /etc/init.d/mvcallfile
#!/bin/bash # Move asterisk call file daemon startup script # Author: Nathan Thomas PROG=mvcallfile DESC="Moves Asterisk call files to spool directory" HOME_DIR=/usr/local/bin DAEMON=$HOME_DIR/$PROG.sh PIDFILE=/var/run/$PROG.pid case "$1" in 'start') # Remove old PIDFILE if it exists if [ -s $PIDFILE ] ; then rm -f $PIDFILE fi # Check for existing process ps_check=`ps aux | grep $PROG.sh | grep -v "grep $PROG.sh" | wc -l` if [ "$ps_check" -ge "1" ] ; then # if count of proc >= 1 echo "Cannot start $PROG, service is already running." pids=`pgrep $PROG.sh` echo "Try killing these processes first: $pids" exit 1 else # Start the service echo "Starting $PROG service..." if start-stop-daemon --start --chuid root --pidfile $PIDFILE --chdir $HOME_DIR --background --make-pidfile --exec $DAEMON; then echo "OK" else echo "Error: Could not start $PROG service." exit 3 fi fi ;; 'stop') echo "Stopping $PROG service..." if start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE; then rm -f $PIDFILE echo "OK" else ps_check=`ps aux | grep $PROG.sh | grep -v "grep $PROG.sh" | wc -l` if [ "$ps_check" -eq "0" ] ; then echo "Error: Could not find an active $PROG process to kill." exit 1 else pids=`pgrep $PROG.sh` echo "Error: Could not stop $PROG service. Try killing these processes manually: $pids" exit 1 fi fi ;; 'restart') /etc/init.d/$PROG stop sleep 2 /etc/init.d/$PROG start ;; 'status') ps_check=`ps aux | grep $PROG.sh | grep -v "grep $PROG.sh" | wc -l` echo "The $PROG service is..." if [ -s $PIDFILE -a "$ps_check" -ge "1" ] ; then # if pidfile exists and size > 0 and # of procs >= 1 echo "Running" exit 0 else echo "Stopped" exit 1 fi ;; *) echo "Usage: {start|stop|restart|status}" exit 1 ;; esac exit $?
This script does the actual moving of the call files and gets executed once a second. Make sure to change the call file and spool directory variables for your specific situation.
filename: /usr/local/bin/mvcallfile.sh
#!/bin/bash # Take ownership and move asterisk call files to spool dir # Author: Nathan Thomas CF_DIR=/tmp SPOOL_DIR=/var/spool/asterisk/outgoing while true do if test -n "$(find $CF_DIR -maxdepth 1 -name '*.call' -print -quit)" ; then chown asterisk:asterisk $CF_DIR/*.call chmod 770 $CF_DIR/*.call mv $CF_DIR/*.call $SPOOL_DIR/ sleep 1 else sleep 1 fi done