Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- # pwwifi # uwierzytelnienie w sieci WiFi PW
- # ato 2013-2015
- # http://www.cisco.com/c/en/us/td/docs/wireless/controller/4-0/configuration/guide/ccfig40/c40users.html
- # TODO: curl 32-bitowy:
- #t3% curl | grep libssl.so.5
- #Shared object "libssl.so.5" not found, required by "curl"
- #t3% curl 2> /dev/null | grep libssl.so.5
- #t3% curl 2> /dev/null | grep libssl.so.5
- # TODO: przetestowac grupe prac
- # TODO: odtwarzac bramke - gdzie ja zpisywac /tmp/$PROG-user-interfejs ?
- OLD=-old # oryginalne pliki (przyrostek)
- RESOLV=/etc/resolv.conf # plik konfiguracyjny resolwera DNS
- LEASES=/var/db/dhclient.leases # prefix plikow z info
- SSID=pwwifi-students
- #GATE=10.68.0.1 # brmka
- PROX=1.1.1.1 # transparent proxy. Potrzebny do logout.
- usage () {
- echo "użycie:
- source =$PROG -x pas # zdefiniowanie użytkownika i hasła (opcjonalnie)
- $PROG inf # informacie o PWWIFI
- $PROG start [interfejs] # połączenie
- $PROG stop # odłączenie
- -x : zapisz dziennik działania skryptu do pliku /tmp/$PROG-\$\$
- Uwaga: skrypt zakłada, że łącze na warstwie drugiej jest już skonfigurowane
- Jesli chcemy użyć innego interfejsu musimy zdefiniwać zmienną srodowiskową wlan np.
- wlan=wlan1 $PROG start"
- exit
- }
- vread () { # prompt zmienna # Wczytaj zmienną
- local X
- eval "X=\$$2"
- read -p "$1 : " X ; [ "$X" ] && setvar $2 "$X"
- }
- fatal () {
- echo "$*" 1>&2
- exit 1
- }
- warn () { # message # komunikat na stderr
- local YELLOW='\e[33m' NOR='\e[m'
- [ "$1" ] && echo -e 1>&2 "$YELLOW$1$NOR" # na stderr
- }
- Debug () { # generuj dziennik działania
- [ "$LOG" ] && return # już był wolany
- LOG=/tmp/$PROG-$$
- exec 2> $LOG ; set -x # DEBUG
- }
- setpar () { # file var=par ... # wstaw wartosc parametru "par" do zmiennej "var" (dane w file)
- local file var par
- file=`$su tail -15 $1 2>/dev/null` # pliku moze nie byc
- shift
- while [ "$1" ] ;do
- var=${1%=*} ; par=${1#*=}
- setvar $var $(echo "$file" | grep -w $par | sed 's/.* //;s/;//')
- eval [ "\$$var" ] || fatal "brak parametru $par"
- shift
- done
- }
- getpass () { # prompt zmienna # interakcyjnie wczytaj album/haslo
- local val pas2
- eval val=\$$2
- pas2=a
- stty -echo
- while [ "$val" != "$pas2" ]; do
- vread "$1" $2
- eval val=\$$2
- # test poprawnosci:
- case "$2" in
- NRAL) # TODO: tylko cyfry
- break # nr albumu wczytujemy jednokrotnie
- ;;
- PASS) [ ${#val} -ne 12 ] && { warn "haslo musi miec dokladnie 12 znaków" ; continue ;}
- ;;
- esac
- vread "${1%% *} ponownie" pas2
- done
- stty echo
- echo
- }
- pwgetpas () { # [user] # ustawienie zmiennych NRAL i PASS
- [ -n "$NRAL" ] && return # ze srodowiska
- if [ -r "$PASSFILE" ]; then
- read NRAL PASS < $PASSFILE # z pliku
- else
- getpass "numer albumu" NRAL # z klawiatury
- getpass "haslo (PESEL + pierwsza duza litera imienia matki)" PASS
- mkdir -m 700 "${PASSFILE%/*}" # zapisanie do pliku
- umask 077 ; echo "$NRAL $PASS" > "$PASSFILE"
- fi
- }
- setWLAN () { # ssid # ustaw zmienna wlan na interefejs podlaczony do siec 'ssid'
- if [ "$wlan" ]; then # uzytkownik zdefiniowal zmienna wlan
- ifconfig $wlan 2>/dev/null | grep -q 'ssid $1' ||
- fatal "brak interfejsu $wlan, lub interfejs nie jest podlaczony do sieci $1"
- else
- for wlan in wlan0 wlan1 wlan2 ; do
- ifconfig $wlan 2>/dev/null | grep -q "ssid $1" && return
- done
- wlan=
- fatal "brak interfejsu w sieci $1"
- fi
- }
- link2 () { # ssid # sprawdzenie czy jest link wifi do 'ssid'
- ifconfig $wlan >/dev/null 2>&1 ||
- fatal "brak interfejsu $wlan, Wykreuj go lub ustaw odpowiednio zmienna wlan="
- ifconfig $wlan | fgrep -q "ssid $1" ||
- $su ifconfig $wlan ssid $1 up && sleep 1
- ifconfig $wlan | fgrep -q "ssid $1" ||
- fatal "interfejs $wlan nie jest podlaczony do sieci $1"
- #$wlan: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
- # ether 00:24:d7:7e:af:54
- # media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11ng
- # status: associated
- # ssid pwwifi-students channel 6 (2437 MHz 11g ht/20) bssid 00:21:a0:81:86:c3
- # regdomain ETSI country PL authmode OPEN privacy OFF txpower 30
- # bmiss 10 scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250
- # roam:rssi 7 roam:rate 64 protmode CTS ampdulimit 64k ampdudensity 8
- # -amsdutx amsdurx shortgi wme bintval 102
- }
- link3 () { # wlan # inicjalizacja 3 warstwy (IP) przez DHCP
- LFILE=$LEASES.$1 # plik zawierajacy prametry uzyskane z dhcp
- GATEOLD=`netstat -rn | grep -w default | cut -w -f2` # XXX: moze byc puste
- $su service dhclient status $1 > /dev/null ||
- $su dhclient $1 # nie mozna uzyc service bez ifconfig_$1 w rc.conf
- $su service dhclient status $1 || # ale teraz juz tak.
- fatal "dhcp na interfejsie $1 nie dziala"
- # Uzyskane parametry:
- setpar $LFILE MYIP=fixed-address GATE=routers PROX=dhcp-server-identifier DNS=domain-name-servers
- # Trasa do PROX musi byc jesli nie jest to trasa standardowa!
- # Uwaga: trasa ta wypda po "LINK DOWN !
- $su route add -host $PROX $GATE 2>/dev/null # to
- #$su route add -host $PROX -interface $1 # lub to
- # Opcjonalny wpis mapowania IP na nazwe:
- $su sh -c "echo -e '$MYIP\t`hostname -s`-pwifi\t# adres w sieci $SSID' >> /etc/hosts"
- # Uwaga mimo zadzialania DHCP ping do GATE/PROX nie dziala. Musi jednak pojawic sie wpis arp dla GATE.
- #su dhclient wlan0
- #DHCPREQUEST on wlan0 to 255.255.255.255 port 67
- #DHCPACK from 1.1.1.1
- #bound to 10.68.19.59 -- renewal in 1800 seconds.
- #su service dhclient status wlan0
- #dhclient is running as pid 3784
- #su tail -14 /var/db/dhclient.leases.wlan0
- #lease {
- # interface "wlan0";
- # fixed-address 10.68.19.59;
- # option subnet-mask 255.255.0.0;
- # option routers 10.68.0.1;
- # option domain-name-servers 10.68.0.1;
- # option domain-name "pwifi-studets.pw.edu.pl";
- # option dhcp-lease-time 3600;
- # option dhcp-message-type 5;
- # option dhcp-server-identifier 1.1.1.1;
- # renew 6 2014/5/17 19:19:37;
- # rebind 6 2014/5/17 19:42:07;
- # expire 6 2014/5/17 19:49:37;
- #}
- #$wlan: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
- # inet 10.68.21.237 netmask 255.255.0.0 broadcast 10.68.255.255
- }
- # TODO: jak przeslac PASS nie w linii wywolania (niebezpieczne - inni widza) ?
- webauth () { # Web Authentication
- URL=https://$PROX/login.html #URL=https://$PROX/login_noscript.html
- OKT='<td align="center">Login Successful</td>'
- pwgetpas # ustawienie zmiennych NRAL i PASS (UserName i Password)
- DAT="username=$NRAL&password=$PASS&buttonClicked=4"
- OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL) ; ex=$?
- if [ $ex -eq 28 -o $ex -eq 130 -o -z "$OUT" ]; then # brak odpowiedzi - druga proba po dodaniu trasy:
- $su route add -host $PROX $GATE
- OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL)
- fi
- if echo "$OUT" | fgrep -q "$OKT" ; then
- warn "Web Authentication OK"
- else
- #warn "brak odpowiedzi 'Login Successful'"
- #The username specified cannot be used at this time. Perhaps the username is already logged into the system?
- info_msg=$(echo "$OUT" | fgrep 'info_msg' | cut -d\" -f10)
- warn "$info_msg" ; exit 1
- LOG=/tmp/$PROG-$USER-err-$$.html
- echo "$OUT" > $LOG # XXX: debug log
- arp -i $wlan -an | grep $GATE
- echo $LOG
- echo links $URL
- echo "napisz exit aby wrocic do $PROG"
- $SHELL || exit
- #fatal "brak odpowiedzi 'Login Successful'.\nSprobuj zalogowac sie recznie poleceniem: links $URL"
- fi
- }
- linktest () { # host # zwraca OK jest $1 odpowiada
- ping -q -c1 -t1 $1 >/dev/null 2>&1
- }
- trasa () { # przestawienie trasy standardowej (bramki)
- echo GATE=$GATE OLD=$GATEOLD # GATE=10.68.0.1
- [ "$GATE" != "$GATEOLD" ] &&
- $su route change default $GATE &&
- traceroute wp.pl # test czy dziala
- }
- resolver () { # Przestawienie DNS-a
- DNSOLD=
- echo DNS=$DNS # DNS=10.68.0.1
- $su sed -i$OLD "s/$DNSOLD/$DNS/" $RESOLV
- }
- pwlogin () { # wlan # zlogowanie sie i skonfigurowanie sieci
- [ "$1" ] && wlan=$1
- link2 $SSID # sprawdzenie/inicjacja warstwy lacza danych
- link3 $wlan # sprawdzenie/inicjacja warstwy sieci
- webauth # uwiezytelnienie:
- linktest $GATE || fatal "bramka $GATE nie odpowiada"
- trasa #
- #resolver # XXX: niepotrzebne - dhcp dodaje
- #logger -p # XXX: dziennik ?
- }
- pwlogout () { # TODO: odtworzyc trase standardowo ?
- LFILE=$LEASES.$wlan # plik zawierajacy prametry uzyskane z dhcp
- setpar $LFILE MYIP=fixed-address GATE=routers PROX=dhcp-server-identifier DNS=domain-name-servers
- URL=https://$PROX/logout.html
- OKT="To complete the log off process and to prevent access to unauthorized users"
- pwgetpas # ustawienie zmiennych NRAL i PASS
- DAT="buttonClicked=4&username=$NRAL&password=$PASS"
- OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL) ; ex=$?
- if [ $ex -eq 28 -o $ex -eq 130 -o -z "$OUT" ]; then # brak odpowiedzi - druga proba po dodaniu trasy:
- $su route add -host $PROX $GATE
- OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL)
- fi
- if ! echo "$OUT" | fgrep -q "$OKT" ; then
- LOG=/tmp/$PROG-$USER-err-$$.html
- echo "$OUT" > $LOG # XXX: debug log
- warn "$LOG"
- exit 1
- fi
- warn "Loggout OK"
- # Test czy rzeczywiscie rozlaczone:
- linktest $GATE && fatal "bramka $GATE nadal odpowiada"
- # Stop dhclient-a
- $su pkill -u _dhcp -lf "dhclient: $wlan" # service stop nie dziala (j.w) XXX: kill -15 ?
- # Resolver:
- [ "$DNS" ] && $su sed -i$OLD "/$DNS/d" $RESOLV # usuniecie dodanego DNS-a
- # Hosts
- [ "$MYIP" ] && $su sed -i$OLD "/$MYIP/d" /etc/hosts # usuniecie dodanego mapowania
- # Trasa:
- $su route delete -host $PROX #
- case "$GATEOLD" in # i poprzedniej bramki: TODO
- '') echo $su route delete default ;; # nie bylo jej
- *) echo $su route change default $GATEOLD ;; #
- esac
- # Usuniecie adresiu z interfejsu:
- $su ifconfig $wlan $MYIP delete
- }
- pwinfo () {
- echo "sieć pwwifi może czasami nie działać :(
- Uczelniany HelpDesk sieci pwwifi:
- http://5999.pw.edu.pl/
- 5999@pw.edu.pl"
- exit
- }
- pwstatus () { # status polaczenia
- LFILE=$LEASES.$wlan # plik zawierajacy prametry uzyskane z dhcp
- setpar $LFILE MYIP=fixed-address GATE=routers PROX=dhcp-server-identifier DNS=domain-name-servers
- linktest $GATE && { warn "ok - bramka $GATE odpowiada" ; return ; }
- warn "bramka $GATE nie odpowiada"
- exit 1
- ifconfig $wlan
- #linktest $PROX || warn "proxy $PROX nie odpowiada"
- #exit
- dhc l $wlan
- tt4 -n
- }
- # START
- PROG=${0##*/}
- case "$1" in
- -x) shift ; Debug ;;
- esac
- case "$1" in
- inf*) cmd=pwinfo ;;
- star*) cmd=pwlogin ;;
- sta*) cmd=pwstatus ;;
- sto*) cmd=pwlogout ;;
- pas*) cmd=pwgetpas ; export NRAL PASS ;; # export gdy source (bezpieczniej niz w pliku)
- ''|*) usage ;;
- esac
- [ `id -ng` = prac ] && SSID=pwwifi # dla grupy prac inny SSID
- setWLAN $SSID # ustaw wlan na interefejs podlaczony do siec
- [ `id -un` = root ] || su=sudo
- eval HOME=~${SUDO_USER:-$USER}
- PASSFILE=$HOME/securedir/$PROG # prywatny plik uzytkownika z haslem
- $cmd $2 # $2 moze zawierac wlan dla start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement