1

Temat: [mało znane pakiety] pingcheck

W repozytorium OpenWrt można znaleźć się setki pakietów. Niektóre są mało znane, choć realizują ciekawe funkcje. Jednym z nich jest pingcheck.
Jak nazwa sugeruje program robi ping określonego hosta i zwraca informacje o jego dostępności. Możliwe jest także uruchomienie skryptu w przypadku braku odpowiedzi lub w przypadku pojawienia się pingów. pingcheck można wykorzystać do sprawdzenia stanu hostów lub istnienia dostępu do internetu z interfejsów bez korzystania ze skryptów uruchamianych np. w cronie.

Instalacja
# opkg update
# opkg install pingcheck
Konfiguracja

Zawarta jest w pliku /etc/config/pingcheck. Domyślnie wygląda tak:

config default
    option host 8.8.8.8
    option interval 10
    option timeout 30

config interface
    option name wan

config interface
    option name sta

Będzie sprawdzany host 8.8.8.8 (dnsy google) co 10s z timeoutem 30s. Sprawdzenie będzie dotyczyło dwóch interfejsów zdefiniowanych w sekcjach wan oraz sta. Można dodać kolejne sekcje option interface z własnymi interfejsami.
Podczas definicji należy pamiętać że dla protokołów qmi/ncm/mbim prawdziwym interfejsem realizującym połączenie z internetem jest wan_4 a nie wan.

Wynik działania

* ubus

Stan interfejsów można sprawdzić "ręcznie" wydając odpowiednie polecenie korzystające z ubusa:

# ifdown wan
# ubus call pingcheck status
{
    "status": "OFFLINE",
    "online_interfaces": [
        
    ],
    "known_interfaces": [
        "wan",
        "sta"
    ]
}
# ifup wan
# ubus call pingcheck status
{
    "status": "ONLINE",
    "online_interfaces": [
        "wan"
    ],
    "known_interfaces": [
        "wan",
        "sta"
    ]
}

W ten prosty sposób można sprawdzić stan wszystkich interfejsów. Jeżeli chcemy wykorzystać wynik do własnych skryptów, to można przefiltrować to przez program jsonfilter lub wykorzystać skrypty systemowe OpenWrt.
Możemy także zapytać się o stan konkretnego interfejsu:

# ubus call pingcheck status '{"interface":"wan"}'
{
    "status": "NO_ROUTE",
    "interface": "wan",
    "device": "wwan0",
    "percent": 0,
    "sent": 0,
    "success": 0
}
# ubus call pingcheck status '{"interface":"wan_4"}'
{
    "status": "ONLINE",
    "interface": "wan_4",
    "device": "wwan0",
    "percent": 100,
    "sent": 8,
    "success": 8
}

* automatyka

Jak już wspomniałem, pingcheck umożliwia automatyczne wykonywanie skryptów w przypadku zaniku lub pojawienia się pingów. Tworzymy odpowiednie katalogi:

# mkdir -p /etc/pingcheck/offline.d
# mkdir -p /etc/pingcheck/online.d

Skrypty umieszczone w nich będą wykonywane odpowiednio w przypadku zaniku pingów lub ich pojawiania się. Do testów można zrobić prosty program:

# touch /etc/pingcheck/offline.d/nie-ma-pingow.sh
# chmod 755  /etc/pingcheck/offline.d/nie-ma-pingow.sh 
# vi /etc/pingcheck/offline.d/nie-ma-pingow.sh 

Umieszczamy w nim następujący kod:

#!/bin/sh
logger "Brak pingow w sekcji $INTERFACE na $DEVICE"
exit 0

Jeżeli zrobimy teraz ifdown wan to w logach (logread) pojawi się coś takiego:

Fri Apr  6 20:29:37 2018 daemon.info pingcheck[1225]: Interface 'wan' event DOWN
Fri Apr  6 20:29:37 2018 daemon.info pingcheck[1225]: Interface 'wan' changed to DOWN
Fri Apr  6 20:29:37 2018 daemon.notice pingcheck[1225]: Scheduling 'offline' scripts for 'wan'
Fri Apr  6 20:29:37 2018 daemon.info pingcheck[1225]: Interface 'wan_4' event DOWN
Fri Apr  6 20:29:37 2018 daemon.info pingcheck[1225]: Interface 'wan_4' changed to DOWN
Fri Apr  6 20:29:37 2018 daemon.notice pingcheck[1225]: Scheduling 'offline' scripts for 'wan_4'
Fri Apr  6 20:29:37 2018 daemon.notice pingcheck[2773]: Running 'offline' scripts for 'wan'
Fri Apr  6 20:29:38 2018 user.notice root: Brak pingow w sekcji wan na wwan0
Fri Apr  6 20:29:38 2018 daemon.notice pingcheck[2783]: Running 'offline' scripts for 'wan_4'
Fri Apr  6 20:29:38 2018 user.notice root: Brak pingow w sekcji wan_4 na wwan0

Oczywiście skrypty można dowolnie rozbudować stosowanie do własnych potrzeb. Więcej informacji na stronie projektu: https://github.com/br101/pingcheck, choć należy pamiętać że pakiet zawarty w OpenWrt jest starszą wersją i nie zawiera kilku opcji.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.