#!/bin/bash # # Init file for Rx3 network setup # # chkconfig: 2345 55 25 # description: Rx3 VPN supervisor # ### BEGIN INIT INFO # Provides: rx3-vpn # Required-Start: $network # Required-Stop: $network # Default-Start: 2 3 4 5 # Short-Description: Rx3 VPN supervisor # Description: Rx3 VPN supervisor ### END INIT INFO # source function library . /etc/rc.d/init.d/functions [ -e /etc/sysconfig/rx3-vpn ] && . /etc/sysconfig/rx3-vpn RETVAL=0 prog="rx3-vpn" LOCK_FILE=/var/lock/subsys/rx3-vpn PID_FILE=/var/run/rx3-vpn.pid LOG_FILE=/var/log/rx3-vpn.log STATUS_FILE=/var/log/rx3-vpn.status unset LC_PAPER LC_ADDRESS LC_MONETARY LC_NUMERIC LC_TELEPHONE LC_MESSAGES LC_IDENTIFICATION LC_COLLATE LANG LC_MEASUREMENT LANGUAGE LC_CTYPE LC_TIME LC_NAME rx3_vpn_supervisor() { job_id=0 for blk in ${VPN_EXT_LIST} do OIFS=${IFS} IFS=: set $blk dev=$1 conf=$2 table=$3 name=$4 IFS=${OIFS} case ${dev} in "eth"*) ;; "tun"*) config_file=/etc/openvpn/ext-client-${dev}.conf template_file=/etc/openvpn/template/ext-client-tunx.conf mng_port=$((2330+$(echo ${dev} | sed -e "s/tun//"))) job_pid[${job_id}]="0" # job_cmd[${job_id}]="/usr/sbin/openvpn --config /etc/openvpn/${conf}-client.conf --dev ${dev} --daemon" job_cmd[${job_id}]="/usr/sbin/openvpn --config ${config_file} --dev ${dev} --daemon" /bin/rm -f ${config_file} 2>/dev/null sed -e "s/TARGET-CFG/${conf}-client.conf/" -e "s/VPN-DEVICE/${dev}/" -e "s/MNG-PORT/${mng_port}/" <${template_file} >${config_file} echo >>${LOG_FILE} $(date) "Loading config: VPN[${job_id}] Name: [${name}] Cmd: [${job_cmd[${job_id}]}]" job_id=$((${job_id} + 1)) ;; "ppp"*) host=$(grep "Server IP:" /etc/ppp/peers/${conf} | cut -d ' ' -f 4-4) unit=$(echo ${dev} | sed "s/ppp//") job_pid[${job_id}]="0" job_cmd[${job_id}]="/usr/sbin/pptp --debug ${host} call ${conf} unit ${unit}" echo >>${LOG_FILE} $(date) "Loading config: VPN[${job_id}] Name: [${name}] Cmd: [${job_cmd[${job_id}]}]" job_id=$((${job_id} + 1)) ;; esac done job_nb=${job_id} job_id=0 while [[ 1 ]] do kill -0 ${job_pid[${job_id}]} 2>/dev/null rc=$? if [[ ${job_pid[${job_id}]} == 0 ]] || [[ $rc != 0 ]] then echo >> ${LOG_FILE} $(date) "Restarting command: [${job_cmd[${job_id}]}]..." eval ${job_cmd[${job_id}]} job_pid[${job_id}]=$( ps aux | grep "${job_cmd[${job_id}]}" | grep -v grep | head -1 | awk '{print $2}') job_date[${job_id}]="$(date)" echo >> ${LOG_FILE} $(date) "PId: [${job_pid[${job_id}]}] !" fi job_id=$((${job_id} + 1)) if [[ ${job_id} -ge ${job_nb} ]] then job_id=0 >${STATUS_FILE} while [[ ${job_id} -lt ${job_nb} ]] do echo >>${STATUS_FILE} "PId: [${job_pid[${job_id}]}] Date: [${job_date[${job_id}]}] Cmd: [${job_cmd[${job_id}]}]" job_id=$((${job_id} + 1)) done job_id=0 sleep 30 fi done } start() { gprintf "Starting %s:" "$prog" if [ -r ${LOCK_FILE} ] then success "already started" RETVAL=0 else rx3_vpn_supervisor & echo "$!" >${PID_FILE} RETVAL=$? [ "$RETVAL" = 0 ] && success "startup" || failure "startup" [ "$RETVAL" = 0 ] && touch ${LOCK_FILE} fi echo } stop() { gprintf "Stopping %s:" "$prog" if [ -r ${LOCK_FILE} ] then echo >> ${LOG_FILE} $(date) "Killing daemon: [$(cat ${PID_FILE})]..." kill -15 $(cat ${PID_FILE}) while read stat do echo >> ${LOG_FILE} $(date) "Killing VPN: [$stat] [$(echo "$stat" | sed -e 's/PId: \[//' -e 's/\].*//')]..." kill -15 $(echo "$stat" | sed -e 's/PId: \[//' -e 's/\].*//') 2>/dev/null 2>&1 done <${STATUS_FILE} # RETVAL=$? RETVAL=0 [ "$RETVAL" = 0 ] && success "stop" || failure "stop" else success "already stopped" RETVAL=0 fi [ "$RETVAL" = 0 ] && rm -f ${LOCK_FILE} && rm -f ${PID_FILE} && rm -f ${STATUS_FILE} echo } status() { if [ -f ${STATUS_FILE} ]; then cat ${STATUS_FILE} fi } case "$1" in start) start ;; stop) stop ;; restart) stop sleep 1 start ;; status) status ;; *) gprintf "Usage: %s {start|stop|restart|status}\n" "$0" RETVAL=1 esac exit $RETVAL