Raspberry. Script som kollar om internet är tillgängligt?

Trädvy Permalänk
Medlem
Plats
Dalarna
Registrerad
Apr 2016

Raspberry. Script som kollar om internet är tillgängligt?

Har funderat på ett script (cron-drivet) som kollar om internet är tillgängligt och om det är så sätts en skapad miljövariabel som sen kan läsas av ett program som rullar och går.
Tänkt ha det till och avgöra om NTP ska aktiveras och mail kan/ska skickas från programmet.

Frågan är; Är det rätt tänkt? Eller finns enklare metoder?

Trädvy Permalänk
Medlem
Plats
Hedesunda
Registrerad
Dec 2005

Använd t.ex. ping grep och if. Det finns många sätt att flå en katt. https://unix.stackexchange.com/questions/180659/how-to-return...

Trädvy Permalänk
Medlem
Plats
Dalarna
Registrerad
Apr 2016

Ja. Det är då sant det där med katten. Jag har testat med system("ping xxxxx") i själva C-programmet men det stannar upp lite och det är inte bra. Därför så blir det ett script som får ta hand om detta i en separat process och som i sin tur sätter en miljövariabel. Jag ser inga protester vad gäller det tankesättet.

Trädvy Permalänk
Medlem
Plats
Trollhättan
Registrerad
Okt 2010

@Sweedland:

Med risk för att denna tråd är gammal, problemet redan är löst och jag återupplivar tråden i onödan.

Är du bekväm med att köra python script så skulle detta antagligen lösa det du är ute efter:

import os import pyping def ping_chk(ip_addr): ping_resp = pyping.ping(ip_addr) return bool(ping_resp.ret_code == 0) os.environ['PING_WORKS'] = str(ping_chk('1.1.1.1'))

Väldigt kort och simpelt. Modifiera med den miljövariablel och ip/fqdn du vill ha och anropa med python2.7. Observera att detta behöver köras som root.

Mvh
Mattias

Trädvy Permalänk
Medlem
Plats
Dalarna
Registrerad
Apr 2016
Skrivet av Mayth:

@Sweedland:

Med risk för att denna tråd är gammal, problemet redan är löst och jag återupplivar tråden i onödan.

Är du bekväm med att köra python script så skulle detta antagligen lösa det du är ute efter:

import os import pyping def ping_chk(ip_addr): ping_resp = pyping.ping(ip_addr) return bool(ping_resp.ret_code == 0) os.environ['PING_WORKS'] = str(ping_chk('1.1.1.1'))

Väldigt kort och simpelt. Modifiera med den miljövariablel och ip/fqdn du vill ha och anropa med python2.7. Observera att detta behöver köras som root.

Mvh
Mattias

Nädå. Tråden är inte gammal. Det finns olika metoder att kolla nätet och din Python version är en del-lösning.
Tack.

Trädvy Permalänk
Medlem
Plats
Västra Götaland
Registrerad
Okt 2016

Fyller på tråden med ett suveränt bash script.

#!/bin/bash

# Requirements:
Kopiera denna kod och spara some /home/user/connectionmonitor.sh
# Du behöver fping beep och cron
# Kommentera ut pcspkr snd-pcsp i /etc/modprobe.d/blacklist.conf
# chmod +x /home/administrator/ConnectionMonitor.sh
# Addad följande i crontab -e som root
# @reboot sleep 120 && /home/user/ConnectionMonitor.sh

#################################################################################
# SETTINGS
TEST="8.8.8.8" # TEST PING
ADAPTER1="eth0" # EXTERNAL ETHERNET ADAPTER

# Report
LOGFILE=/home/user/.logs/connectionmonitor

# Messages
MESSAGE1="Restoring Connectivity..."
MESSAGE2="Wait a moment please..."
MESSAGE3="No Internet connectivity."
MESSAGE4="Yes, there is Internet connectivity."
#################################################################################

# Time and Date
TODAY=$(date "+%r %d-%m-%Y")

# Show IP Public Address
IPv4ExternalAddr1=$(ip addr list $ADAPTER1 |grep "inet " |cut -d' ' -f6|cut -d/ -f1)
IPv6ExternalAddr1=$(ip addr list $ADAPTER1 |grep "inet6 " |cut -d' ' -f6|cut -d/ -f1)

# Alarm
alarm() {
beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550$
}

# Restoring Connectivity
resolve() {
clear
echo "$MESSAGE1"
sudo ifconfig $ADAPTER1 up;sudo dhclient -r $ADAPTER1;sleep 5;sudo dhclient $ADAPTER1
echo "$MESSAGE2"
sleep 120
}

# Execution of work
while true; do
if [[ "$(fping -I $ADAPTER1 $TEST | grep 'unreachable' )" != "" ]]; then
alarm
clear
echo "================================================================================" >> ${LOGFILE}
echo "$MESSAGE3 - $TODAY" >> ${LOGFILE}
echo "$MESSAGE3 - $TODAY"
echo "================================================================================" >> ${LOGFILE}
sleep 10
resolve
else
clear
echo "================================================================================" >> ${LOGFILE}
echo "$MESSAGE4 - $TODAY - IPv4 Addr: $IPv4ExternalAddr1 - IPv6 Addr: $IPv6ExternalAddr1" >> ${LOGFILE}
echo "$MESSAGE4 - $TODAY - IPv4 Addr: $IPv4ExternalAddr1 - IPv6 Addr: $IPv6ExternalAddr1"
echo "================================================================================" >> ${LOGFILE}
sleep 120
fi
done

Tappar du anslutning så kommer den att återansluta, du kan se i logfilen när den tappade anslutning m.m

Följa mina trådar hur jag gång på gång avslöjar Telias backdörrar som dom planterat på din Technicolor router. Dom ser till och med när du startar och stänger av routern på sekunden, inte nog med det. Dom loggar det också!!!

https://wuseman.github.io/TG799vac-Xtream-V16.2-JADE/
https://wuseman.github.io/TG799VAC-XTREME-17.2-MINT/

Trädvy Permalänk
Medlem
Plats
Trollhättan
Registrerad
Okt 2010

@Sweedland: Ja det är helt klart en dellösning. Och något som jag skrev ihop snabbt på en tågresa.

Så det går helt klart att utveckla vidare. Det bör förslagsvis till lite kod för logging och för att få det att rulla i bakgrunden. Om man nu inte vill anropa det från cron hela tiden dvs.

Att anropa via cron är dock ingen snygg lösing om man skriver det i python, då skulle jag välja att skriva det för att kolla med jämna mellanrum och uppdatera systemvariabeln därefter, sen anropa det vid boot efter network-taget med hjälp av systemd.

Bash scriptet som @wuseman skickade är åxå en trevlig lösning!

Mvh
Mattias

Trädvy Permalänk
Medlem
Plats
Dalarna
Registrerad
Apr 2016
Skrivet av Mayth:

@Sweedland: Ja det är helt klart en dellösning. Och något som jag skrev ihop snabbt på en tågresa.

Så det går helt klart att utveckla vidare. Det bör förslagsvis till lite kod för logging och för att få det att rulla i bakgrunden. Om man nu inte vill anropa det från cron hela tiden dvs.

Att anropa via cron är dock ingen snygg lösing om man skriver det i python, då skulle jag välja att skriva det för att kolla med jämna mellanrum och uppdatera systemvariabeln därefter, sen anropa det vid boot efter network-taget med hjälp av systemd.

Bash scriptet som @wuseman skickade är åxå en trevlig lösning!

Mvh
Mattias

Fördelen med bash är att jag redan fuskar i bash. Ska jag ge mig in i Python också blir det en grej ytterligare att lära sig halvdant. "Ett steg i taget..."

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Okt 2003

@Sweedland: Något som inte täckts av föregående svar är att du inte direkt kan dela miljövariabler mellan ett script som kör via cron, och ett program (t.ex. skrivet i C som du nämner) som exekverar separat, även om även detta startas via cron. De kör i olika kontext så du behöver hitta något annat sätt att dela informationen. T.ex. en fil eller liknande.

Speldator: Fractal Design Meshify C, Core i7-8700k @ 5,0 GHz (AVX -3) luftkyld med Cryorig R1 Universal, Asrock Z370 Fatal1ty Professional Gaming i7, 64 GB Corsair Dominator Platinum @ 3466 MHz CL16 (XMP), ASUS ROG Strix GeForce GTX 1080 Ti Gaming, Win10 Pro, Acer XB271HU (gamla bilder med GTX 970)
i7-8700k 5.0 GHz OC: CPU 50x, Vcore 1,310V, LLC 2 (1=max, 5=min), BCLK 100.0, AVX offset -3, Cache 45x
Server: Xeon E3-1226v3 3,3 GHz, 32 GB ECC DDR3, VMware ESXi 6, 10 Gbps fiber

Trädvy Permalänk
Medlem
Plats
Dalarna
Registrerad
Apr 2016
Skrivet av kai:

@Sweedland: Något som inte täckts av föregående svar är att du inte direkt kan dela miljövariabler mellan ett script som kör via cron, och ett program (t.ex. skrivet i C som du nämner) som exekverar separat, även om även detta startas via cron. De kör i olika kontext så du behöver hitta något annat sätt att dela informationen. T.ex. en fil eller liknande.

Ha ha Ja. Jag har försökt med delade miljövariabler och läst på om det. Olika processer gör att det blir drygt. Det samlade svaret var "dela via fil". Det funkar utmärkt på Ram-disken btw.