Nimbin[12]?Administration / wifi.old

wifi.old Administration

Connect to wifi using wpa_supplicant
This script is not working properly
While hoping i could make a more secure connection
by verifying the router by its BSSID
i had to figure out that that BSSID is not a fixed value...

wget https://git.christianimmanuel.de/scripts/raw/Administration/wifi.old && chmod 740 wifi.old
wifi.old 7.5 KB · 285 lines raw
#!/bin/bash

##########################################
### Connect to wifi using wpa_supplicant
### This script is not working properly
### While hoping i could make a more secure connection
### by verifying the router by its BSSID
### i had to figure out that that BSSID is not a fixed value...


INTERFACE="wlan0"
DIR_CONFIG=/etc/sysconfig/wpa_supplicant
FILE_CONFIG_DEFAULT=/etc/sysconfig/wpa_supplicant-wifi0.conf
FILE_CONFIG_DIFF=$FILE_CONFIG_DEFAULT.diff


logError()  { echo -e "\e[0;31m$1\e[0m\n"; }
logValid()  { echo -e "\e[0;32m$1\e[0m\n"; }
logInfo()   { echo -e "\e[0;34m$1\e[0m\n"; }


wpaUp() { ifup $IFNAME; }

wpaDown() { ifdown $IFNAME; }

wpaList() {
   sed -n 's/^.*ssid="\([^"]*\)"/\1/p' $DIR_CONFIG/*
}


readLINE() {
   SSID="$(     awk -F'\t' '{print $5}' <<< $LINE)"
   SIGNAL="$(   awk -F'\t' '{print $3}' <<< $LINE)"
   FREQUENCY="$(awk -F'\t' '{print $2}' <<< $LINE)"
   FLAGS="$(    awk -F'\t' '{print $4}' <<< $LINE)"
   BSSID="$(    awk -F'\t' '{print $1}' <<< $LINE)"
   NUMBER="$c)"
}

readFILE_CONFIG() {
   SSID=$(sed -n 's/"$//g;s/^.*ssid="//p' $FILE_CONFIG)
   BSSID=$(sed -n 's/^.*bssid=//p' $FILE_CONFIG)
   PSK=$(sed -n 's/"$//g;s/^.*psk="//p' $FILE_CONFIG)
}


getConfigName() {
   [[ -n "$PSK" ]]                        && 
   sed "s/://g;s/^/BSSID_/g;s/$/.conf/g" <<< "$BSSID" &&
   return 1
   echo "$SSID"
}

getFileBySSID() {
   for i in $(find $DIR_CONFIG -name "BSSID_*.conf"); do 
      grep -q "ssid=\"$SSID\"$" $i  && 
      FILE_CONFIG="$DIR_CONFIG/$(basename $i)"  &&
      return 1
   done
}

getFileByINPUT() {
   [[ -f $DIR_CONFIG/BSSID_$INPUT.conf ]]  && FILE_CONFIG="$DIR_CONFIG/BSSID_$INPUT.conf"  && return 1
   [[ -f $INPUT ]]                         && FILE_CONFIG="$DIR_CONFIG/$(basename $INPUT)" && return 1
   [[ -f $DIR_CONFIG/$INPUT ]]             && FILE_CONFIG="$DIR_CONFIG/$INPUT"             && return 1
   [[ -f $DIR_CONFIG/$INPUT.conf ]]        && FILE_CONFIG="$DIR_CONFIG/$INPUT.conf"        && return 1
   [[ -f $DIR_CONFIG/$(sed "s/://g;s/^/BSSID_/g" <<< "$INPUT").conf ]]  && 
        FILE_CONFIG="$DIR_CONFIG/$(sed "s/://g;s/^/BSSID_/g" <<< "$INPUT").conf"    && return 1
   SSID="$INPUT" getFileBySSID
   [[ -z $FILE_CONFIG ]] &&
   logError "Unable to find config file for \"$INPUT\" in $DIR_CONFIG.." &&
   exit

}

checkConfigDuplicate() {
   exitD() { logError "Found duplicate: $DIR_CONFIG/$(getConfigName)" && exit; }
   [[ -f "$DIR_CONFIG/$(getConfigName)" ]] && exitD
   for i in $(find . -name "BSSID_*.conf"); do 
      grep "ssid=\"$SSID\"$" $i                 && exitD
   done
}

getScan() {
   wpa_cli ping | grep -q "^PONG" ||
   (wpaUp && sleep 3)
   wpa_cli scan > /dev/null 2>&1
   WIFIS="$(wpa_cli scan_results | tail -n +3)"
}

getBSSID() {
   for i in {1..8}; do
      getScan                       &&
      grep -q "$SSID" <<< "$WIFIS"  &&
      BSSID="$(grep -m1 "$SSID" <<< "$WIFIS" | 
         awk -F'\t' '{print $1}' )" &&
      logValid "Found BSSID for $SSID: $i of 8"
      return 1
      logError "Failed to find BSSID for $SSID: $i of 8"
      sleep 0.2
   done
   logError "Unable to get BSSID so exiting gracefully."
}

getPSK() {
   read PSK
}

resyncBssid() {
   [[ -z "$WIFIS" ]] && getScan
   checkbssid="$(grep -w "$SSID" <<< "$WIFIS" | awk '{print $1}')"
   grep -w "$BSSID" <<< "$checkbssid" && return 1 ### needs to get fixed
   [ "$BSSID" = "$checkbssid" ] && return 1
   logError "SSID  $SSID matches but BSSID doesn't! [ $BSSID != $checkbssid ]"
   logError "Do you wish to update BSSID?"
   echo -n "[Y|n]"
   read -n1 check
   [ "$check" = "n" ] && return 1
   getFileBySSID
   oldfile="$DIR_CONFIG/$FILE_CONFIG"
   BSSID="$checkbssid"
   
   FILE_CONFIG="$DIR_CONFIG/$(getConfigName)"
   readFILE_CONFIG
   mv $oldfile $FILE_CONFIG
   sed -i "s/bssid=.*$/bssid=$BSSID/g" "$FILE_CONFIG"
   logValid "created new config file: "$FILE_CONFIG"
"
}

wpaScan() {
   getScan
   tput rmam
   c=0
   while IFS=$'\n' read LINE; do
      c=$((c+1))
		readLINE

      COLOR="6m"
      [[ $((c%2)) -eq 0 ]] && COLOR="2m"

      if [[ $(wc -c <<< $SSID)      -lt 19 ]]; then 
         SSID="$SSID$(printf '%0.s '      $(seq 1 $((19-$(wc -c <<< $SSID))) ))"; fi
      if [[ $(wc -c <<< $SIGNAL)    -lt 4 ]]; then 
         SIGNAL="$SIGNAL$(printf '%0.s '  $(seq 1 $((4-$(wc -c <<< $SIGNAL))) ))"; fi
      if [[ $(wc -c <<< $FREQUENCY) -lt 5 ]]; then 
         FREQUENCY="$FREQUENCY$(printf '%0.s ' $(seq 1 $((5-$(wc -c <<< $FREQUENCY))) ))"; fi
      if [[ $(wc -c <<< $FLAGS)     -lt 27 ]]; then 
         FLAGS="$FLAGS$(printf '%0.s '    $(seq 1 $((27-$(wc -c <<< $FLAGS))) ))"; fi
      if [[ $(wc -c <<< $BSSID)     -lt 18 ]]; then 
         BSSID="$BSSID$(printf '%0.s '    $(seq 1 $((18-$(wc -c <<< $BSSID))) ))"; fi
      if [[ $(wc -c <<< $NUMBER)    -lt 4 ]]; then 
         NUMBER="$NUMBER$(printf '%0.s '  $(seq 1 $((4-$(wc -c <<< $NUMBER))) ))"; fi

      echo -e "\e[$COLOR $NUMBER  $SSID  $SIGNAL  $FREQUENCY  $BSSID  $FLAGS  \e[0m"
   done <<< "$WIFIS" 
   unset IFS
   tput smam
}

wpaNew() {
   if [[ -z "$1" ]]; then
      getBSSID
      getPSK
   else
      SSID="$1"
      PSK="$2"
      [[ -n $PSK ]]  && getBSSID
   fi

   [[ -z "$SSID" ]]           && 
   logError "SSID not set"    && exit
   [[ -n "$PSK" ]]            &&
   [[ -z "$BSSID" ]]          && 
   logError "BSSID not set"   && exit

   checkConfigDuplicate

   FILE_CONFIG="$DIR_CONFIG/$(getConfigName)"

   echo -e     "network={"          >> "$FILE_CONFIG"
   echo -e     "\tssid=\"$SSID\""   >> "$FILE_CONFIG"
   if [[ -n "$PSK" ]]; then
      echo -e  "\tbssid=$BSSID"     >> "$FILE_CONFIG"
      echo -e  "\tpsk=\"$PSK\""     >> "$FILE_CONFIG"
   else
      echo -e  "\tkey_mgmt=NONE"    >> "$FILE_CONFIG"
   fi
   echo        "}"                  >> "$FILE_CONFIG"
   
   logValid "Added $SSID to $FILE_CONFIG"
   wpaConnect $SSID 
}

wpaDisconnect() {
   pgrep wpa_supplicant && killall wpa_supplicant  &&
   logValid "All wpa_supplicant processes killed." &&
   return 1
}

wpaConnect() {
   INPUT="$1"
   getFileByINPUT
   readFILE_CONFIG
   resyncBssid
   wpaDisconnect
   wpa_supplicant -B -i $INTERFACE -c $FILE_CONFIG &&
   for i in {1..4}; do
      sleep $((5-$i))
      ping -c 3 archlinux.org                            &&
      logValid "Successfully connected to $FILE_CONFIG"  &&
      return 1
      logError "Failed test $i of 4"
   done
   logError "Unable to connect to to $FILE_CONFIG"
}

checkAvailable() {
   getScan
   declare -a AVAILABLE
   for FILE_CONFIG in $(find $DIR_CONFIG -type f); do
      readFILE_CONFIG
      resyncBssid
      [[ -n $BSSID ]]   && search="$BSSID"   && aw=1 
      [[ -z $BSSID ]]   && search="$SSID"    && aw=5
      LINE="$(grep -qw "$search" <<< "$(awk -v aw=$aw '{print $aw}' <<< "$WIFIS")" &&
              grep -w "$search" <<< "$WIFIS")"
      [[ -n $LINE ]]    &&
      readLINE && LINE="$SIGNAL $SSID $BSSID $FREQUENCY $FLAGS"
      AVAILABLE+=("$LINE")
   done
   declare -a AVBYSPEED
   IFS=$'\n' AVBYSPEED=($(sort <<<"${AVAILABLE[*]}"))
   unset IFS
   for i in "${AVBYSPEED[@]}"; do echo "#$i#"; done
}

wpaActive() {
   wpa_cli status | sed -n "s/^ssid=//p"
}


########
### MAIN


case "$1" in
   "scan")
      wpaScan
      ;;
   "new")
      shift 1
      wpaNew "$@"
      ;;
   "check-available")
      checkAvailable
      ;;
   "up")
      wpaUp
      ;;
   "down")
      wpaDown
      ;;
   "connect")
      shift 1
      wpaConnect "$@"
      ;;
   "disconnect")
      wpaDisconnect
      ;;
   "list")
      wpaList
      ;;
   "active")
      wpaActive
      ;;
   "remove")
      wpaRemove
      ;;
   *)
      echo 'Enter [scan|list|new|remove|connect|active]'
      ;;
esac

#sed -n '1 p' <<< $WIFIS