Posso ser notificado e lidar com eventos do sistema (especialmente curioso sobre o desligamento do wifi)

-1

Desde o ubuntu 14.04 LTS, eu tenho tido esse problema que minha conexão sem fio fica "bagunçada" - mais especificamente, às vezes perco conexão.

Atualmente estou resolvendo esse problema desconectando e conectando novamente. Isso funciona clicando no ícone da barra de unidade superior direita ou emitindo um rfkill block wifi seguido por um comando rfkill unblock wifi

Ainda não encontrei uma solução para o problema de leitura, mas tive a ideia de que, se eu conseguisse lidar com essa situação de forma programática com um script que é acionado quando a desconexão ocorre, eu ficarei bem.

Eu também não quero criar um script que faça pesquisas constantes sobre o status do Wi-Fi, eu gostaria de ouvir para esse evento específico e agir quando for notificado.

Isso é de alguma forma possível?

    
por vlad-ardelean 21.09.2014 / 18:46

2 respostas

2

Primeiro de tudo:

O que você descreve como sua resposta desejada é o que você realmente chama: Eu também não quero criar um script que faça pesquisas constantes . Inotify também é usado em um loop constante para "ouvir" as mudanças no estado atual. Em outras palavras: a outra opção que você supõe existir não existe sem algum tipo de loop.

Eu também acho que sua imagem de um loop é muito pesada. Em todos os sistemas, em cada aplicativo existem vários loops ativos para aguardar gatilhos. Não deve ter nenhum efeito perceptível em seus recursos.

A "anatomia" de um mecanismo take-action-on-event é basicamente:

em um loop while:

check the current status;
if a is True:
    take action A
if a is False:
    do nothing
wait a few seconds

Em um script bash

Integrar este script (para verificar sua conexão) em um loop while (com algumas pequenas alterações) deve fazer o que você descreve: restabeleça sua conexão e envie uma notificação.

#!/bin/bash

while :
do
  wget -q --tries=10 --timeout=20 --spider http://google.com
  if [[ $? -eq 0 ]]; then
          :
  else
          rfkill block wifi
          rfkill unblock wifi
          notify-send "connection re-established"
  fi
  sleep 4
done

Em um script python

A função check() retorna True ou False . Se Verdadeiro (conexão estiver ativa), nada acontece. Se False , seu rfkill block wifi / rfkill ublock wifi é executado.

#!/usr/bin/env python3

import socket
import time
import subprocess

def check():
    try:
        host = socket.gethostbyname("www.google.com")
        s = socket.create_connection((host, 80), 2)
        return True
    except Exception:
        return False

while True:
    if check() == True:
        pass
    else:
        subprocess.call(["/bin/bash", "-c", "rfkill", "block", "wifi"])
        subprocess.call(["/bin/bash", "-c", "rfkill", "unblock", "wifi"])
        subprocess.Popen(["/bin/bash", "-c", "notify-send 'conncection re-established'"])
    time.sleep(4)
    
por Jacob Vlijm 22.09.2014 / 10:58
1

Meu script para lidar com login / logout de WIFI GRÁTIS e conexão WIRELESS reconectar e reparar.

Ele se conecta ao wifi gratuito, efetua login, obtém o tempo de conexão restante e aguarda até que o tempo termine e verifica o status do Wi-Fi e do login e a conexão com a Internet, efetua logout e repete.

Para enviar notificações para o uso de ambiente de desktop

notify-send "YOUR MESSAGE HERE"

O reparo da conexão Wi-Fi é tratado na função ReConnect ()

#!/bin/bash
WIFI_DEVICE="wlp3s2"
USER_PC="T-00%3AC0%3AA8%3AC7%3AF0%3AF1"
USER_USB="T-00%3AE0%3A4C%3A84%3AD2%3A5C"
USER_NAME="$USER_PC"
LOGIN_URL="http://starse.hotspot/login?username="
LOGOUT_URL="http://starse.hotspot/logout"
STATUS_URL="http://starse.hotspot/status"
WIFI_NETWORK="starse.WiFiPoint"
WIFI_PROFILE_FILE_SEARCH="starse"
PORT=5555
LOGIN_RETRY=5
REPEAT_HOURS=10000
SECONDS_LEFT="0"
ONE_MINUTE=15
MINUTES=0
START=0
END=0
ONE=1
ZERO=0

function CleanConnections()
{
    MYDIR=$(pwd)
    #remove all connections from network manager
    cd /etc/NetworkManager/system-connections/ &> /dev/null
    rm "$WIFI_PROFILE_FILE_SEARCH.*" &> /dev/null
    cd $MYDIR &> /dev/null
}

function ReConnect()
{
    # check if WIFI_DEVICE is connected to WIFI_NETWORK
    WIFI_OK=$(iwconfig $WIFI_DEVICE | grep -c $WIFI_NETWORK)

    # while not connected, try to repair connection
    while [ $WIFI_OK = "0" ]
    do
        # check if wifi radio is on / turn it on
        RADIO=$(nmcli radio wifi)
        sleep 1
        if [ "$RADIO" = "onemogočeno" ]
        then
            nmcli radio wifi on
            echo "$(date), WIFI RADIO OMOGOČEN!"
        fi
        sleep 1
        # check if WIFI_DEVICE is connected to WIFI_NETWORK again
        WIFI_OK=$(iwconfig $WIFI_DEVICE | grep -c $WIFI_NETWORK)
        if [ $WIFI_OK = "0" ]
        then
            # if not connected, connect to WIFI_NETWORK
            echo "$(date), POVEZAVA WIFI PREKINJENA!"
            nmcli d wifi connect "$WIFI_NETWORK" &> /dev/null
            sleep 1

            # check if WIFI_DEVICE is connected to WIFI_NETWORK again
            WIFI_OK=$(iwconfig $WIFI_DEVICE | grep -c $WIFI_NETWORK)
            sleep 1

            # if connection is still not established, restart network-manager and check connection
            if [ $WIFI_OK = "0" ] 
            then
                service network-manager restart
                sleep 2
                WIFI_OK=$(iwconfig $WIFI_DEVICE | grep -c $WIFI_NETWORK)
                echo "$(date), NETWORK MANAGER PONOVNO ZAGNAN!" 
            else
                echo "$(date), POVEZAVA WIFI VZPOSTAVLJENA!"
                sleep 2         
            fi
        fi
    done
}


function Login()
{
    RETRY_COUNT=0
    LOGIN_OK=0
    # while not logged in
    while [ $LOGIN_OK = "0" ]
    do
        # try to login
        LOGIN_OK=$(curl -s -m 2 "$LOGIN_URL$USER_NAME" | grep -c "You are logged in")
        if [ $LOGIN_OK = "1" ] 
        then
            echo "$(date), PRIJAVA USPEŠNA."
            break
        else
            # if could not login, try for RETRY_COUN
            echo "$(date), PRIJAVA NEUSPEŠNA! Ponavljam $RETRY_COUNT od $LOGIN_RETRY"
            RETRY_COUNT=$((RETRY_COUNT+1))
            sleep 1
        fi

        # if RETRY_COUNT expired then ReConnect and continue
        if [ $RETRY_COUNT -gt $LOGIN_RETRY ]
        then
            ReConnect
            RETRY_COUNT=0
            continue
        fi
    done
}


function GetSecondsLeft()
{
    STATUS_PAGE=$(wget -T 2 -q -O - "$@" "$STATUS_URL") 
    sleep 10
    MIN1=$(echo $STATUS_PAGE | grep -o '[0-9| ][0-9]m' | tail -1 | tr -d 'm' | tr -d ' ')
    sleep 1
    SEC1=$((MIN1*60))
    echo "$(date), ČAS PRIDOBLJEN. NA VOLJO: $((SEC1))s"
    eval "$1"="$SEC1"
}

#ReConnect

LOGIN_NR=1
while  [ "$LOGIN_NR" -lt "$REPEAT_HOURS" ]
do


    # try to login first
    Login

    #set counters
    START=$(date +%s)

    # get time left from status page
    GetSecondsLeft SECONDS_LEFT

    # clean wifi profiles dir
    CleanConnections

    # get first ELPASED_SEC
    END=$(date +%s)
    ELPASED_SEC=$((END-START))

    # count till next login
    while [ $ELPASED_SEC -lt $SECONDS_LEFT ]
    do  
        # display info
        echo "$(date), LOGIN: $LOGIN_NR, PRETEKLO: $((ELPASED_SEC))s,  NA VOLJO ŠE: $((SECONDS_LEFT-ELPASED_SEC))s"


        # wait ONE_MINUTE and periodicaly check for wifi and internet connection every two/three seconds    
        ELPASED_MINUTE_SEC=0
        while [ $ELPASED_MINUTE_SEC -lt $ONE_MINUTE ]
        do
            # start timer
            S=$(date +%s)

            # check for wifi connection
            WIFI_OK=$(iwconfig $WIFI_DEVICE | grep -c $WIFI_NETWORK)
            if [ $WIFI_OK = "1" ]
            then
                #  if wifi connection OK, check for internet connection
                PING="0"
                PING=$(ping -c 1 -w 2000 -s 1 www.google.si | grep -c "9 bytes")
                sleep 2
                if [ "$PING" = "0" ]
                then
                    echo "$(date), INTERNETNA POVEZAVA PREKINJENA! Vzpostavljam ..."
                    # if no internet connection then Login()
                    Login
                    # on reconnect caculate SECONDS_LEFT and reset ELPASED_SEC
                    GetSecondsLeft SECONDS_LEFT
                    ELPASED_SEC=0
                else
                    sleep 1
                fi
            else
                # if wifi connection is lost ReConnect()
                ReConnect   
            fi                  

            # check if whole time is up and break
            END=$(date +%s)
            ELPASED_SEC=$((END-START))
            if [ $SECONDS_LEFT -le $ELPASED_SEC ]
            then
                break
            fi

            # add used seconds to ELPASED MINUTE            
            E=$(date +%s)
            ELPASED_MINUTE_SEC=$((ELPASED_MINUTE_SEC+(E-S)))            
        done    
        END=$(date +%s)
        ELPASED_SEC=$((END-START))
    done


    # TIME IS UP
    # logout and increase LOGIN_NR
    curl -s -m 2 "$LOGOUT_URL" &> /dev/null
    LOGIN_NR=$((LOGIN_NR+1))

done
    
por Sebastijan Bandur 26.11.2015 / 14:07