Advertisement
s243a

/usr/local/rc.network (tahrpup 6.02)

Oct 5th, 2015
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 13.56 KB | None | 0 0
  1. # -- see also: http://www.pearltrees.com/s243a/simple-network-setup-usr-local/id14851906
  2. #!/bin/sh
  3. #(c) Copyright Barry Kauler 2010, bkhome.org
  4. #2010 Lesser GPL licence v2 (file:///usr/share/doc/legal/lgpl-2.1.txt)
  5. #/etc/simple_network_setup/connections is created by SNS, /usr/local/simple_network_setup/sns
  6. #100308 first version of script, open and wep networks only.
  7. #100309 supports wpa. "version 1" released.
  8. #100314 support ndiswrapper.
  9. #100320 fix if essid has spaces. Add DHCPCDFIX parameter.
  10. #100325 added 'stop' commandline option. added DHCPCDFIX for wired.
  11. #100513 more delay, repeat scan attempt.
  12. #100703 fix disconnect/reconnect.
  13. #100804 while testing for module loaded, also test for valid macaddress.
  14. #101122 wait for module to load.
  15. #101216 more logging, to /tmp/simple_network_setup.
  16. #110203 improve scanning.
  17. #120204 BK: internationalized.
  18. #121117 rerwin: Add dropwait option to dhcpcd startup.
  19. #130411 skip dhcpcd if in frisbee mode
  20.  
  21. export TEXTDOMAIN=sns___rc.network
  22. export OUTPUT_CHARSET=UTF-8
  23. LANGORIG=$LANG
  24.  
  25. #each line of /etc/simple_network_setup/connections has everything known about a connection:
  26. #(please ignore spaces, put here for readability only)
  27. #Wireless:
  28. #        1         2          3         4       5                                   6                 7           8                 9            10           11                 12         13                         14       15         16          17
  29. #format: INTERFACE|IF_INTTYPE|IF_DRIVER|IF_BUS |IF_INFO                            |MACADDRESS       |CELL_NUMBER|CELL_ADDRESS     |CELL_CHANNEL|CELL_QUALITY|CELL_ENCRYPTIONKEY|CELL_ESSID|SEC_KEY                   |SEC_MGMT|ENCODEPROTO|WPA_DRIVER|DHCPCDFIX|
  30. #ex:     wlan1    |Wireless  |rt73usb  |usb    |Ralink RT73 USB Wireless LAN driver|00:26:19:F5:AC:3D|01         |00:17:3F:68:33:7E|11          |70/70       |off               |belkin54g |000102030405060708090a0b0c|WEP     |           |wext      |         |
  31. #Wired:
  32. #        1         2          3         4       5                                       6                 7
  33. #format: INTERFACE|IF_INTTYPE|IF_DRIVER|IF_BUS |IF_INFO                                |MACADDRESS       |DHCPCDFIX|
  34. #ex:     eth0     |Wired     |sky2     |pci    |Marvell Yukon 2 Gigabit Ethernet driver|00:17:36:84:E5:1A|         |
  35.  
  36. #IMPORTANT: the INTERFACE field may be different at boot time, due to different plugged in network devices.
  37.  
  38. export LANG='C'
  39. [ ! -s /etc/simple_network_setup/connections ] && exit
  40. rm -f /tmp/sns_rc.network_exit 2>/dev/null #100703
  41.  
  42. if [ $1 ];then #100325
  43.  case $1 in
  44.   stop)
  45.    if [ -f /tmp/sns_interface_success ];then
  46.     INTERFACE="`cat /tmp/sns_interface_success`"
  47.     rm -f /tmp/sns_interface_success
  48.     [ "`pidof wpa_supplicant`" != "" ] && wpa_cli terminate #kill wpa_supplicant.
  49.     ifconfig $INTERFACE down
  50.     [ "`iwconfig $INTERFACE | grep "$INTERFACE" | grep "ESSID"`" != "" ] && iwconfig $INTERFACE essid off
  51.     dhcpcd --release $INTERFACE 2>/dev/null
  52.     ip route flush dev $INTERFACE #100703
  53.     #in situation bring down interface from desktop icon...
  54.     [ "$DISPLAY" ] && LANG=$LANGORIG yaf-splash -placement bottom -bg pink -timeout 5 -text "$(gettext 'Network interface') ${INTERFACE} $(gettext 'has been disabled')" &
  55.    fi
  56.    exit
  57.   ;;
  58.  esac
  59. fi
  60. rm -f /tmp/sns_interface_success 2>/dev/null
  61.  
  62. [ "`grep '|ndiswrapper|' /etc/simple_network_setup/connections`" != "" ] && modprobe ndiswrapper #100314
  63.  
  64. #wait for interfaces to become available...
  65. #note, do not test for wlan0 or wlan1 (etc) to become available, as these can change depending on plugged-in devices.
  66. WAITCNT=0 ; TESTLIST='|'
  67. sleep 1
  68. echo -n "" > /tmp/sns_connections_available
  69. for ONEMODULE in `cut -f 3 -d '|' /etc/simple_network_setup/connections | sort -u | tr '\n' ' '` #100804
  70. do
  71.  TESTLIST="${TESTLIST}${ONEMODULE}|" #101122
  72.  oPATTERN='^'"$ONEMODULE"'$'
  73.  mPATTERN='|'"$ONEMODULE"'|'
  74.  while [ 1 ];do #101122 wait for module to load.
  75.   [ "`lsmod  | grep -v '^Module' | cut -f 1 -d ' ' | grep "$oPATTERN"`" != "" ] && break
  76.   [ "`echo "$TESTLIST" | grep "$mPATTERN"`" != "" ] && continue 2 #avoid re-waiting on same module
  77.   sleep 1
  78.   WAITCNT=$(($WAITCNT + 1))
  79.   [ $WAITCNT -gt 8 ] && continue 2 #no module loaded.
  80.  done
  81.  MACADDRESSES="`grep "$mPATTERN" /etc/simple_network_setup/connections | cut -f 6 -d '|' | sort -u | tr '\n' ' '`" #100804
  82.  for MACADDRESS in $MACADDRESSES #100804
  83.  do
  84.   while [ 1 ];do
  85.    ALL_MACADDRESS="`ifconfig -a | grep 'Link encap:Ethernet' | grep -o 'HWaddr .*' | cut -f 2 -d ' '`"
  86.    if [ "`echo "$ALL_MACADDRESS" | grep "$MACADDRESS"`" != "" ];then
  87.     #interface is ready. copy all connections with that module and macaddress...
  88.     macPATTERN='|'"$MACADDRESS"'|'
  89.     MACMATCH="`grep "$mPATTERN" /etc/simple_network_setup/connections | grep "$macPATTERN"`"
  90.     [ "$MACMATCH" ] && echo "$MACMATCH" >> /tmp/sns_connections_available
  91.     break
  92.    fi
  93.    WAITCNT=`expr $WAITCNT + 1`
  94.    [ $WAITCNT -gt 12 ] && break 2 #timeout.
  95.    sleep 1
  96.   done
  97.  done
  98. done
  99.  
  100. [ ! -s /tmp/sns_connections_available ] && exit
  101. INTERFACES="`ifconfig -a | grep -F 'Link encap:Ethernet' | cut -f1 -d' ' | tr '\n' ' '`"
  102.  
  103. ##########WIRELESS##########
  104. #121117 form dropwait argument for dhcpcd...
  105. DROPWAIT="$(dhcpcd_dropwait_option)"
  106. echo -n "" > /tmp/simple_network_setup/rc_network_wireless_connection_log
  107. grep '|Wireless|' /tmp/sns_connections_available > /tmp/sns_connections_wireless
  108. for INTERFACE in $INTERFACES #exs: wlan0 eth0
  109. do
  110.  [ ! -d /sys/class/net/${INTERFACE}/wireless ] && continue #only want wireless.
  111.  echo -e "\n ${INTERFACE}" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  112.  ifconfig $INTERFACE up
  113.  [ $? -ne 0 ] && continue
  114.  echo " SUCCESS: ifconfig ${INTERFACE} up" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  115.  sleep 2 #100513
  116.  SCANRESULT="`iwlist $INTERFACE scan`" ###SCANNING### 110203
  117.  echo " EXECUTING SCAN: iwlist ${INTERFACE} scan | grep -v 'Scan completed'" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  118.  echo " SCANRESULT=${SCANRESULT}" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  119.  #note, possible to get: 'wlan0     No scan results' so delay then try again...
  120.  if [ "`echo "$SCANRESULT" | grep 'Scan completed'`" = "" ];then #100513 110203
  121.   sleep 2
  122.   SCANRESULT="`iwlist $INTERFACE scan`" ###SCANNING###
  123.   echo " EXECUTING SCAN AGAIN: iwlist ${INTERFACE} scan | grep -v 'Scan completed'" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  124.   echo " SCANRESULT=${SCANRESULT}" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  125.  fi
  126.  ifconfig $INTERFACE down
  127.  echo " EXECUTING: ifconfig $INTERFACE down" >> /tmp/simple_network_setup/rc_network_wireless_connection_log #110203
  128.  if [ "`echo "$SCANRESULT" | grep 'Scan completed'`" = "" ];then #110203
  129.   echo 'SCAN FAILURE, EXPECTED STRING "Scan completed"' >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  130.   continue #110203
  131.  fi
  132.  #convert each found network into a single line... 110203
  133.  SRLINES="`echo "$SCANRESULT" | grep -v 'Scan completed' | tr '|' ' ' | tr '\n' '|' | sed -e 's%       Cell %\n%g' | tr -s ' '`"
  134.  echo "$SRLINES" |
  135.  while read ONELINE
  136.  do
  137.   [ "$ONELINE" = "" ] && continue
  138.   [ "$ONELINE" = " " ] && continue
  139.   CELL_ESSID="`echo -n "$ONELINE" | grep -o ' ESSID:.*' | cut -f 2 -d '"'`" #'geany
  140.   essidPATTERN='|'"$CELL_ESSID"'|'
  141.   CONNECTDATA="`grep "$essidPATTERN" /tmp/sns_connections_wireless`"
  142.   if [ "$CONNECTDATA" != "" ];then
  143.    MACADDRESS="`ifconfig -a $INTERFACE | grep -o 'HWaddr .*' | cut -f 2 -d ' '`"
  144.    maPATTERN='|'"$MACADDRESS"'|'
  145.    CONNECTDATA="`echo "$CONNECTDATA" | grep "$maPATTERN"`"
  146.    echo "   MACADDRESS=$MACADDRESS CONNECTDATA=$CONNECTDATA" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  147.    if [ "$CONNECTDATA" != "" ];then
  148.     #note, INTERFACE not necessarily the same as in first field of CONNECTDATA.
  149.     CELL_CHANNEL="`echo -n "$CONNECTDATA" | cut -f9 -d'|'`"
  150.     CELL_ENCRYPTIONKEY="`echo -n "$CONNECTDATA" | cut -f11 -d'|'`"
  151.     SEC_KEY="`echo -n "$CONNECTDATA" | cut -f13 -d'|'`" #ex: thebigbaddog
  152.     SEC_MGMT="`echo -n "$CONNECTDATA" | cut -f14 -d'|'`" #exs: WEP, WPA-PSK
  153.     ENCODEPROTO="`echo -n "$CONNECTDATA" | cut -f15 -d'|'`" #exs: WEP: restricted, open. WPA*: AES, TKIP.
  154.     WPA_DRIVER="`echo -n "$CONNECTDATA" | cut -f16 -d'|'`" #ex: wext
  155.     DHCPCDFIX="`echo -n "$CONNECTDATA" | cut -f17 -d'|'`" #100320 ex: -I ''
  156.     iwconfig $INTERFACE mode managed
  157.     echo "    RESULT=$? FOR: iwconfig $INTERFACE mode managed" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  158.     iwconfig $INTERFACE channel $CELL_CHANNEL
  159.     echo "    RESULT=$? FOR: iwconfig $INTERFACE channel $CELL_CHANNEL" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  160.     iwconfig $INTERFACE essid "$CELL_ESSID"
  161.     echo "    RESULT=$? FOR: iwconfig $INTERFACE essid \"$CELL_ESSID\"" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  162.     RUNWPASUPP='no'
  163.     if [ "$CELL_ENCRYPTIONKEY" == "on" ];then
  164.      case $SEC_MGMT in
  165.       WEP)  iwconfig $INTERFACE key $ENCODEPROTO $SEC_KEY ;; #ex: iwconfig wlan0 key open 00112233445566778899aabbcc
  166.       WPA*) RUNWPASUPP='yes' ;;
  167.      esac
  168.     fi
  169.     MODTIME1="`stat --format=%Y /etc/resolv.conf`"
  170.     ifconfig $INTERFACE up #hmmm, it seems need to bring up after all the iwconfig operations!
  171.     if [ $? -eq 0 ];then
  172.      echo "     RESULT=$? FOR: ifconfig $INTERFACE up" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  173.      wCNT=0
  174.      if [ "$RUNWPASUPP" = "yes" ];then
  175.       if [ -f "/etc/simple_network_setup/wpa_supplicant.conf-${CELL_ESSID}-${MACADDRESS}" ];then
  176.        wpa_supplicant -B -D${WPA_DRIVER} -i${INTERFACE} -c"/etc/simple_network_setup/wpa_supplicant.conf-${CELL_ESSID}-${MACADDRESS}"
  177.        echo "       RESULT=$? FOR: wpa_supplicant -B -D${WPA_DRIVER} -i${INTERFACE} -c\"/etc/simple_network_setup/wpa_supplicant.conf-${CELL_ESSID}-${MACADDRESS}\"" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  178.        while [ $wCNT -le 20 ];do #100314 wait until wpa_supplicant has "connected".
  179.         sleep 1
  180.         echo "        TEST: wpa_cli -i $INTERFACE status" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  181.         wpa_cli -i $INTERFACE status >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  182.         echo "        RESULT=$? wCNT=$wCNT" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  183.         [ "`wpa_cli -i $INTERFACE status | grep '^bssid=[0-9a-f]'`" != "" ] && break
  184.         #[ "`wpa_cli -i $INTERFACE status | grep 'COMPLETED'`" != "" ] && break
  185.         wCNT=$(($wCNT + 1))
  186.        done
  187.       fi
  188.      fi
  189.      grep -q -s '^frisbee_mode=1' /etc/frisbee/frisbee.conf && continue #130411
  190.      [ $wCNT -le 20 ] && dhcpcd $DHCPCDFIX $DROPWAIT $INTERFACE #100320 121115
  191.     fi
  192.     MODTIME2="`stat --format=%Y /etc/resolv.conf`"
  193.     [ "`grep -v '^#' /etc/resolv.conf`" == "" ] && MODTIME2=$MODTIME1 #fail.
  194.     if [ "$MODTIME2" != "$MODTIME1" ];then
  195.      echo "     SUCCESS" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  196.      #in situation bring up interface from desktop icon...
  197.      [ "$DISPLAY" ] &&  yaf-splash -placement bottom -bg green -timeout 5 -text "Network interface ${INTERFACE} has been activated" &
  198.      echo "$INTERFACE" > /tmp/sns_interface_success #100325
  199.      #break
  200.      touch /tmp/sns_rc.network_exit #'exit' only terminates this code block (which is running as a separate process).
  201.      exit #one internet connection is enough!
  202.     else
  203.      echo "     FAIL" >> /tmp/simple_network_setup/rc_network_wireless_connection_log
  204.      [ "`pidof wpa_supplicant`" != "" ] && wpa_cli terminate #kill wpa_supplicant.
  205.      ifconfig $INTERFACE down
  206.      [ "`iwconfig $INTERFACE | grep "$INTERFACE" | grep "ESSID"`" != "" ] && iwconfig $INTERFACE essid off
  207.      dhcpcd --release $INTERFACE 2>/dev/null
  208.      ip route flush dev $INTERFACE #100703
  209.     fi
  210.    fi
  211.   fi
  212.  done
  213.  [ -f /tmp/sns_rc.network_exit ] && break #100320 bug fix, if more than one wireless interface.
  214. done
  215.  
  216. [ -f /tmp/sns_rc.network_exit ] && exit
  217.  
  218. ##########WIRED##########
  219. grep '|Wired|' /tmp/sns_connections_available > /tmp/sns_connections_wired
  220. for INTERFACE in $INTERFACES #exs: wlan0 eth0
  221. do
  222.  [ -d /sys/class/net/${INTERFACE}/wireless ] && continue #only want wired.
  223.  
  224.  ifconfig $INTERFACE up > /tmp/sns_wired_log 2>&1
  225.  [ $? -ne 0 ] && continue
  226.  
  227.  if ! ifplugstatus-0.18 "$INTERFACE" | grep -F -q 'link beat detected' ;then
  228.   sleep 1
  229.   if ! ifplugstatus "$INTERFACE" | grep -F -q 'link beat detected' ;then
  230.    sleep 1
  231.    if ! ifplugstatus-0.18 "$INTERFACE" | grep -F -q 'link beat detected' ;then
  232.     sleep 1
  233.     if ! ifplugstatus "$INTERFACE" | grep -F -q 'link beat detected' ;then
  234.      sleep 1
  235.      if ! ethtool "$INTERFACE" | grep -Fq 'Link detected: yes' ; then
  236.       ifconfig $INTERFACE down
  237.       continue #no network.
  238.      fi
  239.     fi
  240.    fi
  241.   fi
  242.  fi
  243.  
  244.  grep -q -s '^frisbee_mode=1' /etc/frisbee/frisbee.conf && continue #130411
  245.  MACADDRESS="`ifconfig -a $INTERFACE | grep -o 'HWaddr .*' | cut -f 2 -d ' '`"
  246.  maPATTERN='|'"$MACADDRESS"'|'
  247.  DHCPCDFIX="`grep "$maPATTERN" /tmp/sns_connections_wired | head -n 1 | cut -f 7 -d '|'`" #100325 ex: -I ''
  248.  
  249.  MODTIME1="`stat --format=%Y /etc/resolv.conf`"
  250.  dhcpcd $DHCPCDFIX $INTERFACE >> /tmp/sns_wired_log 2>&1
  251.  MODTIME2="`stat --format=%Y /etc/resolv.conf`"
  252.  [ "`grep -v '^#' /etc/resolv.conf`" == "" ] && MODTIME2=$MODTIME1 #fail.
  253.  
  254.  if [ "$MODTIME2" != "$MODTIME1" ];then
  255.   echo "$INTERFACE" > /tmp/sns_interface_success #100325
  256.   exit #success.
  257.  else
  258.   ifconfig $INTERFACE down
  259.   dhcpcd --release $INTERFACE 2>/dev/null
  260.   ip route flush dev $INTERFACE #100703
  261.  fi
  262.  
  263. done
  264.  
  265.  
  266. ###END###
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement