Changeset 4622

Show
Ignore:
Timestamp:
11/11/08 11:52:37 (2 months ago)
Author:
martin
Message:

dynamic logging configuration through strongswan.conf
fallback to existing ipsec.conf/stroke loglevel configuration

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/charon/bus/bus.c

    r4531 r4622  
    3737); 
    3838 
     39ENUM(debug_lower_names, DBG_DMN, DBG_LIB, 
     40    "dmn", 
     41    "mgr", 
     42    "ike", 
     43    "chd", 
     44    "job", 
     45    "cfg", 
     46    "knl", 
     47    "net", 
     48    "enc", 
     49    "lib", 
     50); 
     51 
    3952typedef struct private_bus_t private_bus_t; 
    4053 
  • trunk/src/charon/bus/bus.h

    r4531 r4622  
    7171 
    7272/** 
     73 * short names of debug message group, lower case. 
     74 */ 
     75extern enum_name_t *debug_lower_names; 
     76 
     77/** 
    7378 * Debug levels used to control output verbosity. 
    7479 */ 
  • trunk/src/charon/bus/listeners/file_logger.c

    r4484 r4622  
    9999static void destroy(private_file_logger_t *this) 
    100100{ 
     101    if (this->out != stdout && this->out != stderr) 
     102    { 
     103        fclose(this->out); 
     104    } 
    101105    free(this); 
    102106} 
  • trunk/src/charon/daemon.c

    r4585 r4622  
    206206    dbg = dbg_stderr; 
    207207    DESTROY_IF(this->public.bus); 
    208     DESTROY_IF(this->public.outlog); 
    209     DESTROY_IF(this->public.syslog); 
    210     DESTROY_IF(this->public.authlog); 
     208    this->public.file_loggers->destroy_offset(this->public.file_loggers, 
     209                                            offsetof(file_logger_t, destroy)); 
     210    this->public.sys_loggers->destroy_offset(this->public.sys_loggers, 
     211                                            offsetof(sys_logger_t, destroy)); 
    211212    free(this); 
    212213} 
     
    329330 
    330331/** 
     332 * Initialize logging 
     333 */ 
     334static void initialize_loggers(private_daemon_t *this, bool use_stderr, 
     335                               level_t levels[]) 
     336{ 
     337    sys_logger_t *sys_logger; 
     338    file_logger_t *file_logger; 
     339    enumerator_t *enumerator; 
     340    char *facility, *filename; 
     341    int loggers_defined = 0; 
     342    debug_t group; 
     343    level_t  def; 
     344    bool append; 
     345    FILE *file; 
     346     
     347    /* setup sysloggers */ 
     348    enumerator = lib->settings->create_section_enumerator(lib->settings, 
     349                                                          "charon.syslog"); 
     350    while (enumerator->enumerate(enumerator, &facility)) 
     351    { 
     352        loggers_defined++; 
     353        if (streq(facility, "daemon")) 
     354        { 
     355            sys_logger = sys_logger_create(LOG_DAEMON); 
     356        } 
     357        else if (streq(facility, "auth")) 
     358        { 
     359            sys_logger = sys_logger_create(LOG_AUTHPRIV); 
     360        } 
     361        else 
     362        { 
     363            continue; 
     364        } 
     365        def = lib->settings->get_int(lib->settings, 
     366                                     "charon.syslog.%s.default", 1, facility); 
     367        for (group = 0; group < DBG_MAX; group++) 
     368        { 
     369            sys_logger->set_level(sys_logger, group, 
     370                lib->settings->get_int(lib->settings, 
     371                                       "charon.syslog.%s.%N", def, 
     372                                       facility, debug_lower_names, group)); 
     373        } 
     374        this->public.sys_loggers->insert_last(this->public.sys_loggers, 
     375                                              sys_logger); 
     376        this->public.bus->add_listener(this->public.bus, &sys_logger->listener); 
     377    } 
     378    enumerator->destroy(enumerator); 
     379     
     380    /* and file loggers */ 
     381    enumerator = lib->settings->create_section_enumerator(lib->settings, 
     382                                                          "charon.filelog"); 
     383    while (enumerator->enumerate(enumerator, &filename)) 
     384    { 
     385        loggers_defined++; 
     386        if (streq(filename, "stderr")) 
     387        { 
     388            file = stderr; 
     389        } 
     390        else if (streq(filename, "stdout")) 
     391        { 
     392            file = stdout; 
     393        } 
     394        else 
     395        { 
     396            append = lib->settings->get_bool(lib->settings, 
     397                                    "charon.filelog.%s.append", TRUE, filename); 
     398            file = fopen(filename, append ? "a" : "w"); 
     399            if (file == NULL) 
     400            { 
     401                DBG1(DBG_DMN, "opening file %s for logging failed: %s", 
     402                     filename, strerror(errno)); 
     403                continue; 
     404            } 
     405        } 
     406        file_logger = file_logger_create(file); 
     407        def = lib->settings->get_int(lib->settings, 
     408                                     "charon.filelog.%s.default", 1, filename); 
     409        for (group = 0; group < DBG_MAX; group++) 
     410        { 
     411            file_logger->set_level(file_logger, group, 
     412                lib->settings->get_int(lib->settings, 
     413                                       "charon.filelog.%s.%N", def, 
     414                                       filename, debug_lower_names, group)); 
     415        } 
     416        this->public.file_loggers->insert_last(this->public.file_loggers, 
     417                                               file_logger); 
     418        this->public.bus->add_listener(this->public.bus, &file_logger->listener); 
     419     
     420    } 
     421    enumerator->destroy(enumerator); 
     422     
     423    /* setup legacy style default loggers provided via command-line */ 
     424    if (!loggers_defined) 
     425    { 
     426        file_logger = file_logger_create(stdout); 
     427        sys_logger = sys_logger_create(LOG_DAEMON); 
     428        this->public.bus->add_listener(this->public.bus, &file_logger->listener); 
     429        this->public.bus->add_listener(this->public.bus, &sys_logger->listener); 
     430        this->public.file_loggers->insert_last(this->public.file_loggers, 
     431                                               file_logger); 
     432        this->public.sys_loggers->insert_last(this->public.sys_loggers, 
     433                                              sys_logger); 
     434        for (group = 0; group < DBG_MAX; group++) 
     435        { 
     436            sys_logger->set_level(sys_logger, group, levels[group]); 
     437            if (use_stderr) 
     438            { 
     439                file_logger->set_level(file_logger, group, levels[group]); 
     440            } 
     441        } 
     442    } 
     443} 
     444 
     445/** 
    331446 * Initialize the daemon 
    332447 */ 
    333448static bool initialize(private_daemon_t *this, bool syslog, level_t levels[]) 
    334449{ 
    335     debug_t group; 
    336      
    337450    /* for uncritical pseudo random numbers */ 
    338451    srandom(time(NULL) + getpid()); 
     
    340453    /* setup bus and it's listeners first to enable log output */ 
    341454    this->public.bus = bus_create(); 
    342     this->public.outlog = file_logger_create(stdout); 
    343     this->public.syslog = sys_logger_create(LOG_DAEMON); 
    344     this->public.authlog = sys_logger_create(LOG_AUTHPRIV); 
    345     this->public.bus->add_listener(this->public.bus, &this->public.syslog->listener); 
    346     this->public.bus->add_listener(this->public.bus, &this->public.outlog->listener); 
    347     this->public.bus->add_listener(this->public.bus, &this->public.authlog->listener); 
    348     this->public.authlog->set_level(this->public.authlog, DBG_ANY, LEVEL_AUDIT); 
    349455    /* set up hook to log dbg message in library via charons message bus */ 
    350456    dbg = dbg_bus; 
    351457     
    352     /* apply loglevels */ 
    353     for (group = 0; group < DBG_MAX; group++) 
    354     { 
    355         this->public.syslog->set_level(this->public.syslog, 
    356                                        group, levels[group]); 
    357         if (!syslog) 
    358         { 
    359             this->public.outlog->set_level(this->public.outlog, 
    360                                            group, levels[group]); 
    361         } 
    362     } 
     458    initialize_loggers(this, !syslog, levels); 
    363459     
    364460    DBG1(DBG_DMN, "starting charon (strongSwan Version %s)", VERSION); 
     
    465561    this->public.sim = NULL; 
    466562    this->public.bus = NULL; 
    467     this->public.outlog = NULL; 
    468     this->public.syslog = NULL; 
    469     this->public.authlog = NULL; 
     563    this->public.file_loggers = linked_list_create(); 
     564    this->public.sys_loggers = linked_list_create(); 
    470565#ifdef ME 
    471566    this->public.connect_manager = NULL; 
  • trunk/src/charon/daemon.h

    r4406 r4622  
    218218     
    219219    /** 
    220      * Manager IKEv2 cfg payload attributes 
     220     * Manager for IKEv2 cfg payload attributes 
    221221     */ 
    222222    attribute_manager_t *attributes; 
     
    253253     
    254254    /** 
    255      * A bus listener logging to stdout 
    256      */ 
    257     file_logger_t *outlog; 
    258      
    259     /** 
    260      * A bus listener logging to syslog 
    261      */ 
    262     sys_logger_t *syslog; 
    263      
    264     /** 
    265      * A bus listener logging most important events 
    266      */ 
    267     sys_logger_t *authlog; 
     255     * A list of installed file_logger_t's 
     256     */ 
     257    linked_list_t *file_loggers; 
     258     
     259    /** 
     260     * A list of installed sys_logger_t's 
     261     */ 
     262    linked_list_t *sys_loggers; 
    268263     
    269264    /** 
  • trunk/src/charon/plugins/stroke/stroke_socket.c

    r4576 r4622  
    359359                            stroke_msg_t *msg, FILE *out) 
    360360{ 
     361    enumerator_t *enumerator; 
     362    sys_logger_t *sys_logger; 
     363    file_logger_t *file_logger; 
    361364    debug_t group; 
    362365     
     
    371374        return; 
    372375    } 
    373      
    374     charon->outlog->set_level(charon->outlog, group, msg->loglevel.level); 
    375     charon->syslog->set_level(charon->syslog, group, msg->loglevel.level); 
     376    /* we set the loglevel on ALL sys- and file-loggers */ 
     377    enumerator = charon->sys_loggers->create_enumerator(charon->sys_loggers); 
     378    while (enumerator->enumerate(enumerator, &sys_logger)) 
     379    { 
     380        sys_logger->set_level(sys_logger, group, msg->loglevel.level); 
     381    } 
     382    enumerator->destroy(enumerator); 
     383    enumerator = charon->file_loggers->create_enumerator(charon->file_loggers); 
     384    while (enumerator->enumerate(enumerator, &file_logger)) 
     385    { 
     386        file_logger->set_level(file_logger, group, msg->loglevel.level); 
     387    } 
     388    enumerator->destroy(enumerator); 
    376389} 
    377390