Skip to content

Instantly share code, notes, and snippets.

@giu1io
Last active February 24, 2024 10:00
Show Gist options
  • Select an option

  • Save giu1io/d8d4695325a8d5cc429f to your computer and use it in GitHub Desktop.

Select an option

Save giu1io/d8d4695325a8d5cc429f to your computer and use it in GitHub Desktop.

Revisions

  1. giu1io renamed this gist Aug 22, 2014. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. giu1io revised this gist Aug 22, 2014. 2 changed files with 178 additions and 0 deletions.
    133 changes: 133 additions & 0 deletions wifi_watchdog
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,133 @@
    #! /bin/sh
    ### BEGIN INIT INFO
    # Provides: wifi_watchdog
    # Required-Start: $remote_fs $syslog
    # Required-Stop: $remote_fs $syslog
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: Watchdog service for Wi-Fi
    # Description: This script ping the router every N seconds and if it fails
    # tries to restore the network connection.
    ### END INIT INFO
    # this file goes in /etc/init.d/
    # Author: Giulio Montagner

    # Do NOT "set -e"

    # PATH should only include /usr/* if it runs after the mountnfs.sh script
    DESC="Description of the service"
    NAME=wifi_watchdog
    DAEMON=/root/$NAME.sh
    DAEMON_PS=/[r]oot/$NAME.sh
    DAEMON_ARGS="--options args"
    PIDFILE=/var/run/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME

    #Include functions
    . /lib/lsb/init-functions


    #
    # Function that starts the daemon/service
    #
    do_start()
    {
    # Return
    # 0 if daemon has been started
    # 1 if daemon was already running
    # 2 if daemon could not be started
    # make sure we aren't running already
    what=$(basename $DAEMON)
    for p in `ps h -o pid -C $what`; do
    if [ $p != $$ ]; then
    return 1
    fi
    done
    $DAEMON &
    return 0
    }

    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
    # Return
    # 0 if daemon has been stopped
    # 1 if daemon was already stopped
    # 2 if daemon could not be stopped
    # other if a failure occurred
    kill -9 $(ps aux | grep "$DAEMON_PS" | awk '{print $2}')
    }

    #
    # Function that sends a SIGHUP to the daemon/service
    #
    do_reload() {
    #
    # If the daemon can reload its configuration without
    # restarting (for example, when it is sent a SIGHUP),
    # then implement that here.
    #
    return 0
    }

    case "$1" in
    start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
    stop)
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
    status)
    ps aux | grep "$DAEMON_PS"
    ;;
    #reload|force-reload)
    #
    # If do_reload() is not implemented then leave this commented out
    # and leave 'force-reload' as an alias for 'restart'.
    #
    #log_daemon_msg "Reloading $DESC" "$NAME"
    #do_reload
    #log_end_msg $?
    #;;
    restart|force-reload)
    #
    # If the "reload" option is implemented then remove the
    # 'force-reload' alias
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
    0|1)
    do_start
    case "$?" in
    0) log_end_msg 0 ;;
    1) log_end_msg 1 ;; # Old process is still running
    *) log_end_msg 1 ;; # Failed to start
    esac
    ;;
    *)
    # Failed to stop
    log_end_msg 1
    ;;
    esac
    ;;
    *)
    #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
    echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
    exit 3
    ;;
    esac

    :
    45 changes: 45 additions & 0 deletions wifi_watchdog.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,45 @@
    #!/bin/bash
    # source: http://raspberrypi.stackexchange.com/a/5121
    # make sure we aren't running already
    what=`basename $0`
    for p in `ps h -o pid -C $what`; do
    if [ $p != $$ ]; then
    exit 0
    fi
    done

    # source configuration
    wlan=wlan0
    #set router ip = gateway
    router_ip=$(route -n | grep 'wlan0$' | grep '^0\.0\.0\.0' | awk '{print $2}')
    log=/var/log/wifi.log
    check_interval=120

    exec 1> /dev/null
    exec 2>> $log
    echo $(date) > $log
    # without check_interval set, we risk a 0 sleep = busy loop
    if [ ! "$check_interval" ]; then
    echo "No check interval set!" >> $log
    exit 1
    else sleep $check_interval
    fi

    restartWifi () {
    dhclient -v -r
    # make really sure
    killall dhclient
    ifconfig $wlan down
    ifconfig $wlan up
    #launch script to connect wifi
    /root/load_wifi.sh &
    }

    while [ 1 ]; do
    ping -c 1 $router_ip & wait $!
    if [ $? != 0 ]; then
    echo $(date)" attempting restart..." >> $log
    restartWifi
    fi
    sleep $check_interval
    done
  3. giu1io created this gist Aug 22, 2014.
    97 changes: 97 additions & 0 deletions load_wifi.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,97 @@
    #!/bin/bash

    WPA_SUPPLICANT_CONF="/etc/wpa_supplicant/wpa_supplicant.conf"

    # this funcion is called once the connection is established,
    # in this case a boot sound will be played to notify the user that everything is ready.
    function connected {
    aplay /root/Windows3.1.wav 2>&1 >/dev/null &
    }

    # function that tries to establish a connection, get a network in $temp from the WPA file
    # and then goes through all available networks ($essid) to find a match.
    function testConnect {
    while [ $x -lt ${#essid[@]} ]; do
    if [ "${temp[ssid]}" = "${essid[$x]}" ]
    then
    echo "Trying to connect to ${temp[ssid]}"
    ssid="${temp[ssid]}"
    ssid="${ssid%\"}"
    ssid="${ssid#\"}"
    iwconfig wlan0 essid "$ssid"
    dhclient wlan0
    connected
    exit
    fi
    (( x++ ))
    done
    }

    a=0
    b=0
    x=0

    declare -a essid
    declare -a address
    # load in $essid and $address all available networks
    while read line
    do
    case $line in
    *ESSID* )
    line=${line#*ESSID:}
    essid[$a]="$line"
    a=$((a + 1))
    ;;
    *Address*)
    line=${line#*Address:}
    address[$b]="$line"
    b=$((b + 1))
    ;;
    esac
    done < <(iwlist wlan0 scanning)

    #load in $temp a network at time from the WPA supplicant file
    declare -A temp
    i=0
    flag=0
    while read line
    do
    case "$line" in
    "network={")
    flag=1
    ;;
    "}")
    #echo "${temp[*]}"
    testConnect temp[@]
    ((i++))
    flag=0
    ;;
    *)
    if [ "$flag" -eq 1 ]; then
    IFS='=' read -a array <<< "$line"
    key="${array[0]}"
    temp[$key]="${array[1]}"
    fi
    esac
    done < $WPA_SUPPLICANT_CONF

    # if a connection hasn't been established create an hotspot
    if ifconfig wlan0 | grep -q "inet addr:" ; then
    echo "Already Connected"
    # start the watchdog service
    service wifi_watchdog start
    connected
    else
    #we don't know if the watchdog service is running so stop it 'cause I haven't test it yet
    service wifi_watchdog stop

    echo "Network connection down! Inizializing hotspot:"
    # set a static IP
    ifconfig wlan0 192.168.0.1 netmask 255.255.255.0
    # inizialize hotspot
    hostapd -B -dd /etc/hostapd/hostapd.conf
    # start dhcp
    service udhcpd start

    connected
    fi