Hello
J’essaye de d’obtenir une notification du modification du fichier /proc/net/tcp avec inotify
mai sa ne marche pas malgrer le code que voici en c++ (ça compile)
sauf si vous faite un simple
je vous met les 3 fichier
#include <iostream>
#include <string>
#include "cNotify.hpp"
int main()
{
cNotify cN;
std::cout << "Start notify tcp" << std::endl;
int buff = cN.start_notify("/proc/net/tcp");
std::cout << "End notify valeur:" << buff << std::endl;
return 0;
}
#ifndef DEF_ME_NOTIFY
#define DEF_ME_NOTIFY
#include <iostream>
#include <sys/select.h>
#include <sys/inotify.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
class cNotify
{
public:
cNotify();
//renvoie 0 si tout ce termine normalment -1 si erreur
// 1 si le changement a été detecter et s'arrete.
int start_notify(const std::string & my_path);
private:
/*
*Prise en charge du code C . comme c est priver on peux
*changer facilment sans mofier l'application parente,
*sinon c est pas utile, utilise le code C directement est mieux
*/
int afficher_masque(int mask);
};
#endif
#include "cNotify.hpp"
cNotify::cNotify(){}
//int fd, wd;
int cNotify::afficher_masque(int mask)
{
if (mask & IN_CREATE) { return 1; }
else if (mask & IN_DELETE) { return 2; }
else if (mask & IN_DELETE_SELF) { return 3; }
else if (mask & IN_UNMOUNT) { return 4; }
else if (mask & IN_MOVED_FROM) { return 5; }
else if (mask & IN_MOVED_TO) { return 6; }
else if (mask & IN_MOVE_SELF) { return 7; }
else if (mask & IN_Q_OVERFLOW) { return 8; }
else if (mask & IN_IGNORED) { return 9; }
else if (mask & IN_MODIFY) { return 10; }
else if (mask & IN_ATTRIB) { return 11; }
else if (mask & IN_CLOSE) { return 12; }
else if (mask & IN_OPEN) { return 13; }
else if (mask & IN_ISDIR) { return 14; }
else if (mask & IN_ACCESS) { return 15; }
else { return -1; }
}
int cNotify::start_notify(const std::string & my_path)
{
size_t r;
fd_set fds;
char buffer[8192];
struct inotify_event *event;
int fd, wd;
int change=0;
/* Initialisation d'inotify */
fd = inotify_init();
if (fd < 0) {
perror("inotify_init");
return -1;
}
/* Surveillance du fichier/répertoire passé en paramètre
* On accepte tous les évènements possibles */
wd = inotify_add_watch(fd, my_path.c_str(), IN_ALL_EVENTS);
if (wd < 0) {
perror("inotify_add_watch");
return -1;
}
while (1) {
FD_ZERO(&fds);
FD_SET(fd, &fds);
if (select(fd + 1, &fds, NULL, NULL, 0) <= 0) {
continue;
}
/* Obtention des informations sur l'évènement qui vient de se produire */
r = read(fd, buffer, sizeof(buffer));
if (r <= 0) {
perror("read");
return -1;
}
event = (struct inotify_event *) buffer;
change=afficher_masque(event->mask);
//if ((change == 12) || (change == 10) || (change == 15))
if ((change > 0) && (change < 15)) //adapter le teste a vos besoins etc.
{
inotify_rm_watch(fd, wd);
close(fd);
return 1;
}
else
{
std::cout << "Notify valeur en dehord de la plage" << change << std::endl;
}
}
inotify_rm_watch(fd, wd);
close(fd);
return 0;
donc est-ce possible d’avoir autre chose qu’une boucle qui va lire systématiquement dans /proc/net/tcp toute les x secondes ? car la les disque ssd vont pas apprécier sans parler de la charge cpu.
aux pire je peux loguer la sortie d’iptable et utiliser inotify dessu … mai bon sa va poser souci aux moment le paquet arrive . le premier sera dropper. a partir de la je peux aller re-lire le fichier /proc/net/tcp mai sa reste pas propre :\
Merci d’avance