Hi Robin,

Thank you for the patch, I have applied it to the source.

Best regards, Wouter

On 03/11/16 01:10, robbat2--- via Unbound-users wrote:
> From: "Robin H. Johnson" <[email protected]>
> 
> Add an option to control the log identity of unbound instances.
> 
> This is primarily useful on systems that run more than one instance of
> unbound, with different configurations, so that the logs can be easily
> distinguished against.
> 
> Signed-off-by: Robin H. Johnson <[email protected]>
> ---
>  daemon/unbound.c     | 29 ++++++++++++++++++++++-------
>  doc/example.conf.in  |  6 +++++-
>  util/config_file.c   |  3 +++
>  util/config_file.h   |  2 ++
>  util/configlexer.lex |  1 +
>  util/configparser.y  | 11 ++++++++++-
>  6 files changed, 43 insertions(+), 9 deletions(-)
> 
> diff --git a/daemon/unbound.c b/daemon/unbound.c
> index 88fbb6f..0a0cf80 100644
> --- a/daemon/unbound.c
> +++ b/daemon/unbound.c
> @@ -244,10 +244,21 @@ checkrlimits(struct config_file* cfg)
>  #endif /* S_SPLINT_S */
>  }
>  
> +/** set default logfile identity based on value from argv[0] at startup **/
> +static void
> +log_ident_set_fromdefault(struct config_file* cfg,
> +     const char *log_default_identity)
> +{
> +     if(strncmp(cfg->log_identity, "", strlen(cfg->log_identity)) == 0)
> +             log_ident_set(log_default_identity);
> +     else
> +             log_ident_set(cfg->log_identity);
> +}
> +
>  /** set verbosity, check rlimits, cache settings */
>  static void
>  apply_settings(struct daemon* daemon, struct config_file* cfg, 
> -     int cmdline_verbose, int debug_mode)
> +     int cmdline_verbose, int debug_mode, const char* log_default_identity)
>  {
>       /* apply if they have changed */
>       verbosity = cmdline_verbose + cfg->verbosity;
> @@ -258,6 +269,7 @@ apply_settings(struct daemon* daemon, struct config_file* 
> cfg,
>       }
>       daemon_apply_cfg(daemon, cfg);
>       checkrlimits(cfg);
> +     log_ident_set_fromdefault(cfg, log_default_identity);
>  }
>  
>  #ifdef HAVE_KILL
> @@ -587,9 +599,10 @@ perform_setup(struct daemon* daemon, struct config_file* 
> cfg, int debug_mode,
>   * @param cmdline_verbose: verbosity resulting from commandline -v.
>   *    These increase verbosity as specified in the config file.
>   * @param debug_mode: if set, do not daemonize.
> + * @param log_default_identity: Default identity to report in logs
>   */
>  static void 
> -run_daemon(const char* cfgfile, int cmdline_verbose, int debug_mode)
> +run_daemon(const char* cfgfile, int cmdline_verbose, int debug_mode, const 
> char* log_default_identity)
>  {
>       struct config_file* cfg = NULL;
>       struct daemon* daemon = NULL;
> @@ -611,7 +624,7 @@ run_daemon(const char* cfgfile, int cmdline_verbose, int 
> debug_mode)
>                                       cfgfile);
>                       log_warn("Continuing with default config settings");
>               }
> -             apply_settings(daemon, cfg, cmdline_verbose, debug_mode);
> +             apply_settings(daemon, cfg, cmdline_verbose, debug_mode, 
> log_default_identity);
>               if(!done_setup)
>                       config_lookup_uid(cfg);
>       
> @@ -619,7 +632,7 @@ run_daemon(const char* cfgfile, int cmdline_verbose, int 
> debug_mode)
>               if(!daemon_open_shared_ports(daemon))
>                       fatal_exit("could not open ports");
>               if(!done_setup) { 
> -                     perform_setup(daemon, cfg, debug_mode, &cfgfile); 
> +                     perform_setup(daemon, cfg, debug_mode, &cfgfile);
>                       done_setup = 1; 
>               } else {
>                       /* reopen log after HUP to facilitate log rotation */
> @@ -666,6 +679,7 @@ main(int argc, char* argv[])
>       int c;
>       const char* cfgfile = CONFIGFILE;
>       const char* winopt = NULL;
> +     const char* log_ident_default;
>       int cmdline_verbose = 0;
>       int debug_mode = 0;
>  #ifdef UB_ON_WINDOWS
> @@ -678,7 +692,8 @@ main(int argc, char* argv[])
>  #endif
>  
>       log_init(NULL, 0, NULL);
> -     log_ident_set(strrchr(argv[0],'/')?strrchr(argv[0],'/')+1:argv[0]);
> +     log_ident_default = strrchr(argv[0],'/')?strrchr(argv[0],'/')+1:argv[0];
> +     log_ident_set(log_ident_default);
>       /* parse the options */
>       while( (c=getopt(argc, argv, "c:dhvw:")) != -1) {
>               switch(c) {
> @@ -711,7 +726,7 @@ main(int argc, char* argv[])
>       if(winopt) {
>  #ifdef UB_ON_WINDOWS
>               wsvc_command_option(winopt, cfgfile, cmdline_verbose, 
> -                     cmdline_cfg);
> +                     cmdline_cfg, log_ident_default);
>  #else
>               fatal_exit("option not supported");
>  #endif
> @@ -722,7 +737,7 @@ main(int argc, char* argv[])
>               return 1;
>       }
>  
> -     run_daemon(cfgfile, cmdline_verbose, debug_mode);
> +     run_daemon(cfgfile, cmdline_verbose, debug_mode, log_ident_default);
>       log_init(NULL, 0, NULL); /* close logfile */
>       return 0;
>  }
> diff --git a/doc/example.conf.in b/doc/example.conf.in
> index 9c097aa..2e47701 100644
> --- a/doc/example.conf.in
> +++ b/doc/example.conf.in
> @@ -275,9 +275,13 @@ server:
>       # logfile: ""
>  
>       # Log to syslog(3) if yes. The log facility LOG_DAEMON is used to
> -     # log to, with identity "unbound". If yes, it overrides the logfile.
> +     # log to. If yes, it overrides the logfile.
>       # use-syslog: yes
>  
> +     # Log identity to report. if empty, defaults to the name of argv[0]
> +     # (usually "unbound").
> +     # log-identity: ""
> +
>       # print UTC timestamp in ascii to logfile, default is epoch in seconds.
>       # log-time-ascii: no
>  
> diff --git a/util/config_file.c b/util/config_file.c
> index 7c668ba..e798700 100644
> --- a/util/config_file.c
> +++ b/util/config_file.c
> @@ -105,6 +105,7 @@ config_create(void)
>       cfg->ssl_port = 853;
>       cfg->ssl_upstream = 0;
>       cfg->use_syslog = 1;
> +     cfg->log_identity = strdup(""); /* changed later with argv[0] */
>       cfg->log_time_ascii = 0;
>       cfg->log_queries = 0;
>  #ifndef USE_WINSOCK
> @@ -370,6 +371,7 @@ int config_set_option(struct config_file* cfg, const 
> char* opt,
>         log_set_time_asc(cfg->log_time_ascii); }
>       else S_SIZET_NONZERO("max-udp-size:", max_udp_size)
>       else S_YNO("use-syslog:", use_syslog)
> +     else S_STR("log-identity:", log_identity)
>       else S_YNO("extended-statistics:", stat_extended)
>       else S_YNO("statistics-cumulative:", stat_cumulative)
>       else S_YNO("do-ip4:", do_ip4)
> @@ -680,6 +682,7 @@ config_get_option(struct config_file* cfg, const char* 
> opt,
>       else O_YNO(opt, "statistics-cumulative", stat_cumulative)
>       else O_YNO(opt, "extended-statistics", stat_extended)
>       else O_YNO(opt, "use-syslog", use_syslog)
> +     else O_STR(opt, "log-identity", log_identity)
>       else O_YNO(opt, "log-time-ascii", log_time_ascii)
>       else O_DEC(opt, "num-threads", num_threads)
>       else O_IFC(opt, "interface", num_ifs, ifs)
> diff --git a/util/config_file.h b/util/config_file.h
> index 4499ac3..bf518d1 100644
> --- a/util/config_file.h
> +++ b/util/config_file.h
> @@ -229,6 +229,8 @@ struct config_file {
>       int log_time_ascii;
>       /** log queries with one line per query */
>       int log_queries;
> +     /** log identity to report */
> +     char* log_identity;
>  
>       /** do not report identity (id.server, hostname.bind) */
>       int hide_identity;
> diff --git a/util/configlexer.lex b/util/configlexer.lex
> index 35b7ecb..074ccf5 100644
> --- a/util/configlexer.lex
> +++ b/util/configlexer.lex
> @@ -328,6 +328,7 @@ del-holddown{COLON}               { YDVAR(1, 
> VAR_DEL_HOLDDOWN) }
>  keep-missing{COLON}          { YDVAR(1, VAR_KEEP_MISSING) }
>  permit-small-holddown{COLON} { YDVAR(1, VAR_PERMIT_SMALL_HOLDDOWN) }
>  use-syslog{COLON}            { YDVAR(1, VAR_USE_SYSLOG) }
> +log-identity{COLON}          { YDVAR(1, VAR_LOG_IDENTITY) }
>  log-time-ascii{COLON}                { YDVAR(1, VAR_LOG_TIME_ASCII) }
>  log-queries{COLON}           { YDVAR(1, VAR_LOG_QUERIES) }
>  local-zone{COLON}            { YDVAR(2, VAR_LOCAL_ZONE) }
> diff --git a/util/configparser.y b/util/configparser.y
> index 6ac12b5..2a3df28 100644
> --- a/util/configparser.y
> +++ b/util/configparser.y
> @@ -130,6 +130,7 @@ extern struct config_parser_state* cfg_parser;
>  %token VAR_LOCAL_ZONE_OVERRIDE VAR_ACCESS_CONTROL_TAG_ACTION
>  %token VAR_ACCESS_CONTROL_TAG_DATA VAR_VIEW VAR_ACCESS_CONTROL_VIEW
>  %token VAR_VIEW_FIRST VAR_SERVE_EXPIRED VAR_FAKE_DSA
> +%token VAR_LOG_IDENTITY
>  
>  %%
>  toplevelvars: /* empty */ | toplevelvars toplevelvar ;
> @@ -204,7 +205,7 @@ content_server: server_num_threads | server_verbosity | 
> server_port |
>       server_local_zone_override | server_access_control_tag_action |
>       server_access_control_tag_data | server_access_control_view |
>       server_qname_minimisation_strict | server_serve_expired |
> -     server_fake_dsa
> +     server_fake_dsa | server_log_identity
>       ;
>  stubstart: VAR_STUB_ZONE
>       {
> @@ -1909,6 +1910,14 @@ server_disable_dnssec_lame_check: 
> VAR_DISABLE_DNSSEC_LAME_CHECK STRING_ARG
>                       (strcmp($2, "yes")==0);
>               free($2);
>       }
> +     ;
> +server_log_identity: VAR_LOG_IDENTITY STRING_ARG
> +     {
> +             OUTYY(("P(server_log_identity:%s)\n", $2));
> +             free(cfg_parser->cfg->log_identity);
> +             cfg_parser->cfg->log_identity = $2;
> +     }
> +     ;
>  %%
>  
>  /* parse helper routines could be here */
> 


Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to