[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:
Matteo Cypriani 2009-07-02 07:42:15 +00:00
parent b9bdb9400a
commit 9f0c4793e6
2 changed files with 133 additions and 15 deletions

View File

@ -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

View File

@ -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 é 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 é 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) ;
}