| #!/bin/bash |
|
|
| echo "=== [WiFi Setup Script] Starting... ===" |
|
|
| |
| |
| |
| |
| WIFI_SSID="${WIFI_SSID:-}" |
| WIFI_PASSWORD="${WIFI_PASSWORD:-}" |
| CONNECTION_NAME="${CONNECTION_NAME:-}" |
| WIFI_INTERFACE="${WIFI_INTERFACE:-}" |
| FALLBACK_SSID="${FALLBACK_SSID:-}" |
|
|
| usage() { |
| cat << 'USAGE_EOF' |
| Usage: setup_wifi.sh [options] |
|
|
| Options: |
| --ssid <ssid> WiFi SSID (required) |
| --password <password> WiFi password (required for secured networks) |
| --interface <ifname> WiFi interface (optional; auto-detect if omitted) |
| --connection <name> Connection profile name (optional; defaults to SSID) |
| --gateway <ip> Gateway IP (optional; sets route/DNS) |
| --fallback-ssid <ssid> Fallback SSID (optional) |
| -h, --help Show this help |
|
|
| You can also set environment variables: |
| WIFI_SSID, WIFI_PASSWORD, WIFI_INTERFACE, CONNECTION_NAME, FALLBACK_SSID, WIFI_GATEWAY, |
| ROUTE_CLEANUP_GW |
| USAGE_EOF |
| } |
|
|
| while [ $# -gt 0 ]; do |
| case "$1" in |
| --ssid) WIFI_SSID="$2"; shift 2 ;; |
| --password) WIFI_PASSWORD="$2"; shift 2 ;; |
| --interface) WIFI_INTERFACE="$2"; shift 2 ;; |
| --connection) CONNECTION_NAME="$2"; shift 2 ;; |
| --fallback-ssid) FALLBACK_SSID="$2"; shift 2 ;; |
| --gateway) WIFI_GATEWAY="$2"; shift 2 ;; |
| -h|--help) usage; exit 0 ;; |
| *) |
| echo "[!] Unknown option: $1" |
| usage |
| exit 2 |
| ;; |
| esac |
| done |
|
|
| if [ -z "$WIFI_SSID" ]; then |
| echo "[✗] Missing WiFi SSID. Provide --ssid or WIFI_SSID." |
| usage |
| exit 2 |
| fi |
|
|
| if [ -z "$CONNECTION_NAME" ]; then |
| CONNECTION_NAME="$WIFI_SSID" |
| fi |
|
|
| if [ -z "$WIFI_INTERFACE" ]; then |
| WIFI_INTERFACE=$(nmcli -t -f DEVICE,TYPE device status | awk -F: '$2=="wifi"{print $1; exit}') |
| fi |
|
|
| if [ -z "$WIFI_INTERFACE" ]; then |
| echo "[✗] No WiFi interface detected. Provide --interface or WIFI_INTERFACE." |
| exit 2 |
| fi |
|
|
| |
| |
| WIFI_GATEWAY="${WIFI_GATEWAY:-}" |
| |
| ROUTE_CLEANUP_GW="${ROUTE_CLEANUP_GW:-}" |
| WIRED_CONNECTION="Wired connection 1" |
|
|
| |
| echo "[1] Unblocking WiFi and enabling interface..." |
| sudo rfkill unblock wifi |
| sudo ip link set $WIFI_INTERFACE up |
|
|
| |
| echo "[2] Scanning for WiFi networks..." |
| sudo nmcli device wifi rescan |
| sleep 3 |
|
|
| |
| echo "[3] Checking for '$WIFI_SSID' network..." |
| if sudo nmcli device wifi list | grep -q "$WIFI_SSID"; then |
| echo "[✓] Network '$WIFI_SSID' found in scan" |
| |
| echo "[4] Attempting direct connection to '$WIFI_SSID'..." |
| if [ -n "$WIFI_PASSWORD" ]; then |
| CONNECT_CMD=(sudo nmcli device wifi connect "$WIFI_SSID" password "$WIFI_PASSWORD") |
| else |
| CONNECT_CMD=(sudo nmcli device wifi connect "$WIFI_SSID") |
| fi |
| if "${CONNECT_CMD[@]}"; then |
| echo "[✓] Successfully connected directly" |
| CONNECTION_SUCCESS=true |
| else |
| echo "[!] Direct connection failed, trying manual profile method..." |
| CONNECTION_SUCCESS=false |
| fi |
| else |
| echo "[!] Network '$WIFI_SSID' not found in scan (possibly hidden)" |
| CONNECTION_SUCCESS=false |
| fi |
|
|
| |
| if [ "$CONNECTION_SUCCESS" != "true" ]; then |
| echo "[4] Creating manual connection profile for '$WIFI_SSID'..." |
| |
| |
| sudo nmcli connection delete "$CONNECTION_NAME" 2>/dev/null || true |
| |
| |
| if [ -n "$WIFI_PASSWORD" ]; then |
| ADD_ARGS=(wifi-sec.key-mgmt wpa-psk wifi-sec.psk "$WIFI_PASSWORD") |
| else |
| ADD_ARGS=() |
| fi |
| if sudo nmcli connection add type wifi con-name "$CONNECTION_NAME" ifname "$WIFI_INTERFACE" ssid "$WIFI_SSID" "${ADD_ARGS[@]}"; then |
| echo "[✓] Connection profile created successfully" |
| |
| echo "[5] Activating connection profile..." |
| if sudo nmcli connection up "$CONNECTION_NAME"; then |
| echo "[✓] Connection profile activated successfully" |
| CONNECTION_SUCCESS=true |
| else |
| echo "[✗] Failed to activate connection profile" |
| CONNECTION_SUCCESS=false |
| fi |
| else |
| echo "[✗] Failed to create connection profile" |
| CONNECTION_SUCCESS=false |
| fi |
| fi |
|
|
| |
| if [ "$CONNECTION_SUCCESS" = "true" ]; then |
| echo "[5] Configuring network routing priorities..." |
| |
| |
| echo " Setting WiFi connection priority to 100..." |
| sudo nmcli connection modify "$CONNECTION_NAME" ipv4.route-metric 100 |
| |
| |
| echo " Setting wired connection priority to 30000..." |
| sudo nmcli connection modify "$WIRED_CONNECTION" ipv4.route-metric 30000 2>/dev/null || true |
| |
| |
| echo " Cleaning up routing table..." |
| if [ -n "$ROUTE_CLEANUP_GW" ]; then |
| sudo ip route del default via "$ROUTE_CLEANUP_GW" 2>/dev/null || true |
| fi |
| |
| |
| if [ -n "$WIFI_GATEWAY" ]; then |
| sudo ip route add default via "$WIFI_GATEWAY" dev "$WIFI_INTERFACE" metric 50 2>/dev/null || true |
| |
| |
| echo " Configuring DNS..." |
| sudo tee /etc/resolv.conf > /dev/null << DNS_EOF |
| nameserver $WIFI_GATEWAY |
| nameserver 8.8.8.8 |
| nameserver 1.1.1.1 |
| DNS_EOF |
| fi |
| |
| echo "[✓] Network routing configured for WiFi priority" |
| fi |
|
|
| |
| echo "[6] Checking connection status..." |
| if [ "$CONNECTION_SUCCESS" = "true" ]; then |
| CURRENT_CONNECTION=$(nmcli device status | grep "$WIFI_INTERFACE" | awk '{print $4}') |
| if [[ "$CURRENT_CONNECTION" == "$CONNECTION_NAME" ]] || [[ "$CURRENT_CONNECTION" == "$WIFI_SSID" ]]; then |
| echo "[✓] Successfully connected to '$WIFI_SSID'" |
| echo " Interface: $WIFI_INTERFACE" |
| echo " Connection: $CURRENT_CONNECTION" |
| else |
| echo "[!] Connection status unclear" |
| CONNECTION_SUCCESS=false |
| fi |
| fi |
|
|
| |
| if [ "$CONNECTION_SUCCESS" = "true" ]; then |
| echo "[7] Testing internet connectivity..." |
| MAX_RETRIES=3 |
| COUNT=0 |
| INTERNET_OK=false |
| |
| while [ "$COUNT" -lt "$MAX_RETRIES" ]; do |
| if ping -c 2 -W 5 8.8.8.8 >/dev/null 2>&1; then |
| echo "[✓] Internet connectivity verified (ping test)" |
| |
| |
| if curl -s --connect-timeout 5 -I http://google.com >/dev/null 2>&1; then |
| echo "[✓] DNS resolution and HTTP connectivity verified" |
| INTERNET_OK=true |
| break |
| else |
| echo "[!] DNS/HTTP test failed, but ping works. Retrying... ($((COUNT+1))/$MAX_RETRIES)" |
| fi |
| else |
| echo "[!] Internet test failed. Retrying... ($((COUNT+1))/$MAX_RETRIES)" |
| fi |
| |
| sleep 3 |
| ((COUNT++)) |
| done |
| |
| if [ "$INTERNET_OK" != "true" ]; then |
| echo "[!] Internet connectivity test failed after $MAX_RETRIES attempts" |
| CONNECTION_SUCCESS=false |
| fi |
| fi |
|
|
| |
| if [ "$CONNECTION_SUCCESS" != "true" ] && [ -n "$FALLBACK_SSID" ]; then |
| echo "[8] Connection to '$WIFI_SSID' failed. Attempting fallback to '$FALLBACK_SSID'..." |
| |
| |
| if sudo nmcli device wifi list | grep -q "$FALLBACK_SSID"; then |
| echo "[!] Attempting to connect to fallback network '$FALLBACK_SSID'..." |
| if sudo nmcli device wifi connect "$FALLBACK_SSID"; then |
| echo "[✓] Connected to fallback network '$FALLBACK_SSID'" |
| |
| |
| echo " Applying routing fixes for fallback network..." |
| if [ -n "$ROUTE_CLEANUP_GW" ]; then |
| sudo ip route del default via "$ROUTE_CLEANUP_GW" 2>/dev/null || true |
| fi |
| sudo nmcli connection modify "$WIRED_CONNECTION" ipv4.route-metric 30000 2>/dev/null || true |
| else |
| echo "[✗] Failed to connect to fallback network" |
| fi |
| else |
| echo "[!] Fallback network '$FALLBACK_SSID' not available" |
| fi |
| fi |
|
|
| |
| echo "[9] Final WiFi status:" |
| nmcli device status | grep wifi |
| echo "" |
| echo "Active connections:" |
| nmcli connection show --active | head -5 |
| echo "" |
| echo "Current routing table:" |
| ip route show | head -5 |
| echo "" |
| echo "DNS configuration:" |
| cat /etc/resolv.conf | grep nameserver |
|
|
| echo "=== [WiFi Setup Script] Completed ===" |
|
|
| |
| if [ "$CONNECTION_SUCCESS" = "true" ]; then |
| exit 0 |
| else |
| exit 1 |
| fi |
|
|