Nimbin[12]?Administration / wifi

wifi 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 && chmod 740 wifi
wifi 4.8 KB · 212 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="wlp3s0"
DIR_CONFIG=/etc/sysconfig/wpa_supplicant
FILE_CONFIG_DEFAULT=/etc/sysconfig/ifconfig.wlan0
FILE_CONFIG_DIFF=$FILE_CONFIG_DEFAULT.diff

SSID=""
PSK=""

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"; }




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)"
}

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)"
}

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
}

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

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

wpaConnect() {
   SSID="$1"

   FILE_CONFIG="$DIR_CONFIG/$SSID"
   if ! [[ -f "$FILE_CONFIG" ]]; then
       logError "File $FILE_CONFIG not found!"
       exit
   fi

   wpaUp

   sleep 1

   readFILE_CONFIG

   wpaDisconnect

   sleep 1

   wpa_supplicant -B -i $INTERFACE -c "$FILE_CONFIG" &&
   sleep 1 &&
   for i in {1..20}; do
      sleep 2
      ping -c 3 christianimmanuel.de &&
      logValid "Successfully connected to $FILE_CONFIG"  &&
      return 0
      logError "Failed test $i of 20"
   done
   logError "Unable to connect to to $FILE_CONFIG"
   echo
   echo "Retry connecting? [Yn]"
   read ret
   if [[ "$ret" != "n" ]]; then
       wpaConnect $SSID
       return 0
   fi

   echo "Disable wifi? [Yn]"
   read dis
   [[ "$dis" != "n" ]] &&
       wpaDown

}

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

wpaUp() { modprobe iwlwifi && ifup $IFNAME wlan0; }

wpaDown() { wpaDisconnect; ifdown $IFNAME wlan0; }

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

wpaNew() {
    SSID="$1"
    PSK="$2"

    [[ -z "$SSID" ]] && 
        logError "Please provide the ssid."   && exit

    if [[ -z "$psk" ]]; then
        echo -e "No password passed!\nDo you wish to Enter a password?\n[y|N]"
        read -n1 check
        if [[ "$check" -eq "y" ]]; then
            read PSK
        fi
    fi

   [[ -f "$DIR_CONFIG/$SSID" ]] && 
       logError "Found duplicate: $DIR_CONFIG/$SSID" && exit;

    FILE_CONFIG="$DIR_CONFIG/$SSID"

    echo -e     "network={"          >> "$FILE_CONFIG"
    echo -e     "\tssid=\"$SSID\""   >> "$FILE_CONFIG"
    if [[ -n "$PSK" ]]; then
        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 
}

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


case "$1" in
    "scan")
        wpaScan
        ;;
    "new")
        shift 1
        wpaNew "$@"
        ;;
    "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