BASH   60

psuautosigned.txt

Guest on 5th September 2021 05:46:57 PM

  1. #!/bin/sh
  2.  
  3. # --------------------------------------------------------------------- #
  4. # psuautosigned         Signed-in with PSU Login to access internet.    #
  5. #                                                                       #
  6. # version 0.1           - cj (2010-06-11) modified from engautosign-3   #
  7. # version 0.1a          - cj (2010-06-14) read login/password from user #
  8. #                         if any of them doesn't provide from $CONF     #
  9. # version 0.1b          - cj (2010-06-15) uses of function bug fixed.   #
  10. #                         thanks to aj. Panyarak for this.              #
  11. # version 0.1c          - cj (2010-06-18) fix bug when receive login    #
  12. #                         and password from command line, thanks to     #
  13. #                         k. nagarindkx for finding this BIG bug.       #
  14. # version 0.1d          - cj (2010-06-18) make it work with dash.       #
  15. # version 0.2           - cj (2010-06-23) login page moved.             #
  16. # version 0.2a          - cj (2010-06-24) logout supported.             #
  17. # version 0.2b          - cj (2010-07-05) login page moved, again.      #
  18. # version 0.2c          - cj (2011-05-12) login page changed, maybe     #
  19. #                         caused by OS upgrade.                         #
  20. # version 0.2d          - cj (2011-05-18) some bug still exists, need   #
  21. #                         to use address outside .psu.ac.th for the     #
  22. #                         first connection, or else we are stuck.       #
  23. #                         Also TIMEOUT added.                           #
  24. # version 0.2e          - cj (2011-05-20) port moved, address changed,  #
  25. #                         once again?                                   #
  26. # version 0.2f          - cj (2011-05-23) logout page changed.          #
  27. # version 0.2g          - cj (2011-05-24) try to cope with internal     #
  28. #                         server error on first logout.                 #
  29. # version 0.2h          - cj (2011-12-08) Captive Portal change from    #
  30. #                         cp.psu.ac.th to cp-ufw.psu.ac.th              #
  31. # version 0.3           - cj (2011-12-13) Support PANOS 4.1.1           #
  32. # version 0.3a          - cj (2011-12-13) minor bug fixed.              #
  33. # version 0.3b          - cj (2011-12-30) Improve error handling.       #
  34. # version 0.4           - cj (2013-03-06) clean up code and handling    #
  35. #                         error changed a bit.                          #
  36. # version 0.4a          - cj (2013-03-11) more clean up.                #
  37. # version 0.4b          - cj (2013-05-27) do_authen bug?                #
  38. # version 0.5           - cj (2015-01-23) there is one bug(?) in func   #
  39. #                         do_checklogin to get CPPAGE value.            #
  40. # version 0.6           - ps (2019-07-01) login url and                 #
  41. #                       keepalive url changed                           #
  42. # --------------------------------------------------------------------- #
  43.  
  44. CONF="$HOME/.psuautosigned"
  45. COOKIES="$HOME/.psuautosigned-cookies.txt"
  46.  
  47. TIMEOUT="--connect-timeout 10 --max-time 10"
  48. LOGIN="https://cp-xml-40g.psu.ac.th:6082/php/uid.php"
  49. KEEPALIVE="https://logout.psu.ac.th"
  50. LOGOUT="https://logout.psu.ac.th/cgi-bin/logout-cp.cgi"
  51.  
  52. # How long before we try refresh login page
  53. SLEEPTIME=600
  54. RETRYTIME=60
  55. RES="/tmp/.$$.html"
  56.  
  57. CURL="/usr/bin/curl"
  58. [ ! -x $CURL ] && echo "Can't execute ${CURL}." && exit
  59.  
  60. RET=0
  61.  
  62. # Read USER and PASS from configuration file
  63. readconf() {
  64.         USER=`grep ^user= $CONF`
  65.         PASS=`grep ^passwd= $CONF`
  66.         # support for old format 'user=xxx, pwd=yyy'
  67.         [ -z "$PASS" ] && PASS=`grep ^pwd= $CONF | sed -e 's/^pwd/passwd/'`
  68.         if [ -z "$USER" -o -z "$PASS" ]; then
  69.                 [ -z "$USER" ] && echo "Please set username 'user=' in $CONF"
  70.                 [ -z "$PASS" ] && echo "Please set password 'passwd=' in $CONF"
  71.                 exit
  72.         fi
  73. }
  74.  
  75. # Get USER and PASS from User
  76. getuserpasswd() {
  77.         # If we are running from terminal?
  78.         [ "`tty`" = "not a tty" ]               && \
  79.                 echo "Not running in terminal." && \
  80.                 exit
  81.  
  82.         # Yes, we are in the terminal
  83.         stty echo;      echo -n "User: ";       read USER
  84.         stty -echo;     echo -n "Passwd: ";     read PASS; echo ""
  85.         stty echo
  86.         if [ -z "$USER" -o -z "$PASS" ]; then
  87.                 [ -z "$USER" ] && echo "User must be defined."
  88.                 [ -z "$PASS" ] && echo "Password must be defined."
  89.                 exit
  90.         fi
  91.         USER="username=$USER"
  92.         PASS="password=$PASS"
  93. }
  94.  
  95. # Check whether we already login
  96. do_checklogin() {
  97.         # get header of login page
  98.         RET=999
  99.         COUNT=0
  100.         while [ $RET != 0 ]; do
  101.                 $CURL $TIMEOUT -i -s -S -k $KEEPALIVE -c $COOKIES > $RES
  102.                 RET=$?
  103.                 if [ $RET != 0 ]; then
  104.                         COUNT=`expr $COUNT + 1`
  105.                         D=`date "+%Y-%m-%d %H:%M:%S"`
  106.                         echo "$D ERROR: do_checklogin() [:$COUNT]failed. ret=$RET"
  107.                         echo "RES:"; cat $RES
  108.                         sleep $RETRYTIME
  109.                 fi
  110.         done
  111.  
  112.         # if get relocation header, then mean we need to login
  113.         notLogin=`cat $RES | grep 'window.location'`
  114.  
  115.         # Get the captive portal page
  116.         if [ "$notLogin" ]; then
  117.                 CPPAGE=https://cp-xml-40g.psu.ac.th:6082/php/uid.php
  118.         fi
  119. }
  120.  
  121. # get keepalive page
  122. do_getkeepalive() {
  123.         RET=999
  124.         COUNT=0
  125.         while [ $RET != 0 ]; do
  126.                 $CURL $TIMEOUT -s -S -k -L $KEEPALIVE -c $COOKIES > $RES
  127.                 RET=$?
  128.                 if [ "$RET" != 0 ]; then
  129.                         COUNT=`expr $COUNT + 1`
  130.                         D=`date "+%Y-%m-%d %H:%M:%S"`
  131.                         echo "$D ERROR: do_getkeepalive() [:$COUNT] failed. RET=$RET"
  132.                         sleep $RETRYTIME
  133.                 fi
  134.         done
  135. }
  136.  
  137. # Signed-in
  138. do_authen() {
  139.         do_checklogin
  140.  
  141.         # Did we authenticated?
  142.         if [  "$notLogin" ]; then
  143.                 # No, try authenticate first
  144.                 echo "Not login, try authenticated at `date`"
  145.                 COUNT=0
  146.                 while true; do
  147.                         RET=999
  148.                         $CURL   $TIMEOUT -s -k -L "$CPPAGE"     \
  149.                                 -c $COOKIES -b $COOKIES         \
  150.                                 -d "$U"                         \
  151.                                 --data-urlencode "$P"           \
  152.                                 -d "$O"                         > $RES
  153.                         RET=$?
  154.                         CRET=$RET
  155.  
  156.                         # Return ok, then we do authened!
  157.                         [ "$RET" = 0 ] && break
  158.  
  159.                         # WTF! No reponse until timeout, assume ok
  160.                         [ -z "$RES" ] && break
  161.  
  162.                         # Try getkeepalive
  163.                         $CURL $TIMEOUT -s -S -k -L $KEEPALIVE -c $COOKIES > $RES
  164.                         RET=$?
  165.                         [ "$RET" = 0 ] && break
  166.  
  167.                         # Else ...
  168.                         COUNT=`expr $COUNT + 1`
  169.                         D=`date "+%Y-%m-%d %H:%M:%S"`
  170.                         echo "$D ERROR: do_authen() [:$COUNT] failed. CRET=$CRET RET=$RET"
  171.                         sleep $RETRYTIME
  172.                 done
  173.         fi
  174.  
  175.         # Since December 2011, PSU ufw captive portal failed
  176.         # to response after authenticate, so we just ignore
  177.         # the output and proceed to keepalive page ourself.
  178.  
  179.         do_getkeepalive
  180.  
  181.         cat $RES                                        |\
  182. egrep 'This computer has ipv4' | sed -e 's/<br>//g' -e 's/This computer has ipv4/: /' -e 's/\<span id//' -e 's/ipv6-show//' -e 's/ipv6//' -e 's/\/span>//' -e 's/<//' -e 's/''>//' -e 's/and login//' -e 's/=//g' -e 's/<//'| tr "'" ' '
  183.         echo ""
  184.  
  185.         rm -f $RES
  186. }
  187.  
  188. # Signed-out
  189. do_logout() {
  190.         do_checklogin
  191.         if [  "$notLogin" ]; then
  192.                 echo "You are not logged in..."
  193.                 rm -f $RES
  194.                 exit
  195.         fi
  196.  
  197.         la=0
  198.  
  199.         # When we get 'Internal Server Reply' then wait for 3 seconds
  200.         # and then try again...
  201.         while test $la -lt 3; do
  202.                 la=`expr $la + 1`
  203.                 if [ "$la" -gt 3 ]; then        # Too many error!
  204.                         echo "Can't get valid response from firewall"
  205.                         cat $RES
  206.                         rm -f $RES
  207.                         exit
  208.                 fi
  209.  
  210.                 $CURL $TIMEOUT -s -S -k -L $LOGOUT              \
  211.                         -d "submit=LOGOUT"                      \
  212.                         -c $COOKIES -b $COOKIES -d ""           > $RES
  213.                 if [ "$?" != 0 ]; then
  214.                         D=`date "+%Y-%m-%d %H:%M:%S"`
  215.                         echo "$D ERROR: do_logout() failed."
  216.                         sleep 10
  217.                         continue
  218.                 fi
  219.                 if [ "`grep 'Internal Server Error' $RES`" ]; then
  220.                         sleep 3
  221.                 else
  222.                         break
  223.                 fi
  224.         done
  225.  
  226.         if [ -z "`grep 'has been logged out' $RES`" ]; then
  227.                 echo "Hmmmm, not recognize response from firewall...."
  228.                 cat $RES
  229.                 rm -f $RES
  230.                 exit
  231.         fi
  232.  
  233.         local login=`   cat $RES                                |\
  234.                         grep 'Login='                           |\
  235.                         sed     -e 's/^.*Login=//'              \
  236.                                 -e 's/\r//'             `
  237.  
  238.         local ip=`      cat $RES                                |\
  239.                         grep 'IP='                              |\
  240.                         sed     -e 's/^.*;IP=//'                \
  241.                                 -e 's/ has been logged out.*$//'`
  242.  
  243.         local date="`   cat $RES                                |\
  244.                         grep 'IP='                              |\
  245.                         cut -f5 -d\>                            |\
  246.                         cut -f1 -d\<                            `"
  247.  
  248.         echo "User $login from $ip has logout at $date"
  249.         rm -f $COOKIES
  250. }
  251.  
  252. # Get authentication information
  253. getautheninfo() {
  254.         # if config file $CONF exist, read user/password from config file.
  255.         if [ -f "$CONF" ]; then
  256.                 readconf
  257.         else    # Then ask user to provide them.
  258.                 getuserpasswd
  259.         fi
  260.  
  261. ## The usual AUTHSTRING="${USER}&${PASS}&ok=Login"
  262. ## Separate AUTHSTRING to 'user=xxx' 'pwd=xxx' and 'ok=Login'
  263.  
  264.         O="login=Login"
  265.         U="$USER"
  266.         P="$PASS"
  267. }
  268.  
  269. # Main body as a function #
  270.  
  271. do_main() {
  272.  
  273.         # Default usage it loop until the terminal is closed or the
  274.         # ^C is given.
  275.  
  276.         case "$action" in
  277.         login)
  278.                 getautheninfo
  279.                 echo "-------------------------------------------"
  280.                 echo "Using default sleep value = $SLEEPTIME secs"
  281.                 echo "Please ^C to break from loop"
  282.                 echo "-------------------------------------------"
  283.                 while true; do
  284.                         do_authen
  285.                         sleep $SLEEPTIME
  286.                 done
  287.         ;;
  288.         noloop)
  289.                 getautheninfo
  290.                 do_authen
  291.                 echo "Done."
  292.         ;;
  293.         logout)
  294.                 do_logout
  295.         #       echo "Logging out at $(date), goodbye."
  296.         ;;
  297.         *)
  298.                 echo "Usage: $0 [login|logout|noloop]"
  299.                 exit
  300.         ;;
  301.         esac
  302. }
  303.  
  304. ### Start Here ###
  305. action="$1"
  306. # Set default action if argument is not provided.
  307. [ "$action" = "" ] && action="login"
  308.  
  309. # Main function here
  310. do_main
  311.  
  312. # --------------------------------------------------------------------- #
  313. # end of file.                                                          #
  314. # --------------------------------------------------------------------- #

Raw Paste


Login or Register to edit or fork this paste. It's free.