home *** CD-ROM | disk | FTP | other *** search
/ linuxmafia.com 2013 / 2013.06.linuxmafia.com / linuxmafia.com / pub / helpful-things / slirplink < prev   
Text File  |  2008-08-17  |  7KB  |  227 lines

  1. #!/bin/sh
  2. #
  3. # 29 August 2006
  4. # written by Marc Singer
  5. #
  6. # 31 January 2008
  7. # modified by Daniel Gimpelevich, with influences from slirp.sh by Ace Evader:
  8. # http://exitthematrix.dod.net/matrixmirror/slirp/Linux/slirp.sh
  9. #
  10. # 26 March 2008
  11. # option -p added by Daniel Gimpelevich
  12. #
  13. # 5 August 2008
  14. # bugs fixed and bashisms removed by Daniel Gimpelevich
  15. #
  16. # slirp link initializations script
  17. # version 1.2.2
  18. #
  19. # NOTES
  20. # -----
  21. #
  22. # o If this will be used to handle much routing, it may be worthwhile
  23. #   having a .slirplink file with predefined user@remote and routing.
  24. #
  25. # o pppd's pid file has the form "PID\nDEV\n" where PID is the process
  26. #   ID of the daemon and DEV is the name of the ppp device.
  27. #   Extracting the PID alone from this requires some finesse and it
  28. #   isn't clear that it will always be correct.  What we really need
  29. #   to be able to do is interpret the whole file as a single string
  30. #   (line) and match against that.
  31. #
  32. # o PPPD silent.  Some of the howto's on the net incorrectly portray
  33. #   the setup of this kind of link.  For example, the 'silent' option
  34. #   to pppd will prevent the link from starting.
  35. #
  36. # o PASSWORD_HACK.  If you do not have password-free logins
  37. #   to the target host, the script will fail to establish the link
  38. #   unless the 'record' option is used with PPPD.  So, the
  39. #   PASSWORD_HACK option may be used to cope, but the recorded data
  40. #   will be sent to /dev/null.  It's better to configure password-free
  41. #   logins.
  42. #
  43. # o TCP over TCP.  According to the page
  44. #     http://sites.inka.de/sites/bigred/devel/tcp-tcp.html
  45. #   running TCP over TCP effectively breaks the timeout calculation
  46. #   for TCP.  At the moment, we don't have a lot of choice for our
  47. #   particular purpose.  One saving grace is that the motive for this
  48. #   work is to be able to perform SNMP queries via a host with
  49. #   priviledge to make those queries.  Thus, we're running UDP over
  50. #   TCP which is suceptible to this particular failure.
  51.  
  52. # Uncomment to see what is happening
  53. #set -x
  54.  
  55. usage () {
  56.   echo " usage: slirplink up [-d] [-P] [-D] [-r] [-p PORT] USER@REMOTE[:SLIRP] [NET]..."
  57.   echo "         slirplink down"
  58.   echo "         slirplink status"
  59.   echo
  60.   echo "    The -d option enables debugging for both PPPD and slirp."
  61.   echo "    The -P option enable the PPPD option 'record /dev/null'"
  62.   echo "      which is a workaround for when password-free logins don't"
  63.   echo "      work.  It's best to make password-free logins work."
  64.   echo "    The -D option enables the use of DNS on the target host."
  65.   echo "    The -r option makes the link the default route."
  66.   echo "    The -p option supplies a port other than 22 to ssh."
  67.   echo "    The optional NET parameters define networks to be routed"
  68.   echo "      through the remote end of the PPP link."
  69.   echo "    If SLIRP is not specified, it defaults to 'slirp' and the "
  70.   echo "      shell will search for it on the path."
  71.   echo
  72.   echo "    e.g. slirplink up joe@niagra:bin/slirp 170.35.71.1/24"
  73.   echo
  74.   echo "  This script must be executed as root on the local (client) host so"
  75.   echo "  that pppd may be run to handle routing."
  76.   exit 0
  77. }
  78.  
  79. OP=$1
  80. [ $# -eq 0 ] && usage
  81. shift
  82.  
  83. DEBUG=0
  84. PASSWORD_HACK=0
  85. PEER_DNS=0
  86. DEF_ROUTE=0
  87. SSH_OPTIONS="-t -e none"
  88.  
  89. while true ; do
  90.     case "$1" in
  91.     "-d" )
  92.         DEBUG=1
  93.         [ $# -eq 0 ] && usage
  94.         shift
  95.         ;;
  96.     "-P" )
  97.         PASSWORD_HACK=1
  98.         [ $# -eq 0 ] && usage
  99.         shift
  100.         ;;
  101.     "-D" )
  102.         PEER_DNS=1
  103.         [ $# -eq 0 ] && usage
  104.         shift
  105.         ;;
  106.     "-r" )
  107.         DEF_ROUTE=1
  108.         [ $# -eq 0 ] && usage
  109.         shift
  110.         ;;
  111.     "-p" )
  112.         [ $# -eq 0 ] && usage
  113.         shift
  114.         SSH_OPTIONS="$SSH_OPTIONS -p $1"
  115.         [ $# -eq 0 ] && usage
  116.         shift
  117.         ;;
  118.     *)
  119.         break
  120.         ;;
  121.     esac
  122. done
  123.  
  124. URI=$1
  125. [ $# -eq 0 ] || shift
  126. [ `id -u` = 0 ] || usage
  127.  
  128. # === Slirp Special Addresses
  129.  
  130. SLIRP_NET="10.0.2.0/28"
  131. SLIRP_LOCAL="10.0.2.15"
  132. SLIRP_EXEC="10.0.2.1"
  133. SLIRP_REMOTE="10.0.2.2"
  134. SLIRP_DNS="10.0.2.3"
  135.  
  136.  
  137. # === Executable path for pppd and ssh on the local host
  138.  
  139. PPPD=`which pppd`
  140. [ -x "$PPPD" ] || PPPD=/usr/sbin/pppd
  141. [ -x "$PPPD" ] || { echo "Unable to locate pppd program" ; exit 1; }
  142. SSH=`which ssh`
  143. [ -x "$SSH" ] || SSH=/usr/bin/ssh
  144. [ -x "$SSH" ] || { echo "Unable to locate ssh program" ; exit 1; }
  145. LINKNAME=`basename "$0"`
  146. PIDFILE="/var/run/ppp-$LINKNAME.pid"
  147.  
  148. # === Parse the connection URI
  149.  
  150. REMOTE_USER=`echo $URI | sed -e 's/^\([^@]*\)@.*/\1/'`
  151. REMOTE_SERVER=`echo $URI | sed -e 's/^[^@]*@\([^:]*\).*/\1/'`
  152. REMOTE_SLIRP=`echo $URI | sed -e 's/^[^:]*:\(.*\)/\1/'`
  153. [ x"$REMOTE_SLIRP" != x -a x"$REMOTE_SLIRP" != x"$URI" ] || REMOTE_SLIRP=slirp
  154.  
  155. # === Configure slirp options
  156.  
  157. REMOTE_SLIRP_OPTIONS="-P -b 2147483647"
  158. [ $DEBUG = 0 ] || REMOTE_SLIRP_OPTIONS="$REMOTE_SLIRP_OPTIONS -d -1 debugppp"
  159. REMOTE_SLIRP_OPTIONS="$REMOTE_SLIRP_OPTIONS \"'mru 1500'\" \"'mtu 1500'\""
  160.  
  161. # === Configure pppd and ssh options
  162.  
  163. PPPD_OPTIONS="noauth local $SLIRP_LOCAL:$SLIRP_REMOTE"
  164. #PPPD_OPTIONS="$PPPD_OPTIONS silent"    # DO NOT USE
  165. [ $PEER_DNS = 0 ]\
  166.   || PPPD_OPTIONS="$PPPD_OPTIONS usepeerdns"
  167. [ $DEF_ROUTE = 0 ]\
  168.   || PPPD_OPTIONS="$PPPD_OPTIONS defaultroute replacedefaultroute"
  169. PPPD_OPTIONS="$PPPD_OPTIONS passive noipdefault"
  170. PPPD_OPTIONS="$PPPD_OPTIONS updetach"    # detach only after link established
  171. PPPD_OPTIONS="$PPPD_OPTIONS linkname $LINKNAME"
  172. SSH_OPTIONS="$SSH_OPTIONS \$REMOTE_USER@\$SERVER_IP"
  173. [ $PASSWORD_HACK = 0 ]\
  174.   && SSH_OPTIONS="$SSH_OPTIONS -o Batchmode=yes"\
  175.   || PPPD_OPTIONS="$PPPD_OPTIONS record /dev/null"
  176. [ $DEBUG = 0 ]\
  177.   || PPPD_OPTIONS="$PPPD_OPTIONS debug nodetach record /tmp/ppp-$LINKNAME.log"
  178. PPPD_OPTIONS="$PPPD_OPTIONS connect-delay 5000"
  179.  
  180. # ===  Perform OP
  181.  
  182. case "$OP" in
  183.     "up" | "u" )
  184.     [ ! -f $PIDFILE ] || { echo "link already established" ; exit ; }
  185.     [ x"$REMOTE_USER" != x -a x"$REMOTE_SERVER" != x ] || usage
  186.     SERVER_IP=`ping -nc 1 $REMOTE_SERVER|tr ' ' '\n'|sed '1,2d;4,$d'|tr '()' ' '`
  187.     SERVER_IP=`echo $SERVER_IP`
  188.     [ -z "$SERVER_IP" ] && SERVER_IP="$REMOTE_SERVER" ||
  189.     LOCAL_ROUTE=`ip route get ${SERVER_IP}|head -n 1|sed 's,src .*$,,'`
  190.     $PPPD $PPPD_OPTIONS pty\
  191.         "$SSH `eval echo $SSH_OPTIONS` $REMOTE_SLIRP $REMOTE_SLIRP_OPTIONS"
  192.     [ $? != 0 ] && exit 1
  193.     [ $DEBUG != 0 ] || echo "link established"
  194.     if [ $PEER_DNS != 0 ]; then
  195.         echo "nameserver $SLIRP_DNS" >> /etc/ppp/resolv.conf
  196.     fi
  197.     ip route add $SLIRP_NET via $SLIRP_REMOTE
  198.     [ -z "$LOCAL_ROUTE" ] || ip route add $LOCAL_ROUTE
  199.     for NET ; do ip route add $NET via $SLIRP_REMOTE ; done
  200.     ;;
  201.     "down" | "d" )
  202.     [ -f $PIDFILE ] || { echo "no link established" ; exit ; }
  203.     kill `cat $PIDFILE | grep -o -E '\<[[:digit:]]+'`
  204.     REAL_DEFAULT=`ip route show|grep -w default|tr ' ' '\n'|grep -v '[^.0-9]'`
  205.     ip route del `ip route show via $REAL_DEFAULT|head -n 1`
  206.     echo "link dropped"
  207.     ;;
  208.     "status" | "s" )
  209.     [ -f $PIDFILE ] || { echo "link is down" ; exit ; }
  210.     echo "pid: `cat $PIDFILE | grep -o -x -E '[[:digit:]]+'`"
  211.     echo "device: `cat $PIDFILE | grep -o -x -E '[^[:digit:]].*'`"
  212.     ;;
  213.     "check" | "c" )
  214.     echo "REMOTE_USER   $REMOTE_USER"
  215.     echo "REMOTE_SERVER $REMOTE_SERVER"
  216.     echo "REMOTE_SLIRP  $REMOTE_SLIRP"
  217.     echo "DEF_ROUTE     $DEF_ROUTE"
  218.     echo "PEER_DNS      $PEER_DNS"
  219.     echo "PASSWORD_HACK $PASSWORD_HACK"
  220.     echo "DEBUG         $DEBUG"
  221.     [ -z "$*" ] || for NET ; do echo "NET           $NET" ; done
  222.     ;;
  223.     * )
  224.     usage
  225.     ;;
  226. esac
  227.