daily pastebin goal
49%
SHARE
TWEET

pwwifi

a guest May 27th, 2018 189 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/sh
  2. # pwwifi                                        # uwierzytelnienie w sieci WiFi PW
  3. # ato 2013-2015
  4.  
  5. # http://www.cisco.com/c/en/us/td/docs/wireless/controller/4-0/configuration/guide/ccfig40/c40users.html
  6.  
  7. # TODO: curl 32-bitowy:
  8. #t3% curl | grep libssl.so.5
  9. #Shared object "libssl.so.5" not found, required by "curl"
  10. #t3% curl 2> /dev/null | grep libssl.so.5
  11. #t3% curl 2> /dev/null | grep libssl.so.5
  12.  
  13. # TODO: przetestowac grupe prac
  14.  
  15. # TODO: odtwarzac bramke - gdzie ja zpisywac /tmp/$PROG-user-interfejs ?
  16.  
  17. OLD=-old                                        # oryginalne pliki (przyrostek)
  18.  
  19. RESOLV=/etc/resolv.conf                         # plik konfiguracyjny resolwera DNS
  20. LEASES=/var/db/dhclient.leases                  # prefix plikow z info
  21. SSID=pwwifi-students
  22.  
  23. #GATE=10.68.0.1                                 # brmka
  24. PROX=1.1.1.1                                    # transparent proxy. Potrzebny do logout.
  25.  
  26. usage () {
  27.   echo "użycie:
  28. source =$PROG -x pas    # zdefiniowanie użytkownika i hasła (opcjonalnie)
  29. $PROG inf               # informacie o PWWIFI
  30. $PROG start [interfejs] # połączenie
  31. $PROG stop              # odłączenie
  32. -x : zapisz dziennik działania skryptu do pliku /tmp/$PROG-\$\$
  33. Uwaga: skrypt zakłada, że łącze na warstwie drugiej jest już skonfigurowane
  34. Jesli chcemy użyć innego interfejsu musimy zdefiniwać zmienną srodowiskową wlan np.
  35. wlan=wlan1 $PROG start"
  36.   exit
  37. }
  38.  
  39. vread () { # prompt zmienna                     # Wczytaj zmienną
  40.   local X
  41.   eval "X=\$$2"
  42.   read -p "$1 : " X ; [ "$X" ] && setvar $2 "$X"
  43. }
  44.  
  45. fatal () {
  46.   echo "$*" 1>&2
  47.   exit 1
  48. }
  49.  
  50. warn () { # message                             # komunikat na stderr
  51.   local YELLOW='\e[33m' NOR='\e[m'
  52.   [ "$1" ] && echo -e 1>&2 "$YELLOW$1$NOR"      # na stderr
  53. }
  54.  
  55. Debug () {                                      # generuj dziennik działania
  56.   [ "$LOG" ] && return                          # już był wolany
  57.   LOG=/tmp/$PROG-$$
  58.   exec 2> $LOG ; set -x                         # DEBUG
  59. }
  60.  
  61. setpar () { # file var=par ...                  # wstaw wartosc parametru "par" do zmiennej "var" (dane w file)
  62.   local file var par
  63.   file=`$su tail -15 $1 2>/dev/null`            # pliku moze nie byc
  64.   shift
  65.   while [ "$1" ] ;do
  66.     var=${1%=*} ; par=${1#*=}
  67.     setvar $var $(echo "$file" | grep -w $par | sed 's/.* //;s/;//')
  68.     eval [ "\$$var" ] || fatal "brak parametru $par"
  69.     shift
  70.   done
  71. }
  72.  
  73. getpass () { # prompt zmienna                   # interakcyjnie wczytaj album/haslo
  74.   local val pas2
  75.   eval val=\$$2
  76.   pas2=a
  77.   stty -echo
  78.   while [ "$val" != "$pas2" ]; do
  79.     vread "$1" $2
  80.     eval val=\$$2
  81.     # test poprawnosci:
  82.     case "$2" in
  83.     NRAL) # TODO: tylko cyfry
  84.           break                                 # nr albumu wczytujemy jednokrotnie
  85.           ;;
  86.     PASS) [ ${#val} -ne 12 ] &&  { warn "haslo musi miec dokladnie 12 znaków" ; continue ;}
  87.           ;;
  88.     esac
  89.     vread "${1%% *} ponownie" pas2
  90.   done
  91.   stty echo
  92.   echo
  93. }
  94.  
  95. pwgetpas () { # [user]                          # ustawienie zmiennych NRAL i PASS
  96.   [ -n "$NRAL" ] && return                      # ze srodowiska
  97.   if [ -r "$PASSFILE" ]; then
  98.     read NRAL PASS < $PASSFILE                  # z pliku
  99.   else
  100.     getpass "numer albumu" NRAL                 # z klawiatury
  101.     getpass "haslo (PESEL + pierwsza duza litera imienia matki)" PASS
  102.     mkdir -m 700 "${PASSFILE%/*}"               # zapisanie do pliku
  103.     umask 077 ; echo "$NRAL $PASS" > "$PASSFILE"
  104.   fi
  105. }
  106.  
  107. setWLAN () { # ssid                             # ustaw zmienna wlan na interefejs podlaczony do siec 'ssid'
  108.   if [ "$wlan" ]; then                          # uzytkownik zdefiniowal zmienna wlan
  109.     ifconfig $wlan 2>/dev/null | grep -q 'ssid $1' ||
  110.       fatal "brak interfejsu $wlan, lub interfejs nie jest podlaczony do sieci $1"
  111.   else
  112.     for wlan in wlan0 wlan1 wlan2 ; do
  113.       ifconfig $wlan 2>/dev/null | grep -q "ssid $1" && return
  114.     done
  115.     wlan=
  116.     fatal "brak interfejsu w sieci $1"
  117.   fi
  118. }
  119.  
  120. link2 () { # ssid                               # sprawdzenie czy jest link wifi do 'ssid'
  121.   ifconfig $wlan >/dev/null 2>&1 ||
  122.     fatal "brak interfejsu $wlan, Wykreuj go lub ustaw odpowiednio zmienna wlan="
  123.   ifconfig $wlan | fgrep -q "ssid $1" ||
  124.     $su ifconfig $wlan ssid $1 up && sleep 1
  125.   ifconfig $wlan | fgrep -q "ssid $1" ||
  126.     fatal "interfejs $wlan nie jest podlaczony do sieci $1"
  127.   #$wlan: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
  128.   #        ether 00:24:d7:7e:af:54
  129.   #        media: IEEE 802.11 Wireless Ethernet OFDM/36Mbps mode 11ng
  130.   #        status: associated
  131.   #        ssid pwwifi-students channel 6 (2437 MHz 11g ht/20) bssid 00:21:a0:81:86:c3
  132.   #        regdomain ETSI country PL authmode OPEN privacy OFF txpower 30
  133.   #        bmiss 10 scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250
  134.   #        roam:rssi 7 roam:rate 64 protmode CTS ampdulimit 64k ampdudensity 8
  135.   #        -amsdutx amsdurx shortgi wme bintval 102
  136. }
  137.  
  138. link3 () { # wlan                               # inicjalizacja 3 warstwy (IP) przez DHCP
  139.   LFILE=$LEASES.$1                              # plik zawierajacy prametry uzyskane z dhcp
  140.   GATEOLD=`netstat -rn | grep -w default | cut -w -f2`  # XXX: moze byc puste
  141.   $su service dhclient status $1 > /dev/null ||
  142.     $su dhclient $1                             # nie mozna uzyc service bez ifconfig_$1 w rc.conf
  143.   $su service dhclient status $1 ||             # ale teraz juz tak.
  144.     fatal "dhcp na interfejsie $1 nie dziala"
  145.  
  146.   # Uzyskane parametry:
  147.   setpar $LFILE MYIP=fixed-address GATE=routers PROX=dhcp-server-identifier DNS=domain-name-servers
  148.  
  149.   # Trasa do PROX musi byc jesli nie jest to trasa standardowa!
  150.   # Uwaga: trasa ta wypda po "LINK DOWN !
  151.   $su route add -host $PROX $GATE 2>/dev/null   # to
  152.   #$su route add -host $PROX -interface $1      # lub to
  153.  
  154.   # Opcjonalny wpis mapowania IP na nazwe:
  155.   $su sh -c "echo -e '$MYIP\t`hostname -s`-pwifi\t# adres w sieci $SSID' >> /etc/hosts"
  156.  
  157.   # Uwaga mimo zadzialania DHCP ping do GATE/PROX nie dziala. Musi jednak pojawic sie wpis arp dla GATE.
  158.  
  159.   #su dhclient wlan0
  160.   #DHCPREQUEST on wlan0 to 255.255.255.255 port 67
  161.   #DHCPACK from 1.1.1.1
  162.   #bound to 10.68.19.59 -- renewal in 1800 seconds.
  163.  
  164.   #su service dhclient status wlan0
  165.   #dhclient is running as pid 3784
  166.  
  167.   #su tail -14 /var/db/dhclient.leases.wlan0
  168.   #lease {
  169.   #  interface "wlan0";
  170.   #  fixed-address 10.68.19.59;
  171.   #  option subnet-mask 255.255.0.0;
  172.   #  option routers 10.68.0.1;
  173.   #  option domain-name-servers 10.68.0.1;
  174.   #  option domain-name "pwifi-studets.pw.edu.pl";
  175.   #  option dhcp-lease-time 3600;
  176.   #  option dhcp-message-type 5;
  177.   #  option dhcp-server-identifier 1.1.1.1;
  178.   #  renew 6 2014/5/17 19:19:37;
  179.   #  rebind 6 2014/5/17 19:42:07;
  180.   #  expire 6 2014/5/17 19:49:37;
  181.   #}
  182.  
  183.   #$wlan: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
  184.   #        inet 10.68.21.237 netmask 255.255.0.0 broadcast 10.68.255.255
  185. }
  186.  
  187. # TODO: jak przeslac PASS nie w linii wywolania (niebezpieczne - inni widza) ?
  188. webauth () {                                    # Web Authentication
  189.   URL=https://$PROX/login.html                  #URL=https://$PROX/login_noscript.html
  190.   OKT='<td align="center">Login Successful</td>'
  191.  
  192.   pwgetpas                                      # ustawienie zmiennych NRAL i PASS (UserName i Password)
  193.   DAT="username=$NRAL&password=$PASS&buttonClicked=4"
  194.   OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL) ; ex=$?
  195.   if [ $ex -eq 28 -o $ex -eq 130 -o -z "$OUT" ]; then   # brak odpowiedzi - druga proba po dodaniu trasy:
  196.     $su route add -host $PROX $GATE
  197.     OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL)
  198.   fi
  199.   if echo "$OUT" | fgrep -q "$OKT" ; then
  200.     warn "Web Authentication OK"
  201.   else
  202.     #warn "brak odpowiedzi 'Login Successful'"
  203.     #The username specified cannot be used at this time. Perhaps the username is already logged into the system?
  204.     info_msg=$(echo "$OUT" | fgrep 'info_msg' | cut -d\" -f10)
  205.     warn "$info_msg" ; exit 1
  206.     LOG=/tmp/$PROG-$USER-err-$$.html
  207.     echo "$OUT" > $LOG                          # XXX: debug log
  208.     arp -i $wlan -an | grep $GATE
  209.     echo $LOG
  210.     echo links $URL
  211.     echo "napisz exit aby wrocic do $PROG"
  212.     $SHELL || exit
  213.     #fatal "brak odpowiedzi 'Login Successful'.\nSprobuj zalogowac sie recznie poleceniem: links $URL"
  214.   fi
  215. }
  216.  
  217. linktest () { # host                            # zwraca OK jest $1 odpowiada
  218.   ping -q -c1 -t1 $1 >/dev/null 2>&1
  219. }
  220.  
  221. trasa () {                                      # przestawienie trasy standardowej (bramki)
  222.   echo GATE=$GATE  OLD=$GATEOLD                 # GATE=10.68.0.1
  223.   [ "$GATE" != "$GATEOLD" ] &&
  224.     $su route change default $GATE &&
  225.       traceroute wp.pl                          # test czy dziala
  226. }
  227.  
  228. resolver () {                                   # Przestawienie DNS-a
  229.   DNSOLD=
  230.   echo DNS=$DNS                                 # DNS=10.68.0.1
  231.   $su sed -i$OLD "s/$DNSOLD/$DNS/" $RESOLV
  232. }
  233.  
  234. pwlogin () { # wlan                             # zlogowanie sie i skonfigurowanie sieci
  235.   [ "$1" ] && wlan=$1
  236.   link2 $SSID                                   # sprawdzenie/inicjacja warstwy lacza danych
  237.   link3 $wlan                                   # sprawdzenie/inicjacja warstwy sieci
  238.   webauth                                       # uwiezytelnienie:
  239.   linktest $GATE || fatal "bramka $GATE nie odpowiada"
  240.   trasa                                         #
  241.   #resolver                                     # XXX: niepotrzebne - dhcp dodaje
  242.   #logger -p                                    # XXX: dziennik ?
  243. }
  244.  
  245. pwlogout () {                                   # TODO: odtworzyc trase standardowo ?
  246.  
  247.   LFILE=$LEASES.$wlan                           # plik zawierajacy prametry uzyskane z dhcp
  248.   setpar $LFILE MYIP=fixed-address GATE=routers PROX=dhcp-server-identifier DNS=domain-name-servers
  249.  
  250.   URL=https://$PROX/logout.html
  251.   OKT="To complete the log off process and to prevent access to unauthorized users"
  252.  
  253.   pwgetpas                                      # ustawienie zmiennych NRAL i PASS
  254.   DAT="buttonClicked=4&username=$NRAL&password=$PASS"
  255.   OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL) ; ex=$?
  256.   if [ $ex -eq 28 -o $ex -eq 130 -o -z "$OUT" ]; then   # brak odpowiedzi - druga proba po dodaniu trasy:
  257.     $su route add -host $PROX $GATE
  258.     OUT=$(curl --connect-timeout 1 -k -s -d "$DAT" --url $URL)
  259.   fi
  260.   if ! echo "$OUT" | fgrep -q "$OKT" ; then
  261.     LOG=/tmp/$PROG-$USER-err-$$.html
  262.     echo "$OUT" > $LOG                          # XXX: debug log
  263.     warn "$LOG"
  264.     exit 1
  265.   fi
  266.  
  267.   warn "Loggout OK"
  268.  
  269.   # Test czy rzeczywiscie rozlaczone:
  270.   linktest $GATE && fatal "bramka $GATE nadal odpowiada"
  271.  
  272.   # Stop dhclient-a
  273.   $su pkill -u _dhcp -lf "dhclient: $wlan"      # service stop nie dziala (j.w)  XXX: kill -15 ?
  274.  
  275.   # Resolver:
  276.   [ "$DNS" ] && $su sed -i$OLD "/$DNS/d" $RESOLV # usuniecie dodanego DNS-a
  277.  
  278.   # Hosts
  279.   [ "$MYIP" ] && $su sed -i$OLD "/$MYIP/d" /etc/hosts # usuniecie dodanego mapowania
  280.  
  281.   # Trasa:
  282.   $su route delete -host $PROX                  #
  283.   case "$GATEOLD" in                            # i poprzedniej bramki: TODO
  284.   '') echo $su route delete default ;;          #   nie bylo jej
  285.    *) echo $su route change default $GATEOLD ;; #
  286.   esac
  287.  
  288.   # Usuniecie adresiu z interfejsu:
  289.   $su ifconfig $wlan $MYIP delete
  290. }
  291.  
  292. pwinfo () {
  293.   echo "sieć pwwifi może czasami nie działać :(
  294.   Uczelniany HelpDesk sieci pwwifi:
  295.   http://5999.pw.edu.pl/
  296.   5999@pw.edu.pl"
  297.   exit
  298. }
  299.  
  300. pwstatus () {                                   # status polaczenia
  301.   LFILE=$LEASES.$wlan                           # plik zawierajacy prametry uzyskane z dhcp
  302.   setpar $LFILE MYIP=fixed-address GATE=routers PROX=dhcp-server-identifier DNS=domain-name-servers
  303.   linktest $GATE && { warn "ok - bramka $GATE odpowiada" ; return ; }
  304.   warn "bramka $GATE nie odpowiada"
  305.   exit 1
  306.   ifconfig $wlan
  307.   #linktest $PROX || warn "proxy $PROX nie odpowiada"
  308.   #exit
  309.   dhc l $wlan
  310.   tt4 -n
  311. }
  312.  
  313. # START
  314.  
  315. PROG=${0##*/}
  316.  
  317. case "$1" in
  318. -x) shift ; Debug ;;
  319. esac
  320.  
  321. case "$1" in
  322.  inf*) cmd=pwinfo ;;
  323. star*) cmd=pwlogin ;;
  324.  sta*) cmd=pwstatus ;;
  325.  sto*) cmd=pwlogout ;;
  326.  pas*) cmd=pwgetpas ; export NRAL PASS ;;       # export gdy source (bezpieczniej niz w pliku)
  327. ''|*) usage ;;
  328. esac
  329.  
  330. [ `id -ng` = prac ] && SSID=pwwifi              # dla grupy prac inny SSID
  331.  
  332. setWLAN $SSID                                   # ustaw wlan na interefejs podlaczony do siec
  333.  
  334. [ `id -un` = root ] || su=sudo
  335.  
  336. eval HOME=~${SUDO_USER:-$USER}
  337.  
  338. PASSFILE=$HOME/securedir/$PROG                  # prywatny plik uzytkownika z haslem
  339.  
  340. $cmd $2                                         # $2 moze zawierac wlan dla start
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top