summaryrefslogtreecommitdiff
path: root/etc/init.d/anytun
blob: 93c56f0a6d796e3fecf1dd572e96dda365018453 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/anytun
ANYTUNCONFIG=/usr/bin/anytun-config
CONTROLDAEMON=/usr/bin/anytun-controld
CHROOTDIR='/var/run/anytun'
# DAEMONOPTS="--chroot --username nobody --chroot-dir $CHROOTDIR"
NAME=anytun
DESC=anytun
CONFIG_DIR=/etc/anytun
VARCONFIG_DIR=/var/run/anytun-controld

test -x $DAEMON || exit 0

# Include anytun defaults if available
if [ -f /etc/default/anytun ] ; then
	. /etc/default/anytun
fi

start_vpn () {
		STATUS=OK
		if [ -f $CONFIG_DIR/$NAME/config ] ; then
			POSTUP=''
			test -f  $CONFIG_DIR/$NAME/post-up.sh && POSTUP="-x $CONFIG_DIR/$NAME/post-up.sh"
			DAEMONARG=`sed 's/#.*//'  <  $CONFIG_DIR/$NAME/config | grep -e '\w' | sed  's/^/ --/' | xargs echo`
			$DAEMON --write-pid /var/run/anytun.$NAME.pid $POSTUP \
			 	$DAEMONOPTS $DAEMONARG || STATUS="FAILED"
		else
			STATUS="no config found"
		fi
		start_configd
    echo -n "($STATUS)"
}
stop_vpn () {
  kill `cat $PIDFILE` || true
  rm $PIDFILE
	stop_configd
}

start_configd () {
		if [ -d $CONFIG_DIR/$NAME/conf.d ] ; then
			test -d $VARCONFIG_DIR || mkdir -p $VARCONFIG_DIR
			chmod 700 $VARCONFIG_DIR
			rm -f $VARCONFIG_DIR/$NAME 2>/dev/null
      for CLIENTNAME in `ls $CONFIG_DIR/$NAME/conf.d`; do
				echo -n " ($CLIENTNAME)"
			  DAEMONARG=`sed 's/#.*//'  <  $CONFIG_DIR/$NAME/conf.d/$CLIENTNAME | grep -e '\w' | sed  's/^/ --/' | xargs echo`
				$ANYTUNCONFIG $DAEMONARG >> $VARCONFIG_DIR/$NAME
			done
			CONTROLHOST=`sed 's/#.*//'  <  $CONFIG_DIR/$NAME/config | grep -e 'control-host' | sed  's/^/ --/'`
			$CONTROLDAEMON -f $VARCONFIG_DIR/$NAME $DAEMONOPTS $CONTROLHOST \
				--write-pid $VARCONFIG_DIR/$NAME.pid
			# rm -f $VARCONFIG_DIR/$NAME
		fi
}
stop_configd () {
	if [ -d $CONFIG_DIR/$NAME/conf.d ] ; then
		echo -n " ($NAME)"
		kill `cat $VARCONFIG_DIR/$NAME.pid` || true
		rm $VARCONFIG_DIR/$NAME.pid
	fi 
}

set -e
case "$1" in
  start)
	echo -n "Starting $DESC: "
	test -d $CHROOTDIR || mkdir -p $CHROOTDIR
  if test -z "$2" ; then
		if [ -f $CONFIG_DIR/autostart ] ; then
      for NAME in `sed 's/#.*//'  <  $CONFIG_DIR/autostart | grep -e '\w'`; do
			  echo -n "$NAME"
        start_vpn
      done
		else
			echo "no config found"
			exit 1;
		fi
	else
		while shift ; do
			if [ ! -z $1 ] ; then
				NAME=$1
				echo -n "$NAME"
		  	start_vpn
			fi
		done
	fi
	echo "."
	;;
  stop)
	echo -n "Stoping $DESC: "
  if test -z "$2" ; then
    for PIDFILE in `ls /var/run/anytun.*.pid 2> /dev/null`; do
      NAME=`echo $PIDFILE | cut -c17-`
      NAME=${NAME%%.pid}
      echo -n " $NAME"
      stop_vpn
    done
  else
    while shift ; do
      [ -z "$1" ] && break
      if test -e /var/run/anytun.$1.pid ; then
        PIDFILE=`ls /var/run/anytun.$1.pid 2> /dev/null`
        NAME=`echo $PIDFILE | cut -c17-`
        NAME=${NAME%%.pid}
        echo -n " $NAME"
        stop_vpn
      else
        echo -n " (failure: No such tunnel is running: $1)"
      fi
		done
	fi
	echo .
	;;
  reload)
  if test -z "$2" ; then
    for PIDFILE in `ls /var/run/anytun.*.pid 2> /dev/null`; do
      NAME=`echo $PIDFILE | cut -c17-`
      NAME=${NAME%%.pid}
			if [ -d $CONFIG_DIR/$NAME/conf.d ] ; then
      	stop_vpn
				start_vpn
			else
				stop_config
				start_config
			fi
      echo -n " $NAME"
    done
  else
    while shift ; do
      [ -z "$1" ] && break
      if test -e /var/run/anytun.$1.pid ; then
        PIDFILE=`ls /var/run/anytun.$1.pid 2> /dev/null`
        NAME=`echo $PIDFILE | cut -c17-`
        NAME=${NAME%%.pid}
        echo -n " $NAME"
				if [ -d $CONFIG_DIR/$NAME/conf.d ] ; then
					stop_vpn
					start_vpn
				else
					stop_config
					start_config
				fi
      else
        echo -n " (failure: No such tunnel is running: $1)"
      fi
		done
	fi
  ;;
  force-reload)
	echo -n "Restarting $DESC: "
  if test -z "$2" ; then
    for PIDFILE in `ls /var/run/anytun.*.pid 2> /dev/null`; do
      NAME=`echo $PIDFILE | cut -c17-`
      NAME=${NAME%%.pid}
      echo -n " $NAME"
      stop_vpn
      sleep 1
			start_vpn
    done
  else
    while shift ; do
      [ -z "$1" ] && break
      if test -e /var/run/anytun.$1.pid ; then
        PIDFILE=`ls /var/run/anytun.$1.pid 2> /dev/null`
        NAME=`echo $PIDFILE | cut -c17-`
        NAME=${NAME%%.pid}
        echo -n " $NAME"
        stop_vpn
				start_vpn
      else
        echo -n " (failure: No such tunnel is running: $1)"
      fi
		done
	fi
	echo .
	;;
  restart)
		SCRIPT=$0
		shift
		$SCRIPT stop $*
		sleep 1
		$SCRIPT start $*
	;;
  *)
	N=/etc/init.d/$NAME
	echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
	exit 1
	;;
esac

exit 0