diff --git a/route.sh b/route.sh new file mode 100755 index 0000000..0180cf6 --- /dev/null +++ b/route.sh @@ -0,0 +1,103 @@ +#!/bin/sh + +# route.sh -- set up ip route +# +# Copyright (C) 2014 Zeno Zeng +# Copyright (C) 2014 Hexcles Ma +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# . + +ip_route_del() { + count=$(ip route show $1 | wc -l) + if [ "${count}" -gt "0" ]; then + ip route del $1 + fi +} + +echo "[INFO] Setting up ip route." + +gateway=$(ip route get 10.10.0.21 | grep via | awk '{print $3}') + +devs_count=$(ip addr show | grep 'inet.*ppp' | grep ' 10.5.' | awk '{print $7}' | wc -l) +if [ "${devs_count}" -eq "0" ]; then + dev=$(ip route get 10.10.0.21 | head -n1 | awk '{print $5}') + + ip_route_del 10.0.0.0/8 + ip_route_del 10.50.200.245 + ip_route_del 58.196.192.0/19 + ip_route_del 58.196.224.0/20 + ip_route_del 58.200.100.0/24 + ip_route_del 210.32.0.0/20 + ip_route_del 210.32.128.0/19 + ip_route_del 210.32.160.0/21 + ip_route_del 210.32.168.0/22 + ip_route_del 210.32.172.0/23 + ip_route_del 210.32.176.0/20 + ip_route_del 222.205.0.0/17 + ip_route_del 10.5.1.0/24 + ip_route_del 10.10.0.0/24 + + ip route replace default via $gateway dev $dev + + ip route + return +fi + +ip route replace 10.5.1.0/24 via $gateway # for LNS +ip route replace 10.10.0.0/24 via $gateway # for DNS + +case "$gateway" in + 10.189.*) + ip route replace 10.50.200.245 via $gateway + ;; + 10.171.*) + ;; + *) + # 内网静态路由 + # See also: #18 (thanks Hexcles Ma) + ip route replace 10.0.0.0/8 via $gateway + + # Some classroom computers (especially East 6,7) + ip route replace 58.196.192.0/19 via $gateway + ip route replace 58.196.224.0/20 via $gateway + ip route replace 58.200.100.0/24 via $gateway + + # The public CERNET IP of most ZJU servers, which can be reached directly in the Intranet. + # Most of them do have a 10.* IP, but sometimes school DNS just returns the public ones. + ip route replace 210.32.0.0/20 via $gateway + ip route replace 210.32.128.0/19 via $gateway + ip route replace 210.32.160.0/21 via $gateway + ip route replace 210.32.168.0/22 via $gateway + ip route replace 210.32.172.0/23 via $gateway + ip route replace 210.32.176.0/20 via $gateway + + # 玉泉和我们 vpn 后的 ip + ip route replace 222.205.0.0/17 via $gateway + ;; +esac + +# NEXTHOP +devs=$(ip addr show | grep 'inet.*ppp' | grep ' 10.5.' | awk '{print $7}') +cmd="ip route replace default" +for dev in $devs; do + cmd="${cmd} nexthop dev ${dev}" +done + +# WLAN +cmd="${cmd} nexthop via ${gateway}" + +$cmd +ip route + diff --git a/vpn.sh b/vpn.sh index bb982fe..885ea04 100755 --- a/vpn.sh +++ b/vpn.sh @@ -21,84 +21,7 @@ # along with this program. If not, see # . -ip_route_del() { - count=$(ip route show $1 | wc -l) - if [ "${count}" -gt "0" ]; then - ip route del $1 - fi -} - -set_up_routes() { - - echo "[INFO] Setting up ip route." - - gateway=$(ip route get 10.10.0.21 | grep via | awk '{print $3}') - - devs_count=$(ip addr show | grep 'inet.*ppp' | grep ' 10.5.' | awk '{print $7}' | wc -l) - if [ "${devs_count}" -eq "0" ]; then - dev=$(ip route get 10.10.0.21 | head -n1 | awk '{print $5}') - - ip_route_del 10.0.0.0/8 - ip_route_del 58.196.192.0/19 - ip_route_del 58.196.224.0/20 - ip_route_del 58.200.100.0/24 - ip_route_del 210.32.0.0/20 - ip_route_del 210.32.128.0/19 - ip_route_del 210.32.160.0/21 - ip_route_del 210.32.168.0/22 - ip_route_del 210.32.172.0/23 - ip_route_del 210.32.176.0/20 - ip_route_del 222.205.0.0/17 - ip_route_del 10.5.1.0/24 - ip_route_del 10.10.0.0/24 - - ip route replace default via $gateway dev $dev - - ip route - return - fi - - ip route replace 10.5.1.0/24 via $gateway # for LNS - ip route replace 10.10.0.0/24 via $gateway # for DNS - - case "$gateway" in - 10.189.*) - ;; - 10.171.*) - ;; - *) - # 内网静态路由 - # See also: #18 (thanks Hexcles Ma) - ip route replace 10.0.0.0/8 via $gateway - - # Some classroom computers (especially East 6,7) - ip route replace 58.196.192.0/19 via $gateway - ip route replace 58.196.224.0/20 via $gateway - ip route replace 58.200.100.0/24 via $gateway - - # The public CERNET IP of most ZJU servers, which can be reached directly in the Intranet. - # Most of them do have a 10.* IP, but sometimes school DNS just returns the public ones. - ip route replace 210.32.0.0/20 via $gateway - ip route replace 210.32.128.0/19 via $gateway - ip route replace 210.32.160.0/21 via $gateway - ip route replace 210.32.168.0/22 via $gateway - ip route replace 210.32.172.0/23 via $gateway - ip route replace 210.32.176.0/20 via $gateway - - # 玉泉和我们 vpn 后的 ip - ip route replace 222.205.0.0/17 via $gateway - ;; - esac - - # NEXTHOP - devs=$(ip addr show | grep 'inet.*ppp' | grep ' 10.5.' | awk '{print $7}') - cmd="ip route replace default" - for dev in $devs; do - cmd="${cmd} nexthop dev ${dev}" - done - $cmd - ip route -} +BASEDIR=$(dirname $0) disconnect() { users=$("${BASEDIR}/user.sh" getall) @@ -106,7 +29,7 @@ disconnect() { echo "[INFO] Logout: ${username}" "${BASEDIR}/xl2tpd.sh" disconnect $username done - set_up_routes + "${BASEDIR}/route.sh" } connect() { @@ -119,7 +42,7 @@ connect() { "${BASEDIR}/xl2tpd.sh" connect $username $password done - set_up_routes + "${BASEDIR}/route.sh" } ##################################### @@ -128,14 +51,8 @@ connect() { # ##################################### -BASEDIR=$(dirname $0) - case "$1" in - route) - set_up_routes - ;; - -d) disconnect ;; diff --git a/wlan.sh b/wlan.sh index c510f2c..c934660 100755 --- a/wlan.sh +++ b/wlan.sh @@ -21,6 +21,13 @@ # along with this program. If not, see # . +BASEDIR=$(dirname $0) + +USER="${BASEDIR}/user.sh" + +USERNAME=$($USER get) +PASSWORD=$($USER getpwd $USERNAME) + logout() { USERNAME=$1 PASSWORD=$2 @@ -65,20 +72,15 @@ login() { esac } -BASEDIR=$(dirname $0) -USER="${BASEDIR}/user.sh" - -USERNAME=$($USER get) -PASSWORD=$($USER getpwd $USERNAME) case "$1" in - login) - login $USERNAME $PASSWORD + disconnect) + logout $USERNAME $PASSWORD ;; - logout) + -d) logout $USERNAME $PASSWORD ;; *) - ${BASEDIR}/zjunet.sh usage + login $USERNAME $PASSWORD ;; esac diff --git a/xl2tpd.sh b/xl2tpd.sh index 03cd7cc..aa5458e 100755 --- a/xl2tpd.sh +++ b/xl2tpd.sh @@ -131,7 +131,7 @@ connect() { then echo "[INFO] Connection terminated." echo -n > $PPP_LOG_FILE - echo "[INFO] Retry now." + echo "[INFO] Retrying now. (force kicking off, may take some time)" xl2tpd_disconnect ${LAC_NAME} sleep 1 xl2tpd_connect ${LAC_NAME} diff --git a/zjunet.sh b/zjunet.sh index c06e3d5..a4117be 100755 --- a/zjunet.sh +++ b/zjunet.sh @@ -21,9 +21,16 @@ BASEDIR=$(dirname $0) case "$1" in + route) + "${BASEDIR}/sudo.sh" "${BASEDIR}/route.sh" + ;; user) "${BASEDIR}/user.sh" $2 ;; + all) + "${BASEDIR}/wlan.sh" $2 + "${BASEDIR}/sudo.sh" "${BASEDIR}/vpn.sh" $2 + ;; wlan) "${BASEDIR}/wlan.sh" $2 ;; @@ -47,13 +54,16 @@ Actions: list List all enabled users enable Enable a user disable Disable a user + all + connect(-c) Connect VPN & ZJUWLAN, and combine them using nexthop + disconnect(-d) Disconnect VPN & ZJUWLAN vpn connect(-c) Connect VPN and set up ip route disconnect(-d) Disconnect VPN and reset ip route - route Set up ip route wlan - login Login ZJUWLAN via curl - logout Logout ZJUWLAN via curl + connect(-c) Login ZJUWLAN via curl + disconnect(-d) Logout ZJUWLAN via curl + route Set up ip route dns Test and set up DNS Server EOF ;;