rc.network 13 KB

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