#!/bin/bash
#
# eduroam          Script de arranque do serviço de rede eduroam
#
# chkconfig: 2345 11 89
# description: Este script foi criado pelo Centro de Cálculo (CCa) para
#              automatizar a tarefa de ligação de máquinas com Linux
#              à rede sem fios eduroam.
#              O script assume que o hardware é compatível com todos os
#              requisitos necessários para o seu funcionamento. Para mais
#              informações consulte as páginas de ajuda que o CCa
#              disponibiliza em:
#              http://www.fc.up.pt/wireless/
#
#$Id: eduroam 515 2011-05-20 14:44:04Z ecoutinho $
#

####
#### OBRIGATÓRIO: Definir as variáveis para esta máquina ####
####

#
# Definição do interface de rede que este script utiliza.
#
#INTERFACE=wlan0
INTERFACE=eth1

#
# Definição do comando para chamar o supplicant.
#
SUPPLICANT="wpa_supplicant"
SUPP_CONF=/etc/wpa_supplicant/wpa_supplicant.conf

if [ ! -f $SUPP_CONF ]; then
    if [ -f /etc/wpa_supplicant.conf ]; then
        SUPP_CONF=/etc/wpa_supplicant.conf
    else
        echo "Erro: Nao foi possivel determinar a configuracao do $SUPPLICANT."
        exit 1
    fi
fi

OPTIONS="-i $INTERFACE -c $SUPP_CONF -d -B -D wext"



####
#### ALTERE O SCRIPT A PARTIR DESTE PONTO SE SOUBER O QUE ESTA A FAZER ####
####

RETVAL=0
SSID="eduroam"

# numero de segundos ate desistir
MAX=30


if [ "$INTERFACE" == "" ]; then
    echo "Erro: O interface da rede sem fios não está definido. Edite este script e defina a variável 'INTERFACE'."
    exit 1
fi

if [ "$SUPPLICANT" == "" ]; then
    echo "Erro: O supplicant não está definido. Edite este script e defina a variável 'SUPPLICANT'."
    exit 1
fi

# verificar que o interface existe
if ! iwconfig $INTERFACE 2>/dev/null | grep -q "Access Point" ; then
    echo "Erro: Não foi possível encontrar o interface da rede sem fios. Edite este script e defina a variável 'INTERFACE', ou confirme que o módulo está carregado."
    exit 1
fi


success() {
  echo -n "[  OK  ]"
  echo -ne "\r"
  return 0
}

failure() {
  echo -n "[ FAILED ]"
  echo -ne "\r"
  return 0
}

# source function library
if [ -f /etc/rc.d/init.d/functions ]; then
    . /etc/rc.d/init.d/functions
fi


start() {

    # desligar o interface
    /sbin/ifconfig $INTERFACE down
    killall $SUPPLICANT >& /dev/null
    dhclient -r $INTERFACE >& /dev/null
    if [ -f /var/run/dhclient-$INTERFACE.pid ]; then
	    kill -9 `cat /var/run/dhclient-$INTERFACE.pid` >& /dev/null
    fi

    # ligar o interface
    /sbin/ifconfig $INTERFACE up

    # configurar o interface wireless
    iwconfig $INTERFACE essid $SSID mode managed >& /dev/null
    iwconfig $INTERFACE key 0000-0000-00 >& /dev/null

    # iniciar o supplicant. 
    echo -n "A iniciar serviço de autenticação na rede $SSID: "
    $SUPPLICANT $OPTIONS >& /dev/null && success || failure
    RETVAL=$?
    echo

    # fornecer alguma informacao sobre a autenticacao
    if [ "$RETVAL" = 0 ]; then
        echo -e -n "A procurar um Access Point "
        c=0
        while :; do
            ap=`iwconfig $INTERFACE 2>/dev/null | grep "Access Point:" |sed 's/.*Access Point: \([^ ]\+\).*/\1/'`
            if [ "$ap" != "" -a "$ap" != "00:00:00:00:00:00" -a "$ap" != "Not-Associated" ]; then
		success
                echo -e "\n  Associado ao Acess Point $ap"
                break
            fi
            if [ $c -eq $MAX ]; then
		failure
                echo -e "\nErro: Não foi encontrado nenhum Access Point.\nPor favor desloque-se para uma zona com melhor cobertura de sinal.\n"
                stop
                echo -e -n "Ligação à rede $SSID: " && failure
                echo
                exit 1
            fi
            c=`expr $c + 1`
            echo -n "."
            sleep 1
        done

        echo -e -n "A negociar a autenticação "
        c=0
        while :; do
            key=`iwconfig $INTERFACE 2>/dev/null | grep "Encryption key:" |sed 's/.*Encryption key:\([^ ]\+\).*/\1/'`
            if [ "$key" != "off" -a "$key" != "0000-0000-00" -a "$key" != "0" ]; then
		success
                echo -e "\n  O utilizador foi autenticado com sucesso."
                break
            fi
            if [ $c -eq $MAX ]; then
		failure
                cat <<EOF 

Erro: Não foi possível concluir a autenticação com sucesso. 
Por favor confirme que:
 - o ficheiro de configuração wpa_supplicant.conf contém o seu email e password da rede sem fios.
 - está numa zona com boa cobertura de sinal.

EOF
		# parar servico
                stop
                echo -e -n "Ligação à rede $SSID: " && failure
		echo
                exit 1
            fi
            c=`expr $c + 1`
            echo -n "."
            sleep 1
        done

        # obter IP por DHCP
        echo -e -n "A obter um endereço IP "
        /sbin/dhclient -nw -q -pf /var/run/dhclient-${INTERFACE}.pid $INTERFACE >& /dev/null
        RETVAL=$?

        if [ "$RETVAL" = 0 ]; then
            c=0
            while :; do
                ip=`ifconfig $INTERFACE |grep "inet addr:\|inet end.:" |sed 's/.*inet addr:[ ]*\([^ ]\+\).*/\1/' |sed 's/.*inet end.:[ ]*\([^ ]\+\).*/\1/'`
                if [ "$ip" != "" ]; then
		    success
                    echo -e "\n  Obteve o endereço IP $ip"
                    break
                fi
                if [ $c -eq $MAX ]; then
		    failure
                    echo -e "\nErro: Não foi possível obter um endereço IP.\nPor favor desloque-se para uma zona com melhor cobertura de sinal.\n"
                    stop
                    echo -e -n "Ligação à rede $SSID: " && failure
                    echo
                    exit 1
                fi
                c=`expr $c + 1`
                echo -n "."
                sleep 1
            done
        else
	    failure
	    echo
	fi
    fi

    echo -e -n "Ligação à rede $SSID: "
    [ "$RETVAL" = 0 ] && success || failure
    echo

    return $RETVAL
}

stop() {
    echo -n "A parar $SSID: "

    # parar o dhclient
    if [ -f /var/run/dhclient-${INTERFACE}.pid ]; then
	    /usr/bin/kill -TERM `cat /var/run/dhclient-${INTERFACE}.pid` >& /dev/null
    else
	    /sbin/dhclient -r $INTERFACE >& /dev/null
    fi

    # parar o suppllicant
    killall $SUPPLICANT >& /dev/null

    # parar o interface
    ifconfig $INTERFACE down >& /dev/null

    # desligar o AP
    iwconfig $INTERFACE essid any >&/dev/null
    iwconfig $INTERFACE ap any >&/dev/null && success || failure

    RETVAL=$?
    echo

    return $RETVAL
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
esac
exit $RETVAL