Sie sind nicht angemeldet.

21

24.12.2010, 12:35

den Link zu einem tool gepostet, das das alles übernimmt und eine Reihe Modem/Router erkennt.

Ich habe in Beitrag #11 geschrieben, daß ich das von ddclient machen lasse. Link war da keiner drin, aber es ist über die Paketverwaltung erhältlich.
Es kann das Modem nicht selbst erkennen, dazu ist etwas Konfiguration nötig.
Man kann sich aber auch andere Möglichkeiten der IP-Erkennung aussuchen. Zur Not auch über's Web, und da wäre ihm dann tatsächlich ein Modemwechsel völlig wurscht. (Diese Methode verwende ich aber aus oben genannten Gründen nicht)
Beim Erstellen dieser Nachricht kamen keine Tiere zu Schaden.
me is all sausage
but don't call me Ferdl

22

28.12.2010, 12:01

Wie von floggy richtig gesagt, geht es mir auch ums scripten lernen. Warum ich es dann ausgerechnet so mache? Nun viele Wege führen nach Rom. Für ein und das selbe Problem gibt es sehr viele Lösungen. Wenn ich anfange fertige Software zu benutzen habe ich nichts davon, wenn ich selber auf eine Lösung des Problems kommen will. Das ganze hier hat also einen eher sportlichen Charakter. Vorteile sind wie schon weiter oben beschrieben die Mobilität des Scripts auf andere Linux OS und der Wechsel des Routers ohne Anpassungen machen zu müssen. Nachteilig ist natürlich der hohe Programmieraufwand und die damit verbundene Beachtung so vieler Fehlerfälle usw. Aber mal als Parallelbeispiel das Programmieren in Java. Hier kann man sich selber ne Waffel über Stringformatierungen oder ein und Ausgabe Streams machen. Genauso kann man aber auch fertige Libraries benutzen, die alles übernehmen, aber nicht immer auf jedem Rechner vorhanden sind, oder weitere Abhängigkeiten verursachen.
Ich hoffe damit habe ich nun meine Gründe deutlich machen können. :)

So, nun wieder zurück zum eigentlichen Problem:
Das Problem mit der Temporär falschen IP, ist mir bekannt. Da ich wie gesagt nicht auf Jedes kleine Problem reagieren kann, habe ich diese bei meinem Überlegungen unter der Gruppe "extern Problems" zusammen gefasst. Da das Skript alle 10 min ausgeführt wird, ist das also die Zeitspanne in der Fehler bei der IP möglich sind. Das ist aber nicht so schlimm, da davon nichts abhängt, dann probiert man es halt nach 10 min nochmal.

Thema WebGUI/ssh:
Wenn ich als Alternative Lösung das mit dem Zugang zur WebGUI auch mit Standartsoftware schaffen kann, dann würde ich es gerne einmal ausprobieren. Da man nicht davon ausgehen kann, das jeder Routerhersteller dem Endbenutzer einen ssh Zugang (von Haus aus) zur Verfügung stellt, bin ich für die Lösung über die WebGUI. Problem daran wird wohl sein, die Passwortabfrage sicher zu gestalten. Bei meinem Router ist das alles über https gesichert.

Mfg Shamaz

EDIT:

So hab gerade nochmal das mit der Umleitung von echo ausprobiert. wowi, deine Lösung war leider nicht ganz die richtige, habs aber selber heraus bekommen. der Befehl sieht jetzt so aus:

Quellcode

1
 echo 2>/dev/null "Teststring nach $workpath/$filename" > $workpath/$dummyfilename 


Mfg Shamaz

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Shamaz« (28.12.2010, 13:00)


23

28.12.2010, 13:59

Das ganze hier hat also einen eher sportlichen Charakter.
Sport ist gut, denn er hält (hier zumindest geistig) fit. :)
Unser Problem ist, daß wir gewohnt sind, konkrete Probleme zu überdenken, die meistens auf einen Einzelfall beschränkt sind. Daher auch die eher effizienten, weil erprobten Tipps. Natürlich spricht nichts dagegen, gemeinsam alternative Wege zu diskutieren.

Dein Ansatz, eine universelle Lösung zu kreieren, die überall mit Boardmitteln funktioniert, ist natürlich klasse. Die Kehrseite ist aber, daß sich mit der Universalität auch die dafür eingegangenen Kompromisse (aka "extern Problems") mehren. Nur so als Beispiel: Wenn einer deiner Anwender vielleicht schon an seinem Router geschraubt hat und dieser jetzt externe Pings gar nicht beantwortet... Für so einen Fall würde ich eine Unterkategorie "fatal external problems" vorsehen. :)

Problem daran wird wohl sein, die Passwortabfrage sicher zu gestalten.
Der Weg über's WebUI ist bei der geforderten Kompatibilität natürlich nicht nutzbar, da die alle verschieden sind. Dennoch auch hierzu ein Tipp: Ich habe mir dafür am Router einen weiteren, wenig privilegierten User angelegt, der lediglich die Verbindungsdaten abfragen kann. Mit diesem Usernamen bekommt mein ddclient seine benötigten Informationen heraus.
Beim Erstellen dieser Nachricht kamen keine Tiere zu Schaden.
me is all sausage
but don't call me Ferdl

24

06.01.2011, 17:55

Tja, schade das mit der WebGUI. Aber egal. Ich bin eigentlich mit dem Ergebnis zufrieden. Habs jetzt auch schon seit ca. 2 Wochen produktiv im Einsatz. Da mir hier so fleißig geholfen wurde und ich nen Fan vom Freeware bin, poste ich hier mal das Ergebnis. Natürlich für jeden der es haben will frei :D

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#!/bin/bash

#########################################################################
# Autor: Shamaz								#
# Datum: 06.01.2011							#
# Version: 2.2								#
# Beschreibung: Script für Bash um über Linux Standartprogramme		#
#		die externe IP eines Routers heraus zu bekommen		#
#		und in Abhaengigkeit dessen einen Dienst(eng.: Deamon)	#
#		neu zu starten, sollte sich diese im Vergleich zum	#
#		Vorherigenmale geaendert haben.				#
#									#
# Verwendete Programme: Ping, echo, test, date, head, sed		#
#########################################################################

##########################################
# Variablendeklaration + Initialisierung #
##########################################

 workpath="/tmp"
 filename="<Dateiname fuer alte IP>"
 logfilename="<Dateiname fuer Log>"
 deamonpath="<Pfad zum Deamon(default: /etc/ini.d)>" # WICHTIG: OHNE Slash am Ende
 deamonname="<Dienstname>"
 dynamicdns="<Dynamic DNS>"
 dummyfilename="dummy"
 writeable=0
 defaultip="0.0.0.0"
 external_router_ip_current=""
 external_router_ip_old=""

############################################################
# Test ob schreiben nach /$workpath/$filename moeglich ist #
############################################################
timestamp=$(date +'%d.%m.%Y %H:%M:%S')
echo "$timestamp INFORMATION: Teste Schreibrechte auf $workpath/"
echo 2>/dev/null "Teststring nach $workpath/$filename" > $workpath/$dummyfilename

#########################################################################
# Wenn Schreiben moeglich war, dann globale Variable fuer Exitcode $?=0 #
#########################################################################
if test $? -eq 0

 ###############################
 # Setzen des Flags $writeable #
 ###############################
 then
  writeable=1
 else
  writeable=0
 fi

########################################################################
# Wenn Schreiben moeglich ist wird Skript weiter ausgefuehrt       	#
# wenn nicht, wird das Skript beendet.                             	#
# Begruendung:                                                     	#
# Kann man die AlteIP nicht speichern, so wuerde jedesmal der      	#
# Test auf Gleichheit/Ungleichheit zu Gunsten der NeuenIP gehen,   	#
# was staendig den Dienst neu starten wuerde. Das waere aber schlecht. #
########################################################################
if test "$writeable" -eq 1
 then
  timestamp=$(date +'%d.%m.%Y %H:%M:%S')
  echo "$timestamp INFORMATION: Erstellen Dummydatei erfolgreich"
  echo "$timestamp INFORMATION: Erstellen Dummydatei erfolgreich" >> $workpath/$logfilename
  timestamp=$(date +'%d.%m.%Y %H:%M:%S')
  echo "$timestamp INFORMATION: loesche Dummydatei wieder"
  echo "$timestamp INFORMATION: loesche Dummydatei wieder" >> $workpath/$logfilename
  rm $workpath/$dummyfilename
  
  #######################################################
  # Test ob Datei mit AlterIP nicht existiert. 		#
  # Negative Abfrage, weil nur der Fall interessant ist.#
  # Sollte die Datei nicht existieren, dann wird eine 	#
  # mit der $defaultip erstellt				#
  #######################################################
  if test ! -f $workpath/$filename
   then
	timestamp=$(date +'%d.%m.%Y %H:%M:%S')
	echo "$timestamp ERROR: Datei $workpath/$filename existiert nicht"
	echo "$timestamp ERROR: Datei $workpath/$filename existiert nicht" >> $workpath/$logfilename
	timestamp=$(date +'%d.%m.%Y %H:%M:%S')
	echo "$timestamp INFORMATION: Erstelle $workpath/$filename mit default IP: <$defaultip>"
	echo "$timestamp INFORMATION: Erstelle $workpath/$filename mit default IP: <$defaultip>" >> $workpath/$filename
	echo "$defaultip" > $workpath/$filename
  fi
	#############################
	# Auslesen des Dateiinhalts #
	#############################
	external_router_ip_old=$(head -n1 "$workpath/$filename");

	timestamp=$(date +'%d.%m.%Y %H:%M:%S')
	echo "$timestamp INFORMATION: AlteIP ist: $external_router_ip_old"
	echo "$timestamp INFORMATION: AlteIP ist: $external_router_ip_old" >> $workpath/$logfilename

	###############################################################
	# Ermittelt via ping, head und sed die Externe IP des Routers #
	###############################################################
	external_router_ip_current=$(ping -n -c1 $dynamicdns 2>/dev/null | head -n1 | sed -E 's/.*\(([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\).*/\1/g')

	#####################################################################
	# Wenn Ping erfolgreich dann kann weiter gemacht werden, 		#
	# wenn nicht ist ein Fehler aufgetreten und das Skript wird beendet #
	#####################################################################
	if test -n "$external_router_ip_current"
 	then
  	timestamp=$(date +'%d.%m.%Y %H:%M:%S')
  	echo "$timestamp INFORMATION: Ping war erfolgreich, NeueIP ist: $external_router_ip_current"
  	echo "$timestamp INFORMATION: Ping war erfolgreich, NeueIP ist: $external_router_ip_current" >> $workpath/$logfilename

  	##################################
  	# Eigentlicher Vergleich der IPs #
  	##################################
  	if test "$external_router_ip_old" != "$external_router_ip_current";
   	then
    	timestamp=$(date +'%d.%m.%Y %H:%M:%S')
    	echo "$timestamp INFORMATION: AlteIP <$external_router_ip_old> ist ungleich NeueIP <$external_router_ip_current>"
    	echo "$timestamp INFORMATION: AlteIP <$external_router_ip_old> ist ungleich NeueIP <$external_router_ip_current>" >> $workpath/$logfilename

    	echo $external_router_ip_current > $workpath/$filename
    	timestamp=$(date +'%d.%m.%Y %H:%M:%S')
    	echo "$timestamp INFORMATION: Schreibe <$external_router_ip_current> nach $workpath/$filename"
    	echo "$timestamp INFORMATION: Schreibe <$external_router_ip_current> nach $workpath/$filename" >> $workpath/$logfilename

    	timestamp=$(date +'%d.%m.%Y %H:%M:%S')
    	echo "$timestamp INFORMATION: Starte $deamonname neu"

    	#####################################
    	# Neustart des $deamonname Dienstes #
    	#####################################
    	$deamonpath/$deamonname restart

    	####################################
    	# Test ob Neustart erfolgreich war #
    	####################################
    	if test $? -eq 0
     	then
      	timestamp=$(date +'%d.%m.%Y %H:%M:%S')
      	echo "$timestamp INFORMATION: $deamonname Restart erfolgreich"
      	echo "$timestamp INFORMATION: $deamonname Restart erfolgreich" >> $workpath/$logfilename
      	echo "$timestamp INFORMATION: Skript Ende" >> $workpath/$logfilename
      	echo
      	echo "Skript Ende"
      	echo
     	else
      	timestamp=$(date +'%d.%m.%Y %H:%M:%S')
      	echo "$timestamp ERROR: $deamonname Restart war NICHT erfolgreich!!!"
      	echo "$timestamp ERROR: $deamonname Restart war NICHT erfolgreich!!!" >> $workpath/$logfilename
      	echo "$timestamp INFORMATION: Skript Ende" >> $workpath/$logfilename
      	echo
      	echo "Skript Ende"
      	echo
    	fi
   	else
    	timestamp=$(date +'%d.%m.%Y %H:%M:%S')
    	echo "$timestamp INFORMATION: AlteIP <$external_router_ip_old> ist gleich NeueIP <$external_router_ip_current>, $deamonname wird NICHT neu gestartet"
    	echo "$timestamp INFORMATION: AlteIP <$external_router_ip_old> ist gleich NeueIP <$external_router_ip_current>, $deamonname wird NICHT neu gestartet" >> $workpath/$logfilename
    	echo "$timestamp INFORMATION: Skript Ende" >> $workpath/$logfilename
    	echo
    	echo "Skript Ende"
    	echo
  	fi
 	else
  	timestamp=$(date +'%d.%m.%Y %H:%M:%S')
  	echo "$timestamp WARNING: Ping war nicht erfolgreich, $deamonname wird nicht neu gestartet"
  	echo "$timestamp WARNING: Ping war nicht erfolgreich, $deamonname wird nicht neu gestartet" >> $workpath/$logfilename
  	echo "$timestamp INFORMATION: Skript Ende" >> $workpath/$logfilename
  	echo
  	echo "Skript Ende"
  	echo
	fi
 else
  timestamp=$(date +'%d.%m.%Y %H:%M:%S')
  echo "$timestamp ERROR: Keine Schreibrechte auf <$workpath/...>"
  echo 
  echo "Skript Ende"
  echo
fi


MFG Shamaz

25

07.01.2011, 00:00

Danke dafür.
Ich habs kurz getestet. Spasseshalber cups als daemon eingetragen, der sich als User aber nicht restarten lässt. Dem Script scheint das nicht viel auszumachen:

Quellcode

1
2
3
4
Restarting Common Unix Printing System: cupsdstart-stop-daemon: warning: failed to kill 4421: Operation not permitted
cupsd: Child exited with status 1!
 failed!
06.01.2011 23:55:16 INFORMATION: cups Restart erfolgreich
Klar läuft dieses Script normal mit root-Rechten, aber würde die Meldung im Fehlerfall anders aussehen?

Hier zum Spaß noch ein kürzerer sed für die IP:

Quellcode

1
external_router_ip_current=$(ping -n -c1 $dynamicdns 2>/dev/null | head -n1 | sed 's/).*//; s/.*(//')
Beim Erstellen dieser Nachricht kamen keine Tiere zu Schaden.
me is all sausage
but don't call me Ferdl

  • »Tronic69« ist männlich

Beiträge: 264

Registrierungsdatum: 01.09.2005

Derivat: Ubuntu

Architektur: 64-Bit PC

Desktop: Unity

Andere Betriebssysteme: neben Ubuntu beruflich Solaris sowie (leider) auch SLES 9-11

  • Nachricht senden

26

07.01.2011, 12:29

Hallo zusammen,

es wurde ja eigentlich schon alles gesagt, da ich es ein wenig zu spät gelesen habe ;)

Ich kann mich Fredl nur anschließen, dass der Programmierstil wirklich vorbildlich ist. Nur eines stört mich noch ein wenig an dem Script: Die unglaublich (minimale) Ressourcenverschwendung bei der Ermittlung der externen Router-IP ;)

Denn ein Ping muss im Hintergrund auch erst einen DNS-Lookup ausführen und damit kommen wir auf 4 beteiligte Programme/Tools - nämlich ping, nslookup oder getent, head und sed.

Daher hier der reinen Sportlichkeit wegen noch 3 weitere, einfachere Wege ohne Ping, der zusätzlichen Traffic auslöst. Es gine auch in 2 Schritten mit host oder falls dieses nicht installiert ist mit nslookup oder ganz minimalistisch mit getent:

Quellcode

1
2
3
external_router_ip_current=$(host $dynamicdns | awk ' $3~/address/ { print $NF }')
external_router_ip_current=$(nslookup $dynamicdns | awk ' $1 ~ /Address/ && $NF !~ /#53/ { print $NF }')
external_router_ip_current=$(getent hosts $dynamicdns | awk '{ print $1 }')

Wobei der DNS-Name des Rechners $dynamicdns allerdings nicht in der /etc/hosts stehen darf ;)

EDIT:
Zum Logging ist mir noch was eingefallen. Anstatt dem doppelten Aufruf von echo jedesmal ginge auch folgender Einzeiler:

Quellcode

1
echo "<Text>" | tee -a $workpath/$logfilename
Das gibt den Text auff der Standardausgabe aus und hängt ihn an die Datei an.
Wenn die Klügeren immer nachgeben, geschieht immer das was die Dummen wollen! 8)
Wollen wir das wirklich ???

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Tronic69« (07.01.2011, 12:39)


27

12.01.2011, 19:55

Uhii, klasse. Die Änderungen klingen echt gut. Wenn ich mal die Zeit finde, werde ich die übernehmen. Hoffe mal, der Tread besteht dann noch, könnte nämlich ne Weile dauern.

Danke an euch

Mfg Shamaz

Zurzeit ist neben Ihnen 1 Benutzer in diesem Thema unterwegs:

1 Besucher