Posso ricevere notifiche e gestire eventi di sistema (particolarmente curioso di disattivare il wifi)


0

Da Ubuntu 14.04 LTS, ho riscontrato questo problema che la mia connessione wireless viene "incasinata" - più specificamente a volte perdo la connessione.

Attualmente sto risolvendo questo problema disconnettendomi e riconnettendomi di nuovo. Funziona facendo clic sull'icona della barra dell'unità in alto a destra o eseguendo un rfkill block wifiseguito da un rfkill unblock wificomando

Non ho ancora trovato una soluzione al problema di lettura, ma ho avuto l'idea che se potessi gestire programmaticamente questa situazione con uno script che si innesca quando si verifica la disconnessione, starò bene.

Inoltre, non voglio creare uno script che esegua il polling costante dello stato del wifi, vorrei ascoltare questo specifico evento e agire di conseguenza quando ricevo una notifica.

Questo è in qualche modo possibile?


Non sono sicuro di cosa intendi con "Non voglio nemmeno creare uno script che controlli costantemente lo stato del wifi". Un meccanismo che agisce su determinati cambiamenti di stato deve controllare lo stato corrente ad intervalli in un ciclo. Non puoi fare molto al riguardo. Questo è fondamentalmente ciò che "ascolto" è. (se è questo che vuoi dire?).
Jacob Vlijm,

se non c'è nient'altro che posso fare, allora sarò felice di sondare, ma voglio esserne sicuro. soprattutto che c'è questo inotifyche sembra fare qualcosa di molto simile a quello che voglio: en.wikipedia.org/wiki/Inotify - non l'ho usato, non so molto al riguardo però
vlad-ardelean,

Guarda qui: ibm.com/developerworks/library/l-inotify a quali descrizioni viene applicato Inotify. I loop non dovrebbero consumare una notevole quantità di risorse.
Jacob Vlijm,

Sei sicuro che i due comandi: rfkill block wifi e rfkill sblocco wifi stiano facendo il lavoro? Non fanno nulla sul mio wifi. ciò che funziona tuttavia è sudo service network-manager restartcome menzionato qui: askubuntu.com/a/399159/72216 . Se vuoi, posso fare un esempio "guarda" lo script.
Jacob Vlijm,

@JacobVlijm positivo. una "coincidenza" è esclusa. Forse abbiamo problemi diversi, ma è così che lo risolvo ogni volta facendo clic su "Disattiva rete" -> "Attiva rete" (o qualcosa di simile, non so davvero, uso Ubuntu in tedesco)
vlad-ardelean

Risposte:


3

Prima di tutto:

Ciò che descrivi come la risposta desiderata è ciò che in realtà chiami: anche io non voglio creare uno script che faccia costantemente sondaggi . Inotify viene anche utilizzato in un ciclo costante per "ascoltare" i cambiamenti nello stato corrente. In altre parole: l'altra opzione che si presume esista non esiste senza una sorta di ciclo.

Penso anche che la tua immagine di un loop sia troppo pesante. Su ogni sistema, in ogni applicazione ci sono numerosi loop attivi in ​​attesa di trigger. Non dovrebbe avere alcun effetto evidente sulle tue risorse.

L '"anatomia" di un tale meccanismo di azione sull'evento è sostanzialmente:

in un ciclo while:

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

In uno script bash

L'integrazione di questo script (per verificare la connessione) in un ciclo while (con alcune piccole modifiche) dovrebbe fare ciò che descrivi: ristabilire la connessione e inviare una notifica.

#!/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

In uno script Python

La funzione check()restituisce True o False . Se True (la connessione è attiva), non accade nulla. Se False , il tuo rfkill block wifi/ rfkill ublock wifiviene eseguito.

#!/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)

@ vlad-ardelean è questo quello che stai cercando?
Jacob Vlijm,

@JacomVlijm Grazie per la risposta dettagliata, ma non sarebbe stato un problema per me trovare questa soluzione, in pitone o bash. Ero molto curioso di gestire gli eventi. Metterò la tua risposta in ordine, ma non posso accettarla come risposta alla mia domanda. Posso accettare una risposta con la soluzione che desidero, o una che dice che è impossibile farlo come voglio.
vlad-ardelean,

@ vlad-ardelean vedi la mia risposta modificata.
Jacob Vlijm,

Grazie per l'impegno profuso per l'aiuto. A questo punto sono sostanzialmente costretto ad accettare la tua risposta: D
vlad-ardelean,

1

Il mio script per la gestione del login / logout WIFI GRATUITO e della connessione WIRELESS riconnettersi e riparare.

Si collega al wifi gratuito, effettua l'accesso, ottiene il tempo di connessione rimanente e attende fino allo scadere del tempo e controlla lo stato del wifi e di accesso e la connessione a Internet, si disconnette e si ripete.

Per l'invio di notifiche all'utilizzo dell'ambiente desktop

notify-send "YOUR MESSAGE HERE"

La riparazione della connessione WiFi è gestita nella funzione 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.