diff --git a/infrastructure-centred/owlps-listener/owlps-listener.h b/infrastructure-centred/owlps-listener/owlps-listener.h index 78fcf64..66751a0 100644 --- a/infrastructure-centred/owlps-listener/owlps-listener.h +++ b/infrastructure-centred/owlps-listener/owlps-listener.h @@ -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 + +#ifdef USE_CONFIG_FILE #include +#endif // USE_CONFIG_FILE + +#ifdef USE_PTHREAD +#include +#endif // USE_PTHREAD // Pour la fonction get_mac_addr() : #include @@ -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 diff --git a/infrastructure-centred/owlps-listener/owlps-listenerd.c b/infrastructure-centred/owlps-listener/owlps-listenerd.c index 488ec6e..fbbe1eb 100644 --- a/infrastructure-centred/owlps-listener/owlps-listenerd.c +++ b/infrastructure-centred/owlps-listener/owlps-listenerd.c @@ -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) ; }