[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: DSL-IP protokollieren



Am Montag, den 19.01.2009, 12:54 +0100 schrieb Peter Schütt:
> Hallo,
> ich würde gerne, die IP-Adresse, die ich von meinen DSL-Provider bekomme,
> mit protokollieren, und zwar mit TimeStamp und Uhrzeit.
> Wenn es etwas fertiges dazu gibt, würde ich das nehmen.
> 
> Ansonsten würde ich es gerne just for fun einmal selber basteln.
> 
> Zum ersten bräuchte ich ein Skript, womit ich meine aktuelle IP ermittele.
> Da gibt es schon vieles fertiges, was ich hier in der Liste schon gehört
> habe.
> Kurze Frage dazu: Gibt es da schon etwas fertiges im Debian-Repository?
> 
> Dann hatte ich es mir so gedacht, daß die aktuelle IP-Adresse in einer Datei
> gespeichert wird (/var/run/remote-ip oder so).
> Ein Cron-Job fragt jeder Minute nach der aktuellen IP-Adresse.
> Unterscheidet sie sich von der in der Datei, dann wird in die Log-Datei
> geschrieben, ansonsten passiert nichts.
> Die Log-Datei muß natürlich mittels log-rotate verwaltet werden.
> Außerdem soll das möglichst Debian-Konform gebastelt werden (Verwendung
> von /etc/init.d/remote-ip start|stop|restart, soll beim Boot automatisch
> gestartet werden und darf möglichst keine Resourcen verbrauchen, weil es ja
> eigentlich nur Spielerei ist.
> 
> Da ich aber einen lokalen Webserver mittels no-ip.com betreibe, bin ich auf
> das Ergebnis schon gespannt.
Kurzes Vorwort: Für den Fall, dass du kein Problem damit hast, einen
no-ip.com oder sonstwas zuzulegen, hätte ich da noch ein kleines
Programm, dass ich mir vor einiger Zeit mal geschrieben hatte, um die IP
meines Routers zu bekommen und via Cron minütlich zu erfassen und mir
auch von Cron im Falle eines Wechsels die Daten in mein Postfach legen
lassen.

Ich erlaube mir mal den Quelltext hier mit reinzuschreiben, ist nicht
sehr groß. Bei weiteren Fragen, kann man mich dann auch gerne Privat
anschreiben, falls das ganze nicht unbedingt hier her gehört.

Das ganze ist in einfachem C gehalten und erfordert keine speziellen
Bibliotheken. Ein einfaches 'gcc -o ip-logger ip-logger.c' reicht aus.

-------------Start ip-logger.c
/*
 *      ip-logger.c
 *
 *      Copyright 2005-2006 Florian Sievers
<florian@dynamic-core.ath.cx>
 *
 *      This program is free software; you can redistribute it and/or
modify
 *      it under the terms of the GNU General Public License as
published by
 *      the Free Software Foundation; version 2 of the License.
 *
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *
 *      You should have received a copy of the GNU General Public
License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <errno.h>
#include <time.h>


//Logdateien

#define IP_FILE "ip-lastip.dat"
#define IP_LOG "ip-log"

int write_to_log(char *new_ip);

int main(int argc, char** argv)
{
	int exit_status = 0;

	struct hostent *ip_data;
	char *hostname = "www.example.net";
	const int DOTTED_LENGTH = 16;
	char dotted_ip[DOTTED_LENGTH];

	char *logged_ip_filename = IP_FILE;
	FILE *logged_ip_file;

	int ret_val = 0;

	char old_ip[DOTTED_LENGTH];

	//old_ip mit 0.0.0.0 vorinitialisieren
	memset(dotted_ip, '\0', (sizeof(char)*DOTTED_LENGTH));
	strcpy(old_ip, "0.0.0.0");

	//ip_data mit Daten von füllen
	ip_data = gethostbyname(hostname);
	if(ip_data->h_addrtype == AF_INET)
	{
		//Hostnamen in einen String mit der IP umwandeln
		inet_ntop(AF_INET, ip_data->h_addr, dotted_ip, DOTTED_LENGTH);

		//Datei mit letzter IP zum Lesen und Schreiben öffnen
		logged_ip_file = fopen(logged_ip_filename, "r+");
		if(logged_ip_file == NULL)
		{
			//Neue Datei anlegen, wenn Datei nicht vorhanden.
			if(errno == ENOENT)
			{
				logged_ip_file = fopen(logged_ip_filename, "w");
				if(logged_ip_file == NULL)
				{
					printf("Fehler beim Öffnen von %s\n", logged_ip_filename);
					exit(1);
				}
			}
			else
			{
				exit(2);
			}
		}
		else
		{
			//Alte IP einlesen. Maximal DOTTED_LENGTH (15) Zeichen
			ret_val = fread(old_ip, sizeof(char), DOTTED_LENGTH, logged_ip_file);
			if(feof(logged_ip_file) != 0)
			{
				printf("Fehler beim Lesen von %s\n", logged_ip_filename);
				printf("%s\n", strerror(errno));
				if(ferror(logged_ip_file) != 0)
				{
					exit(3);
				}
			}
		}

		//Fehlerindikator und EOF-Indikator für logged_ip_file zurücksetzen
		clearerr(logged_ip_file);

		//Neue und alte IP vergleichen. Wenn ungleich Block ausführen
		if(strcmp(dotted_ip, old_ip) != 0)
		{
			printf("Hostname: %s\n", ip_data->h_name);
			printf(" Host-IP: %s\n", dotted_ip);
			printf("  Old-IP: %s\n", old_ip);

			rewind(logged_ip_file);
			ret_val = fwrite(dotted_ip, sizeof(char), DOTTED_LENGTH,
logged_ip_file);
			if(feof(logged_ip_file) != 0)
			{
				printf("Fehler beim Schreiben in %s\n", logged_ip_filename);
				printf("%s\n", strerror(errno));
				if(ferror(logged_ip_file) != 0)
				{
					exit(3);
				}
			}

			//Neue IP ins Logfile schreiben
			write_to_log(dotted_ip);
			//printf("%ld",readed);
		}
		fclose(logged_ip_file);
	}
	else
	{
		exit_status = 10;
	}

	return exit_status;
}


//Neue IP in Logdatei schreiben
int write_to_log(char *new_ip)
{
	char *log_filename = IP_LOG;
	FILE *log_file;

	char sDatum[50];
	struct tm *zeit;
	struct time_t *the_time;

	log_file = fopen(log_filename,"a+");
	if(log_file == NULL)
	{
		printf("Fehler beim Öffnen von %s\n", log_filename);
		printf("%s\n", strerror(errno));
		exit(1);
	}

	//Zeit abfragen, in tm umwandeln und anschließend in einen String
umwandeln
	the_time = (struct time_t *)time(NULL);
	zeit = localtime((const time_t *)&the_time);
	strftime((char *)&sDatum, 50, "%a %d. %b %Y - %T", zeit);
	fprintf(log_file, "IP: %15s at %s\n", new_ip, sDatum);

	fclose(log_file);

	printf("    Date: %s\n", sDatum);

	return 0;
}
-------------Ende ip-logger.c

-- 
Florian Sievers <florian@dynamic-core.ath.cx>


Reply to: