[sage] Hilfe bei Nagios-Addon "NSCA" für IPv6

Johannes Hubertz johannes at guug.de
Tue Sep 6 22:53:01 CEST 2011


Guten Abend Christoph,
hallo sage,

On Tuesday 06 September 2011 11:27:04 Christoph Wegener wrote:
> Bei NSCA habe ich aber irgendwie Probleme, den Dienst als
> Standalone-Daemon auf IPv6 zu bekommen, wenn ich bei server_adress
> ein ::1 eintrage, kriege ich ein Segfault. Wenn ich nichts angebe,
> lauscht der Server nur auf IPv4.
>
> Hat jemand von Euch vlt eine lauffähige Konfigurationsdatei für mich,
> die IPv4 _und_IPv6 unterstützt, der Server also unter IPv4 und IPv6
> erreichbar ist? Oder muss beim Compilieren irgendetwas besonderes
> gemacht werden? Oder geht das Ganze (nur) über (X)Inetd?
>
> BTW: System ist Debian Squeeze, die Quellen stammen aus dem git auf
> git.icinga.org, mittels " wget
> "https://git.icinga.org/?p=icinga-nsca.git;a=snapshot;h=HEAD;sf=tgz"
> -O nsca.tgz" gezogen.

Danke fuer die Quellenangabe. Das machte bei mir auch mit einer 
IPv6-Adresse erstmal ein solches eigentuemliches Verhalten und dann 
habe ich mir das mals mit strace und vi angesehen. Es ist immer wieder 
verwunderlich, wie schlecht sich strings auf pointer kopieren lassen. 
Bei mir funktioniert es nun mit einer IPv4-Adresse oder einer 
IPv6-Adresse. Da in der Quelle keinerlei Analyse ueber den String nach 
dem 'server_address=' erfolgt, bleibt es auch bei dem entweder v4 oder 
v6. 

Es folgt ein diff auf nsca.c, damit funktioniert es bei mir ebenfalls 
unter squeeze.

--------------------8<----------------8<------------------8<---
diff --git a/nsca.c b/nsca.c
index 2943768..94ab0c7 100644
--- a/nsca.c
+++ b/nsca.c
@@ -24,7 +24,18 @@
 
 
 char *server_port=DEFAULT_SERVER_PORT;
+// this is possibly as wrong as server_address was broken,
+// but caused no sigsegv during my tests ;-)
+
+/* Johannes Hubertz added this comment on Sept. 6th 2011 because of 
sigsegv
+ * hello c-guys,
+ * its a common misbehavior to store strings in pointers
+ * and usually it fails for ?unknown? reason 8-()
+ * next line is wrong in mind, not in syntax! Believe it!
 char    *server_address=NULL;
+ * make it better by using arrays of chars, that helps!  */
+char   server_address[MAX_INPUT_BUFFER];
+
 static int socket_timeout=DEFAULT_SOCKET_TIMEOUT;
 static int log_facility=LOG_DAEMON;
 
@@ -381,7 +392,8 @@ static int read_config_file(char *filename){
 			server_port=strdup(varvalue);
 
 		else if(!strcmp(varname,"server_address")){
-                        
strncpy(server_address,varvalue,sizeof(server_address) - 1);
+                        //strncpy(server_address,varvalue,sizeof(server_address) - 
1);
+			strcpy(server_address, varvalue);
                         server_address[sizeof(server_address)-1]='\0';
                         }
 		else if(strstr(input_buffer,"command_file")){
@@ -778,7 +790,8 @@ static void wait_for_connections(void) {
 	addrinfo.ai_protocol=IPPROTO_TCP;
 
 	if(!server_address || !strlen(server_address)) {
-		server_address = NULL;
+		//server_address = NULL; see comment at definition of this var
+		memset(&server_address[0], 0, sizeof(char));
 		addrinfo.ai_flags=AI_PASSIVE;
 		}
 	if (rval = getaddrinfo(server_address, server_port, &addrinfo, 
&res) != 0) {
--------------------8<----------------8<------------------8<---
Das ist immer noch reichlich haesslich, aber es tut. Ich habe nur mit: 

nsca -c nsca.cfg --daemon 

getestet, wenn das in der inittab gestartet wird, sollte man stets einen 
lauschenden Service vorfinden. Und mit zwei configs kann man IPv4 und 
IPv6 bedienen. Ach wie modern. ;-)

Die Schreibweise mit IPv6-Adresse in eckigen Klammern funktioniert 
nicht. Hinter dem '=' steht die Adresse und wird ohne jede Pruefung auf 
Sinnhaftigkeit als String direkt dem getaddrinfo untergeschoben. Ob das 
mal sicher ist? Admins machen ja nie Fehler, oder?

Freudliche Gruesse aus z.Zt. Niederselters i.Ts.
Frohes Schaffen

Johannes
PS: Weitergabe des Patches gerne erlaubt, echo auch gerne gesehen.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 489 bytes
Desc: This is a digitally signed message part.
Url : http://lists.guug.de/pipermail/sage/attachments/20110906/65f8fc6f/attachment.pgp 


More information about the SAGE mailing list