Hallo Himbeer-Fans, Linux-Freaks und Forumsbewohner,
vor ein paar Wochen habe ich mir ein kleines Programm geschrieben, das still und ressourcenschonend im Hintergrund läuft, ein paar Dateien überwacht und "korrigiert", wenn dadurch die Verbindung zum LAN / Internet verloren geht, weil die Fehlermeldung "Unable to reselve hostname" dazwischen funkt.
Wenn's mal wieder hakt, behebt das Programm auf Knopfdruck den Fehler - und es läuft wieder - oder es behebt den Fehler automatisch und der Anwender merkt gar nichts, außer dass ein Zähler bei jeder Korrektur hochzählt.
Version 1: mit GUI:
############################################################################
#
# File: /home/pi/icon9_51/bin/host-repair.icn
#
# Subject: Program to repair error message "unable to resolve hostname"
# Author: Andreas Schulz
#
# Date: March 2, 2014
#
############################################################################
link vsetup
global vidgets, root, errors, refresh_delay, AutoRepair
$define file1 "/etc/resolv.conf"
procedure main(args)
local paused
errors := 0
(WOpen ! ui_atts()) | stop("can't open window")
vidgets := ui() # set up vidgets
root := vidgets["root"]
refresh_delay := VGetState(vidgets["sbar1"])
AutorRepair := &null
VSetState(vidgets["radio_button1"], "Aus")
repair()
paused := &null # flag no work to do
repeat
{ while (*Pending() > 0) | \paused do
{
ProcessEvent(root, QuitCheck)
}
if \AutoRepair then repair()
delay(1000 * refresh_delay)
}
end
procedure repair()
server := inet := ""
VSetState(vidgets["text_input1"], server)
VSetState(vidgets["text_input2"], inet)
while server == "" do
{ pipe := open("cat " || file1 || " | grep nameserver | awk '{print $2}'", "p") | stop("Kann ", file1, " nicht öffnen")
server := read(pipe)
if server == "" then # IP des Gateway
{ system("echo \"nameserver 192.168.2.1\" | sudo tee -a " || file1) | write(1)
errors +:= 1
ping := open("ping 192.168.2.1") # IP des Gateway
while connect := read(ping) do write(image(connect))
close(ping)
if image(connect) == "connect: Network is unreachable" then Notice("Router ist nicht erreichbar")
}
else VSetState(vidgets["text_input1"], server)
close(pipe)
}
connect := &null
while inet == "" do
{ pipe := open("ifconfig eth0 | grep inet | awk '{print $2}'", "p") | stop("Fehler bei ifconfig eth0")
inet := read(pipe)
if inet == "" then
{ ping := open("ping 192.168.2.107", "p") | stop(78) # eigene IP-Adresse
if conn := write(read(ping)) then
{ while connect := read(ping) do
{ conn := connect
write("Inet connect: ", conn)
}
if conn == "connect: Network is unreachable" then Notice("LAN-Kabel ist nicht eingesteckt")
}
else Notice("Keine LAN-Verbindung")
close(ping)
system("sudo dhclient eth0")
errors +:= 1
}
else VSetState(vidgets["text_input2"], inet[1 + find(":", inet):0])
close(pipe)
}
if errors > 0 then WAttrib("label=" || errors || " errors")
end
procedure button_cb2(vidget, value)
exit()
end
procedure radio_button_cb1(vidget, value)
case value of
{"An": AutoRepair := 1
"Aus": AutoRepair := &null
}
end
procedure sbar_cb1(vidget, value)
write("Slider ", value)
refresh_delay := value
write("Slider ", refresh_delay)
end
procedure text_input_cb1(vidget, value)
return value
end
procedure text_input_cb2(vidget, value)
return value
end
#===<<vib:begin>>=== modify using vib; do not remove this marker line
procedure ui_atts()
return ["size=244,242", "bg=#b05000","label=Host-Repair"]
end
procedure ui(win, cbk)
return vsetup(win, cbk,
[":Sizer:::0,0,244,242:",],
["button1:Button:regular::171,53,48,39:Repair",repair],
["button2:Button:regular::14,170,206,50:Q U I T",button_cb2],
["label1:Label:::18,6,66,13:Host-Repair",],
["label2:Label:::89,6,84,13:repairs error:",],
["label3:Label:::38,26,168,13:'unable to resolve hostname'",],
["label4:Label:::12,95,48,13:Refresh:",],
["label5:Label:::8,126,66,13:Auto-Repair",],
["label6:Label:::78,108,6,13:0",],
["label7:Label:::191,108,24,13:60 s",],
["radio_button1:Choice::2:75,125,47,42:",radio_button_cb1,
["An","Aus"]],
["sbar1:Scrollbar:h:1:63,94,152,15:0.0,60.0,2.5",sbar_cb1],
["text_input1:Text::15:5,53,160,19:Nameserver\\=",text_input_cb1],
["text_input2:Text::15:22,73,142,19:Host-IP\\=",text_input_cb2],
)
end
#===<<vib:end>>=== end of section maintained by vib
Alles anzeigen
Version 2: ohne GUI:
############################################################################
#
# File: /home/pi/icon9_51/bin/host-repair.icn
#
# Subject: Program to repair error message "unable to resolve hostname"
# Author: Andreas Schulz
#
# Date: March 2, 2014
#
############################################################################
global errors, refresh_delay, AutoRepair
$define file1 "/etc/resolv.conf"
procedure main(args)
local paused
if *args > 0 then
{ every i := 1 to *args do
{ case args[i] of
{"refresh": refresh_delay := args[i + 1]
"IP": IP := args[i + 1]
}
}
}
/refresh_delay := 5000
/IP := 107
AutoRepair := 1
write(refresh_delay)
write(IP)
write(image(AutoRepair))
errors := 0
repair()
repeat
{ if \AutoRepair then repair()
delay(refresh_delay)
}
end
procedure repair()
server := inet := ""
while server == "" do
{ pipe := open("cat " || file1 || " | grep nameserver | awk '{print $2}'", "p") | stop("Kann ", file1, " nicht öffnen")
server := read(pipe)
if server == "" then # IP des Gateway
{ system("echo \"nameserver 192.168.2.1\" | sudo tee -a " || file1) | write(1)
errors +:= 1
ping := open("ping 192.168.2.1") # IP des Gateway
while connect := read(ping) do write(image(connect))
close(ping)
if image(connect) == "connect: Network is unreachable" then write("Host-repair: Router ist nicht erreichbar")
}
else write(server)
close(pipe)
}
connect := &null
while inet == "" do
{ pipe := open("ifconfig eth0 | grep inet | awk '{print $2}'", "p") | stop("Fehler bei ifconfig eth0")
inet := read(pipe)
if inet == "" then
{ ping := open("ping 192.168.2.107", "p") | stop(78) # eigene IP-Adresse
if conn := write(read(ping)) then
{ while connect := read(ping) do
{ conn := connect
write("Inet connect: ", conn)
}
if conn == "connect: Network is unreachable" then write("Host-repair: LAN-Kabel ist nicht eingesteckt")
}
else write("Host-repair: Keine LAN-Verbindung")
close(ping)
system("sudo dhclient eth0")
errors +:= 1
}
else write(inet)
close(pipe)
}
if errors > 0 then write("Host-Repair: ", errors, " errors")
end
Alles anzeigen
Das Programm ist in der Programmiersprache Icon geschrieben. Ihr könnt es gern in andere Sprachen übertragen. Aber denkt daran, Eure eigene IP-Adresse einzugeben - nicht meine darin zu lassen.
Link zum Tutorial, diese Sprache auf dem Raspberry zum Laufen zu bringen: Icon: Teil 1, Tutorial zum Erlernen der Programmiersprache Icon: Installation (EDIT: 08-OKT-2017 Link im alten Forum)
Link zum Tutorial, Geany zu einer IDE für Icon zu konfigurieren: Programmiersprache Icon, Teil 2: Installation und Konfiguration von Geany (EDIT: 08-OKT-2017 Link im alten Forum)
Viel Erfolg und beste Grüße
Andreas