Guest User

Untitled

a guest
Jun 22nd, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.90 KB | None | 0 0
  1. #!/bin/sh
  2. #* reason -- why this script was called, one of: pre-init connect disconnect
  3. #* VPNGATEWAY -- vpn gateway address (always present)
  4. #* TUNDEV -- tunnel device (always present)
  5. #* INTERNAL_IP4_ADDRESS -- address (always present)
  6. #* INTERNAL_IP4_NETMASK -- netmask (often unset)
  7. #* INTERNAL_IP4_NETMASKLEN -- netmask length (often unset)
  8. #* INTERNAL_IP4_NETADDR -- address of network (only present if netmask is set)
  9. #* INTERNAL_IP4_DNS -- list of dns serverss
  10. #* INTERNAL_IP4_NBNS -- list of wins servers
  11. #* CISCO_DEF_DOMAIN -- default domain name
  12. #* CISCO_BANNER -- banner from server
  13. #* CISCO_SPLIT_INC -- number of networks in split-network-list
  14. #* CISCO_SPLIT_INC_%d_ADDR -- network address
  15. #* CISCO_SPLIT_INC_%d_MASK -- subnet mask (for example: 255.255.255.0)
  16. #* CISCO_SPLIT_INC_%d_MASKLEN -- subnet masklen (for example: 24)
  17. #* CISCO_SPLIT_INC_%d_PROTOCOL -- protocol (often just 0)
  18. #* CISCO_SPLIT_INC_%d_SPORT -- source port (often just 0)
  19. #* CISCO_SPLIT_INC_%d_DPORT -- destination port (often just 0)
  20.  
  21. # FIXMEs:
  22.  
  23. # Section A: route handling
  24.  
  25. # 1) The 3 values CISCO_SPLIT_INC_%d_PROTOCOL/SPORT/DPORT are currently being ignored
  26. # In order to use them, we'll probably need os specific solutions
  27. # * Linux: iptables -t mangle -I PREROUTING <conditions> -j ROUTE --oif $TUNDEV
  28. # This would be an *alternative* to changing the routes (and thus 2) and 3)
  29. # shouldn't be relevant at all)
  30. # 2) There are two different functions to set routes: generic routes and the
  31. # default route. Why isn't the defaultroute handled via the generic route case?
  32. # 3) In the split tunnel case, all routes but the default route might get replaced
  33. # without getting restored later. We should explicitely check and save them just
  34. # like the defaultroute
  35. # 4) Replies to a dhcp-server should never be sent into the tunnel
  36.  
  37. # Section B: Split DNS handling
  38.  
  39. # 1) Maybe dnsmasq can do something like that
  40. # 2) Parse dns packets going out via tunnel and redirect them to original dns-server
  41.  
  42. #env | sort
  43. #set -x
  44.  
  45. # =========== script (variable) setup ====================================
  46.  
  47. PATH=/sbin:/usr/sbin:$PATH
  48.  
  49. OS="`uname -s`"
  50.  
  51. DEFAULT_ROUTE_FILE=/var/run/vpnc/defaultroute
  52. RESOLV_CONF_BACKUP=/var/run/vpnc/resolv.conf-backup
  53. SCRIPTNAME=`basename $0`
  54.  
  55. # some systems, eg. Darwin & FreeBSD, prune /var/run on boot
  56. if [ ! -d "/var/run/vpnc" ]; then
  57. mkdir -p /var/run/vpnc
  58. fi
  59.  
  60. # stupid SunOS: no blubber in /usr/local/bin ... (on stdout)
  61. IPROUTE="`which ip | grep '^/' 2> /dev/null`"
  62.  
  63. if [ "$OS" = "Linux" ]; then
  64. ifconfig_syntax_ptp="pointopoint"
  65. route_syntax_gw="gw"
  66. route_syntax_del="del"
  67. route_syntax_netmask="netmask"
  68. else
  69. ifconfig_syntax_ptp=""
  70. route_syntax_gw=""
  71. route_syntax_del="delete"
  72. route_syntax_netmask="-netmask"
  73. fi
  74. if [ "$OS" = "SunOS" ]; then
  75. route_syntax_interface="-interface"
  76. route_syntax_plumb="plumb"
  77. else
  78. route_syntax_interface=""
  79. route_syntax_plumb=""
  80. fi
  81.  
  82. if [ -x /sbin/resolvconf ]; then # Optional tool on Debian, Ubuntu, Gentoo
  83. MODIFYRESOLVCONF=modify_resolvconf_manager
  84. RESTORERESOLVCONF=restore_resolvconf_manager
  85. elif [ -x /sbin/modify_resolvconf ]; then # Mandatory tool on Suse earlier than 11.1
  86. MODIFYRESOLVCONF=modify_resolvconf_suse
  87. RESTORERESOLVCONF=restore_resolvconf_suse
  88. else # Generic for any OS
  89. MODIFYRESOLVCONF=modify_resolvconf_generic
  90. RESTORERESOLVCONF=restore_resolvconf_generic
  91. fi
  92.  
  93. # =========== tunnel interface handling ====================================
  94.  
  95. do_ifconfig() {
  96. if [ -n "$INTERNAL_IP4_MTU" ]; then
  97. MTU=$INTERNAL_IP4_MTU
  98. elif [ -n "$IPROUTE" ]; then
  99. MTUDEV=$($IPROUTE route get "$VPNGATEWAY" | sed -ne 's/^.*dev \([a-z0-9]*\).*$/\1/p')
  100. MTU=$($IPROUTE link show "$MTUDEV" | sed -ne 's/^.*mtu \([[:digit:]]\+\).*$/\1/p')
  101. if [ -n "$MTU" ]; then
  102. MTU=$(( $MTU - 88 ))
  103. fi
  104. fi
  105.  
  106. if [ -z "$MTU" ]; then
  107. MTU=1412
  108. fi
  109.  
  110. # Point to point interface require a netmask of 255.255.255.255 on some systems
  111. if [ -n "$IPROUTE" ]; then
  112. $IPROUTE link set dev "$TUNDEV" up mtu "$MTU"
  113. $IPROUTE addr add "$INTERNAL_IP4_ADDRESS/255.255.255.255" peer "$INTERNAL_IP4_ADDRESS" dev "$TUNDEV"
  114. else
  115. ifconfig "$TUNDEV" inet "$INTERNAL_IP4_ADDRESS" $ifconfig_syntax_ptp "$INTERNAL_IP4_ADDRESS" netmask 255.255.255.255 mtu ${MTU} up
  116. fi
  117.  
  118. if [ -n "$INTERNAL_IP4_NETMASK" ]; then
  119. set_network_route $INTERNAL_IP4_NETADDR $INTERNAL_IP4_NETMASK $INTERNAL_IP4_NETMASKLEN
  120. fi
  121.  
  122. # If the netmask is provided, it contains the address _and_ netmask
  123. if [ -n "$IPROUTE" ]; then
  124. if [ -n "$INTERNAL_IP6_NETMASK" ]; then
  125. $IPROUTE -6 addr add $INTERNAL_IP6_NETMASK dev $TUNDEV
  126. elif [ -n "$INTERNAL_IP6_ADDRESS" ]; then
  127. $IPROUTE -6 addr add $INTERNAL_IP6_ADDRESS/128 dev $TUNDEV
  128. fi
  129. else
  130. if [ -n "$INTERNAL_IP6_ADDRESS" ]; then
  131. ifconfig "$TUNDEV" inet6 $route_syntax_plumb $INTERNAL_IP6_ADDRESS/128 $ifconfig_syntax_ptp $INTERNAL_IP6_ADDRESS mtu $MTU up
  132. fi
  133. fi
  134. }
  135.  
  136. destroy_tun_device() {
  137. case "$OS" in
  138. NetBSD|FreeBSD) # and probably others...
  139. ifconfig "$TUNDEV" destroy
  140. ;;
  141. SunOS)
  142. if [ -n "$INTERNAL_IP6_ADDRESS" ]; then
  143. ifconfig "$TUNDEV" inet6 unplumb
  144. fi
  145. ;;
  146. esac
  147. }
  148.  
  149. # =========== route handling ====================================
  150.  
  151. if [ -n "$IPROUTE" ]; then
  152. fix_ip_get_output () {
  153. sed -e 's/ /\n/g' | \
  154. sed -ne '1p;/via/{N;p};/dev/{N;p};/src/{N;p};/mtu/{N;p}'
  155. }
  156.  
  157. set_vpngateway_route() {
  158. $IPROUTE route add `$IPROUTE route get "$VPNGATEWAY" | fix_ip_get_output`
  159. $IPROUTE route flush cache
  160. }
  161.  
  162. del_vpngateway_route() {
  163. $IPROUTE route $route_syntax_del "$VPNGATEWAY"
  164. $IPROUTE route flush cache
  165. }
  166.  
  167. set_default_route() {
  168. $IPROUTE route | grep '^default' | fix_ip_get_output > "$DEFAULT_ROUTE_FILE"
  169. $IPROUTE route replace default dev "$TUNDEV"
  170. $IPROUTE route flush cache
  171. }
  172.  
  173. set_network_route() {
  174. NETWORK="$1"
  175. NETMASK="$2"
  176. NETMASKLEN="$3"
  177. $IPROUTE route replace "$NETWORK/$NETMASKLEN" dev "$TUNDEV"
  178. $IPROUTE route flush cache
  179. }
  180.  
  181. reset_default_route() {
  182. if [ -s "$DEFAULT_ROUTE_FILE" ]; then
  183. $IPROUTE route replace `cat "$DEFAULT_ROUTE_FILE"`
  184. $IPROUTE route flush cache
  185. rm -f -- "$DEFAULT_ROUTE_FILE"
  186. fi
  187. }
  188.  
  189. del_network_route() {
  190. NETWORK="$1"
  191. NETMASK="$2"
  192. NETMASKLEN="$3"
  193. $IPROUTE route $route_syntax_del "$NETWORK/$NETMASKLEN" dev "$TUNDEV"
  194. $IPROUTE route flush cache
  195. }
  196.  
  197. set_ipv6_default_route() {
  198. # We don't save/restore IPv6 default route; just add a higher-priority one.
  199. $IPROUTE -6 route add default dev "$TUNDEV" metric 1
  200. $IPROUTE -6 route flush cache
  201. }
  202.  
  203. set_ipv6_network_route() {
  204. NETWORK="$1"
  205. NETMASKLEN="$2"
  206. $IPROUTE -6 route replace "$NETWORK/$NETMASKLEN" dev "$TUNDEV"
  207. $IPROUTE route flush cache
  208. }
  209.  
  210. reset_ipv6_default_route() {
  211. $IPROUTE -6 route del default dev "$TUNDEV"
  212. $IPROUTE route flush cache
  213. }
  214.  
  215. del_ipv6_network_route() {
  216. NETWORK="$1"
  217. NETMASKLEN="$2"
  218. $IPROUTE -6 route del "$NETWORK/$NETMASKLEN" dev "$TUNDEV"
  219. $IPROUTE -6 route flush cache
  220. }
  221. else # use route command
  222. get_default_gw() {
  223. # isn't -n supposed to give --numeric output?
  224. # apperently not...
  225. # Get rid of lines containing IPv6 addresses (':')
  226. netstat -r -n | awk '/:/ { next; } /^(default|0\.0\.0\.0)/ { print $2; }'
  227. }
  228.  
  229. set_vpngateway_route() {
  230. route add -host "$VPNGATEWAY" $route_syntax_gw "`get_default_gw`"
  231. }
  232.  
  233. del_vpngateway_route() {
  234. vpngw_route=`netstat -r -n | awk '/:/ { next; } /^(default|0\.0\.0\.0)/ { print $2; }'`
  235. route $route_syntax_del -host "$VPNGATEWAY" $route_syntax_gw "$vpngw_route"
  236. }
  237.  
  238. set_default_route() {
  239. DEFAULTGW="`get_default_gw`"
  240. echo "$DEFAULTGW" > "$DEFAULT_ROUTE_FILE"
  241. route $route_syntax_del default $route_syntax_gw "`get_default_gw`"
  242. route add default $route_syntax_gw "$INTERNAL_IP4_ADDRESS" $route_syntax_interface
  243. }
  244.  
  245. set_network_route() {
  246. NETWORK="$1"
  247. NETMASK="$2"
  248. NETMASKLEN="$3"
  249. del_network_route "$NETWORK" "$NETMASK" "$NETMASKLEN"
  250. route add -net "$NETWORK" $route_syntax_netmask "$NETMASK" $route_syntax_gw "$INTERNAL_IP4_ADDRESS" $route_syntax_interface
  251. }
  252.  
  253. reset_default_route() {
  254. if [ -s "$DEFAULT_ROUTE_FILE" ]; then
  255. route $route_syntax_del default $route_syntax_gw "`get_default_gw`" $route_syntax_interface
  256. route add default $route_syntax_gw `cat "$DEFAULT_ROUTE_FILE"`
  257. rm -f -- "$DEFAULT_ROUTE_FILE"
  258. fi
  259. }
  260.  
  261. del_network_route() {
  262. case "$OS" in
  263. Linux|NetBSD|Darwin|SunOS) # and probably others...
  264. # routes are deleted automatically on device shutdown
  265. return
  266. ;;
  267. esac
  268. NETWORK="$1"
  269. NETMASK="$2"
  270. NETMASKLEN="$3"
  271. route $route_syntax_del -net "$NETWORK" $route_syntax_netmask "$NETMASK" $route_syntax_gw "$INTERNAL_IP4_ADDRESS"
  272. }
  273.  
  274. set_ipv6_default_route() {
  275. route add -inet6 default "$INTERNAL_IP6_ADDRESS" $route_syntax_interface
  276. }
  277.  
  278. set_ipv6_network_route() {
  279. NETWORK="$1"
  280. NETMASK="$2"
  281. route add -inet6 -net "$NETWORK/$NETMASK" "$INTERNAL_IP6_ADDRESS" $route_syntax_interface
  282. :
  283. }
  284.  
  285. reset_ipv6_default_route() {
  286. route $route_syntax_del -inet6 default "$INTERNAL_IP6_ADDRESS"
  287. :
  288. }
  289.  
  290. del_ipv6_network_route() {
  291. NETWORK="$1"
  292. NETMASK="$2"
  293. route $route_syntax_del -inet6 "$NETWORK/$NETMASK" "$INTERNAL_IP6_ADDRESS"
  294. :
  295. }
  296.  
  297. fi
  298.  
  299. # =========== resolv.conf handling ====================================
  300.  
  301. # =========== resolv.conf handling for any OS =========================
  302.  
  303. modify_resolvconf_generic() {
  304. grep '^#@VPNC_GENERATED@' /etc/resolv.conf > /dev/null 2>&1 || cp -- /etc/resolv.conf "$RESOLV_CONF_BACKUP"
  305. NEW_RESOLVCONF="#@VPNC_GENERATED@ -- this file is generated by vpnc
  306. # and will be overwritten by vpnc
  307. # as long as the above mark is intact"
  308.  
  309. # Remember the original value of CISCO_DEF_DOMAIN we need it later
  310. CISCO_DEF_DOMAIN_ORIG="$CISCO_DEF_DOMAIN"
  311. # Don't step on INTERNAL_IP4_DNS value, use a temporary variable
  312. INTERNAL_IP4_DNS_TEMP="$INTERNAL_IP4_DNS"
  313. exec 6< "$RESOLV_CONF_BACKUP"
  314. while read LINE <&6 ; do
  315. case "$LINE" in
  316. nameserver*)
  317. if [ -n "$INTERNAL_IP4_DNS_TEMP" ]; then
  318. read ONE_NAMESERVER INTERNAL_IP4_DNS_TEMP <<-EOF
  319. $INTERNAL_IP4_DNS_TEMP
  320. EOF
  321. LINE="nameserver $ONE_NAMESERVER"
  322. else
  323. LINE=""
  324. fi
  325. ;;
  326. search*)
  327. if [ -n "$CISCO_DEF_DOMAIN" ]; then
  328. LINE="$LINE $CISCO_DEF_DOMAIN"
  329. CISCO_DEF_DOMAIN=""
  330. fi
  331. ;;
  332. domain*)
  333. if [ -n "$CISCO_DEF_DOMAIN" ]; then
  334. LINE="domain $CISCO_DEF_DOMAIN"
  335. CISCO_DEF_DOMAIN=""
  336. fi
  337. ;;
  338. esac
  339. NEW_RESOLVCONF="$NEW_RESOLVCONF
  340. $LINE"
  341. done
  342. exec 6<&-
  343.  
  344. for i in $INTERNAL_IP4_DNS_TEMP ; do
  345. NEW_RESOLVCONF="$NEW_RESOLVCONF
  346. nameserver $i"
  347. done
  348. if [ -n "$CISCO_DEF_DOMAIN" ]; then
  349. NEW_RESOLVCONF="$NEW_RESOLVCONF
  350. search $CISCO_DEF_DOMAIN"
  351. fi
  352. echo "$NEW_RESOLVCONF" > /etc/resolv.conf
  353.  
  354. if [ "$OS" = "Darwin" ]; then
  355. case "`uname -r`" in
  356. # Skip for pre-10.4 systems
  357. 4.*|5.*|6.*|7.*)
  358. ;;
  359. # 10.4 and later require use of scutil for DNS to work properly
  360. *)
  361. OVERRIDE_PRIMARY=""
  362. if [ -n "$CISCO_SPLIT_INC" ]; then
  363. if [ $CISCO_SPLIT_INC -lt 1 ]; then
  364. # Must override for correct default route
  365. # Cannot use multiple DNS matching in this case
  366. OVERRIDE_PRIMARY='d.add OverridePrimary # 1'
  367. fi
  368. fi
  369. # Uncomment the following if/fi pair to use multiple
  370. # DNS matching when available. When multiple DNS matching
  371. # is present, anything reading the /etc/resolv.conf file
  372. # directly will probably not work as intended.
  373. #if [ -z "$CISCO_DEF_DOMAIN_ORIG" ]; then
  374. # Cannot use multiple DNS matching without a domain
  375. OVERRIDE_PRIMARY='d.add OverridePrimary # 1'
  376. #fi
  377. scutil >/dev/null 2>&1 <<-EOF
  378. open
  379. d.init
  380. d.add ServerAddresses * $INTERNAL_IP4_DNS
  381. set State:/Network/Service/$TUNDEV/DNS
  382. d.init
  383. # next line overrides the default gateway and breaks split routing
  384. # d.add Router $INTERNAL_IP4_ADDRESS
  385. d.add Addresses * $INTERNAL_IP4_ADDRESS
  386. d.add SubnetMasks * 255.255.255.255
  387. d.add InterfaceName $TUNDEV
  388. $OVERRIDE_PRIMARY
  389. set State:/Network/Service/$TUNDEV/IPv4
  390. close
  391. EOF
  392. if [ -n "$CISCO_DEF_DOMAIN_ORIG" ]; then
  393. scutil >/dev/null 2>&1 <<-EOF
  394. open
  395. get State:/Network/Service/$TUNDEV/DNS
  396. d.add DomainName $CISCO_DEF_DOMAIN_ORIG
  397. d.add SearchDomains * $CISCO_DEF_DOMAIN_ORIG
  398. d.add SupplementalMatchDomains * $CISCO_DEF_DOMAIN_ORIG
  399. set State:/Network/Service/$TUNDEV/DNS
  400. close
  401. EOF
  402. fi
  403. ;;
  404. esac
  405. fi
  406. }
  407.  
  408. restore_resolvconf_generic() {
  409. if [ ! -e "$RESOLV_CONF_BACKUP" ]; then
  410. return
  411. fi
  412. grep '^#@VPNC_GENERATED@' /etc/resolv.conf > /dev/null 2>&1 && cat "$RESOLV_CONF_BACKUP" > /etc/resolv.conf
  413. rm -f -- "$RESOLV_CONF_BACKUP"
  414.  
  415. if [ "$OS" = "Darwin" ]; then
  416. case "`uname -r`" in
  417. # Skip for pre-10.4 systems
  418. 4.*|5.*|6.*|7.*)
  419. ;;
  420. # 10.4 and later require use of scutil for DNS to work properly
  421. *)
  422. scutil >/dev/null 2>&1 <<-EOF
  423. open
  424. remove State:/Network/Service/$TUNDEV/IPv4
  425. remove State:/Network/Service/$TUNDEV/DNS
  426. close
  427. EOF
  428. ;;
  429. esac
  430. fi
  431. }
  432. # === resolv.conf handling via /sbin/modify_resolvconf (Suse) =====================
  433.  
  434. # Suse provides a script that modifies resolv.conf. Use it because it will
  435. # restart/reload all other services that care about it (e.g. lwresd).
  436.  
  437. modify_resolvconf_suse()
  438. {
  439. FULL_SCRIPTNAME=`readlink -f $0`
  440. RESOLV_OPTS=''
  441. test -n "$INTERNAL_IP4_DNS" && RESOLV_OPTS="-n \"$INTERNAL_IP4_DNS\""
  442. test -n "$CISCO_DEF_DOMAIN" && RESOLV_OPTS="$RESOLV_OPTS -d $CISCO_DEF_DOMAIN"
  443. test -n "$RESOLV_OPTS" && eval /sbin/modify_resolvconf modify -s $SCRIPTNAME -p $SCRIPTNAME -f $FULL_SCRIPTNAME -e $TUNDEV $RESOLV_OPTS -t \"This file was created by $SCRIPTNAME\"
  444. }
  445.  
  446. # Restore resolv.conf to old contents on Suse
  447. restore_resolvconf_suse()
  448. {
  449. FULL_SCRIPTNAME=`readlink -f $0`
  450. /sbin/modify_resolvconf restore -s vpnc -p $SCRIPTNAME -f $FULL_SCRIPTNAME -e $TUNDEV
  451. }
  452.  
  453. # === resolv.conf handling via /sbin/resolvconf (Debian, Ubuntu, Gentoo)) =========
  454.  
  455. modify_resolvconf_manager() {
  456. NEW_RESOLVCONF=""
  457. for i in $INTERNAL_IP4_DNS; do
  458. NEW_RESOLVCONF="$NEW_RESOLVCONF
  459. nameserver $i"
  460. done
  461. if [ -n "$CISCO_DEF_DOMAIN" ]; then
  462. NEW_RESOLVCONF="$NEW_RESOLVCONF
  463. domain $CISCO_DEF_DOMAIN"
  464. fi
  465. echo "$NEW_RESOLVCONF" | /sbin/resolvconf -a $TUNDEV
  466. }
  467.  
  468. restore_resolvconf_manager() {
  469. /sbin/resolvconf -d $TUNDEV
  470. }
  471.  
  472. # ========= Toplevel state handling =======================================
  473.  
  474. kernel_is_2_6_or_above() {
  475. case `uname -r` in
  476. 1.*|2.[012345]*)
  477. return 1
  478. ;;
  479. *)
  480. return 0
  481. ;;
  482. esac
  483. }
  484.  
  485. do_pre_init() {
  486. if [ "$OS" = "Linux" ]; then
  487. if (exec 6<> /dev/net/tun) > /dev/null 2>&1 ; then
  488. :
  489. else # can't open /dev/net/tun
  490. test -e /proc/sys/kernel/modprobe && `cat /proc/sys/kernel/modprobe` tun 2>/dev/null
  491. # fix for broken devfs in kernel 2.6.x
  492. if [ "`readlink /dev/net/tun`" = misc/net/tun \
  493. -a ! -e /dev/net/misc/net/tun -a -e /dev/misc/net/tun ] ; then
  494. ln -sf /dev/misc/net/tun /dev/net/tun
  495. fi
  496. # make sure tun device exists
  497. if [ ! -e /dev/net/tun ]; then
  498. mkdir -p /dev/net
  499. mknod -m 0640 /dev/net/tun c 10 200
  500. fi
  501. # workaround for a possible latency caused by udev, sleep max. 10s
  502. if kernel_is_2_6_or_above ; then
  503. for x in `seq 100` ; do
  504. (exec 6<> /dev/net/tun) > /dev/null 2>&1 && break;
  505. sleep 0.1
  506. done
  507. fi
  508. fi
  509. elif [ "$OS" = "FreeBSD" ]; then
  510. if [ ! -e /dev/tun ]; then
  511. kldload if_tun
  512. fi
  513. elif [ "$OS" = "GNU/kFreeBSD" ]; then
  514. if [ ! -e /dev/tun ]; then
  515. kldload if_tun
  516. fi
  517. elif [ "$OS" = "NetBSD" ]; then
  518. :
  519. elif [ "$OS" = "OpenBSD" ]; then
  520. :
  521. elif [ "$OS" = "SunOS" ]; then
  522. :
  523. elif [ "$OS" = "Darwin" ]; then
  524. :
  525. fi
  526. }
  527.  
  528. do_connect() {
  529. if [ -n "$CISCO_BANNER" ]; then
  530. echo "Connect Banner:"
  531. echo "$CISCO_BANNER" | while read LINE ; do echo "|" "$LINE" ; done
  532. echo
  533. fi
  534.  
  535. set_vpngateway_route
  536. do_ifconfig
  537. if [ -n "$CISCO_SPLIT_INC" ]; then
  538. i=0
  539. while [ $i -lt $CISCO_SPLIT_INC ] ; do
  540. eval NETWORK="\${CISCO_SPLIT_INC_${i}_ADDR}"
  541. eval NETMASK="\${CISCO_SPLIT_INC_${i}_MASK}"
  542. eval NETMASKLEN="\${CISCO_SPLIT_INC_${i}_MASKLEN}"
  543. if [ $NETWORK != "0.0.0.0" ]; then
  544. set_network_route "$NETWORK" "$NETMASK" "$NETMASKLEN"
  545. else
  546. set_default_route
  547. fi
  548. i=`expr $i + 1`
  549. done
  550. for i in $INTERNAL_IP4_DNS ; do
  551. if ! echo "$i" | grep : >/dev/null; then
  552. set_network_route "$i" "255.255.255.255" "32"
  553. fi
  554. done
  555. elif [ -n "$INTERNAL_IP4_ADDRESS" ]; then
  556. set_default_route
  557. fi
  558. if [ -n "$CISCO_IPV6_SPLIT_INC" ]; then
  559. i=0
  560. while [ $i -lt $CISCO_IPV6_SPLIT_INC ] ; do
  561. eval NETWORK="\${CISCO_IPV6_SPLIT_INC_${i}_ADDR}"
  562. eval NETMASKLEN="\${CISCO_IPV6_SPLIT_INC_${i}_MASKLEN}"
  563. if [ $NETMASKLEN -lt 128 ]; then
  564. set_ipv6_network_route "$NETWORK" "$NETMASKLEN"
  565. else
  566. set_ipv6_default_route
  567. fi
  568. i=`expr $i + 1`
  569. done
  570. for i in $INTERNAL_IP4_DNS ; do
  571. if echo "$i" | grep : >/dev/null; then
  572. set_ipv6_network_route "$i" "128"
  573. fi
  574. done
  575. elif [ -n "$INTERNAL_IP6_NETMASK" -o -n "$INTERNAL_IP6_ADDRESS" ]; then
  576. set_ipv6_default_route
  577. fi
  578.  
  579. if [ -n "$INTERNAL_IP4_DNS" ]; then
  580. $MODIFYRESOLVCONF
  581. fi
  582. }
  583.  
  584. do_disconnect() {
  585. if [ -n "$CISCO_SPLIT_INC" ]; then
  586. i=0
  587. while [ $i -lt $CISCO_SPLIT_INC ] ; do
  588. eval NETWORK="\${CISCO_SPLIT_INC_${i}_ADDR}"
  589. eval NETMASK="\${CISCO_SPLIT_INC_${i}_MASK}"
  590. eval NETMASKLEN="\${CISCO_SPLIT_INC_${i}_MASKLEN}"
  591. if [ $NETWORK != "0.0.0.0" ]; then
  592. # FIXME: This doesn't restore previously overwritten
  593. # routes.
  594. del_network_route "$NETWORK" "$NETMASK" "$NETMASKLEN"
  595. else
  596. reset_default_route
  597. fi
  598. i=`expr $i + 1`
  599. done
  600. for i in $INTERNAL_IP4_DNS ; do
  601. del_network_route "$i" "255.255.255.255" "32"
  602. done
  603. else
  604. reset_default_route
  605. fi
  606. if [ -n "$CISCO_IPV6_SPLIT_INC" ]; then
  607. i=0
  608. while [ $i -lt $CISCO_IPV6_SPLIT_INC ] ; do
  609. eval NETWORK="\${CISCO_IPV6_SPLIT_INC_${i}_ADDR}"
  610. eval NETMASKLEN="\${CISCO_IPV6_SPLIT_INC_${i}_MASKLEN}"
  611. if [ $NETMASKLEN -eq 0 ]; then
  612. reset_ipv6_default_route
  613. else
  614. del_ipv6_network_route "$NETWORK" "$NETMASKLEN"
  615. fi
  616. i=`expr $i + 1`
  617. done
  618. for i in $INTERNAL_IP6_DNS ; do
  619. del_ipv6_network_route "$i" "128"
  620. done
  621. elif [ -n "$INTERNAL_IP6_NETMASK" -o -n "$INTERNAL_IP6_ADDRESS" ]; then
  622. reset_ipv6_default_route
  623. fi
  624.  
  625. del_vpngateway_route
  626.  
  627. if [ -n "$INTERNAL_IP4_DNS" ]; then
  628. $RESTORERESOLVCONF
  629. fi
  630. destroy_tun_device
  631. }
  632.  
  633. #### Main
  634.  
  635. if [ -z "$reason" ]; then
  636. echo "this script must be called from vpnc" 1>&2
  637. exit 1
  638. fi
  639.  
  640. case "$reason" in
  641. pre-init)
  642. do_pre_init
  643. ;;
  644. connect)
  645. do_connect
  646. ;;
  647. disconnect)
  648. do_disconnect
  649. ;;
  650. *)
  651. echo "unknown reason '$reason'. Maybe vpnc-script is out of date" 1>&2
  652. exit 1
  653. ;;
  654. esac
  655.  
  656. exit 0
Add Comment
Please, Sign In to add comment