Add support of VLAN configuration
[grml-network.git] / sbin / netcardconfig
index f602f79..dca975a 100755 (executable)
@@ -151,6 +151,18 @@ remauto(){
   fi
 }
 
+scanwlan(){
+  i=0
+  ifconfig $DV up
+  iwlist $DV scanning | grep "ESSID\|Quality" | sed -e "s/^.*ESSID:\"\|\"$//g" | tac > "$TMP"
+  while read line
+  do
+    WARRAY[i++]=$line
+  done < "$TMP"
+  unset i
+  rm -f "$TMP"
+}
+
 configiface() {
   [ ! -r /etc/network/interfaces ] && touch /etc/network/interfaces
   DEVICE=${NETDEVICES[$DV]}
@@ -242,23 +254,50 @@ configiface() {
       rm -f "$TMP"
     fi
 
-    $DIALOG --inputbox "$MESSAGEW4 $DEVICENAME $MESSAGEW5" 15 50 "$ESSID" 2>"$TMP" || bailout 1
-    read ESSID <"$TMP" ; rm -f "$TMP"
-    [ -z "$ESSID" ] && ESSID="any"
+    # ask to scan or manually set wireless network
+    if $DIALOG --yesno "$MESSAGEWSCAN1" 8 45 ; then
+      RESCAN=1
+
+      while [ $RESCAN -eq 1 ]
+      do
+        scanwlan
+        $DIALOG --extra-button --extra-label "Rescan" --menu "$MESSAGEWSCAN2" 20 70 15 "${WARRAY[@]}" 2>"$TMP"
+        case $? in
+          0)
+            RESCAN=0
+            ;;
+          3)
+            ;;
+          *)
+            bailout 1
+            ;;
+        esac
+      done
+
+      read ESSID <"$TMP" ; rm -f "$TMP"
+      [ -z "$MODE" ] && MODE="Managed"
+
+    else
+
+      $DIALOG --inputbox "$MESSAGEW4 $DEVICENAME $MESSAGEW5" 15 50 "$ESSID" 2>"$TMP" || bailout 1
+      read ESSID <"$TMP" ; rm -f "$TMP"
+      [ -z "$ESSID" ] && ESSID="any"
 
-    $DIALOG --inputbox "$MESSAGEW6 $DEVICENAME $MESSAGEW7" 15 50 "$NWID" 2>"$TMP" || bailout 1
-    read NWID <"$TMP" ; rm -f "$TMP"
+      $DIALOG --inputbox "$MESSAGEW6 $DEVICENAME $MESSAGEW7" 15 50 "$NWID" 2>"$TMP" || bailout 1
+      read NWID <"$TMP" ; rm -f "$TMP"
 
-    $DIALOG --inputbox "$MESSAGEW8 $DEVICENAME $MESSAGEW9" 15 50 "$MODE" 2>"$TMP" || bailout 1
-    read MODE <"$TMP" ; rm -f "$TMP"
-    [ -z "$MODE" ] && MODE="Managed"
+      $DIALOG --inputbox "$MESSAGEW8 $DEVICENAME $MESSAGEW9" 15 50 "$MODE" 2>"$TMP" || bailout 1
+      read MODE <"$TMP" ; rm -f "$TMP"
+      [ -z "$MODE" ] && MODE="Managed"
 
-    $DIALOG --inputbox "$MESSAGEW10 $DEVICENAME $MESSAGEW11" 15 50 "$CHANNEL" 2>"$TMP" || bailout 1
-    read CHANNEL <"$TMP" ; rm -f "$TMP"
+      $DIALOG --inputbox "$MESSAGEW10 $DEVICENAME $MESSAGEW11" 15 50 "$CHANNEL" 2>"$TMP" || bailout 1
+      read CHANNEL <"$TMP" ; rm -f "$TMP"
+
+      if [ -z "$CHANNEL" ]; then
+        $DIALOG --inputbox "$MESSAGEW12 $DEVICENAME $MESSAGEW13" 15 50 "$FREQ" 2>"$TMP" || bailout 1
+        read FREQ <"$TMP" ; rm -f "$TMP"
+      fi
 
-    if [ -z "$CHANNEL" ]; then
-      $DIALOG --inputbox "$MESSAGEW12 $DEVICENAME $MESSAGEW13" 15 50 "$FREQ" 2>"$TMP" || bailout 1
-      read FREQ <"$TMP" ; rm -f "$TMP"
     fi
 
     WPAON=0
@@ -375,6 +414,16 @@ configiface() {
     writeiwline
   fi
 
+  # Configure VLAN on this interface?
+  if $DIALOG --yesno "$MESSAGE16" 8 45; then
+    $DIALOG --inputbox "$MESSAGE17 $DV" 10 45 2>"$TMP" || bailout 1
+    read -r VLAN <"$TMP" ; rm -f "$TMP"
+    if [ -n "$VLAN" ]; then
+      PDV=$DV
+      DV="vlan$VLAN"
+    fi
+  fi
+
   if $DIALOG --yesno "$MESSAGE2" 8 45; then
     if [ -w /etc/network/interfaces ]; then
       rm -f "$TMP"
@@ -382,7 +431,7 @@ configiface() {
         /^\W$/{if(blank==0){lastblank=1}else{lastblank=0}{blank=1}}
         /\w/{blank=0;lastblank=0}
         {if(!(found+lastblank)){print}}
-        END{print "iface '"$DV"' inet dhcp"}' \
+        END{print "iface '"$DV"' inet dhcp";if("'"$PDV"'"!=""){print "\tvlan-raw-device '"$PDV"'"}}' \
         /etc/network/interfaces >"$TMP"
       echo -e "$IWOURLINE" >> $TMP
       #echo -e "\n\n" >> $TMP
@@ -400,7 +449,7 @@ configiface() {
         /gateway/{if(found){gateway=$NF}}
         /dns-nameservers/{if(found){dnsnameservers=$NF}}
         END{print address" "netmask" "broadcast" "gateway" "dnsnameservers}' /etc/network/interfaces >"$TMP"
-      read IP NM BC DG <"$TMP"
+      read IP NM BC DG NS <"$TMP"
       rm -f "$TMP"
     fi
 
@@ -426,7 +475,7 @@ configiface() {
     if [ -w /etc/network/interfaces ]; then
       awk '/iface/{if(/'"$DV"'/){found=1}else{found=0}}
         {if(!found){print}}
-        END{print "\niface '"$DV"' inet static\n\taddress '"$IP"'\n\tnetmask '"$NM"'\n\tnetwork '"${IP%.*}.0"'";if("'"$BC"'"!=""){print "\tbroadcast '"$BC"'"};if("'"$DG"'"!=""){print "\tgateway '"$DG"'"};if("'"$NS"'"!=""){print "\tdns-nameservers '"$NS"'"};if("'"$IWOURLINE"'"!=""){print "'"$IWOURLINE"'"};print "\n"}' \
+        END{print "\niface '"$DV"' inet static\n\taddress '"$IP"'\n\tnetmask '"$NM"'\n\tnetwork '"${IP%.*}.0"'";if("'"$BC"'"!=""){print "\tbroadcast '"$BC"'"};if("'"$DG"'"!=""){print "\tgateway '"$DG"'"};if("'"$NS"'"!=""){print "\tdns-nameservers '"$NS"'"};if("'"$PDV"'"!=""){print "\tvlan-raw-device '"$PDV"'"};if("'"$IWOURLINE"'"!=""){print "'"$IWOURLINE"'"};print "\n"}' \
         /etc/network/interfaces >"$TMP"
 
       cat "$TMP" >/etc/network/interfaces
@@ -462,6 +511,8 @@ MESSAGE12="Adding Nameserver to /etc/resolv.conf:"
 MESSAGE13="Setup wireless options?"
 MESSAGE14="Failed to bring up the interface, would you like to reconfigure it?"
 MESSAGE15="Interface enabled, do you want it auto enabled at boot?"
+MESSAGE16="Configure VLAN on this interface?"
+MESSAGE17="Please enter VLAN id for"
 MESSAGEW0="No wireless network card found."
 MESSAGEW1="Configuration of wireless parameters for"
 MESSAGEW3="Please configure IP parameters of the interface first"
@@ -487,7 +538,8 @@ MESSAGEW22="Enable WPA support?"
 MESSAGEW23="Enter the WPA passphrase (passphrase must be 8..63 characters) for"
 MESSAGEW25="Would you like to store your wep key in it's own private file ("
 MESSAGEW26=")?   If you say no, your wep key will be stored in /etc/network/interfaces and will be readable by any account on your system.  You may want to 'chmod 600 /etc/network/interfaces' if you answer no to this question"
-
+MESSAGEWSCAN1="Scan for available wireless networks?"
+MESSAGEWSCAN2="Please choose a wireless network from below:"
 
 NETDEVICESCOUNT=0
 if [ -r /proc/net/dev ] ; then
@@ -530,7 +582,7 @@ while read dev mac; do
   fi
 #echo "Made to ${NETDEVICES[$NETDEVICESCOUNT]}"
   ((NETDEVICESCOUNT++))
-done < <(ifconfig -a|grep Ethernet|grep -v ^vmnet|awk '! /^\s/{print $1" "$5}')
+done < <(ip link show | awk ' !/^\s/{sub(/:/,"",$2);IFACE=$2} /link.ether/{if (IFACE !~/^vmnet/) print IFACE" "$2}')
 for dev in $LAN; do
   if [ "$(ethtool -i $dev 2>/dev/null|awk '/^bus-info:/{print $2}')" == "ieee1394" ]; then
     isauto="0"