-
Notifications
You must be signed in to change notification settings - Fork 0
/
ip_nginx.c
131 lines (109 loc) · 3.56 KB
/
ip_nginx.c
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <zlib.h>
#define MAX_IP_COUNT 100000
typedef struct {
char ip[16];
int count;
} ip_entry;
int compare_count(const void *a, const void *b) {
return ((ip_entry *)b)->count - ((ip_entry *)a)->count;
}
int main(int argc, char *argv[]) {
DIR *dir;
struct dirent *ent;
gzFile gzf;
char buffer[1024];
ip_entry ip_counts[MAX_IP_COUNT];
int ip_count = 0;
if (argc < 2) {
printf("Usage: %s directory [--html|--text]\n", argv[0]);
return 1;
}
int display_html = 0;
int display_text = 0;
if (argc >= 3) {
if (strcmp(argv[2], "--html") == 0) {
display_html = 1;
} else if (strcmp(argv[2], "--text") == 0) {
display_text = 1;
} else {
printf("Invalid option %s\n", argv[2]);
return 1;
}
}
// Out pour tests return 1;
// Vérifier que le répertoire est fourni en argument
if (argc < 2) {
printf("Missing directory argument\n");
return 1;
}
// Ouvrir le répertoire fourni en argument
dir = opendir(argv[1]);
if (!dir) {
printf("Failed to open directory %s\n", argv[1]);
return 1;
}
// Parcourir les fichiers du répertoire
while ((ent = readdir(dir)) != NULL) {
char *filename = ent->d_name;
if (strncmp(filename, "access.log.", 11) == 0 && strstr(filename, ".gz")) {
// Ouvrir le fichier gz
char path[256];
sprintf(path, "%s/%s", argv[1], filename);
gzf = gzopen(path, "r");
if (!gzf) {
printf("Failed to open file %s\n", path);
continue;
}
// Lire les lignes du fichier gz
while (gzgets(gzf, buffer, sizeof(buffer))) {
char *ip = strtok(buffer, " ");
if (!ip) {
continue;
}
// Rechercher l'adresse IP dans le tableau
int i;
for (i = 0; i < ip_count; i++) {
if (strcmp(ip_counts[i].ip, ip) == 0) {
// Incrémenter le compteur pour cette adresse IP
ip_counts[i].count++;
break;
}
}
if (i == ip_count) {
// Ajouter une nouvelle entrée pour cette adresse IP
if (ip_count == MAX_IP_COUNT) {
printf("Maximum IP count reached\n");
break;
}
strcpy(ip_counts[ip_count].ip, ip);
ip_counts[ip_count].count = 1;
ip_count++;
}
}
// Fermer le fichier gz
gzclose(gzf);
}
}
// Trier le tableau par nombre d'accès en ordre décroissant
qsort(ip_counts, ip_count, sizeof(ip_entry), compare_count);
// Afficher les résultats en format HTML
if (display_html) {
printf("<table>\n");
printf("<tr><th>Adresse IP</th><th>Nombre d'accès</th></tr>\n");
for (int i = 0; i < ip_count; i++) {
printf("<tr><td>%s</td><td>%d</td></tr>\n", ip_counts[i].ip, ip_counts[i].count);
}
printf("</table>\n");
} else if(display_text) {
for (int i = 0; i < ip_count; i++) {
printf("%s: %d\n", ip_counts[i].ip, ip_counts[i].count);
}
} else {
printf("Invalid option, use --html or --text\n");
}
return 0;
}