Just another Command Line junkie blog

Notes of a command line junkie

You should be using Firefox.

Tue, 21 Oct 2008

pptp connection manager

Пару лет назад мне понадобилось следить за состоянием 2-х pptp соединений.
В то же время я увлекался bash script'ом и очень хотелось что-то (без)дельное самому написать.

Не помню, чем мне тогда не понравилась возможность сказать pppd "persist",
или почему я не нашел готовых средств, но так или иначе свой скрипт я написал.
И даже потом еще раз переписал, уменьшив код в 2 раза :-)
Собственно, скачать его можно здесь
Под катом - :TOhtml из Vim.

  1 #!/bin/bash
  2 ################################
  3 #####    pptp-manager     ######
  4 ################################
  5 #
  6 ################################
  7 # to check ppp connection state every 10 minutes:
  8 ###
  9 # create file /etc/cron.d/ppp_check:
 10 # */10 * * * * root /path/to/ppp-manager params >& /dev/null
 11 # send HUP to cron
 12 #################################
 13 # last change: 2007-08-01
 14 
 15 LANG="POSIX"
 16 PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
 17 
 18 # ppp 0 server IP adress:
 19 dest0=""
 20 
 21 # ppp 1 server IP adress:
 22 dest1=""
 23 
 24 # pper 0 name (/etc/ppp/peers/peer_name)
 25 peer0=""
 26 
 27 # pper 1 name (/etc/ppp/peers/peer_name)
 28 peer1=""
 29 
 30 # pptp 0 `network` (if no defaultroute in pppd config)
 31 pppnet0=""
 32 
 33 # pptp 1 `network` (if no defaultroute in pppd config)
 34 pppnet1=""
 35 
 36 # mail flag
 37 mail="0"
 38 
 39 # mail recipient (check reports)
 40 mailrecip=""
 41 
 42 # ip-up string:
 43 ipustr="echo \"${PPP_IPPARAM} at ${IFNAME}\" > /var/run/ipup-${PPP_IPPARAM}"
 44 
 45 # ip-down-string:
 46 ipdstr="echo \"${PPP_IPPARAM} at ${IFNAME}\" > /var/run/ipup-${PPP_IPPARAM"
 47 
 48 if [ ! $UID = "0" ]
 49 then
 50         echo "script needs root privileges. exit"
 51         exit 1;
 52 fi
 53 
 54 if [ ! -d /etc/ppp/ip-up.d/ ] && [ ! -d /etc/ppp/ip-up.d/ ]
 55 then
 56         if [ `tail -n 1 /etc/ppp/ip-up` -eq $ipustr ]
 57         then
 58                 echo "firest start. your system doesn't support /etc/ppp/ip-up.d scripts"
 59                 echo $ipustr >> /etc/ppp/ip-up
 60                 echo "added $ipustr to /etc/ppp/ip-up"
 61         fi
 62 
 63         if [ `tail -n 1 /etc/ppp/ip-down` -eq $ipdstr ]
 64         then
 65                 echo "firest start. your system doesn't support /etc/ppp/ip-down.d scripts"
 66                 echo $ipdstr >> /etc/ppp/ip-down
 67                 echo "added $ipdstr to /etc/ppp/ip-down"      
 68         fi
 69 else
 70         if [ ! -e /etc/ppp/ip-up.d/ppp-ifup ] || [ ! -x /etc/ppp/ip-up.d/ppp-ifup ]
 71         then
 72                 echo "first start. file /etc/ppp/ip-up.d/ppp-ifup will be created"
 73                 echo "#!/bin/bash" > /etc/ppp/ip-up.d/ppp-ifup
 74                 echo $ipustr >> /etc/ppp/ip-up.d/ppp-ifup
 75                 chmod u+x /etc/ppp/ip-up.d/ppp-ifup
 76         fi
 77 
 78         if [ ! -e /etc/ppp/ip-down.d/ppp-ifdown ] || [ ! -x /etc/ppp/ip-down.d/ppp-ifdown ]
 79         then
 80                 echo "first start. file /etc/ppp/ip-down.d/ppp-ifdown will be created"
 81                 echo "#!/bin/bash" > /etc/ppp/ip-down.d/ppp-ifdown
 82                 echo $ipdstr >> /etc/ppp/ip-down.d/ppp-ifdown
 83                 chmod u+x /etc/ppp/ip-down.d/ppp-ifdown
 84         fi
 85 fi
 86 
 87 #############################################
 88 #############################################
 89 # start peer func, 1st arg destination, 2nd arg peer name, [3rd arg ppp network]
 90 start_peer()
 91 {
 92         # check for another ppp connections 
 93         if [ ! -e /var/run/ipup-$2 ] || [ `ps ax | grep pppd | grep -v grep | awk '{print $9}' | grep -w $1 | wc -l` -eq 0 ]
 94         then
 95                 echo "setting up ppp connection to $1 peer $2"
 96                 /usr/sbin/pptp $1 call $2 ipparam $2
 97                 sleep 10
 98 
 99                 if [ -e /var/run/ipup-$2 ]
100                 then
101                         dev=`cat /var/run/ipup-$2 | awk '{print $3}'`
102                 fi
103 
104                 if [ ! $dev = "" ] && [ `cat /proc/net/dev | grep $dev | awk '{print $1}' | wc -l` -eq 1 ]
105                 then
106 
107                         if [[ `cat \`cat /etc/ppp/peers/$2 | grep options | awk '{print $2}'\` | grep defaultroute` = "defaultroute" ]]
108                         then
109                                 echo "defaultroute for $2 enabled (\`route del default\` before running script)"
110                         else
111                                 if [ ! $3 = "" ]
112                                 then
113                                         echo "defaultroute for $2 disabled"
114                                         route add -net $3 dev $dev
115                                         echo "route to $3 through $dev added"
116                                 else
117                                         echo "no routes will be added. please define pppnet0 var or add "defaultroute" pppd parameter"
118                                 fi
119                         fi
120 
121                         echo "connected. interface $dev"
122                 else
123                         echo "error trying to connect peer $2"
124                 fi
125         else
126 
127                 echo "$2 already connected"
128         fi
129 }
130 
131 ##############################################
132 ##############################################
133 ## stop peer func, 1st arg peer 
134 stop_peer()
135 {
136         if [ -e /var/run/ipup-$1  ]
137         then
138                 dev=`cat /var/run/ipup-$1 | awk '{print $3}'`
139         fi
140         if [ ! -e /var/run/ipup-$1 ] || [ `ps ax | grep pppd | grep -v grep | awk '{print $9}' | grep -w $1 | wc -l` -eq 0 ]
141         then
142                 echo "connection $1 already down"
143         else
144                 kill -9 `ps ax | grep ppp | grep -w $1 | awk '{print $1}' | head -n 1`
145                 echo "$1 terminated, iface $dev down"
146         fi
147 }
148 
149 ##############################################
150 ##############################################
151 ## check peer func, 1st arg peer 
152 check_peer()
153 {
154         echo "checking $1 connection state"
155 
156         if [ -e /var/run/ipup-$1 ]
157         then
158                 dev=`cat /var/run/ipup-$1 | awk '{print $3}'`
159         fi
160         if [ ! -e /var/run/ipup-$1 ] || [ `ps ax | grep pppd | grep -v grep | awk '{print $9}' | grep -w $1 | wc -l` -eq 0 ]
161         then
162                 echo "connection $1 down. trying to reconnect.."
163                 $0 start $1
164                 if [ $mail -eq 1 ]
165                 then
166                         echo "ppp connection $1 down at `date`" | mail -s "`hostname` ppp-manager report" $mailrecip
167                 fi
168         else
169                 echo "$1 is connected at iface $dev"
170         fi
171 }
172 
173 
174 ##############################################
175 ## menu 
176 if [ ! -z "$1" ]
177 then
178         param0=$1
179         param1=$2
180 else
181         echo "1) start"
182         echo "2) stop"
183         echo "3) restart"
184         echo "4) check"
185         echo -n "enter: "; read param0
186         if [ $param0 -eq "1" ]
187         then
188                 param0="start"
189                 echo "$param0 peer:"
190                 echo "1) $peer0"
191                 echo "2) $peer1"
192                 echo "3) all"
193                 echo -n "enter: "; read param1
194                 if [ $param1 -eq "1" ]
195                 then
196                         param1=$peer0
197                 elif [ $param1 -eq "2" ]
198                 then
199                         param1=$peer1
200                 elif [ $param1 -eq "3" ]
201                 then
202                         param1="all"
203                 else
204                         echo "bad argument, exiting.."
205                         exit 1;
206                 fi
207         elif [ $param0 -eq "2" ]
208         then
209                 param0="stop"
210                 echo "$param0 peer:"
211                 echo "1) $peer0"
212                 echo "2) $peer1"
213                 echo "3) all"
214                 echo -n "enter: "; read param1
215                 if [ $param1 -eq "1" ]
216                 then
217                         param1=$peer0
218                 elif [ $param1 -eq "2" ]
219                 then
220                         param1=$peer1
221                 elif [ $param1 -eq "3" ]
222                 then
223                         param1="all"
224                 else
225                         echo "bad argument, exiting.."
226                         exit 1;
227                 fi
228         elif [ $param0 -eq "3" ]
229         then
230                 param0="restart"
231                 echo "$param0 peer:"
232                 echo "1) $peer0"
233                 echo "2) $peer1"
234                 echo "3) all"
235                 echo -n "enter: "; read param1
236                 if [ $param1 -eq "1" ]
237                 then
238                         param1=$peer0
239                 elif [ $param1 -eq "2" ]
240                 then
241                         param1=$peer1
242                 elif [ $param1 -eq "3" ]
243                 then
244                         param1="all"
245                 else
246                         echo "bad argument, exiting.."       
247                         exit 1;
248                 fi
249         elif [ $param0 -eq "4" ]
250         then
251                 param0="check"
252                 echo "$param0 peer:"
253                 echo "1) $peer0"
254                 echo "2) $peer1"
255                 echo "3) all"
256                 echo -n "enter: "; read param1
257                 if [ $param1 -eq "1" ]
258                 then
259                         param1=$peer0
260                 elif [ $param1 -eq "2" ]
261                 then
262                         param1=$peer1
263                 elif [ $param1 -eq "3" ]
264                 then
265                         param1="all"
266                 else
267                         echo "bad argument, exiting.."       
268                         exit 1;
269                 fi
270         else
271                 echo "bad argument, exiting.."        
272                 exit 1;
273         fi
274 fi
275 #############################################
276 
277 
278 
279 case "$param0" in
280         start)
281                 case $param1 in
282                 $peer0)
283                 start_peer $dest0 $peer0 $pppnet0
284                 ;;
285 
286                 $peer1)
287                 start_peer $dest1 $peer1 $pppnet1
288                 ;;
289 
290                 all)
291                         start_peer $dest0 $peer0 $pppnet0
292                         start_peer $dest1 $peer1 $pppnet1
293                 ;;
294 
295                 *)
296                         echo "usage: \`$0 start {$peer0 | $peer1 | all}\`"
297                 esac
298         ;;
299 
300         stop)
301                 case $param1 in
302                 $peer0)
303                         stop_peer $peer0
304                         ;;
305                 $peer1)
306                         stop_peer $peer1
307                         ;;
308                 all)
309                         stop_peer $peer0
310                         stop_peer $peer1
311                         ;;
312                 *)
313                         echo "usage: '$0 stop {$peer0 | $peer1 | all}'"
314                 esac
315         ;;
316 
317         restart)
318                 case $param1 in
319                 $peer0)
320                         stop_peer $peer0
321                         sleep 2
322                         start_peer $dest0 $peer0 $pppnet0
323                         ;;
324                 $peer1)
325                         stop_peer $peer1
326                         sleep 2
327                         start_peer $dest1 $peer1 $pppnet1
328                         ;;
329                 all)
330                         $0 stop all
331                         sleep 2
332                         $0 start all
333                         ;;
334                 *)
335                         echo "usage: '$0 restart {$peer0 | $peer1 | all}'"
336                 esac
337         ;;
338 
339         check)
340                 case $param1 in
341                 $peer0)
342                         check_peer $peer0
343                         ;;
344                 $peer1)
345                         check_peer $peer1
346                         ;;
347                 all)
348                         $0 check $peer0
349                         $0 check $peer1
350                         ;;
351                 *)
352                         echo "usage: '$0 check {$peer0 | $peer1 | all}'"
353                 esac
354         ;;
355         *)
356                 echo "usage: '$0 {start | stop | restart | check}'"
357 esac

Name:


E-mail:


URL:


Comment:


Sorry, no robots allowed. Answer the question:

[UNIX utilites] Change the file modes/attributes/permissions