[Listener] Paramètres préprocesseur, option -k
listener : * Ajout de l'option préprocesseur USE_CONFIG_FILE, qui permet d'activer ou pas l'utilisation d'un fichier de configuration via libconfuse. * Ajout de l'option préprocesseur USE_PTHREAD, qui permet d'activer ou pas la gestion des threads POSIX (nécessaire pour la fonction de maintien du mode monitor). * Ajout de l'option -k ("keep_monitor" dans le fichier de config), qui permet d'activer le maintien actif du mode monitor (qui est à présent désactivé par défaut). * Correction de bogue : ajout de "p:" dans la chaîne getopt. git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@97 785a6c6c-259e-4ff1-8b91-dc31627914f0
This commit is contained in:
parent
b9bdb9400a
commit
9f0c4793e6
|
@ -5,10 +5,21 @@
|
|||
#ifndef _AP_H
|
||||
#define _AP_H
|
||||
|
||||
// Compilation-time options (comment-out to unactivate)
|
||||
#define USE_CONFIG_FILE // Use libconfuse to read a config file
|
||||
#define USE_PTHREAD // POSIX threads available?
|
||||
|
||||
|
||||
#include "../../libowlps/owlps.h"
|
||||
#include <pcap.h>
|
||||
|
||||
#ifdef USE_CONFIG_FILE
|
||||
#include <confuse.h>
|
||||
#endif // USE_CONFIG_FILE
|
||||
|
||||
#ifdef USE_PTHREAD
|
||||
#include <pthread.h>
|
||||
#endif // USE_PTHREAD
|
||||
|
||||
// Pour la fonction get_mac_addr() :
|
||||
#include <netinet/if_ether.h>
|
||||
|
@ -22,16 +33,56 @@
|
|||
#define ERR_BAD_USAGE 3 // Mauvais appel au programme
|
||||
#define ERR_PARSING_CONFIG_FILE 4 // Erreur lors de la lecture du fichier de configuration
|
||||
|
||||
|
||||
/* Arguments & configuration du programme */
|
||||
#define OPTIONS "f:d:r:w:" // Chaîne pour getopt
|
||||
#define OPTIONS "f:d:kp:r:w:" // Chaîne pour getopt
|
||||
#define DEFAULT_CONFIG_FILE "/usr/local/etc/owlps/owlps-listener.conf"
|
||||
|
||||
|
||||
/* En-têtes des fonctions */
|
||||
#ifdef USE_PTHREAD
|
||||
void* keep_mode_monitor(char *iface) ;
|
||||
#endif // USE_PTHREAD
|
||||
int capture(char *capture_iface, char *aggregation_ip, unsigned int aggregation_port, BOOL print_values) ;
|
||||
void read_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet, int sockfd, struct sockaddr_in *server, BOOL print_values) ;
|
||||
void get_mac_addr(char *eth, unsigned char mac_bytes[6]) ;
|
||||
void print_usage(char *prog) ;
|
||||
|
||||
|
||||
#endif
|
||||
/* Macros permettant de jongler entre la gestion des options via la
|
||||
* structure offerte par libconfuse, et une structure maison si cette
|
||||
* dernière est désactivée.
|
||||
*/
|
||||
/* Macros utilisant libconfuse : */
|
||||
#ifdef USE_CONFIG_FILE
|
||||
#define SET_AGGREGATION_IP(IP) (cfg_setstr(cfg, "aggregation_ip", (IP)))
|
||||
#define GET_AGGREGATION_IP() (cfg_getstr(cfg, "aggregation_ip"))
|
||||
#ifdef USE_PTHREAD
|
||||
#define SET_KEEP_MONITOR() (cfg_setbool(cfg, "keep_monitor", cfg_true))
|
||||
#define GET_KEEP_MONITOR() (cfg_getbool(cfg, "keep_monitor"))
|
||||
#endif // USE_PTHREAD
|
||||
#define SET_AGGREGATION_PORT(PORT) (cfg_setint(cfg, "aggregation_port", (PORT)))
|
||||
#define GET_AGGREGATION_PORT() (cfg_getint(cfg, "aggregation_port"))
|
||||
#define SET_RTAP_IFACE(IFACE) (cfg_setstr(cfg, "rtap_iface", (IFACE)))
|
||||
#define GET_RTAP_IFACE() (cfg_getstr(cfg, "rtap_iface"))
|
||||
#define SET_WIFI_IFACE(IFACE) (cfg_setstr(cfg, "wifi_iface", (IFACE)))
|
||||
#define GET_WIFI_IFACE() (cfg_getstr(cfg, "wifi_iface"))
|
||||
|
||||
/* Macros utilisant la structure maison : */
|
||||
#else // USE_CONFIG_FILE
|
||||
#define SET_AGGREGATION_IP(IP) (strncpy(options.aggregation_ip, (IP), 16))
|
||||
#define GET_AGGREGATION_IP() (options.aggregation_ip)
|
||||
#ifdef USE_PTHREAD
|
||||
#define SET_KEEP_MONITOR() (options.keep_monitor = TRUE)
|
||||
#define GET_KEEP_MONITOR() (options.keep_monitor)
|
||||
#endif // USE_PTHREAD
|
||||
#define SET_AGGREGATION_PORT(PORT) (options.aggregation_port = (PORT))
|
||||
#define GET_AGGREGATION_PORT() (options.aggregation_port)
|
||||
#define SET_RTAP_IFACE(IFACE) (strncpy(options.rtap_iface, (IFACE), IFNAMSIZ+1))
|
||||
#define GET_RTAP_IFACE() (options.rtap_iface)
|
||||
#define SET_WIFI_IFACE(IFACE) (strncpy(options.wifi_iface, (IFACE), IFNAMSIZ+1))
|
||||
#define GET_WIFI_IFACE() (options.wifi_iface)
|
||||
#endif // USE_CONFIG_FILE
|
||||
|
||||
|
||||
#endif // _AP_H
|
||||
|
|
|
@ -16,16 +16,41 @@ int main(int argc, char *argv[])
|
|||
struct sigaction action ; // Structure de mise en place des gestionnaires de signaux
|
||||
char *mac_string ; // MAC de l'AP sous forme de chaîne
|
||||
int ret ; // Code de retour du programme
|
||||
#ifdef USE_PTHREAD
|
||||
pthread_t thread ; // Thread pour le repassage en mode monitor
|
||||
#endif // USE_PTHREAD
|
||||
|
||||
#ifdef USE_CONFIG_FILE
|
||||
cfg_opt_t opts[] = { // Options reconnues par confuse dans le fichier de config
|
||||
CFG_STR("aggregation_ip", "127.0.0.1", CFGF_NONE), // Adresse IP du serveur d'agrégation (défaut : boucle locale)
|
||||
CFG_INT("aggregation_port", AGGREGATE_DEFAULT_PORT, CFGF_NONE), // Port sur le serveur d'agrégation
|
||||
#ifdef USE_PTHREAD
|
||||
CFG_BOOL("keep_monitor", cfg_false, CFGF_NONE), // Active le maintien actif du mode monitor
|
||||
#endif // USE_PTHREAD
|
||||
CFG_STR("rtap_iface", "", CFGF_NONE), // Interface radiotap utilisée pour la capture
|
||||
CFG_STR("wifi_iface", "", CFGF_NONE), // Interface physique correspondante (utilisée pour récupérer l'adresse MAC)
|
||||
CFG_END() } ;
|
||||
cfg_t *cfg ; // Structure contenant la configuration
|
||||
char *config_file ; // Nom du fichier de configuration
|
||||
#else // USE_CONFIG_FILE
|
||||
struct {
|
||||
char aggregation_ip[16] ;
|
||||
int aggregation_port ;
|
||||
#ifdef USE_PTHREAD
|
||||
BOOL keep_monitor ;
|
||||
#endif // USE_PTHREAD
|
||||
char rtap_iface[IFNAMSIZ + 1] ;
|
||||
char wifi_iface[IFNAMSIZ + 1] ;
|
||||
} options = {"127.0.0.1",
|
||||
AGGREGATE_DEFAULT_PORT,
|
||||
#ifdef USE_PTHREAD
|
||||
FALSE,
|
||||
#endif // USE_PTHREAD
|
||||
"",
|
||||
""
|
||||
} ;
|
||||
#endif // USE_CONFIG_FILE
|
||||
|
||||
int opt ; // Retour de getopt
|
||||
|
||||
|
||||
|
@ -36,9 +61,14 @@ int main(int argc, char *argv[])
|
|||
while (opt != 'f' && opt != -1) ;
|
||||
if (opt == 'f')
|
||||
{
|
||||
#ifdef USE_CONFIG_FILE
|
||||
config_file = malloc((strlen(optarg) + 1) * sizeof(char)) ;
|
||||
strcpy(config_file, optarg) ;
|
||||
#else // USE_CONFIG_FILE
|
||||
fprintf(stderr, "Attention ! Le programme a été compilé sans le support des fichiers de configuration, l'option -f n'est donc pas disponible. Vous devez passer toutes les options sur la ligne de commandes, sans quoi les valeurs par défaut seront utilisées.\n") ;
|
||||
#endif // USE_CONFIG_FILE
|
||||
}
|
||||
#ifdef USE_CONFIG_FILE
|
||||
else // Si -f n'est pas présente, on utilise le fichier de config par défaut
|
||||
{
|
||||
config_file = malloc((strlen(DEFAULT_CONFIG_FILE) + 1) * sizeof(char)) ;
|
||||
|
@ -53,6 +83,8 @@ int main(int argc, char *argv[])
|
|||
return ERR_PARSING_CONFIG_FILE ;
|
||||
}
|
||||
free(config_file) ;
|
||||
#endif // USE_CONFIG_FILE
|
||||
|
||||
|
||||
/* Lecture des arguments de la ligne de commandes */
|
||||
optind = 1 ; // On reprend l'analyse des arguments au début
|
||||
|
@ -64,16 +96,23 @@ int main(int argc, char *argv[])
|
|||
// Déjà traité.
|
||||
break ;
|
||||
case 'd' :
|
||||
cfg_setstr(cfg, "aggregation_ip", optarg) ;
|
||||
SET_AGGREGATION_IP(optarg) ;
|
||||
break ;
|
||||
case 'k' :
|
||||
#ifdef USE_PTHREAD
|
||||
SET_KEEP_MONITOR() ;
|
||||
#else // USE_PTHREAD
|
||||
fprintf(stderr, "Attention ! Le programme a été compilé sans le support des threads POSIX, l'option -k (maintien du mode monitor) n'est donc pas disponible et sera ignorée.\n") ;
|
||||
#endif // USE_PTHREAD
|
||||
break ;
|
||||
case 'p' :
|
||||
cfg_setint(cfg, "aggregation_port", strtol(optarg, NULL, 0)) ;
|
||||
SET_AGGREGATION_PORT(strtol(optarg, NULL, 0)) ;
|
||||
break ;
|
||||
case 'r' :
|
||||
cfg_setstr(cfg, "rtap_iface", optarg) ;
|
||||
SET_RTAP_IFACE(optarg) ;
|
||||
break ;
|
||||
case 'w' :
|
||||
cfg_setstr(cfg, "wifi_iface", optarg) ;
|
||||
SET_WIFI_IFACE(optarg) ;
|
||||
break ;
|
||||
default :
|
||||
print_usage(argv[0]) ;
|
||||
|
@ -82,24 +121,43 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
/* Vérification des arguments */
|
||||
if (cfg_getstr(cfg, "rtap_iface")[0] == '\0')
|
||||
if (GET_RTAP_IFACE()[0] == '\0')
|
||||
{
|
||||
fprintf(stderr, "Erreur ! Vous devez spécifier une interface radiotap pour la capture.\n") ;
|
||||
print_usage(argv[0]) ;
|
||||
return ERR_BAD_USAGE ;
|
||||
}
|
||||
if (cfg_getstr(cfg, "wifi_iface")[0] == '\0')
|
||||
if (GET_WIFI_IFACE()[0] == '\0')
|
||||
{
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Attention ! Aucune interface Wi-Fi spécifiée. Utilisation de l'interface radiotap (%s) à la place.\n", cfg_getstr(cfg, "rtap_iface")) ;
|
||||
fprintf(stderr, "Attention ! Aucune interface Wi-Fi spécifiée. Utilisation de l'interface radiotap (%s) à la place.\n", GET_RTAP_IFACE()) ;
|
||||
#endif // DEBUG
|
||||
cfg_setstr(cfg, "wifi_iface", cfg_getstr(cfg, "rtap_iface")) ;
|
||||
SET_WIFI_IFACE(GET_RTAP_IFACE()) ;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
/* Affichage de la configuration */
|
||||
fprintf(stderr, "Configuration :\n") ;
|
||||
#ifdef USE_CONFIG_FILE
|
||||
cfg_print(cfg, stderr) ;
|
||||
#else // USE_CONFIG_FILE
|
||||
fprintf(stderr, "\
|
||||
aggregation_ip = \"%s\"\n\
|
||||
aggregation_port = %d\n\
|
||||
rtap_iface = \"%s\"\n\
|
||||
wifi_iface = \"%s\"\n\
|
||||
",
|
||||
GET_AGGREGATION_IP(),
|
||||
GET_AGGREGATION_PORT(),
|
||||
GET_RTAP_IFACE(),
|
||||
GET_WIFI_IFACE()
|
||||
);
|
||||
#ifdef USE_PTHREAD
|
||||
fprintf(stderr, "keep_monitor = %s\n",
|
||||
GET_KEEP_MONITOR() ? "true" : "false"
|
||||
) ;
|
||||
#endif // USE_PTHREAD
|
||||
#endif // USE_CONFIG_FILE
|
||||
#endif // DEBUG
|
||||
|
||||
run = TRUE ;
|
||||
|
@ -111,17 +169,22 @@ int main(int argc, char *argv[])
|
|||
action.sa_handler = sigterm_handler ;
|
||||
sigaction(SIGTERM, &action, NULL) ;
|
||||
|
||||
#ifdef USE_PTHREAD
|
||||
/* Création du thread */
|
||||
pthread_create(&thread, NULL, (void *) &keep_mode_monitor, cfg_getstr(cfg, "wifi_iface")) ;
|
||||
if (GET_KEEP_MONITOR())
|
||||
pthread_create(&thread, NULL, (void *) &keep_mode_monitor, GET_WIFI_IFACE()) ;
|
||||
#endif // USE_PTHREAD
|
||||
|
||||
get_mac_addr(cfg_getstr(cfg, "wifi_iface"), mac) ;
|
||||
get_mac_addr(GET_WIFI_IFACE(), mac) ;
|
||||
mac_string = mac_bytes_to_string(mac) ;
|
||||
printf("Ma mac est : %s\n", mac_string) ;
|
||||
free(mac_string) ;
|
||||
|
||||
ret = capture(cfg_getstr(cfg, "rtap_iface"), cfg_getstr(cfg, "aggregation_ip"), cfg_getint(cfg, "aggregation_port"), TRUE) ;
|
||||
ret = capture(GET_RTAP_IFACE(), GET_AGGREGATION_IP(), GET_AGGREGATION_PORT(), TRUE) ;
|
||||
|
||||
#ifdef USE_CONFIG_FILE
|
||||
cfg_free(cfg) ; // Nettoyage de la configuration
|
||||
#endif // USE_CONFIG_FILE
|
||||
|
||||
printf("%s : fin.\n", argv[0]) ;
|
||||
return ret ;
|
||||
|
@ -130,6 +193,7 @@ int main(int argc, char *argv[])
|
|||
|
||||
|
||||
|
||||
#ifdef USE_PTHREAD
|
||||
/* Fonction du thread, qui surveille la liste et envoie les infos au serveur de localisation au bout du timeout */
|
||||
void* keep_mode_monitor(char *iface)
|
||||
{
|
||||
|
@ -139,8 +203,9 @@ void* keep_mode_monitor(char *iface)
|
|||
sleep(1) ; // Pause de 1 secondes.
|
||||
}
|
||||
|
||||
return NULL ;
|
||||
pthread_exit(NULL) ;
|
||||
}
|
||||
#endif // USE_PTHREAD
|
||||
|
||||
|
||||
|
||||
|
@ -420,10 +485,12 @@ void get_mac_addr(char *eth, unsigned char mac_bytes[6])
|
|||
void print_usage(char *prog)
|
||||
{
|
||||
printf("Usage :\n\
|
||||
\t%s [-f config_file] [-d ip_agrégation] [-p port_agrégation] -r rtap_iface [-w wifi_iface]\n\
|
||||
\t%s [-f config_file] [-d ip_agrégation] [-p port_agrégation] -r rtap_iface [-w wifi_iface] [-k]\n\
|
||||
- L'option -f permet de spécifier un fichier de configuration alternatif (le fichier de configuration par défaut ne sera pas lu). Disponible uniquement si le programme a été compilé avec le support de libconfuse.\n\
|
||||
- ip_agrégation est l'adresse IP du serveur d'agrégation (par défaut : 127.0.0.1), et port_agrégation le port sur lequel il écoute (par défaut : %d).\n\
|
||||
- rtap_iface est l'interface de capture radiotap.\n\
|
||||
- wifi_iface est l'interface physique correspondant à rtap_iface (par défaut : rtap_iface).\n\
|
||||
- L'option -k active le maintien actif du mode monitor. À utiliser avec des pilotes bogués. Disponible uniquement si le programme a été compilé avec le support des threads POSIX.\n\
|
||||
Note : tous les paramètres sont facultatifs si les options correspondantes sont renseignées dans un fichier de configuration. L'option -f permet de spécifier un fichier de configuration alternatif (par défaut : %s).\n\
|
||||
", prog, AGGREGATE_DEFAULT_PORT, DEFAULT_CONFIG_FILE) ;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue