progress
This commit is contained in:
parent
bf2249fa7b
commit
8628423696
2
.gitignore
vendored
2
.gitignore
vendored
@ -52,3 +52,5 @@ Module.symvers
|
|||||||
Mkfile.old
|
Mkfile.old
|
||||||
dkms.conf
|
dkms.conf
|
||||||
|
|
||||||
|
.vscode
|
||||||
|
bin/main
|
59
src/main.c
59
src/main.c
@ -102,7 +102,7 @@ char* skip_spaces(char* str) {
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kopiert einen Eingabestring von einem Quellbereich zu einem Zielbereich, bis ein Leerzeichen (oder Nullterminator) erreicht wird
|
// Kopiert einen Eingabestring von einem Quellbereich zu einem Zielbereich, bis ein Leerzeichen (oder Nullterminator) erreicht wird oder die max. Zeilenlänge nicht überschritten wird
|
||||||
void copy_until_space(char* destination, char* source, int max_length) {
|
void copy_until_space(char* destination, char* source, int max_length) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (source[i] != ' ' && source[i] != '\0' && i < max_length - 1) {
|
while (source[i] != ' ' && source[i] != '\0' && i < max_length - 1) {
|
||||||
@ -181,7 +181,7 @@ void cleanup_memory() {
|
|||||||
|
|
||||||
// sauberes Schließen und bereinigen bei Fehlerstatus, sofern Speicher nicht alloziert werden kann
|
// sauberes Schließen und bereinigen bei Fehlerstatus, sofern Speicher nicht alloziert werden kann
|
||||||
void cleanup_and_exit() {
|
void cleanup_and_exit() {
|
||||||
printf("Speicherfehler, Programmende\n");
|
printf("Programmende. Speicher wird freigegeben und mit NULL überschrieben.\n");
|
||||||
cleanup_memory();
|
cleanup_memory();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@ -257,23 +257,39 @@ Parser. Regex Parser und strtok haben sich als schwieriger herausgestellt, da ng
|
|||||||
Daher ist das Parsing am einfachsten, wenn ein Pointer-basierter Algorithmus die Zeile Stück für Stück einliest und die Erwartungswerte in die struct schreibt.
|
Daher ist das Parsing am einfachsten, wenn ein Pointer-basierter Algorithmus die Zeile Stück für Stück einliest und die Erwartungswerte in die struct schreibt.
|
||||||
Fehleranfällig, wenn das Logformat nicht dem Standard entspricht - das gilt aber auch für andere Parser.
|
Fehleranfällig, wenn das Logformat nicht dem Standard entspricht - das gilt aber auch für andere Parser.
|
||||||
*/
|
*/
|
||||||
|
// Standard-nginx-accesslog:
|
||||||
|
// 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
|
||||||
int parse_simple_log_line(char* line, int entry_index) { // Nimmt den Pointer auf die Zeile und einen Index entgegen - dieser ist anfangs 0 (globale Variable) und wird pro Eintrag inkrementiert
|
int parse_simple_log_line(char* line, int entry_index) { // Nimmt den Pointer auf die Zeile und einen Index entgegen - dieser ist anfangs 0 (globale Variable) und wird pro Eintrag inkrementiert
|
||||||
char* current_pos = line;
|
char* current_pos = line;
|
||||||
|
// leere Zeichen am Anfang überspringen
|
||||||
current_pos = skip_spaces(current_pos);
|
current_pos = skip_spaces(current_pos);
|
||||||
|
|
||||||
|
// kopieren der IP-Adresse in die globale all_entries Struktur unter gegebenen index
|
||||||
|
// 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
|
||||||
|
// ^
|
||||||
copy_until_space(all_entries[entry_index].ip_address, current_pos, sizeof(all_entries[entry_index].ip_address));
|
copy_until_space(all_entries[entry_index].ip_address, current_pos, sizeof(all_entries[entry_index].ip_address));
|
||||||
|
|
||||||
|
// weiter zum nächsten Leerzeichen
|
||||||
while (*current_pos != ' ' && *current_pos != '\0') current_pos++;
|
while (*current_pos != ' ' && *current_pos != '\0') current_pos++;
|
||||||
|
// 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
|
||||||
|
// ^
|
||||||
|
// überspringe Leerzeichen
|
||||||
current_pos = skip_spaces(current_pos);
|
current_pos = skip_spaces(current_pos);
|
||||||
|
// 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
|
||||||
|
// ^
|
||||||
|
// mehrmaliges Überspringen des Wertes, der nicht von Interesse ist, Überspringen des Leerzeichens
|
||||||
while (*current_pos != ' ' && *current_pos != '\0') current_pos++;
|
while (*current_pos != ' ' && *current_pos != '\0') current_pos++;
|
||||||
current_pos = skip_spaces(current_pos);
|
current_pos = skip_spaces(current_pos);
|
||||||
while (*current_pos != ' ' && *current_pos != '\0') current_pos++;
|
while (*current_pos != ' ' && *current_pos != '\0') current_pos++;
|
||||||
current_pos = skip_spaces(current_pos);
|
current_pos = skip_spaces(current_pos);
|
||||||
|
// 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
|
||||||
|
// ^
|
||||||
|
// Timestamp-Parsing
|
||||||
if (*current_pos == '[') {
|
if (*current_pos == '[') {
|
||||||
current_pos++;
|
current_pos++;
|
||||||
|
// 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
|
||||||
|
// ^
|
||||||
|
// es folgt nach und nach das Einlesen von Datum und Uhrzeit, und wiederholtes Verschieben des Pointers
|
||||||
all_entries[entry_index].time.day = 0;
|
all_entries[entry_index].time.day = 0;
|
||||||
while (*current_pos >= '0' && *current_pos <= '9') {
|
while (*current_pos >= '0' && *current_pos <= '9') {
|
||||||
all_entries[entry_index].time.day = all_entries[entry_index].time.day * 10 + (*current_pos - '0');
|
all_entries[entry_index].time.day = all_entries[entry_index].time.day * 10 + (*current_pos - '0');
|
||||||
@ -322,20 +338,29 @@ int parse_simple_log_line(char* line, int entry_index) { // Nimmt den Pointer au
|
|||||||
all_entries[entry_index].time.second = all_entries[entry_index].time.second * 10 + (*current_pos - '0');
|
all_entries[entry_index].time.second = all_entries[entry_index].time.second * 10 + (*current_pos - '0');
|
||||||
current_pos++;
|
current_pos++;
|
||||||
}
|
}
|
||||||
|
// der Zeitzonen-Deskriptor wird übersprungen
|
||||||
while (*current_pos != ']' && *current_pos != '\0') current_pos++;
|
while (*current_pos != ']' && *current_pos != '\0') current_pos++;
|
||||||
if (*current_pos == ']') current_pos++;
|
if (*current_pos == ']') current_pos++;
|
||||||
|
// 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
|
||||||
|
// ^
|
||||||
|
} else {
|
||||||
|
printf("ERROR: Unerwartetes Log-Format. Lediglich mit standard-nginx-accesslog kompatibel.\nDer Fehler ist beim Prüfen des Timestamps aufgetreten, dieser sollte folgendes Format haben:\n[DD/MMM/YYYY:HH:MM:SS +0000]\nProgramm wird beendet.\n");
|
||||||
|
cleanup_and_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
current_pos = skip_spaces(current_pos);
|
current_pos = skip_spaces(current_pos);
|
||||||
|
// Weiter mit dem String innerhalb "", aus dem die HTTP-Methode und der URL-Pfad zu entnehmen ist
|
||||||
if (*current_pos == '"') {
|
if (*current_pos == '"') {
|
||||||
current_pos++;
|
current_pos++;
|
||||||
|
// 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
|
||||||
|
// ^
|
||||||
|
// HTTP-Methode bis zum nächsten Leerzeichen einlesen und speichern
|
||||||
copy_until_space(all_entries[entry_index].request_method, current_pos, sizeof(all_entries[entry_index].request_method));
|
copy_until_space(all_entries[entry_index].request_method, current_pos, sizeof(all_entries[entry_index].request_method));
|
||||||
while (*current_pos != ' ' && *current_pos != '\0') current_pos++;
|
while (*current_pos != ' ' && *current_pos != '\0') current_pos++;
|
||||||
current_pos = skip_spaces(current_pos);
|
current_pos = skip_spaces(current_pos);
|
||||||
|
// 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
|
||||||
|
// ^
|
||||||
|
// Einlesen des URL-Path bis zum abschließenden "
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (*current_pos != ' ' && *current_pos != '"' && *current_pos != '\0' && i < sizeof(all_entries[entry_index].url_path) - 1) {
|
while (*current_pos != ' ' && *current_pos != '"' && *current_pos != '\0' && i < sizeof(all_entries[entry_index].url_path) - 1) {
|
||||||
all_entries[entry_index].url_path[i] = *current_pos;
|
all_entries[entry_index].url_path[i] = *current_pos;
|
||||||
@ -346,10 +371,15 @@ int parse_simple_log_line(char* line, int entry_index) { // Nimmt den Pointer au
|
|||||||
|
|
||||||
while (*current_pos != '"' && *current_pos != '\0') current_pos++;
|
while (*current_pos != '"' && *current_pos != '\0') current_pos++;
|
||||||
if (*current_pos == '"') current_pos++;
|
if (*current_pos == '"') current_pos++;
|
||||||
|
} else {
|
||||||
|
printf("ERROR: Unerwartetes Log-Format. Lediglich mit standard-nginx-accesslog kompatibel.\nDer Fehler ist beim Prüfen der HTTP-Methode aufgetreten. Diese steht innerhalb eines Strings zusammen mit dem URL-Pfad:\n\"GET /.git/config HTTP/1.1\"\nProgramm wird beendet.\n");
|
||||||
|
cleanup_and_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
current_pos = skip_spaces(current_pos);
|
current_pos = skip_spaces(current_pos);
|
||||||
|
// 107.170.27.248 - - [31/Aug/2025:00:11:42 +0000] "GET /.git/config HTTP/1.1" 400 255 "-" "Mozilla/5.0; Keydrop.io/1.0(onlyscans.com/about);" "-"
|
||||||
|
// ^
|
||||||
|
// Parsen ded HTTP-Status Codes, der eine Zahl sein muss
|
||||||
all_entries[entry_index].status_code = 0;
|
all_entries[entry_index].status_code = 0;
|
||||||
while (*current_pos >= '0' && *current_pos <= '9') {
|
while (*current_pos >= '0' && *current_pos <= '9') {
|
||||||
all_entries[entry_index].status_code = all_entries[entry_index].status_code * 10 + (*current_pos - '0');
|
all_entries[entry_index].status_code = all_entries[entry_index].status_code * 10 + (*current_pos - '0');
|
||||||
@ -357,20 +387,21 @@ int parse_simple_log_line(char* line, int entry_index) { // Nimmt den Pointer au
|
|||||||
}
|
}
|
||||||
|
|
||||||
current_pos = skip_spaces(current_pos);
|
current_pos = skip_spaces(current_pos);
|
||||||
|
// genauso mit bytegröße der Anfrage
|
||||||
all_entries[entry_index].bytes_sent = 0;
|
all_entries[entry_index].bytes_sent = 0;
|
||||||
while (*current_pos >= '0' && *current_pos <= '9') {
|
while (*current_pos >= '0' && *current_pos <= '9') {
|
||||||
all_entries[entry_index].bytes_sent = all_entries[entry_index].bytes_sent * 10 + (*current_pos - '0');
|
all_entries[entry_index].bytes_sent = all_entries[entry_index].bytes_sent * 10 + (*current_pos - '0');
|
||||||
current_pos++;
|
current_pos++;
|
||||||
}
|
}
|
||||||
|
// TODO: Der User Agent wäre noch eine interessante Metrik. Kann relativ einfach implementiert werden.
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
void load_regular_file(char* filename) {
|
void load_regular_file(char* filename) {
|
||||||
FILE* file = fopen(filename, "r");
|
FILE* file = fopen(filename, "r");
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
printf("WARNUNG: Kann Datei '%s' nicht öffnen!\n", filename);
|
printf("ERROR: Kann Datei '%s' nicht öffnen!\n", filename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user