]> git.proxmox.com Git - mirror_frr.git/commitdiff
2004-12-07 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
authorajs <ajs>
Tue, 7 Dec 2004 15:39:31 +0000 (15:39 +0000)
committerajs <ajs>
Tue, 7 Dec 2004 15:39:31 +0000 (15:39 +0000)
* bgp_main.c: (main) The 2nd argument to openzlog has been removed.
* isis_main.c: (main) The 2nd argument to openzlog has been removed.
* ospf6_main.c: (main) The 2nd argument to openzlog has been removed.
  Note that stdout logging will no longer be enabled by default when
  not running as a daemon.
* ospf_main.c: (main) The 2nd argument to openzlog has been removed.
* rip_main.c: (main) The 2nd argument to openzlog has been removed.
* ripng_main.c: (main) The 2nd argument to openzlog has been removed.
* main.c: (main) The 2nd argument to openzlog has been removed.
  So stdout logging will no longer be enabled by default.
* irdp_main.c: (irdp_finish) Reduce severity of shutdown message
  from LOG_WARNING to LOG_INFO.
* vtysh.c: Make several functions static instead of global.
  Added several commands to support destination-specific logging levels.
  (vtysh_completion) This function is unused, so comment it out.
* basic.texi: Document new logging features.  Separate basic config
  commands from basic VTY commands.
* log.h: Replace struct zlog flags and maskpri fields with maxlvl
  array to support individual logging levels for each destination.
  Remove the 2nd argument to openzlog since the default logging config
  should be standardized inside the library.  Replaced the
  zlog_set_flag and zlog_reset_flag functions with zlog_set_level.
  And zlog_set_file now requires an additional log_level argument.
  Declare zlog_proto_names for use inside command.c in the
  "show logging" command.  Added defines useful for command
  construction.
* log.c: (vzlog) Decide where to send the message based on the
  individual logging levels configured for each destination.
  Remove support for ZLOG_STDERR since it was never actually used.
  Support record-priority for terminal monitors.
  (zlog_signal,zlog_backtrace_sigsafe) Support destination-specific
  logging levels.  Remove stderr support (was never used).  Added
  support for terminal monitor logging.
  (_zlog_assert_failed) Increase message severity to LOG_EMERG.
  (openzlog) Remove 2nd argument since default config should be
  standardized in library.  By default, terminal monitoring
  is set to debug, and all other logging is disabled.
  (zlog_set_flag,zlog_reset_flag) Removed.
  (zlog_set_level) New function to replace zlog_set_flag and
  zlog_reset_flag.  Supports destination-specific logging levels.
  (zlog_set_file,zlog_reset_file) Support file-specific logging level.
  (zlog_rotate) Log an error message if fopen fails, and support
  new file-specific logging level.
* command.h: Change DEFUN_CMD_FUNC_DECL and DEFUN_CMD_FUNC_TEXT so that
  command functions will be static instead of global.  Remove
  declarations for config_exit and config_help.  Define new macros
  DEFUNSH_ATTR, DEFUNSH_HIDDEN, and DEFUNSH_DEPRECATED so we can
  have deprecated commands in vtysh.  Similarly, for completeness,
  define macros ALIAS_SH, ALIAS_SH_HIDDEN, and ALIAS_SH_DEPRECATED.
  Also, fix bug in ALIAS_ATTR macro (didn't matter because it
  was never used).
* command.c: Make many functions static instead of global.
  (facility_name,facility_match,level_match) New functions
  to support enhanced destination-specific logging levels.
  (config_write_host) Support new destination-specific logging levels.
  (config_logmsg) Added new "logmsg" command to help test logging
  system.
  (show_logging) Added "show logging" command to show the current
  configuration of the logging system.
  (config_log_stdout_level) Support explicit stdout logging level.
  (no_config_log_stdout) Now takes optional LEVEL arg.
  (config_log_monitor,config_log_monitor_level,no_config_log_monitor)
  New commands creating new "log monitor" commands to set terminal
  monitoring log level.
  (config_log_file_level) Support explicit file logging level.
  (config_log_syslog_level) Support explicit syslog logging level.
  (config_log_facility,no_config_log_facility) Implement new
  "log facility" command.
  (cmd_init) Add hooks for new commands: "show logging", "logmsg",
  "log stdout <level>", "log monitor", "log monitor <level>",
  "no log monitor", "log file <filename> <level>",
  "no log file <filename> <level>", "log syslog <level>",
  "log facility", and "no log facility".
* vty.h: Added a "level" argument to vty_log so it can support
  "log record-priority".  Declare new function vty_log_fixed for
  use in signal handlers.
* vty.c: (vty_log,vty_log_out) Added a "level" argument to support
  "log record-priority" for vty terminal monitors.
  (vty_down_level) Use config_exit_cmd.func instead of calling
  config_exit directly (since command functions will now be static
  instead of global).
  (vty_log_fixed) New function to send terminal monitor messages
  from inside a signal handler.

27 files changed:
bgpd/ChangeLog
bgpd/bgp_main.c
doc/ChangeLog
doc/basic.texi
doc/quagga.info
isisd/ChangeLog
isisd/isis_main.c
lib/ChangeLog
lib/command.c
lib/command.h
lib/log.c
lib/log.h
lib/vty.c
lib/vty.h
ospf6d/ChangeLog
ospf6d/ospf6_main.c
ospfd/ChangeLog
ospfd/ospf_main.c
ripd/ChangeLog
ripd/rip_main.c
ripngd/ChangeLog
ripngd/ripng_main.c
vtysh/ChangeLog
vtysh/vtysh.c
zebra/ChangeLog
zebra/irdp_main.c
zebra/main.c

index c76627b6697856794338e061a250ed67fae93219..705d76f970c54e33e887cd5c7a83d9721b350fae 100644 (file)
@@ -1,3 +1,7 @@
+2004-12-07 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+       * bgp_main.c: (main) The 2nd argument to openzlog has been removed.
+
 2004-12-03 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
        * bgp_main.c: (sigint) Use zlog_notice for termination message.
index ee498b0c31b24e8c8f02b4288b1e12fb88f22979..6de0a8a068bd70c97311d5451d350505c89b79ed 100644 (file)
@@ -205,7 +205,7 @@ main (int argc, char **argv)
   /* Preserve name of myself. */
   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
 
-  zlog_default = openzlog (progname, ZLOG_NOLOG, ZLOG_BGP,
+  zlog_default = openzlog (progname, ZLOG_BGP,
                           LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
 
   /* BGP master init. */
index 6afe5a3d2061fffc45cb46420429a7702abf083d..0327be2b310aeeba7eda38023fd3cd094ef19e18 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-07 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+       * basic.texi: Document new logging features.  Separate basic config
+         commands from basic VTY commands.
+
 2004-11-25 Hasso Tepper <hasso at quagga.net>
 
        * *.8: Document -g/--group command line switch and some small
index ab976445dc8eb7775afcb685c33ebb57467721f6..cbbdea49b6b753cfe48f8e89345c2d5ec36715f5 100644 (file)
@@ -15,9 +15,10 @@ The following sections discuss commands common to all the routing
 daemons.
 
 @menu
+* Terminal Mode Commands::      Common commands used in a VTY
 * Config Commands::             Commands used in config files
 * Common Invocation Options::   Starting the daemons
-* Virtual Terminal Interfaces::  Interacting with the daemons
+* Virtual Terminal Interfaces:: Interacting with the daemons
 @end menu
 
 
@@ -78,47 +79,85 @@ accept connections.
 Set enable password.
 @end deffn
 
+@deffn Command {log trap @var{level}} {}
+@deffnx Command {no log trap} {}
+These commands are deprecated and are present only for historical compatibility.
+The log trap command sets the current logging level for all enabled
+logging destinations, and it sets the default for all future logging commands
+that do not specify a level.  The normal default
+logging level is debugging.  The @code{no} form of the command resets
+the default level for future logging commands to debugging, but it does
+not change the logging level of existing logging destinations.
+@end deffn
+
+
 @deffn Command {log stdout} {}
+@deffnx Command {log stdout @var{level}} {}
 @deffnx Command {no log stdout} {}
-Set logging output to stdout.
+Enable logging output to stdout. 
+If the optional second argument specifying the
+logging level is not present, the default logging level (typically debugging,
+but can be changed using the deprecated @code{log trap} command) will be used.
+The @code{no} form of the command disables logging to stdout.
+The @code{level} argument must have one of these values: 
+emergencies, alerts, critical, errors, warnings, notifications, informational, or debugging.  Note that the existing code logs its most important messages
+with severity @code{errors}.
 @end deffn
 
 @deffn Command {log file @var{filename}} {}
-If you want to log into a file please specify @code{filename} as
-follows.
+@deffnx Command {log file @var{filename} @var{level}} {}
+@deffnx Command {no log file} {}
+If you want to log into a file, please specify @code{filename} as
+in this example:
 @example
-log file /usr/local/etc/bgpd.log
+log file /var/log/quagga/bgpd.log informational
 @end example
+If the optional second argument specifying the
+logging level is not present, the default logging level (typically debugging,
+but can be changed using the deprecated @code{log trap} command) will be used.
+The @code{no} form of the command disables logging to a file.
 @end deffn
 
 @deffn Command {log syslog} {}
+@deffnx Command {log syslog @var{level}} {}
 @deffnx Command {no log syslog} {}
-Set logging output to syslog.
-@end deffn
-
-@deffn Command {write terminal} {}
-Displays the current configuration to the vty interface.
-@end deffn
-
-@deffn Command {write file} {}
-Write current configuration to configuration file.
-@end deffn
-
-@deffn Command {configure terminal} {}
-Change to configuration mode.  This command is the first step to
-configuration.
+Enable logging output to syslog.
+If the optional second argument specifying the
+logging level is not present, the default logging level (typically debugging,
+but can be changed using the deprecated @code{log trap} command) will be used.
+The @code{no} form of the command disables logging to syslog.
 @end deffn
 
-@deffn Command {terminal length @var{<0-512>}} {}
-Set terminal display length to @var{<0-512>}.  If length is 0, no
-display control is performed.
+@deffn Command {log monitor} {}
+@deffnx Command {log monitor @var{level}} {}
+@deffnx Command {no log monitor} {}
+Enable logging output to vty terminals that have enabled logging
+using the @code{terminal monitor} command.
+By default, monitor logging is enabled at the debugging level, but this
+command (or the deprecated @code{log trap} command) can be used to change 
+the monitor logging level.
+If the optional second argument specifying the
+logging level is not present, the default logging level (typically debugging,
+but can be changed using the deprecated @code{log trap} command) will be used.
+The @code{no} form of the command disables logging to terminal monitors.
 @end deffn
 
-@deffn Command {who} {}
+@deffn Command {log facility @var{facility}} {}
+@deffnx Command {no log facility} {}
+This command changes the facility used in syslog messages.  The default
+facility is @code{daemon}.  The @code{no} form of the command resets
+the facility to the default @code{daemon} facility.
 @end deffn
 
-@deffn Command {list} {}
-List commands.
+@deffn Command {log record-priority} {}
+@deffnx Command {no log record-priority} {}
+To include the severity in all messages logged to a file, to stdout, or to
+a terminal monitor (i.e. anything except syslog),
+use the @code{log record-priority} global configuration command.
+To disable this option, use the @code{no} form of the command.  By default,
+the severity level is not included in logged messages.  Note: some
+versions of syslogd (including Solaris) can be configured to include
+the facility and level in the messages emitted.
 @end deffn
 
 @deffn Command {service password-encryption} {}
@@ -134,10 +173,6 @@ Set system wide line configuration.  This configuration command applies
 to all VTY interfaces.
 @end deffn
 
-@deffn Command {show version} {}
-Show the current version of @value{PACKAGE_NAME} and its build host information.
-@end deffn
-
 @deffn Command {line vty} {}
 Enter vty configuration mode.
 @end deffn
@@ -167,8 +202,6 @@ Do not perform timeout at all.  This command is as same as
 Restrict vty connections with an access list.
 @end deffn
 
-
-
 @node Sample Config File
 @subsection Sample Config File
 
@@ -204,6 +237,52 @@ comment and the password is set to 'zebra!password'.
 
 
 
+@node Terminal Mode Commands
+@section Terminal Mode Commands
+
+@deffn Command {write terminal} {}
+Displays the current configuration to the vty interface.
+@end deffn
+
+@deffn Command {write file} {}
+Write current configuration to configuration file.
+@end deffn
+
+@deffn Command {configure terminal} {}
+Change to configuration mode.  This command is the first step to
+configuration.
+@end deffn
+
+@deffn Command {terminal length @var{<0-512>}} {}
+Set terminal display length to @var{<0-512>}.  If length is 0, no
+display control is performed.
+@end deffn
+
+@deffn Command {who} {}
+Show a list of currently connected vty sessions.
+@end deffn
+
+@deffn Command {list} {}
+List all available commands.
+@end deffn
+
+@deffn Command {show version} {}
+Show the current version of @value{PACKAGE_NAME} and its build host information.
+@end deffn
+
+@deffn Command {show logging} {}
+Shows the current configuration of the logging system.  This includes
+the status of all logging destinations.
+@end deffn
+
+@deffn Command {logmsg @var{level} @var{message}} {}
+Send a message to all logging destinations that are enabled for messages
+of the given severity.
+@end deffn
+
+
+
+
 @node Common Invocation Options
 @section Common Invocation Options
 @c COMMON_OPTIONS
index b2db6d9afced3861854354c9878e5174e5f05bc7..c60458387acd7e8fd5f031b6e965fd547cdf825c 100644 (file)
@@ -22,7 +22,7 @@ END-INFO-DIR-ENTRY
    This file documents the Quagga Software Routing Suite which manages
 common TCP/IP routing protocols.
 
-   This is Edition 0.97.3, last updated 7 November 2004 of `The Quagga
+   This is Edition 0.97.3, last updated 8 November 2004 of `The Quagga
 Manual', for Quagga Version 0.97.3.
 
    Copyright (C) 1999-2004 Kunihiro Ishiguro, et al.
@@ -693,12 +693,13 @@ daemons.
 
 * Menu:
 
+* Terminal Mode Commands::      Common commands used in a VTY
 * Config Commands::             Commands used in config files
 * Common Invocation Options::   Starting the daemons
-* Virtual Terminal Interfaces::  Interacting with the daemons
+* Virtual Terminal Interfaces:: Interacting with the daemons
 
 \1f
-File: quagga.info,  Node: Config Commands,  Next: Common Invocation Options,  Up: Basic commands
+File: quagga.info,  Node: Config Commands,  Next: Common Invocation Options,  Prev: Terminal Mode Commands,  Up: Basic commands
 
 3.1 Config Commands
 ===================
@@ -742,37 +743,78 @@ File: quagga.info,  Node: Basic Config Commands,  Next: Sample Config File,  Up:
  -- Command: enable password PASSWORD
      Set enable password.
 
+ -- Command: log trap LEVEL
+ -- Command: no log trap
+     These commands are deprecated and are present only for historical
+     compatibility.  The log trap command sets the current logging
+     level for all enabled logging destinations, and it sets the
+     default for all future logging commands that do not specify a
+     level.  The normal default logging level is debugging.  The `no'
+     form of the command resets the default level for future logging
+     commands to debugging, but it does not change the logging level of
+     existing logging destinations.
+
  -- Command: log stdout
+ -- Command: log stdout LEVEL
  -- Command: no log stdout
-     Set logging output to stdout.
+     Enable logging output to stdout.  If the optional second argument
+     specifying the logging level is not present, the default logging
+     level (typically debugging, but can be changed using the
+     deprecated `log trap' command) will be used.  The `no' form of the
+     command disables logging to stdout.  The `level' argument must
+     have one of these values: emergencies, alerts, critical, errors,
+     warnings, notifications, informational, or debugging.  Note that
+     the existing code logs its most important messages with severity
+     `errors'.
 
  -- Command: log file FILENAME
-     If you want to log into a file please specify `filename' as
-     follows.
-          log file /usr/local/etc/bgpd.log
+ -- Command: log file FILENAME LEVEL
+ -- Command: no log file
+     If you want to log into a file, please specify `filename' as in
+     this example:
+          log file /var/log/quagga/bgpd.log informational
+     If the optional second argument specifying the logging level is
+     not present, the default logging level (typically debugging, but
+     can be changed using the deprecated `log trap' command) will be
+     used.  The `no' form of the command disables logging to a file.
 
  -- Command: log syslog
+ -- Command: log syslog LEVEL
  -- Command: no log syslog
-     Set logging output to syslog.
-
- -- Command: write terminal
-     Displays the current configuration to the vty interface.
-
- -- Command: write file
-     Write current configuration to configuration file.
-
- -- Command: configure terminal
-     Change to configuration mode.  This command is the first step to
-     configuration.
-
- -- Command: terminal length <0-512>
-     Set terminal display length to <0-512>.  If length is 0, no
-     display control is performed.
-
- -- Command: who
-
- -- Command: list
-     List commands.
+     Enable logging output to syslog.  If the optional second argument
+     specifying the logging level is not present, the default logging
+     level (typically debugging, but can be changed using the
+     deprecated `log trap' command) will be used.  The `no' form of the
+     command disables logging to syslog.
+
+ -- Command: log monitor
+ -- Command: log monitor LEVEL
+ -- Command: no log monitor
+     Enable logging output to vty terminals that have enabled logging
+     using the `terminal monitor' command.  By default, monitor logging
+     is enabled at the debugging level, but this command (or the
+     deprecated `log trap' command) can be used to change the monitor
+     logging level.  If the optional second argument specifying the
+     logging level is not present, the default logging level (typically
+     debugging, but can be changed using the deprecated `log trap'
+     command) will be used.  The `no' form of the command disables
+     logging to terminal monitors.
+
+ -- Command: log facility FACILITY
+ -- Command: no log facility
+     This command changes the facility used in syslog messages.  The
+     default facility is `daemon'.  The `no' form of the command resets
+     the facility to the default `daemon' facility.
+
+ -- Command: log record-priority
+ -- Command: no log record-priority
+     To include the severity in all messages logged to a file, to
+     stdout, or to a terminal monitor (i.e. anything except syslog),
+     use the `log record-priority' global configuration command.  To
+     disable this option, use the `no' form of the command.  By default,
+     the severity level is not included in logged messages.  Note: some
+     versions of syslogd (including Solaris) can be configured to
+     include the facility and level in the messages emitted.
 
  -- Command: service password-encryption
      Encrypt password.
@@ -784,9 +826,6 @@ File: quagga.info,  Node: Basic Config Commands,  Next: Sample Config File,  Up:
      Set system wide line configuration.  This configuration command
      applies to all VTY interfaces.
 
- -- Command: show version
-     Show the current version of Quagga and its build host information.
-
  -- Command: line vty
      Enter vty configuration mode.
 
@@ -840,10 +879,47 @@ forward will be ignored as a comment.
 normal character. So in the above example '!' will not be regarded as a
 comment and the password is set to 'zebra!password'.
 
+\1f
+File: quagga.info,  Node: Terminal Mode Commands,  Next: Config Commands,  Up: Basic commands
+
+3.2 Terminal Mode Commands
+==========================
+
+ -- Command: write terminal
+     Displays the current configuration to the vty interface.
+
+ -- Command: write file
+     Write current configuration to configuration file.
+
+ -- Command: configure terminal
+     Change to configuration mode.  This command is the first step to
+     configuration.
+
+ -- Command: terminal length <0-512>
+     Set terminal display length to <0-512>.  If length is 0, no
+     display control is performed.
+
+ -- Command: who
+     Show a list of currently connected vty sessions.
+
+ -- Command: list
+     List all available commands.
+
+ -- Command: show version
+     Show the current version of Quagga and its build host information.
+
+ -- Command: show logging
+     Shows the current configuration of the logging system.  This
+     includes the status of all logging destinations.
+
+ -- Command: logmsg LEVEL MESSAGE
+     Send a message to all logging destinations that are enabled for
+     messages of the given severity.
+
 \1f
 File: quagga.info,  Node: Common Invocation Options,  Next: Virtual Terminal Interfaces,  Prev: Config Commands,  Up: Basic commands
 
-3.2 Common Invocation Options
+3.3 Common Invocation Options
 =============================
 
 These options apply to all Quagga daemons.
@@ -895,7 +971,7 @@ These options apply to all Quagga daemons.
 \1f
 File: quagga.info,  Node: Virtual Terminal Interfaces,  Prev: Common Invocation Options,  Up: Basic commands
 
-3.3 Virtual Terminal Interfaces
+3.4 Virtual Terminal Interfaces
 ===============================
 
 VTY - Virtual Terminal [aka TeletYpe] Interface is a command line
@@ -910,7 +986,7 @@ interface (CLI) for user interaction with the routing daemon.
 \1f
 File: quagga.info,  Node: VTY Overview,  Next: VTY Modes,  Up: Virtual Terminal Interfaces
 
-3.3.1 VTY Overview
+3.4.1 VTY Overview
 ------------------
 
 VTY stands for Virtual TeletYpe interface.  It means you can connect to
@@ -951,7 +1027,7 @@ all.
 \1f
 File: quagga.info,  Node: VTY Modes,  Next: VTY CLI Commands,  Prev: VTY Overview,  Up: Virtual Terminal Interfaces
 
-3.3.2 VTY Modes
+3.4.2 VTY Modes
 ---------------
 
 There are three basic VTY modes:
@@ -967,7 +1043,7 @@ There are three basic VTY modes:
 \1f
 File: quagga.info,  Node: VTY View Mode,  Next: VTY Enable Mode,  Up: VTY Modes
 
-3.3.2.1 VTY View Mode
+3.4.2.1 VTY View Mode
 .....................
 
 This mode is for read-only access to the CLI. One may exit the mode by
@@ -976,7 +1052,7 @@ leaving the system, or by entering `enable' mode.
 \1f
 File: quagga.info,  Node: VTY Enable Mode,  Next: VTY Other Modes,  Prev: VTY View Mode,  Up: VTY Modes
 
-3.3.2.2 VTY Enable Mode
+3.4.2.2 VTY Enable Mode
 .......................
 
 This mode is for read-write access to the CLI. One may exit the mode by
@@ -985,7 +1061,7 @@ leaving the system, or by escaping to view mode.
 \1f
 File: quagga.info,  Node: VTY Other Modes,  Prev: VTY Enable Mode,  Up: VTY Modes
 
-3.3.2.3 VTY Other Modes
+3.4.2.3 VTY Other Modes
 .......................
 
 This page is for describing other modes.
@@ -993,7 +1069,7 @@ This page is for describing other modes.
 \1f
 File: quagga.info,  Node: VTY CLI Commands,  Prev: VTY Modes,  Up: Virtual Terminal Interfaces
 
-3.3.3 VTY CLI Commands
+3.4.3 VTY CLI Commands
 ----------------------
 
 Commands that you may use at the command-line are described in the
@@ -1008,7 +1084,7 @@ following three subsubsections.
 \1f
 File: quagga.info,  Node: CLI Movement Commands,  Next: CLI Editing Commands,  Up: VTY CLI Commands
 
-3.3.3.1 CLI Movement Commands
+3.4.3.1 CLI Movement Commands
 .............................
 
 These commands are used for moving the CLI cursor. The <C> character
@@ -1038,7 +1114,7 @@ means press the Control Key.
 \1f
 File: quagga.info,  Node: CLI Editing Commands,  Next: CLI Advanced Commands,  Prev: CLI Movement Commands,  Up: VTY CLI Commands
 
-3.3.3.2 CLI Editing Commands
+3.4.3.2 CLI Editing Commands
 ............................
 
 These commands are used for editing text on a line. The <C> character
@@ -1070,7 +1146,7 @@ means press the Control Key.
 \1f
 File: quagga.info,  Node: CLI Advanced Commands,  Prev: CLI Editing Commands,  Up: VTY CLI Commands
 
-3.3.3.3 CLI Advanced Commands
+3.4.3.3 CLI Advanced Commands
 .............................
 
 There are several additional CLI commands for command line completions,
@@ -5101,7 +5177,7 @@ Command Index
 * Menu:
 
 * access-class ACCESS-LIST:              Basic Config Commands.
-                                                              (line  83)
+                                                              (line 121)
 * access-list NAME deny IPV4-NETWORK:    IP Access List.      (line   8)
 * access-list NAME permit IPV4-NETWORK:  IP Access List.      (line   7)
 * aggregate-address A.B.C.D/M:           Route Aggregation.   (line   7)
@@ -5138,7 +5214,7 @@ Command Index
 * auto-cost refrence-bandwidth <1-4294967>: OSPF router.      (line  53)
 * bandwidth <1-10000000>:                Interface Commands.  (line  31)
 * banner motd default:                   Basic Config Commands.
-                                                              (line  65)
+                                                              (line 103)
 * bgp cluster-id A.B.C.D:                Route Reflector.     (line   7)
 * bgp config-type cisco:                 Multiple instance.   (line  20)
 * bgp config-type zebra:                 Multiple instance.   (line  49)
@@ -5154,8 +5230,8 @@ Command Index
                                                               (line  11)
 * clear ip prefix-list NAME A.B.C.D/M:   Clear counter of ip prefix-list.
                                                               (line  13)
-* configure terminal:                    Basic Config Commands.
-                                                              (line  36)
+* configure terminal:                    Terminal Mode Commands.
+                                                              (line  13)
 * debug event:                           More Show IP BGP.    (line  33)
 * debug keepalive:                       More Show IP BGP.    (line  37)
 * debug ospf ism:                        Debugging OSPF.      (line  12)
@@ -5232,9 +5308,9 @@ Command Index
 * enable password PASSWORD:              Basic Config Commands.
                                                               (line  14)
 * exec-timeout MINUTE:                   Basic Config Commands.
-                                                              (line  71)
+                                                              (line 109)
 * exec-timeout MINUTE SECOND:            Basic Config Commands.
-                                                              (line  72)
+                                                              (line 110)
 * flush_timer TIME:                      ripngd Configuration.
                                                               (line  12)
 * hostname HOSTNAME:                     Basic Config Commands.
@@ -5318,16 +5394,34 @@ Command Index
 * ipv6 route NETWORK GATEWAY DISTANCE:   Static Route Commands.
                                                               (line  78)
 * line vty:                              Basic Config Commands.
-                                                              (line  62)
+                                                              (line 100)
 * link-detect:                           Interface Commands.  (line  37)
-* list:                                  Basic Config Commands.
-                                                              (line  46)
+* list:                                  Terminal Mode Commands.
+                                                              (line  24)
+* log facility FACILITY:                 Basic Config Commands.
+                                                              (line  74)
 * log file FILENAME:                     Basic Config Commands.
-                                                              (line  21)
+                                                              (line  41)
+* log file FILENAME LEVEL:               Basic Config Commands.
+                                                              (line  42)
+* log monitor:                           Basic Config Commands.
+                                                              (line  61)
+* log monitor LEVEL:                     Basic Config Commands.
+                                                              (line  62)
+* log record-priority:                   Basic Config Commands.
+                                                              (line  80)
 * log stdout:                            Basic Config Commands.
-                                                              (line  17)
+                                                              (line  28)
+* log stdout LEVEL:                      Basic Config Commands.
+                                                              (line  29)
 * log syslog:                            Basic Config Commands.
-                                                              (line  26)
+                                                              (line  52)
+* log syslog LEVEL:                      Basic Config Commands.
+                                                              (line  53)
+* log trap LEVEL:                        Basic Config Commands.
+                                                              (line  17)
+* logmsg LEVEL MESSAGE:                  Terminal Mode Commands.
+                                                              (line  34)
 * match as-path WORD:                    Using AS Path in Route Map.
                                                               (line   7)
 * match aspath AS_PATH:                  Route Map Match Command.
@@ -5429,7 +5523,7 @@ Command Index
 * no auto-cost refrence-bandwidth:       OSPF router.         (line  54)
 * no bandwidth <1-10000000>:             Interface Commands.  (line  32)
 * no banner motd:                        Basic Config Commands.
-                                                              (line  68)
+                                                              (line 106)
 * no bgp multiple-instance:              Multiple instance.   (line  14)
 * no debug event:                        More Show IP BGP.    (line  39)
 * no debug keepalive:                    More Show IP BGP.    (line  43)
@@ -5462,7 +5556,7 @@ Command Index
 * no distribute-list NAME out (kernel|connected|static|rip|ospf: Redistribute routes to OSPF.
                                                               (line  42)
 * no exec-timeout:                       Basic Config Commands.
-                                                              (line  79)
+                                                              (line 117)
 * no ip address ADDRESS/PREFIX:          Interface Commands.  (line  15)
 * no ip address ADDRESS/PREFIX secondary: Interface Commands. (line  20)
 * no ip as-path access-list WORD:        AS Path Access List. (line  12)
@@ -5511,10 +5605,20 @@ Command Index
 * no ipv6 nd suppress-ra:                Router Advertisement.
                                                               (line   7)
 * no link-detect:                        Interface Commands.  (line  38)
+* no log facility:                       Basic Config Commands.
+                                                              (line  75)
+* no log file:                           Basic Config Commands.
+                                                              (line  43)
+* no log monitor:                        Basic Config Commands.
+                                                              (line  63)
+* no log record-priority:                Basic Config Commands.
+                                                              (line  81)
 * no log stdout:                         Basic Config Commands.
-                                                              (line  18)
+                                                              (line  30)
 * no log syslog:                         Basic Config Commands.
-                                                              (line  27)
+                                                              (line  54)
+* no log trap:                           Basic Config Commands.
+                                                              (line  18)
 * no multicast:                          Interface Commands.  (line  28)
 * no neighbor A.B.C.D:                   RIP Configuration.   (line  46)
 * no neighbor PEER default-originate:    BGP Peer commands.   (line  48)
@@ -5662,13 +5766,13 @@ Command Index
                                                               (line  24)
 * router-id A.B.C.D:                     OSPF6 router.        (line   9)
 * service advanced-vty:                  Basic Config Commands.
-                                                              (line  52)
+                                                              (line  93)
 * service integrated-vtysh-config:       VTY shell integrated configuration.
                                                               (line   7)
 * service password-encryption:           Basic Config Commands.
-                                                              (line  49)
+                                                              (line  90)
 * service terminal-length <0-512>:       Basic Config Commands.
-                                                              (line  55)
+                                                              (line  96)
 * set as-path prepend AS-PATH:           Using AS Path in Route Map.
                                                               (line   9)
 * set as-path prepend AS_PATH:           Route Map Set Command.
@@ -5819,8 +5923,10 @@ Command Index
                                                               (line  24)
 * show ipv6forward:                      zebra Terminal Mode Commands.
                                                               (line  28)
-* show version:                          Basic Config Commands.
-                                                              (line  59)
+* show logging:                          Terminal Mode Commands.
+                                                              (line  30)
+* show version:                          Terminal Mode Commands.
+                                                              (line  27)
 * shutdown:                              Interface Commands.  (line   9)
 * smux peer OID:                         MIB and command reference.
                                                               (line  28)
@@ -5828,18 +5934,18 @@ Command Index
                                                               (line  31)
 * table TABLENO:                         Static Route Commands.
                                                               (line  81)
-* terminal length <0-512>:               Basic Config Commands.
-                                                              (line  40)
+* terminal length <0-512>:               Terminal Mode Commands.
+                                                              (line  17)
 * timers basic UPDATE TIMEOUT GARBAGE:   RIP Timers.          (line   7)
 * timers spf <0-4294967295> <0-4294967295>: OSPF router.      (line  46)
 * username USERNAME nopassword:          VTY shell username.  (line   7)
 * version VERSION:                       RIP Configuration.   (line  23)
-* who:                                   Basic Config Commands.
-                                                              (line  44)
-* write file:                            Basic Config Commands.
-                                                              (line  33)
-* write terminal:                        Basic Config Commands.
-                                                              (line  30)
+* who:                                   Terminal Mode Commands.
+                                                              (line  21)
+* write file:                            Terminal Mode Commands.
+                                                              (line  10)
+* write terminal:                        Terminal Mode Commands.
+                                                              (line   7)
 
 \1f
 File: quagga.info,  Node: VTY Key Index,  Prev: Command Index,  Up: Top
@@ -5912,138 +6018,139 @@ Ref: Linux notes-Footnote-1\7f21476
 Node: Build the Software\7f21542
 Node: Install the Software\7f22090
 Node: Basic commands\7f23550
-Node: Config Commands\7f24264
-Node: Basic Config Commands\7f25126
-Node: Sample Config File\7f27530
-Node: Common Invocation Options\7f28300
-Node: Virtual Terminal Interfaces\7f29707
-Node: VTY Overview\7f30218
-Node: VTY Modes\7f31469
-Node: VTY View Mode\7f31919
-Node: VTY Enable Mode\7f32169
-Node: VTY Other Modes\7f32447
-Node: VTY CLI Commands\7f32623
-Node: CLI Movement Commands\7f33083
-Node: CLI Editing Commands\7f33606
-Node: CLI Advanced Commands\7f34194
-Node: Zebra\7f34960
-Node: Invoking zebra\7f35469
-Node: Interface Commands\7f36048
-Node: Static Route Commands\7f37580
-Node: zebra Terminal Mode Commands\7f40853
-Node: RIP\7f41818
-Node: Starting and Stopping ripd\7f42755
-Node: RIP netmask\7f44168
-Node: RIP Configuration\7f45267
-Node: How to Announce RIP route\7f49532
-Node: Filtering RIP Routes\7f52095
-Node: RIP Metric Manipulation\7f53562
-Node: RIP distance\7f54475
-Node: RIP route-map\7f55290
-Node: RIP Authentication\7f57806
-Node: RIP Timers\7f58913
-Node: Show RIP Information\7f60199
-Node: RIP Debug Commands\7f61572
-Node: RIPng\7f62568
-Node: Invoking ripngd\7f62888
-Node: ripngd Configuration\7f63137
-Node: ripngd Terminal Mode Commands\7f63888
-Node: ripngd Filtering Commands\7f64252
-Node: OSPFv2\7f64761
-Node: Configuring ospfd\7f65320
-Node: OSPF router\7f65788
-Node: OSPF area\7f68944
-Node: OSPF interface\7f74126
-Node: Redistribute routes to OSPF\7f77509
-Node: Showing OSPF information\7f79672
-Node: Debugging OSPF\7f80918
-Node: OSPFv3\7f81957
-Node: OSPF6 router\7f82277
-Node: OSPF6 area\7f82631
-Node: OSPF6 interface\7f82809
-Node: Redistribute routes to OSPF6\7f83686
-Node: Showing OSPF6 information\7f84002
-Node: BGP\7f84822
-Node: Starting BGP\7f85712
-Node: BGP router\7f86289
-Node: BGP distance\7f87533
-Node: BGP decision process\7f87971
-Node: BGP network\7f88241
-Node: BGP route\7f88431
-Node: Route Aggregation\7f88987
-Node: Redistribute to BGP\7f89556
-Node: BGP Peer\7f90083
-Node: Defining Peer\7f90270
-Node: BGP Peer commands\7f90883
-Node: Peer filtering\7f93287
-Node: BGP Peer Group\7f93795
-Node: BGP Address Family\7f94108
-Node: Autonomous System\7f94262
-Node: AS Path Regular Expression\7f95099
-Node: Display BGP Routes by AS Path\7f96346
-Node: AS Path Access List\7f96786
-Node: Using AS Path in Route Map\7f97253
-Node: Private AS Numbers\7f97534
-Node: BGP Communities Attribute\7f97692
-Node: BGP Community Lists\7f100159
-Node: Numbered BGP Community Lists\7f102813
-Node: BGP Community in Route Map\7f104400
-Node: Display BGP Routes by Community\7f106343
-Node: Using BGP Communities Attribute\7f107512
-Node: BGP Extended Communities Attribute\7f111080
-Node: BGP Extended Community Lists\7f112852
-Node: BGP Extended Communities in Route Map\7f114727
-Node: Displaying BGP routes\7f115186
-Node: Show IP BGP\7f115423
-Node: More Show IP BGP\7f116123
-Node: Capability Negotiation\7f117274
-Node: Route Reflector\7f120578
-Node: Route Server\7f120857
-Node: Multiple instance\7f121923
-Node: BGP instance and view\7f123734
-Node: Routing policy\7f125114
-Node: Viewing the view\7f125882
-Node: How to set up a 6-Bone connection\7f126167
-Node: Dump BGP packets and table\7f127539
-Node: Configuring Quagga as a Route Server\7f128086
-Node: Description of the Route Server model\7f129047
-Ref: fig:normal-processing\7f130624
-Ref: fig:full-mesh\7f130774
-Ref: fig:route-server\7f130870
-Ref: filter-delegation\7f131284
-Ref: Route Server tasks\7f132468
-Ref: Route-server path filter process\7f132839
-Ref: fig:rs-processing\7f135153
-Node: Commands for configuring a Route Server\7f135270
-Node: Example of Route Server Configuration\7f138297
-Node: Configuration of the BGP routers without Route Server\7f139218
-Node: Configuration of the BGP routers with Route Server\7f142101
-Node: Configuration of the Route Server itself\7f143402
-Node: Further considerations about Import and Export route-maps\7f148401
-Node: VTY shell\7f151445
-Node: VTY shell username\7f152114
-Node: VTY shell integrated configuration\7f152746
-Node: Filtering\7f154124
-Node: IP Access List\7f154477
-Node: IP Prefix List\7f154863
-Node: ip prefix-list description\7f157882
-Node: ip prefix-list sequential number control\7f158409
-Node: Showing ip prefix-list\7f158951
-Node: Clear counter of ip prefix-list\7f160059
-Node: Route Map\7f160498
-Node: Route Map Command\7f161003
-Node: Route Map Match Command\7f161200
-Node: Route Map Set Command\7f161824
-Node: IPv6 Support\7f162701
-Node: Router Advertisement\7f163273
-Node: Kernel Interface\7f167074
-Node: SNMP Support\7f169031
-Node: Getting and installing an SNMP agent\7f169603
-Node: SMUX configuration\7f170176
-Node: MIB and command reference\7f172312
-Node: Zebra Protocol\7f173699
-Node: Packet Binary Dump Format\7f175613
-Node: Command Index\7f187223
-Node: VTY Key Index\7f241352
+Node: Config Commands\7f24325
+Node: Basic Config Commands\7f25218
+Node: Sample Config File\7f30316
+Node: Terminal Mode Commands\7f31086
+Node: Common Invocation Options\7f32183
+Node: Virtual Terminal Interfaces\7f33590
+Node: VTY Overview\7f34101
+Node: VTY Modes\7f35352
+Node: VTY View Mode\7f35802
+Node: VTY Enable Mode\7f36052
+Node: VTY Other Modes\7f36330
+Node: VTY CLI Commands\7f36506
+Node: CLI Movement Commands\7f36966
+Node: CLI Editing Commands\7f37489
+Node: CLI Advanced Commands\7f38077
+Node: Zebra\7f38843
+Node: Invoking zebra\7f39352
+Node: Interface Commands\7f39931
+Node: Static Route Commands\7f41463
+Node: zebra Terminal Mode Commands\7f44736
+Node: RIP\7f45701
+Node: Starting and Stopping ripd\7f46638
+Node: RIP netmask\7f48051
+Node: RIP Configuration\7f49150
+Node: How to Announce RIP route\7f53415
+Node: Filtering RIP Routes\7f55978
+Node: RIP Metric Manipulation\7f57445
+Node: RIP distance\7f58358
+Node: RIP route-map\7f59173
+Node: RIP Authentication\7f61689
+Node: RIP Timers\7f62796
+Node: Show RIP Information\7f64082
+Node: RIP Debug Commands\7f65455
+Node: RIPng\7f66451
+Node: Invoking ripngd\7f66771
+Node: ripngd Configuration\7f67020
+Node: ripngd Terminal Mode Commands\7f67771
+Node: ripngd Filtering Commands\7f68135
+Node: OSPFv2\7f68644
+Node: Configuring ospfd\7f69203
+Node: OSPF router\7f69671
+Node: OSPF area\7f72827
+Node: OSPF interface\7f78009
+Node: Redistribute routes to OSPF\7f81392
+Node: Showing OSPF information\7f83555
+Node: Debugging OSPF\7f84801
+Node: OSPFv3\7f85840
+Node: OSPF6 router\7f86160
+Node: OSPF6 area\7f86514
+Node: OSPF6 interface\7f86692
+Node: Redistribute routes to OSPF6\7f87569
+Node: Showing OSPF6 information\7f87885
+Node: BGP\7f88705
+Node: Starting BGP\7f89595
+Node: BGP router\7f90172
+Node: BGP distance\7f91416
+Node: BGP decision process\7f91854
+Node: BGP network\7f92124
+Node: BGP route\7f92314
+Node: Route Aggregation\7f92870
+Node: Redistribute to BGP\7f93439
+Node: BGP Peer\7f93966
+Node: Defining Peer\7f94153
+Node: BGP Peer commands\7f94766
+Node: Peer filtering\7f97170
+Node: BGP Peer Group\7f97678
+Node: BGP Address Family\7f97991
+Node: Autonomous System\7f98145
+Node: AS Path Regular Expression\7f98982
+Node: Display BGP Routes by AS Path\7f100229
+Node: AS Path Access List\7f100669
+Node: Using AS Path in Route Map\7f101136
+Node: Private AS Numbers\7f101417
+Node: BGP Communities Attribute\7f101575
+Node: BGP Community Lists\7f104042
+Node: Numbered BGP Community Lists\7f106696
+Node: BGP Community in Route Map\7f108283
+Node: Display BGP Routes by Community\7f110226
+Node: Using BGP Communities Attribute\7f111395
+Node: BGP Extended Communities Attribute\7f114963
+Node: BGP Extended Community Lists\7f116735
+Node: BGP Extended Communities in Route Map\7f118610
+Node: Displaying BGP routes\7f119069
+Node: Show IP BGP\7f119306
+Node: More Show IP BGP\7f120006
+Node: Capability Negotiation\7f121157
+Node: Route Reflector\7f124461
+Node: Route Server\7f124740
+Node: Multiple instance\7f125806
+Node: BGP instance and view\7f127617
+Node: Routing policy\7f128997
+Node: Viewing the view\7f129765
+Node: How to set up a 6-Bone connection\7f130050
+Node: Dump BGP packets and table\7f131422
+Node: Configuring Quagga as a Route Server\7f131969
+Node: Description of the Route Server model\7f132930
+Ref: fig:normal-processing\7f134507
+Ref: fig:full-mesh\7f134657
+Ref: fig:route-server\7f134753
+Ref: filter-delegation\7f135167
+Ref: Route Server tasks\7f136351
+Ref: Route-server path filter process\7f136722
+Ref: fig:rs-processing\7f139036
+Node: Commands for configuring a Route Server\7f139153
+Node: Example of Route Server Configuration\7f142180
+Node: Configuration of the BGP routers without Route Server\7f143101
+Node: Configuration of the BGP routers with Route Server\7f145984
+Node: Configuration of the Route Server itself\7f147285
+Node: Further considerations about Import and Export route-maps\7f152284
+Node: VTY shell\7f155328
+Node: VTY shell username\7f155997
+Node: VTY shell integrated configuration\7f156629
+Node: Filtering\7f158007
+Node: IP Access List\7f158360
+Node: IP Prefix List\7f158746
+Node: ip prefix-list description\7f161765
+Node: ip prefix-list sequential number control\7f162292
+Node: Showing ip prefix-list\7f162834
+Node: Clear counter of ip prefix-list\7f163942
+Node: Route Map\7f164381
+Node: Route Map Command\7f164886
+Node: Route Map Match Command\7f165083
+Node: Route Map Set Command\7f165707
+Node: IPv6 Support\7f166584
+Node: Router Advertisement\7f167156
+Node: Kernel Interface\7f170957
+Node: SNMP Support\7f172914
+Node: Getting and installing an SNMP agent\7f173486
+Node: SMUX configuration\7f174059
+Node: MIB and command reference\7f176195
+Node: Zebra Protocol\7f177582
+Node: Packet Binary Dump Format\7f179496
+Node: Command Index\7f191106
+Node: VTY Key Index\7f247299
 \1f
 End Tag Table
index e241d54d6aab734ee94081e91a309d8550b52b75..32905516fec0e44f16a6362eeb510e2d630a0a31 100644 (file)
@@ -1,3 +1,7 @@
+2004-12-07 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+       * isis_main.c: (main) The 2nd argument to openzlog has been removed.
+
 2004-12-03 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
        * isis_main.c: (sigint,sigterm) Use zlog_notice for termination message.
index 9aa487a7973cacc12b8283ecfe9db61f8aea38c2..027e47b48364bf6e2f5dffce0311ce41020d8658 100644 (file)
@@ -218,7 +218,7 @@ main (int argc, char **argv, char **envp)
   /* Get the programname without the preceding path. */
   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
 
-  zlog_default = openzlog (progname, ZLOG_NOLOG, ZLOG_ISIS,
+  zlog_default = openzlog (progname, ZLOG_ISIS,
                           LOG_CONS | LOG_NDELAY | LOG_PID, LOG_DAEMON);
 
   /* for reload */
index 79062cae4632b39aca55eed7dbe4aadb30970384..986c67aa4419ae8394c1ebf320bfe95993cbb759 100644 (file)
@@ -1,3 +1,72 @@
+2004-12-07 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+       * log.h: Replace struct zlog flags and maskpri fields with maxlvl
+         array to support individual logging levels for each destination.
+         Remove the 2nd argument to openzlog since the default logging config
+         should be standardized inside the library.  Replaced the
+         zlog_set_flag and zlog_reset_flag functions with zlog_set_level.
+         And zlog_set_file now requires an additional log_level argument.
+         Declare zlog_proto_names for use inside command.c in the
+         "show logging" command.  Added defines useful for command
+         construction.
+       * log.c: (vzlog) Decide where to send the message based on the
+         individual logging levels configured for each destination.
+         Remove support for ZLOG_STDERR since it was never actually used.
+         Support record-priority for terminal monitors.
+         (zlog_signal,zlog_backtrace_sigsafe) Support destination-specific
+         logging levels.  Remove stderr support (was never used).  Added
+         support for terminal monitor logging.
+         (_zlog_assert_failed) Increase message severity to LOG_EMERG.
+         (openzlog) Remove 2nd argument since default config should be
+         standardized in library.  By default, terminal monitoring
+         is set to debug, and all other logging is disabled.
+         (zlog_set_flag,zlog_reset_flag) Removed.
+         (zlog_set_level) New function to replace zlog_set_flag and
+         zlog_reset_flag.  Supports destination-specific logging levels.
+         (zlog_set_file,zlog_reset_file) Support file-specific logging level.
+         (zlog_rotate) Log an error message if fopen fails, and support
+         new file-specific logging level.
+       * command.h: Change DEFUN_CMD_FUNC_DECL and DEFUN_CMD_FUNC_TEXT so that
+         command functions will be static instead of global.  Remove
+         declarations for config_exit and config_help.  Define new macros
+         DEFUNSH_ATTR, DEFUNSH_HIDDEN, and DEFUNSH_DEPRECATED so we can
+         have deprecated commands in vtysh.  Similarly, for completeness,
+         define macros ALIAS_SH, ALIAS_SH_HIDDEN, and ALIAS_SH_DEPRECATED.
+         Also, fix bug in ALIAS_ATTR macro (didn't matter because it
+         was never used).
+       * command.c: Make many functions static instead of global.
+         (facility_name,facility_match,level_match) New functions
+         to support enhanced destination-specific logging levels.
+         (config_write_host) Support new destination-specific logging levels.
+         (config_logmsg) Added new "logmsg" command to help test logging
+         system.
+         (show_logging) Added "show logging" command to show the current
+         configuration of the logging system.
+         (config_log_stdout_level) Support explicit stdout logging level.
+         (no_config_log_stdout) Now takes optional LEVEL arg.
+         (config_log_monitor,config_log_monitor_level,no_config_log_monitor)
+         New commands creating new "log monitor" commands to set terminal
+         monitoring log level.
+         (config_log_file_level) Support explicit file logging level.
+         (config_log_syslog_level) Support explicit syslog logging level.
+         (config_log_facility,no_config_log_facility) Implement new
+         "log facility" command.
+         (cmd_init) Add hooks for new commands: "show logging", "logmsg",
+         "log stdout <level>", "log monitor", "log monitor <level>",
+         "no log monitor", "log file <filename> <level>",
+         "no log file <filename> <level>", "log syslog <level>",
+         "log facility", and "no log facility".
+       * vty.h: Added a "level" argument to vty_log so it can support
+         "log record-priority".  Declare new function vty_log_fixed for
+         use in signal handlers.
+       * vty.c: (vty_log,vty_log_out) Added a "level" argument to support
+         "log record-priority" for vty terminal monitors.
+         (vty_down_level) Use config_exit_cmd.func instead of calling
+         config_exit directly (since command functions will now be static
+         instead of global).
+         (vty_log_fixed) New function to send terminal monitor messages
+         from inside a signal handler.
+
 2004-12-03 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
        * log.h: Document appropriate use of syslog logging priorities
index 99036d17aca2cb82b525fa875614b5e4a2813c5e..188296722e650c2a20fcf53e31ab533e6f152195 100644 (file)
@@ -1,4 +1,7 @@
-/* Command interpreter routine for virtual terminal [aka TeletYpe]
+/*
+   $Id: command.c,v 1.28 2004/12/07 15:39:32 ajs Exp $
+
+   Command interpreter routine for virtual terminal [aka TeletYpe]
    Copyright (C) 1997, 98, 99 Kunihiro Ishiguro
 
 This file is part of GNU Zebra.
@@ -75,6 +78,70 @@ Hello, this is " QUAGGA_PROGNAME " (version " QUAGGA_VERSION ").\r\n\
 " QUAGGA_COPYRIGHT "\r\n\
 \r\n";
 
+
+static struct facility_map {
+  int facility;
+  const char *name;
+  size_t match;
+} syslog_facilities[] = 
+  {
+    { LOG_KERN, "kern", 1 },
+    { LOG_USER, "user", 2 },
+    { LOG_MAIL, "mail", 1 },
+    { LOG_DAEMON, "daemon", 1 },
+    { LOG_AUTH, "auth", 1 },
+    { LOG_SYSLOG, "syslog", 1 },
+    { LOG_LPR, "lpr", 2 },
+    { LOG_NEWS, "news", 1 },
+    { LOG_UUCP, "uucp", 2 },
+    { LOG_CRON, "cron", 1 },
+#ifdef LOG_FTP
+    { LOG_FTP, "ftp", 1 },
+#endif
+    { LOG_LOCAL0, "local0", 6 },
+    { LOG_LOCAL1, "local1", 6 },
+    { LOG_LOCAL2, "local2", 6 },
+    { LOG_LOCAL3, "local3", 6 },
+    { LOG_LOCAL4, "local4", 6 },
+    { LOG_LOCAL5, "local5", 6 },
+    { LOG_LOCAL6, "local6", 6 },
+    { LOG_LOCAL7, "local7", 6 },
+    { 0, NULL, 0 },
+  };
+
+static const char *
+facility_name(int facility)
+{
+  struct facility_map *fm;
+
+  for (fm = syslog_facilities; fm->name; fm++)
+    if (fm->facility == facility)
+      return fm->name;
+  return "";
+}
+
+static int
+facility_match(const char *str)
+{
+  struct facility_map *fm;
+
+  for (fm = syslog_facilities; fm->name; fm++)
+    if (!strncmp(str,fm->name,fm->match))
+      return fm->facility;
+  return -1;
+}
+
+static int
+level_match(const char *s)
+{
+  int level ;
+  
+  for ( level = 0 ; zlog_priority [level] != NULL ; level ++ )
+    if (!strncmp (s, zlog_priority[level], 2))
+      return level;
+  return ZLOG_DISABLED;
+}
+
 void
 print_version (const char *progname)
 {
@@ -128,7 +195,7 @@ install_node (struct cmd_node *node,
 }
 
 /* Compare two command's string.  Used in sort_node (). */
-int
+static int
 cmp_node (const void *p, const void *q)
 {
   struct cmd_element *a = *(struct cmd_element **)p;
@@ -137,7 +204,7 @@ cmp_node (const void *p, const void *q)
   return strcmp (a->string, b->string);
 }
 
-int
+static int
 cmp_desc (const void *p, const void *q)
 {
   struct desc *a = *(struct desc **)p;
@@ -241,7 +308,7 @@ cmd_free_strvec (vector v)
 }
 
 /* Fetch next description.  Used in cmd_make_descvec(). */
-char *
+static char *
 cmd_desc_str (const char **string)
 {
   const char *cp, *start;
@@ -277,7 +344,7 @@ cmd_desc_str (const char **string)
 }
 
 /* New string vector. */
-vector
+static vector
 cmd_make_descvec (const char *string, const char *descstr)
 {
   int multiple = 0;
@@ -370,7 +437,7 @@ cmd_make_descvec (const char *string, const char *descstr)
 
 /* Count mandantory string vector size.  This is to determine inputed
    command has enough command length. */
-int
+static int
 cmd_cmdsize (vector strvec)
 {
   unsigned int i;
@@ -430,7 +497,7 @@ install_element (enum node_type ntype, struct cmd_element *cmd)
 static unsigned char itoa64[] =        
 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 
-void
+static void
 to64(char *s, long v, int n)
 {
   while (--n >= 0) 
@@ -440,7 +507,8 @@ to64(char *s, long v, int n)
     }
 }
 
-char *zencrypt (const char *passwd)
+static char *
+zencrypt (const char *passwd)
 {
   char salt[6];
   struct timeval tv;
@@ -455,73 +523,8 @@ char *zencrypt (const char *passwd)
   return crypt (passwd, salt);
 }
 
-const char *
-syslog_facility_print (int facility)
-{
-  switch (facility)
-    {
-      case LOG_KERN:
-       return "kern";
-       break;
-      case LOG_USER:
-       return "user";
-       break;
-      case LOG_MAIL:
-       return "mail";
-       break;
-      case LOG_DAEMON:
-       return "daemon";
-       break;
-      case LOG_AUTH:
-       return "auth";
-       break;
-      case LOG_SYSLOG:
-       return "syslog";
-       break;
-      case LOG_LPR:
-       return "lpr";
-       break;
-      case LOG_NEWS:
-       return "news";
-       break;
-      case LOG_UUCP:
-       return "uucp";
-       break;
-      case LOG_CRON:
-       return "cron";
-       break;
-      case LOG_LOCAL0:
-       return "local0";
-       break;
-      case LOG_LOCAL1:
-       return "local1";
-       break;
-      case LOG_LOCAL2:
-       return "local2";
-       break;
-      case LOG_LOCAL3:
-       return "local3";
-       break;
-      case LOG_LOCAL4:
-       return "local4";
-       break;
-      case LOG_LOCAL5:
-       return "local5";
-       break;
-      case LOG_LOCAL6:
-       return "local6";
-       break;
-      case LOG_LOCAL7:
-       return "local7";
-       break;
-      default:
-       break;
-    }
-  return "";
-}
-
 /* This function write configuration of this host. */
-int
+static int
 config_write_host (struct vty *vty)
 {
   if (host.name)
@@ -542,21 +545,46 @@ config_write_host (struct vty *vty)
         vty_out (vty, "enable password %s%s", host.enable, VTY_NEWLINE);
     }
 
-  if (host.logfile)
-    vty_out (vty, "log file %s%s", host.logfile, VTY_NEWLINE);
+  if (zlog_default->default_lvl != LOG_DEBUG)
+    vty_out (vty, "log trap %s%s",
+            zlog_priority[zlog_default->default_lvl], VTY_NEWLINE);
+
+  if (host.logfile && (zlog_default->maxlvl[ZLOG_DEST_FILE] != ZLOG_DISABLED))
+    {
+      vty_out (vty, "log file %s", host.logfile);
+      if (zlog_default->maxlvl[ZLOG_DEST_FILE] != zlog_default->default_lvl)
+       vty_out (vty, " %s",
+                zlog_priority[zlog_default->maxlvl[ZLOG_DEST_FILE]]);
+      vty_out (vty, "%s", VTY_NEWLINE);
+    }
+
+  if (zlog_default->maxlvl[ZLOG_DEST_STDOUT] != ZLOG_DISABLED)
+    {
+      vty_out (vty, "log stdout");
+      if (zlog_default->maxlvl[ZLOG_DEST_STDOUT] != zlog_default->default_lvl)
+       vty_out (vty, " %s",
+                zlog_priority[zlog_default->maxlvl[ZLOG_DEST_STDOUT]]);
+      vty_out (vty, "%s", VTY_NEWLINE);
+    }
 
-  if (zlog_default->flags & ZLOG_STDOUT)
-    vty_out (vty, "log stdout%s", VTY_NEWLINE);
+  if (zlog_default->maxlvl[ZLOG_DEST_MONITOR] == ZLOG_DISABLED)
+    vty_out(vty,"no log monitor%s",VTY_NEWLINE);
+  else if (zlog_default->maxlvl[ZLOG_DEST_MONITOR] != zlog_default->default_lvl)
+    vty_out(vty,"log monitor %s%s",
+           zlog_priority[zlog_default->maxlvl[ZLOG_DEST_MONITOR]],VTY_NEWLINE);
 
-  if (zlog_default->flags & ZLOG_SYSLOG)
+  if (zlog_default->maxlvl[ZLOG_DEST_SYSLOG] != ZLOG_DISABLED)
     {
       vty_out (vty, "log syslog");
-      if (zlog_default->facility != LOG_DAEMON)
-       vty_out (vty, " facility %s", syslog_facility_print (zlog_default->facility));
+      if (zlog_default->maxlvl[ZLOG_DEST_SYSLOG] != zlog_default->default_lvl)
+       vty_out (vty, " %s",
+                zlog_priority[zlog_default->maxlvl[ZLOG_DEST_SYSLOG]]);
       vty_out (vty, "%s", VTY_NEWLINE);
     }
-  if (zlog_default->maskpri != LOG_DEBUG)
-    vty_out (vty, "log trap %s%s", zlog_priority[zlog_default->maskpri], VTY_NEWLINE);
+
+  if (zlog_default->facility != LOG_DAEMON)
+    vty_out (vty, "log facility %s%s",
+            facility_name(zlog_default->facility), VTY_NEWLINE);
 
   if (zlog_default->record_priority == 1)
     vty_out (vty, "log record-priority%s", VTY_NEWLINE);
@@ -578,15 +606,17 @@ config_write_host (struct vty *vty)
 }
 
 /* Utility function for getting command vector. */
-vector
+static vector
 cmd_node_vector (vector v, enum node_type ntype)
 {
   struct cmd_node *cnode = vector_slot (v, ntype);
   return cnode->cmd_vector;
 }
 
-/* Filter command vector by symbol */
-int
+#if 0
+/* Filter command vector by symbol.  This function is not actually used;
+ * should it be deleted? */
+static int
 cmd_filter_by_symbol (char *command, char *symbol)
 {
   int i, lim;
@@ -629,6 +659,7 @@ cmd_filter_by_symbol (char *command, char *symbol)
     }
   return 0;
 }
+#endif
 
 /* Completion match types. */
 enum match_type 
@@ -645,7 +676,7 @@ enum match_type
   exact_match 
 };
 
-enum match_type
+static enum match_type
 cmd_ipv4_match (const char *str)
 {
   const char *sp;
@@ -702,7 +733,7 @@ cmd_ipv4_match (const char *str)
   return exact_match;
 }
 
-enum match_type
+static enum match_type
 cmd_ipv4_prefix_match (const char *str)
 {
   const char *sp;
@@ -793,7 +824,7 @@ cmd_ipv4_prefix_match (const char *str)
 
 #ifdef HAVE_IPV6
 
-enum match_type
+static enum match_type
 cmd_ipv6_match (const char *str)
 {
   int state = STATE_START;
@@ -899,7 +930,7 @@ cmd_ipv6_match (const char *str)
   return exact_match;
 }
 
-enum match_type
+static enum match_type
 cmd_ipv6_prefix_match (const char *str)
 {
   int state = STATE_START;
@@ -1034,7 +1065,7 @@ cmd_ipv6_prefix_match (const char *str)
 
 #define DECIMAL_STRLEN_MAX 10
 
-int
+static int
 cmd_range_match (const char *range, const char *str)
 {
   char *p;
@@ -1080,7 +1111,7 @@ cmd_range_match (const char *range, const char *str)
 }
 
 /* Make completion match and return match type flag. */
-enum match_type
+static enum match_type
 cmd_filter_by_completion (char *command, vector v, unsigned int index)
 {
   unsigned int i;
@@ -1195,7 +1226,7 @@ cmd_filter_by_completion (char *command, vector v, unsigned int index)
 }
 
 /* Filter vector by command character with index. */
-enum match_type
+static enum match_type
 cmd_filter_by_string (char *command, vector v, unsigned int index)
 {
   unsigned int i;
@@ -1303,7 +1334,7 @@ cmd_filter_by_string (char *command, vector v, unsigned int index)
 }
 
 /* Check ambiguous match */
-int
+static int
 is_cmd_ambiguous (char *command, vector v, int index, enum match_type type)
 {
   unsigned int i;
@@ -1400,7 +1431,7 @@ is_cmd_ambiguous (char *command, vector v, int index, enum match_type type)
 }
 
 /* If src matches dst return dst string, otherwise return NULL */
-const char *
+static const char *
 cmd_entry_function (const char *src, const char *dst)
 {
   /* Skip variable arguments. */
@@ -1422,7 +1453,7 @@ cmd_entry_function (const char *src, const char *dst)
 /* If src matches dst return dst string, otherwise return NULL */
 /* This version will return the dst string always if it is
    CMD_VARIABLE for '?' key processing */
-const char *
+static const char *
 cmd_entry_function_desc (const char *src, const char *dst)
 {
   if (CMD_VARARG (dst))
@@ -1486,7 +1517,7 @@ cmd_entry_function_desc (const char *src, const char *dst)
 
 /* Check same string element existence.  If it isn't there return
     1. */
-int
+static int
 cmd_unique_string (vector v, const char *str)
 {
   unsigned int i;
@@ -1501,7 +1532,7 @@ cmd_unique_string (vector v, const char *str)
 
 /* Compare string to description vector.  If there is same string
    return 1 else return 0. */
-int
+static int
 desc_unique_string (vector v, const char *str)
 {
   unsigned int i;
@@ -1514,7 +1545,7 @@ desc_unique_string (vector v, const char *str)
   return 0;
 }
 
-int 
+static int 
 cmd_try_do_shortcut (enum node_type node, char* first_word) {
   if ( first_word != NULL &&
        node != AUTH_NODE &&
@@ -1527,7 +1558,7 @@ cmd_try_do_shortcut (enum node_type node, char* first_word) {
 }
 
 /* '?' describe command support. */
-vector
+static vector
 cmd_describe_command_real (vector vline, struct vty *vty, int *status)
 {
   unsigned int i;
@@ -1690,7 +1721,7 @@ cmd_describe_command (vector vline, struct vty *vty, int *status)
 
 
 /* Check LCD of matched command. */
-int
+static int
 cmd_lcd (char **matched)
 {
   int i;
@@ -1723,7 +1754,7 @@ cmd_lcd (char **matched)
 }
 
 /* Command line completion support. */
-char **
+static char **
 cmd_complete_command_real (vector vline, struct vty *vty, int *status)
 {
   unsigned int i;
@@ -1905,7 +1936,8 @@ cmd_complete_command (vector vline, struct vty *vty, int *status)
 
 /* return parent node */
 /* MUST eventually converge on CONFIG_NODE */
-enum node_type node_parent ( enum node_type node )
+static enum node_type
+node_parent ( enum node_type node )
 {
   enum node_type ret;
 
@@ -1930,7 +1962,7 @@ enum node_type node_parent ( enum node_type node )
 }
 
 /* Execute command by argument vline vector. */
-int
+static int
 cmd_execute_command_real (vector vline, struct vty *vty, struct cmd_element **cmd)
 {
   unsigned int i;
@@ -2959,40 +2991,158 @@ DEFUN (no_service_terminal_length, no_service_terminal_length_cmd,
   return CMD_SUCCESS;
 }
 
+DEFUN (config_logmsg,
+       config_logmsg_cmd,
+       "logmsg "LOG_LEVELS" .MESSAGE",
+       "Send a message to enabled logging destinations\n"
+       LOG_LEVEL_DESC
+       "The message to send\n")
+{
+  int level;
+  char *message;
+
+  if ((level = level_match(argv[0])) == ZLOG_DISABLED)
+    return CMD_ERR_NO_MATCH;
+
+  zlog(NULL, level, (message = argv_concat(argv, argc, 1)));
+  XFREE(MTYPE_TMP, message);
+  return CMD_SUCCESS;
+}
+
+DEFUN (show_logging,
+       show_logging_cmd,
+       "show logging",
+       SHOW_STR
+       "Show current logging configuration\n")
+{
+  struct zlog *zl = zlog_default;
+
+  vty_out (vty, "Syslog logging: ");
+  if (zl->maxlvl[ZLOG_DEST_SYSLOG] == ZLOG_DISABLED)
+    vty_out (vty, "disabled");
+  else
+    vty_out (vty, "level %s, facility %s, ident %s",
+            zlog_priority[zl->maxlvl[ZLOG_DEST_SYSLOG]],
+            facility_name(zl->facility), zl->ident);
+  vty_out (vty, "%s", VTY_NEWLINE);
+
+  vty_out (vty, "Stdout logging: ");
+  if (zl->maxlvl[ZLOG_DEST_STDOUT] == ZLOG_DISABLED)
+    vty_out (vty, "disabled");
+  else
+    vty_out (vty, "level %s",
+            zlog_priority[zl->maxlvl[ZLOG_DEST_STDOUT]]);
+  vty_out (vty, "%s", VTY_NEWLINE);
+
+  vty_out (vty, "Monitor logging: ");
+  if (zl->maxlvl[ZLOG_DEST_MONITOR] == ZLOG_DISABLED)
+    vty_out (vty, "disabled");
+  else
+    vty_out (vty, "level %s",
+            zlog_priority[zl->maxlvl[ZLOG_DEST_MONITOR]]);
+  vty_out (vty, "%s", VTY_NEWLINE);
+
+  vty_out (vty, "File logging: ");
+  if ((zl->maxlvl[ZLOG_DEST_FILE] == ZLOG_DISABLED) ||
+      !zl->fp)
+    vty_out (vty, "disabled");
+  else
+    vty_out (vty, "level %s, filename %s",
+            zlog_priority[zl->maxlvl[ZLOG_DEST_FILE]],
+            zl->filename);
+  vty_out (vty, "%s", VTY_NEWLINE);
+
+  vty_out (vty, "Protocol name: %s%s",
+          zlog_proto_names[zl->protocol], VTY_NEWLINE);
+  vty_out (vty, "Record priority: %s%s",
+          (zl->record_priority ? "enabled" : "disabled"), VTY_NEWLINE);
+
+  return CMD_SUCCESS;
+}
+
 DEFUN (config_log_stdout,
        config_log_stdout_cmd,
        "log stdout",
        "Logging control\n"
-       "Logging goes to stdout\n")
+       "Set stdout logging level\n")
 {
-  zlog_set_flag (NULL, ZLOG_STDOUT);
+  zlog_set_level (NULL, ZLOG_DEST_STDOUT, zlog_default->default_lvl);
+  return CMD_SUCCESS;
+}
+
+DEFUN (config_log_stdout_level,
+       config_log_stdout_level_cmd,
+       "log stdout "LOG_LEVELS,
+       "Logging control\n"
+       "Set stdout logging level\n"
+       LOG_LEVEL_DESC)
+{
+  int level;
+
+  if ((level = level_match(argv[0])) == ZLOG_DISABLED)
+    return CMD_ERR_NO_MATCH;
+  zlog_set_level (NULL, ZLOG_DEST_STDOUT, level);
   return CMD_SUCCESS;
 }
 
 DEFUN (no_config_log_stdout,
        no_config_log_stdout_cmd,
-       "no log stdout",
+       "no log stdout [LEVEL]",
        NO_STR
        "Logging control\n"
-       "Cancel logging to stdout\n")
+       "Cancel logging to stdout\n"
+       "Logging level\n")
 {
-  zlog_reset_flag (NULL, ZLOG_STDOUT);
+  zlog_set_level (NULL, ZLOG_DEST_STDOUT, ZLOG_DISABLED);
   return CMD_SUCCESS;
 }
 
-DEFUN (config_log_file,
-       config_log_file_cmd,
-       "log file FILENAME",
+DEFUN (config_log_monitor,
+       config_log_monitor_cmd,
+       "log monitor",
        "Logging control\n"
-       "Logging to file\n"
-       "Logging filename\n")
+       "Set terminal line (monitor) logging level\n")
+{
+  zlog_set_level (NULL, ZLOG_DEST_MONITOR, zlog_default->default_lvl);
+  return CMD_SUCCESS;
+}
+
+DEFUN (config_log_monitor_level,
+       config_log_monitor_level_cmd,
+       "log monitor "LOG_LEVELS,
+       "Logging control\n"
+       "Set terminal line (monitor) logging level\n"
+       LOG_LEVEL_DESC)
+{
+  int level;
+
+  if ((level = level_match(argv[0])) == ZLOG_DISABLED)
+    return CMD_ERR_NO_MATCH;
+  zlog_set_level (NULL, ZLOG_DEST_MONITOR, level);
+  return CMD_SUCCESS;
+}
+
+DEFUN (no_config_log_monitor,
+       no_config_log_monitor_cmd,
+       "no log monitor [LEVEL]",
+       NO_STR
+       "Logging control\n"
+       "Disable terminal line (monitor) logging\n"
+       "Logging level\n")
+{
+  zlog_set_level (NULL, ZLOG_DEST_MONITOR, ZLOG_DISABLED);
+  return CMD_SUCCESS;
+}
+
+static int
+set_log_file(struct vty *vty, const char *fname, int loglevel)
 {
   int ret;
   char *p = NULL;
   const char *fullpath;
   
   /* Path detection. */
-  if (! IS_DIRECTORY_SEP (*argv[0]))
+  if (! IS_DIRECTORY_SEP (*fname))
     {
       char cwd[MAXPATHLEN+1];
       cwd[MAXPATHLEN] = '\0';
@@ -3003,37 +3153,62 @@ DEFUN (config_log_file,
           return CMD_WARNING;
         }
       
-      if ( (p = XMALLOC (MTYPE_TMP, strlen (cwd) + strlen (argv[0]) + 2))
+      if ( (p = XMALLOC (MTYPE_TMP, strlen (cwd) + strlen (fname) + 2))
           == NULL)
         {
           zlog_err ("config_log_file: Unable to alloc mem!");
           return CMD_WARNING;
         }
-      sprintf (p, "%s/%s", cwd, argv[0]);
+      sprintf (p, "%s/%s", cwd, fname);
       fullpath = p;
     }
   else
-    fullpath = argv[0];
+    fullpath = fname;
 
-  ret = zlog_set_file (NULL, fullpath);
+  ret = zlog_set_file (NULL, fullpath, loglevel);
 
   if (p)
     XFREE (MTYPE_TMP, p);
 
   if (!ret)
     {
-      vty_out (vty, "can't open logfile %s\n", argv[0]);
+      vty_out (vty, "can't open logfile %s\n", fname);
       return CMD_WARNING;
     }
 
   if (host.logfile)
     XFREE (MTYPE_TMP, host.logfile);
 
-  host.logfile = XSTRDUP (MTYPE_TMP, argv[0]);
+  host.logfile = XSTRDUP (MTYPE_TMP, fname);
 
   return CMD_SUCCESS;
 }
 
+DEFUN (config_log_file,
+       config_log_file_cmd,
+       "log file FILENAME",
+       "Logging control\n"
+       "Logging to file\n"
+       "Logging filename\n")
+{
+  return set_log_file(vty, argv[0], zlog_default->default_lvl);
+}
+
+DEFUN (config_log_file_level,
+       config_log_file_level_cmd,
+       "log file FILENAME "LOG_LEVELS,
+       "Logging control\n"
+       "Logging to file\n"
+       "Logging filename\n"
+       LOG_LEVEL_DESC)
+{
+  int level;
+
+  if ((level = level_match(argv[1])) == ZLOG_DISABLED)
+    return CMD_ERR_NO_MATCH;
+  return set_log_file(vty, argv[0], level);
+}
+
 DEFUN (no_config_log_file,
        no_config_log_file_cmd,
        "no log file [FILENAME]",
@@ -3052,154 +3227,135 @@ DEFUN (no_config_log_file,
   return CMD_SUCCESS;
 }
 
+ALIAS (no_config_log_file,
+       no_config_log_file_level_cmd,
+       "no log file FILENAME LEVEL",
+       NO_STR
+       "Logging control\n"
+       "Cancel logging to file\n"
+       "Logging file name\n"
+       "Logging level\n")
+
 DEFUN (config_log_syslog,
        config_log_syslog_cmd,
        "log syslog",
        "Logging control\n"
-       "Logging goes to syslog\n")
+       "Set syslog logging level\n")
 {
-  zlog_set_flag (NULL, ZLOG_SYSLOG);
-  zlog_default->facility = LOG_DAEMON;
+  zlog_set_level (NULL, ZLOG_DEST_SYSLOG, zlog_default->default_lvl);
   return CMD_SUCCESS;
 }
 
-DEFUN (config_log_syslog_facility,
-       config_log_syslog_facility_cmd,
-       "log syslog facility (kern|user|mail|daemon|auth|syslog|lpr|news|uucp|cron|local0|local1|local2|local3|local4|local5|local6|local7)",
+DEFUN (config_log_syslog_level,
+       config_log_syslog_level_cmd,
+       "log syslog "LOG_LEVELS,
        "Logging control\n"
-       "Logging goes to syslog\n"
-       "Facility parameter for syslog messages\n"
-       "Kernel\n"
-       "User process\n"
-       "Mail system\n"
-       "System daemons\n"
-       "Authorization system\n"
-       "Syslog itself\n"
-       "Line printer system\n"
-       "USENET news\n"
-       "Unix-to-Unix copy system\n"
-       "Cron/at facility\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n")
-{
-  int facility = LOG_DAEMON;
-
-  zlog_set_flag (NULL, ZLOG_SYSLOG);
-
-  if (strncmp (argv[0], "kern", 1) == 0)
-    facility = LOG_KERN;
-  else if (strncmp (argv[0], "user", 2) == 0)
-    facility = LOG_USER;
-  else if (strncmp (argv[0], "mail", 1) == 0)
-    facility = LOG_MAIL;
-  else if (strncmp (argv[0], "daemon", 1) == 0)
-    facility = LOG_DAEMON;
-  else if (strncmp (argv[0], "auth", 1) == 0)
-    facility = LOG_AUTH;
-  else if (strncmp (argv[0], "syslog", 1) == 0)
-    facility = LOG_SYSLOG;
-  else if (strncmp (argv[0], "lpr", 2) == 0)
-    facility = LOG_LPR;
-  else if (strncmp (argv[0], "news", 1) == 0)
-    facility = LOG_NEWS;
-  else if (strncmp (argv[0], "uucp", 2) == 0)
-    facility = LOG_UUCP;
-  else if (strncmp (argv[0], "cron", 1) == 0)
-    facility = LOG_CRON;
-  else if (strncmp (argv[0], "local0", 6) == 0)
-    facility = LOG_LOCAL0;
-  else if (strncmp (argv[0], "local1", 6) == 0)
-    facility = LOG_LOCAL1;
-  else if (strncmp (argv[0], "local2", 6) == 0)
-    facility = LOG_LOCAL2;
-  else if (strncmp (argv[0], "local3", 6) == 0)
-    facility = LOG_LOCAL3;
-  else if (strncmp (argv[0], "local4", 6) == 0)
-    facility = LOG_LOCAL4;
-  else if (strncmp (argv[0], "local5", 6) == 0)
-    facility = LOG_LOCAL5;
-  else if (strncmp (argv[0], "local6", 6) == 0)
-    facility = LOG_LOCAL6;
-  else if (strncmp (argv[0], "local7", 6) == 0)
-    facility = LOG_LOCAL7;
+       "Set syslog logging level\n"
+       LOG_LEVEL_DESC)
+{
+  int level;
 
-  zlog_default->facility = facility;
+  if ((level = level_match(argv[0])) == ZLOG_DISABLED)
+    return CMD_ERR_NO_MATCH;
+  zlog_set_level (NULL, ZLOG_DEST_SYSLOG, level);
+  return CMD_SUCCESS;
+}
+
+DEFUN_DEPRECATED (config_log_syslog_facility,
+                 config_log_syslog_facility_cmd,
+                 "log syslog facility "LOG_FACILITIES,
+                 "Logging control\n"
+                 "Logging goes to syslog\n"
+                 "(Deprecated) Facility parameter for syslog messages\n"
+                 LOG_FACILITY_DESC)
+{
+  int facility;
+
+  if ((facility = facility_match(argv[0])) < 0)
+    return CMD_ERR_NO_MATCH;
 
+  zlog_set_level (NULL, ZLOG_DEST_SYSLOG, zlog_default->default_lvl);
+  zlog_default->facility = facility;
   return CMD_SUCCESS;
 }
 
 DEFUN (no_config_log_syslog,
        no_config_log_syslog_cmd,
-       "no log syslog",
+       "no log syslog [LEVEL]",
        NO_STR
        "Logging control\n"
-       "Cancel logging to syslog\n")
+       "Cancel logging to syslog\n"
+       "Logging level\n")
 {
-  zlog_reset_flag (NULL, ZLOG_SYSLOG);
-  zlog_default->facility = LOG_DAEMON;
+  zlog_set_level (NULL, ZLOG_DEST_SYSLOG, ZLOG_DISABLED);
   return CMD_SUCCESS;
 }
 
 ALIAS (no_config_log_syslog,
        no_config_log_syslog_facility_cmd,
-       "no log syslog facility (kern|user|mail|daemon|auth|syslog|lpr|news|uucp|cron|local0|local1|local2|local3|local4|local5|local6|local7)",
+       "no log syslog facility "LOG_FACILITIES,
        NO_STR
        "Logging control\n"
        "Logging goes to syslog\n"
        "Facility parameter for syslog messages\n"
-       "Kernel\n"
-       "User process\n"
-       "Mail system\n"
-       "System daemons\n"
-       "Authorization system\n"
-       "Syslog itself\n"
-       "Line printer system\n"
-       "USENET news\n"
-       "Unix-to-Unix copy system\n"
-       "Cron/at facility\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n"
-       "Local use\n")
-
-DEFUN (config_log_trap,
-       config_log_trap_cmd,
-       "log trap (emergencies|alerts|critical|errors|warnings|notifications|informational|debugging)",
+       LOG_FACILITY_DESC)
+
+DEFUN (config_log_facility,
+       config_log_facility_cmd,
+       "log facility "LOG_FACILITIES,
        "Logging control\n"
-       "Limit logging to specifed level\n")
+       "Facility parameter for syslog messages\n"
+       LOG_FACILITY_DESC)
 {
-  int new_level ;
-  
-  for ( new_level = 0 ; zlog_priority [new_level] != NULL ; new_level ++ )
-    {
-    if ( strcmp ( argv[0], zlog_priority [new_level] ) == 0 )
-      /* found new logging level */
-      {
-      zlog_default->maskpri = new_level;
-      return CMD_SUCCESS;
-      }
-    }
-  return CMD_ERR_NO_MATCH;
+  int facility;
+
+  if ((facility = facility_match(argv[0])) < 0)
+    return CMD_ERR_NO_MATCH;
+  zlog_default->facility = facility;
+  return CMD_SUCCESS;
 }
 
-DEFUN (no_config_log_trap,
-       no_config_log_trap_cmd,
-       "no log trap",
+DEFUN (no_config_log_facility,
+       no_config_log_facility_cmd,
+       "no log facility [FACILITY]",
        NO_STR
        "Logging control\n"
-       "Permit all logging information\n")
+       "Reset syslog facility to default (daemon)\n"
+       "Syslog facility\n")
+{
+  zlog_default->facility = LOG_DAEMON;
+  return CMD_SUCCESS;
+}
+
+DEFUN_DEPRECATED (config_log_trap,
+                 config_log_trap_cmd,
+                 "log trap "LOG_LEVELS,
+                 "Logging control\n"
+                 "(Deprecated) Set logging level and default for all destinations\n"
+                 LOG_LEVEL_DESC)
+{
+  int new_level ;
+  int i;
+  
+  if ((new_level = level_match(argv[0])) == ZLOG_DISABLED)
+    return CMD_ERR_NO_MATCH;
+
+  zlog_default->default_lvl = new_level;
+  for (i = 0; i < ZLOG_NUM_DESTS; i++)
+    if (zlog_default->maxlvl[i] != ZLOG_DISABLED)
+      zlog_default->maxlvl[i] = new_level;
+  return CMD_SUCCESS;
+}
+
+DEFUN_DEPRECATED (no_config_log_trap,
+                 no_config_log_trap_cmd,
+                 "no log trap [LEVEL]",
+                 NO_STR
+                 "Logging control\n"
+                 "Permit all logging information\n"
+                 "Logging level\n")
 {
-  zlog_default->maskpri = LOG_DEBUG;
+  zlog_default->default_lvl = LOG_DEBUG;
   return CMD_SUCCESS;
 }
 
@@ -3304,6 +3460,7 @@ cmd_init (int terminal)
       install_element (VIEW_NODE, &config_enable_cmd);
       install_element (VIEW_NODE, &config_terminal_length_cmd);
       install_element (VIEW_NODE, &config_terminal_no_length_cmd);
+      install_element (VIEW_NODE, &show_logging_cmd);
     }
 
   if (terminal)
@@ -3320,6 +3477,8 @@ cmd_init (int terminal)
     {
       install_element (ENABLE_NODE, &config_terminal_length_cmd);
       install_element (ENABLE_NODE, &config_terminal_no_length_cmd);
+      install_element (ENABLE_NODE, &show_logging_cmd);
+      install_element (ENABLE_NODE, &config_logmsg_cmd);
 
       install_default (CONFIG_NODE);
     }
@@ -3336,13 +3495,22 @@ cmd_init (int terminal)
       install_element (CONFIG_NODE, &no_enable_password_cmd);
 
       install_element (CONFIG_NODE, &config_log_stdout_cmd);
+      install_element (CONFIG_NODE, &config_log_stdout_level_cmd);
       install_element (CONFIG_NODE, &no_config_log_stdout_cmd);
+      install_element (CONFIG_NODE, &config_log_monitor_cmd);
+      install_element (CONFIG_NODE, &config_log_monitor_level_cmd);
+      install_element (CONFIG_NODE, &no_config_log_monitor_cmd);
       install_element (CONFIG_NODE, &config_log_file_cmd);
+      install_element (CONFIG_NODE, &config_log_file_level_cmd);
       install_element (CONFIG_NODE, &no_config_log_file_cmd);
+      install_element (CONFIG_NODE, &no_config_log_file_level_cmd);
       install_element (CONFIG_NODE, &config_log_syslog_cmd);
+      install_element (CONFIG_NODE, &config_log_syslog_level_cmd);
       install_element (CONFIG_NODE, &config_log_syslog_facility_cmd);
       install_element (CONFIG_NODE, &no_config_log_syslog_cmd);
       install_element (CONFIG_NODE, &no_config_log_syslog_facility_cmd);
+      install_element (CONFIG_NODE, &config_log_facility_cmd);
+      install_element (CONFIG_NODE, &no_config_log_facility_cmd);
       install_element (CONFIG_NODE, &config_log_trap_cmd);
       install_element (CONFIG_NODE, &no_config_log_trap_cmd);
       install_element (CONFIG_NODE, &config_log_record_priority_cmd);
index 52cfded92ced2ce53e9103ef94d502534a9f73af..c8699e1091624c44bbafa22c3db5ead58f08d6b9 100644 (file)
@@ -177,10 +177,10 @@ struct desc
   };
 
 #define DEFUN_CMD_FUNC_DECL(funcname) \
-  int funcname (struct cmd_element *, struct vty *, int, const char *[]); \
+  static int funcname (struct cmd_element *, struct vty *, int, const char *[]); \
 
 #define DEFUN_CMD_FUNC_TEXT(funcname) \
-  int funcname \
+  static int funcname \
     (struct cmd_element *self, struct vty *vty, int argc, const char *argv[])
 
 /* DEFUN for vty command interafce. Little bit hacky ;-). */
@@ -214,12 +214,24 @@ struct desc
   DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon) \
   DEFUN_CMD_FUNC_TEXT(funcname)
 
+/* DEFUN + DEFSH with attributes */
+#define DEFUNSH_ATTR(daemon, funcname, cmdname, cmdstr, helpstr, attr) \
+  DEFUN_CMD_FUNC_DECL(funcname) \
+  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, daemon) \
+  DEFUN_CMD_FUNC_TEXT(funcname)
+
+#define DEFUNSH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
+  DEFUNSH_ATTR (daemon, funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN)
+
+#define DEFUNSH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
+  DEFUNSH_ATTR (daemon, funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED)
+
 /* ALIAS macro which define existing command's alias. */
 #define ALIAS(funcname, cmdname, cmdstr, helpstr) \
   DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, 0)
 
 #define ALIAS_ATTR(funcname, cmdname, cmdstr, helpstr, attr) \
-  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, daemon) \
+  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, attr, 0)
 
 #define ALIAS_HIDDEN(funcname, cmdname, cmdstr, helpstr) \
   DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, 0)
@@ -227,6 +239,15 @@ struct desc
 #define ALIAS_DEPRECATED(funcname, cmdname, cmdstr, helpstr) \
   DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED, 0)
 
+#define ALIAS_SH(daemon, funcname, cmdname, cmdstr, helpstr) \
+  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, 0, daemon)
+
+#define ALIAS_SH_HIDDEN(daemon, funcname, cmdname, cmdstr, helpstr) \
+  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_HIDDEN, daemon)
+
+#define ALIAS_SH_DEPRECATED(daemon, funcname, cmdname, cmdstr, helpstr) \
+  DEFUN_CMD_ELEMENT(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_DEPRECATED, daemon)
+
 #endif /* VTYSH_EXTRACT_PL */
 
 /* Some macroes */
@@ -319,8 +340,6 @@ extern struct cmd_element config_exit_cmd;
 extern struct cmd_element config_quit_cmd;
 extern struct cmd_element config_help_cmd;
 extern struct cmd_element config_list_cmd;
-int config_exit (struct cmd_element *, struct vty *, int, const char *[]);
-int config_help (struct cmd_element *, struct vty *, int, const char *[]);
 char *host_config_file ();
 void host_config_set (char *);
 
index d3106cb4d98794bb2aff6ab6f4700419580f9c1e..b68896cac8ae66f89681d613be50dae6c1944f05 100644 (file)
--- a/lib/log.c
+++ b/lib/log.c
@@ -1,4 +1,7 @@
-/* Logging of zebra
+/*
+ * $Id: log.c,v 1.17 2004/12/07 15:39:32 ajs Exp $
+ *
+ * Logging of zebra
  * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro
  *
  * This file is part of GNU Zebra.
@@ -104,12 +107,8 @@ vzlog (struct zlog *zl, int priority, const char *format, va_list args)
       return;
     }
 
-  /* only log this information if it has not been masked out */
-  if ( priority > zl->maskpri )
-    return ;
-               
   /* Syslog output */
-  if (zl->flags & ZLOG_SYSLOG)
+  if (priority <= zl->maxlvl[ZLOG_DEST_SYSLOG])
     {
       va_list ac;
       va_copy(ac, args);
@@ -118,7 +117,7 @@ vzlog (struct zlog *zl, int priority, const char *format, va_list args)
     }
 
   /* File output. */
-  if (zl->flags & ZLOG_FILE)
+  if ((priority <= zl->maxlvl[ZLOG_DEST_FILE]) && zl->fp)
     {
       va_list ac;
       time_print (zl->fp);
@@ -133,7 +132,7 @@ vzlog (struct zlog *zl, int priority, const char *format, va_list args)
     }
 
   /* stdout output. */
-  if (zl->flags & ZLOG_STDOUT)
+  if (priority <= zl->maxlvl[ZLOG_DEST_STDOUT])
     {
       va_list ac;
       time_print (stdout);
@@ -147,23 +146,10 @@ vzlog (struct zlog *zl, int priority, const char *format, va_list args)
       fflush (stdout);
     }
 
-  /* stderr output. */
-  if (zl->flags & ZLOG_STDERR)
-    {
-      va_list ac;
-      time_print (stderr);
-      if (zl->record_priority)
-       fprintf (stderr, "%s: ", zlog_priority[priority]);
-      fprintf (stderr, "%s: ", zlog_proto_names[zl->protocol]);
-      va_copy(ac, args);
-      vfprintf (stderr, format, ac);
-      va_end(ac);
-      fprintf (stderr, "\n");
-      fflush (stderr);
-    }
-
   /* Terminal monitor. */
-  vty_log (zlog_proto_names[zl->protocol], format, args);
+  if (priority <= zl->maxlvl[ZLOG_DEST_MONITOR])
+    vty_log ((zl->record_priority ? zlog_priority[priority] : NULL),
+            zlog_proto_names[zl->protocol], format, args);
 }
 
 static char *
@@ -297,26 +283,29 @@ zlog_signal(int signo, const char *action)
   if (s < buf+sizeof(buf))
     *s++ = '\n';
 
+  /* N.B. implicit priority is most severe */
+#define PRI LOG_EMERG
+
 #define DUMP(FP) write(fileno(FP),buf,s-buf);
   if (!zlog_default)
     DUMP(stderr)
   else
     {
-      if ((zlog_default->flags & ZLOG_FILE) && zlog_default->fp)
+      if ((PRI <= zlog_default->maxlvl[ZLOG_DEST_FILE]) && zlog_default->fp)
         DUMP(zlog_default->fp)
-      if (zlog_default->flags & ZLOG_STDOUT)
+      if (PRI <= zlog_default->maxlvl[ZLOG_DEST_STDOUT])
         DUMP(stdout)
-      if (zlog_default->flags & ZLOG_STDERR)
-        DUMP(stderr)
-      if (zlog_default->flags & ZLOG_SYSLOG)
-        {
-         *--s = '\0';
-         syslog_sigsafe(LOG_ERR|zlog_default->facility,msgstart,s-msgstart);
-       }
+      /* Remove trailing '\n' for monitor and syslog */
+      *--s = '\0';
+      if (PRI <= zlog_default->maxlvl[ZLOG_DEST_MONITOR])
+        vty_log_fixed(buf,s-buf);
+      if (PRI <= zlog_default->maxlvl[ZLOG_DEST_SYSLOG])
+       syslog_sigsafe(PRI|zlog_default->facility,msgstart,s-msgstart);
     }
 #undef DUMP
 
-  zlog_backtrace_sigsafe(LOG_ERR);
+  zlog_backtrace_sigsafe(PRI);
+#undef PRI
 #undef LOC
 }
 
@@ -332,10 +321,6 @@ zlog_backtrace_sigsafe(int priority)
   char *s;
 #define LOC s,buf+sizeof(buf)-s
 
-  /* only log this information if it has not been masked out */
-  if (zlog_default && (priority > zlog_default->maskpri))
-    return;
-
   if (((size = backtrace(array,sizeof(array)/sizeof(array[0]))) <= 0) ||
       ((size_t)size > sizeof(array)/sizeof(array[0])))
     return;
@@ -353,29 +338,34 @@ zlog_backtrace_sigsafe(int priority)
     DUMP(stderr)
   else
     {
-      if ((zlog_default->flags & ZLOG_FILE) && zlog_default->fp)
+      if ((priority <= zlog_default->maxlvl[ZLOG_DEST_FILE]) &&
+         zlog_default->fp)
        DUMP(zlog_default->fp)
-      if (zlog_default->flags & ZLOG_STDOUT)
+      if (priority <= zlog_default->maxlvl[ZLOG_DEST_STDOUT])
        DUMP(stdout)
-      if (zlog_default->flags & ZLOG_STDERR)
-       DUMP(stderr)
-      if (zlog_default->flags & ZLOG_SYSLOG)
-        {
-         int i;
-         *--s = '\0';
-         syslog_sigsafe(priority|zlog_default->facility,buf,s-buf);
-         /* Just print the function addresses. */
-         for (i = 0; i < size; i++)
-           {
-             s = buf;
-             s = str_append(LOC,"[bt ");
-             s = num_append(LOC,i);
-             s = str_append(LOC,"] 0x");
-             s = hex_append(LOC,(u_long)(array[i]));
-             *s = '\0';
+      /* Remove trailing '\n' for monitor and syslog */
+      *--s = '\0';
+      if (priority <= zlog_default->maxlvl[ZLOG_DEST_MONITOR])
+       vty_log_fixed(buf,s-buf);
+      if (priority <= zlog_default->maxlvl[ZLOG_DEST_SYSLOG])
+       syslog_sigsafe(priority|zlog_default->facility,buf,s-buf);
+      {
+       int i;
+       /* Just print the function addresses. */
+       for (i = 0; i < size; i++)
+         {
+           s = buf;
+           s = str_append(LOC,"[bt ");
+           s = num_append(LOC,i);
+           s = str_append(LOC,"] 0x");
+           s = hex_append(LOC,(u_long)(array[i]));
+           *s = '\0';
+           if (priority <= zlog_default->maxlvl[ZLOG_DEST_MONITOR])
+             vty_log_fixed(buf,s-buf);
+           if (priority <= zlog_default->maxlvl[ZLOG_DEST_SYSLOG])
              syslog_sigsafe(priority|zlog_default->facility,buf,s-buf);
-           }
-        }
+         }
+      }
     }
 #undef DUMP
 #undef LOC
@@ -476,29 +466,32 @@ _zlog_assert_failed (const char *assertion, const char *file,
 {
   zlog_err("Assertion `%s' failed in file %s, line %u, function %s",
           assertion,file,line,(function ? function : "?"));
-  zlog_backtrace(LOG_ERR);
+  zlog_backtrace(LOG_EMERG);
   abort();
 }
 
 \f
 /* Open log stream */
 struct zlog *
-openzlog (const char *progname, int flags, zlog_proto_t protocol,
+openzlog (const char *progname, zlog_proto_t protocol,
          int syslog_flags, int syslog_facility)
 {
   struct zlog *zl;
+  u_int i;
 
-  zl = XMALLOC(MTYPE_ZLOG, sizeof (struct zlog));
-  memset (zl, 0, sizeof (struct zlog));
+  zl = XCALLOC(MTYPE_ZLOG, sizeof (struct zlog));
 
   zl->ident = progname;
-  zl->flags = flags;
   zl->protocol = protocol;
   zl->facility = syslog_facility;
-  zl->maskpri = LOG_DEBUG;
-  zl->record_priority = 0;
   zl->syslog_options = syslog_flags;
 
+  /* Set default logging levels. */
+  for (i = 0; i < sizeof(zl->maxlvl)/sizeof(zl->maxlvl[0]); i++)
+    zl->maxlvl[i] = ZLOG_DISABLED;
+  zl->maxlvl[ZLOG_DEST_MONITOR] = LOG_DEBUG;
+  zl->default_lvl = LOG_DEBUG;
+
   openlog (progname, syslog_flags, zl->facility);
   
   return zl;
@@ -515,25 +508,16 @@ closezlog (struct zlog *zl)
 
 /* Called from command.c. */
 void
-zlog_set_flag (struct zlog *zl, int flags)
+zlog_set_level (struct zlog *zl, zlog_dest_t dest, int log_level)
 {
   if (zl == NULL)
     zl = zlog_default;
 
-  zl->flags |= flags;
-}
-
-void
-zlog_reset_flag (struct zlog *zl, int flags)
-{
-  if (zl == NULL)
-    zl = zlog_default;
-
-  zl->flags &= ~flags;
+  zl->maxlvl[dest] = log_level;
 }
 
 int
-zlog_set_file (struct zlog *zl, const char *filename)
+zlog_set_file (struct zlog *zl, const char *filename, int log_level)
 {
   FILE *fp;
   mode_t oldumask;
@@ -548,16 +532,13 @@ zlog_set_file (struct zlog *zl, const char *filename)
   /* Open file. */
   oldumask = umask (0777 & ~LOGFILE_MASK);
   fp = fopen (filename, "a");
-  if (fp == NULL)
-    {
-      umask(oldumask);
-      return 0;
-    }
   umask(oldumask);
+  if (fp == NULL)
+    return 0;
 
   /* Set flags. */
   zl->filename = strdup (filename);
-  zl->flags |= ZLOG_FILE;
+  zl->maxlvl[ZLOG_DEST_FILE] = log_level;
   zl->fp = fp;
 
   return 1;
@@ -570,11 +551,10 @@ zlog_reset_file (struct zlog *zl)
   if (zl == NULL)
     zl = zlog_default;
 
-  zl->flags &= ~ZLOG_FILE;
-
   if (zl->fp)
     fclose (zl->fp);
   zl->fp = NULL;
+  zl->maxlvl[ZLOG_DEST_FILE] = ZLOG_DISABLED;
 
   if (zl->filename)
     free (zl->filename);
@@ -587,7 +567,7 @@ zlog_reset_file (struct zlog *zl)
 int
 zlog_rotate (struct zlog *zl)
 {
-  FILE *fp;
+  int level;
 
   if (zl == NULL)
     zl = zlog_default;
@@ -595,20 +575,25 @@ zlog_rotate (struct zlog *zl)
   if (zl->fp)
     fclose (zl->fp);
   zl->fp = NULL;
+  level = zl->maxlvl[ZLOG_DEST_FILE];
+  zl->maxlvl[ZLOG_DEST_FILE] = ZLOG_DISABLED;
 
   if (zl->filename)
     {
       mode_t oldumask;
+      int save_errno;
 
       oldumask = umask (0777 & ~LOGFILE_MASK);
-      fp = fopen (zl->filename, "a");
-      if (fp == NULL)
+      zl->fp = fopen (zl->filename, "a");
+      save_errno = errno;
+      umask(oldumask);
+      if (zl->fp == NULL)
         {
-         umask(oldumask);
+         zlog_err("Log rotate failed: cannot open file %s for append: %s",
+                  zl->filename, safe_strerror(save_errno));
          return -1;
         }      
-      umask(oldumask);
-      zl->fp = fp;
+      zl->maxlvl[ZLOG_DEST_FILE] = level;
     }
 
   return 1;
index 26ff902bc7c3d5527c0a2d825fba20c94c01d3a6..1f9f23cdc08044eea6abf7238fa92e16319af373 100644 (file)
--- a/lib/log.h
+++ b/lib/log.h
@@ -1,4 +1,7 @@
-/* Zebra logging funcions.
+/*
+ * $Id: log.h,v 1.14 2004/12/07 15:39:32 ajs Exp $
+ *
+ * Zebra logging funcions.
  * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro
  *
  * This file is part of GNU Zebra.
  * please use LOG_ERR instead.
  */
 
-#define ZLOG_NOLOG              0x00
-#define ZLOG_FILE              0x01
-#define ZLOG_SYSLOG            0x02
-#define ZLOG_STDOUT             0x04
-#define ZLOG_STDERR             0x08
-
 typedef enum 
 {
   ZLOG_NONE,
@@ -60,14 +57,28 @@ typedef enum
   ZLOG_MASC
 } zlog_proto_t;
 
+/* If maxlvl is set to ZLOG_DISABLED, then no messages will be sent
+   to that logging destination. */
+#define ZLOG_DISABLED  (LOG_EMERG-1)
+
+typedef enum
+{
+  ZLOG_DEST_SYSLOG = 0,
+  ZLOG_DEST_STDOUT,
+  ZLOG_DEST_MONITOR,
+  ZLOG_DEST_FILE
+} zlog_dest_t;
+#define ZLOG_NUM_DESTS         (ZLOG_DEST_FILE+1)
+
 struct zlog 
 {
   const char *ident;   /* daemon name (first arg to openlog) */
   zlog_proto_t protocol;
-  int flags;           /* mask indicating which destinations to log to */
+  int maxlvl[ZLOG_NUM_DESTS];  /* maximum priority to send to associated
+                                  logging destination */
+  int default_lvl;     /* maxlvl to use if none is specified */
   FILE *fp;
   char *filename;
-  int maskpri;         /* discard messages with priority > maskpri */
   int facility;                /* as per syslog facility */
   int record_priority; /* should messages logged through stdio include the
                           priority of the message? */
@@ -85,7 +96,8 @@ struct message
 extern struct zlog *zlog_default;
 
 /* Open zlog function */
-struct zlog *openzlog (const char *, int, zlog_proto_t, int, int);
+struct zlog *openzlog (const char *progname, zlog_proto_t protocol,
+                      int syslog_options, int syslog_facility);
 
 /* Close zlog function. */
 void closezlog (struct zlog *zl);
@@ -114,12 +126,15 @@ void plog_info (struct zlog *, const char *format, ...);
 void plog_notice (struct zlog *, const char *format, ...);
 void plog_debug (struct zlog *, const char *format, ...);
 
-/* Set zlog flags. */
-void zlog_set_flag (struct zlog *zl, int flags);
-void zlog_reset_flag (struct zlog *zl, int flags);
+/* Set logging level for the given destination.  If the log_level
+   argument is ZLOG_DISABLED, then the destination is disabled.
+   This function should not be used for file logging (use zlog_set_file
+   or zlog_reset_file instead). */
+void zlog_set_level (struct zlog *zl, zlog_dest_t, int log_level);
 
-/* Set zlog filename. */
-int zlog_set_file (struct zlog *zl, const char *filename);
+/* Set logging to the given filename at the specified level. */
+int zlog_set_file (struct zlog *zl, const char *filename, int log_level);
+/* Disable file logging. */
 int zlog_reset_file (struct zlog *zl);
 
 /* Rotate log. */
@@ -132,6 +147,7 @@ const char *lookup (struct message *, int);
 const char *mes_lookup (struct message *meslist, int max, int index);
 
 extern const char *zlog_priority[];
+extern const char *zlog_proto_names[];
 
 /* Safe version of strerror -- never returns NULL. */
 extern const char *safe_strerror(int errnum);
@@ -147,4 +163,40 @@ extern void zlog_backtrace(int priority);
    up the state of zlog file pointers. */
 extern void zlog_backtrace_sigsafe(int priority);
 
+/* Defines for use in command construction: */
+
+#define LOG_LEVELS "(emergencies|alerts|critical|errors|warnings|notifications|informational|debugging)"
+
+#define LOG_LEVEL_DESC \
+  "System is unusable\n" \
+  "Immediate action needed\n" \
+  "Critical conditions\n" \
+  "Error conditions\n" \
+  "Warning conditions\n" \
+  "Normal but significant conditions\n" \
+  "Informational messages\n" \
+  "Debugging messages\n"
+
+#define LOG_FACILITIES "(kern|user|mail|daemon|auth|syslog|lpr|news|uucp|cron|local0|local1|local2|local3|local4|local5|local6|local7)"
+
+#define LOG_FACILITY_DESC \
+       "Kernel\n" \
+       "User process\n" \
+       "Mail system\n" \
+       "System daemons\n" \
+       "Authorization system\n" \
+       "Syslog itself\n" \
+       "Line printer system\n" \
+       "USENET news\n" \
+       "Unix-to-Unix copy system\n" \
+       "Cron/at facility\n" \
+       "Local use\n" \
+       "Local use\n" \
+       "Local use\n" \
+       "Local use\n" \
+       "Local use\n" \
+       "Local use\n" \
+       "Local use\n" \
+       "Local use\n"
+
 #endif /* _ZEBRA_LOG_H */
index bf1eec382be9e20ae419292e417a5bb88b059d1d..25366fb454acb7dfa67a91c39c513681685fc688 100644 (file)
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -148,14 +148,17 @@ vty_out (struct vty *vty, const char *format, ...)
 }
 
 static int
-vty_log_out (struct vty *vty, const char *proto_str, const char *format,
-            va_list va)
+vty_log_out (struct vty *vty, const char *level, const char *proto_str,
+            const char *format, va_list va)
 {
   int len;
   char buf[1024];
 
-  snprintf (buf, sizeof buf, "%s: ", proto_str);
-  write (vty->fd, buf, strlen (proto_str) + 2);
+  if (level)
+    snprintf (buf, sizeof buf, "%s: %s: ", level, proto_str);
+  else
+    snprintf (buf, sizeof buf, "%s: ", proto_str);
+  write (vty->fd, buf, strlen (buf));
 
   len = vsnprintf (buf, sizeof buf, format, va);
   if (len < 0)
@@ -602,7 +605,7 @@ static void
 vty_down_level (struct vty *vty)
 {
   vty_out (vty, "%s", VTY_NEWLINE);
-  config_exit (NULL, vty, 0, NULL);
+  (*config_exit_cmd.func)(NULL, vty, 0, NULL);
   vty_prompt (vty);
   vty->cp = 0;
 }
@@ -2273,7 +2276,8 @@ vty_read_config (char *config_file,
 
 /* Small utility function which output log to the VTY. */
 void
-vty_log (const char *proto_str, const char *format, va_list va)
+vty_log (const char *level, const char *proto_str,
+        const char *format, va_list va)
 {
   unsigned int i;
   struct vty *vty;
@@ -2284,11 +2288,29 @@ vty_log (const char *proto_str, const char *format, va_list va)
        {
          va_list ac;
          va_copy(ac, va);
-         vty_log_out (vty, proto_str, format, ac);
+         vty_log_out (vty, level, proto_str, format, ac);
          va_end(ac);
        }
 }
 
+/* Async-signal-safe version of vty_log for fixed strings. */
+void
+vty_log_fixed (const char *buf, size_t len)
+{
+  unsigned int i;
+
+  for (i = 0; i < vector_max (vtyvec); i++)
+    {
+      struct vty *vty;
+      if ((vty = vector_slot (vtyvec, i)) != NULL)
+       if (vty->monitor)
+         {
+           write(vty->fd, buf, len);
+           write(vty->fd, "\r\n", 2);
+         }
+    }
+}
+
 int
 vty_config_lock (struct vty *vty)
 {
index c3221e2ac1f5e5419c8f9854d2a7e13db96c16d0..8cd2b4e31323378580356bc4f905e9a6cc40aaa0 100644 (file)
--- a/lib/vty.h
+++ b/lib/vty.h
@@ -180,11 +180,15 @@ void vty_time_print (struct vty *, int);
 void vty_serv_sock (const char *, unsigned short, const char *);
 void vty_close (struct vty *);
 char *vty_get_cwd (void);
-void vty_log (const char *, const char *, va_list);
+void vty_log (const char *level, const char *proto, const char *fmt, va_list);
 int vty_config_lock (struct vty *);
 int vty_config_unlock (struct vty *);
 int vty_shell (struct vty *);
 int vty_shell_serv (struct vty *);
 void vty_hello (struct vty *);
 
+/* Send a fixed-size message to all vty terminal monitors; this should be
+   an async-signal-safe function. */
+extern void vty_log_fixed (const char *buf, size_t len);
+
 #endif /* _ZEBRA_VTY_H */
index 7bb6b4bf3ea60589396a5070f28ac4f7fd8f5ed3..a3e8c949d7d0d78ee941a35891b5783d590cfd86 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-07 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+       * ospf6_main.c: (main) The 2nd argument to openzlog has been removed.
+         Note that stdout logging will no longer be enabled by default when
+         not running as a daemon.
+
 2004-12-03 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
        * ospf6_main.c: (sigint,sigterm) Use zlog_notice for termination
index ba266d95120ac3f17b6beba8f263384cff2e78e4..073e9d68bcf03eb0d6a61e147ea5dba0a5b3d9e6 100644 (file)
@@ -184,7 +184,6 @@ main (int argc, char *argv[], char *envp[])
   int vty_port = 0;
   char *config_file = NULL;
   struct thread thread;
-  int flag;
 
   /* Set umask before anything for security */
   umask (0027);
@@ -250,12 +249,7 @@ main (int argc, char *argv[], char *envp[])
   master = thread_master_create ();
 
   /* Initializations. */
-  if (! daemon_mode)
-    flag = ZLOG_STDOUT;
-  else
-    flag = 0;
-
-  zlog_default = openzlog (progname, flag, ZLOG_OSPF6,
+  zlog_default = openzlog (progname, ZLOG_OSPF6,
                            LOG_CONS|LOG_NDELAY|LOG_PID,
                            LOG_DAEMON);
   zprivs_init (&ospf6d_privs);
index 9d5b1fb84d5b0665160d44107ca2ab97e8d1823c..33c790ade0715cdeeb1655e12b77188932406b63 100644 (file)
@@ -1,3 +1,7 @@
+2004-12-07 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+       * ospf_main.c: (main) The 2nd argument to openzlog has been removed.
+
 2004-12-03 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
        * ospf_packet.c: (ospf_db_desc) Reduce priority on a debug message
index d155c98094d1b94e1e32b125331462cf9f6e288d..7955162d019de2a8fed14e5583d284cced21bac3 100644 (file)
@@ -201,7 +201,7 @@ main (int argc, char **argv)
       exit (1);
     }
 
-  zlog_default = openzlog (progname, ZLOG_NOLOG, ZLOG_OSPF,
+  zlog_default = openzlog (progname, ZLOG_OSPF,
                           LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
 
   /* OSPF master init. */
index 1c703dfa564b06102f6706dec00f83364ce91f3d..46b7f193199001f3402159b7e147a3a2b264a964 100644 (file)
@@ -1,3 +1,7 @@
+2004-12-07 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+       * rip_main.c: (main) The 2nd argument to openzlog has been removed.
+
 2004-12-03 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
        * rip_main.c: (sigint) Use zlog_notice for termination message.
index 2b2939dd50c59726e6ce98ea0ce936ffc1381708..ba60b36ff4e74cdf10c57cc040e5a6b1569281bc 100644 (file)
@@ -195,7 +195,7 @@ main (int argc, char **argv)
   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
 
   /* First of all we need logging init. */
-  zlog_default = openzlog (progname, ZLOG_NOLOG, ZLOG_RIP,
+  zlog_default = openzlog (progname, ZLOG_RIP,
                           LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
 
   /* Command line option parse. */
index 840f41305bbb9ce8194aa479845360483a154402..a66825671b10c77dffbe96f6491002dad87da2fb 100644 (file)
@@ -1,3 +1,7 @@
+2004-12-07 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+       * ripng_main.c: (main) The 2nd argument to openzlog has been removed.
+
 2004-12-03 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
        * ripng_main.c: (sighup) Remove spurious terminating message.
index ac63abbb1b0df1906467663e6b4045a2343cc6d1..ea30c1bff0811edb08e273b53456207959734ecc 100644 (file)
@@ -197,7 +197,7 @@ main (int argc, char **argv)
   /* get program name */
   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
 
-  zlog_default = openzlog(progname, ZLOG_NOLOG, ZLOG_RIPNG,
+  zlog_default = openzlog(progname, ZLOG_RIPNG,
                          LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
 
   while (1) 
index ea611179f5868efdeb0834b521fbd78990a7a5fb..5e32f015cba5b81cdfb05b11f328e982c6de6327 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-07 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+       * vtysh.c: Make several functions static instead of global.
+         Added several commands to support destination-specific logging levels.
+         (vtysh_completion) This function is unused, so comment it out.
+
 2004-11-11 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
        * vtysh.c: (vtysh_client_execute) Fix flaws in detecting trailing
index 08bd1275cc95fda3385d00523081077ecbf71442..0a043cf9a398e3d32355781d97d8bb035e3cfc62 100644 (file)
@@ -52,7 +52,7 @@ int vtysh_writeconfig_integrated = 0;
 
 extern char config_default[];
 
-void
+static void
 vclient_close (struct vtysh_client *vclient)
 {
   if (vclient->fd > 0)
@@ -63,7 +63,7 @@ vclient_close (struct vtysh_client *vclient)
 /* Following filled with debug code to trace a problematic condition
  * under load - it SHOULD handle it. */
 #define ERR_WHERE_STRING "vtysh(): vtysh_client_config(): "
-int
+static int
 vtysh_client_config (struct vtysh_client *vclient, char *line)
 {
   int ret;
@@ -161,7 +161,7 @@ vtysh_client_config (struct vtysh_client *vclient, char *line)
   return ret;
 }
 
-int
+static int
 vtysh_client_execute (struct vtysh_client *vclient, const char *line, FILE *fp)
 {
   int ret;
@@ -247,7 +247,7 @@ vtysh_pager_init ()
 }
 
 /* Command execution over the vty interface. */
-void
+static void
 vtysh_execute_func (const char *line, int pager)
 {
   int ret, cmd_stat;
@@ -604,7 +604,7 @@ vtysh_rl_describe ()
  * correct places only. */
 int complete_status;
 
-char *
+static char *
 command_generator (const char *text, int state)
 {
   vector vline;
@@ -635,7 +635,7 @@ command_generator (const char *text, int state)
   return NULL;
 }
 
-char **
+static char **
 new_completion (char *text, int start, int end)
 {
   char **matches;
@@ -652,7 +652,9 @@ new_completion (char *text, int start, int end)
   return matches;
 }
 
-char **
+#if 0
+/* This function is not actually being used. */
+static char **
 vtysh_completion (char *text, int start, int end)
 {
   int ret;
@@ -676,6 +678,7 @@ vtysh_completion (char *text, int start, int end)
 
   return (char **) matched;
 }
+#endif
 
 /* Vty node structures. */
 struct cmd_node bgp_node =
@@ -1015,7 +1018,7 @@ DEFUNSH (VTYSH_ALL,
   return CMD_SUCCESS;
 }
 
-int
+static int
 vtysh_exit (struct vty *vty)
 {
   switch (vty->node)
@@ -1265,7 +1268,18 @@ DEFUNSH (VTYSH_ALL,
         vtysh_log_stdout_cmd,
         "log stdout",
         "Logging control\n"
-        "Logging goes to stdout\n")
+        "Set stdout logging level\n")
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH (VTYSH_ALL,
+        vtysh_log_stdout_level,
+        vtysh_log_stdout_level_cmd,
+        "log stdout "LOG_LEVELS,
+        "Logging control\n"
+        "Set stdout logging level\n"
+        LOG_LEVEL_DESC)
 {
   return CMD_SUCCESS;
 }
@@ -1273,10 +1287,11 @@ DEFUNSH (VTYSH_ALL,
 DEFUNSH (VTYSH_ALL,
         no_vtysh_log_stdout,
         no_vtysh_log_stdout_cmd,
-        "no log stdout",
+        "no log stdout [LEVEL]",
         NO_STR
         "Logging control\n"
-        "Logging goes to stdout\n")
+        "Cancel logging to stdout\n"
+        "Logging level\n")
 {
   return CMD_SUCCESS;
 }
@@ -1292,6 +1307,18 @@ DEFUNSH (VTYSH_ALL,
   return CMD_SUCCESS;
 }
 
+DEFUNSH (VTYSH_ALL,
+        vtysh_log_file_level,
+        vtysh_log_file_level_cmd,
+        "log file FILENAME "LOG_LEVELS,
+        "Logging control\n"
+        "Logging to file\n"
+        "Logging filename\n"
+        LOG_LEVEL_DESC)
+{
+  return CMD_SUCCESS;
+}
+
 DEFUNSH (VTYSH_ALL,
         no_vtysh_log_file,
         no_vtysh_log_file_cmd,
@@ -1304,12 +1331,66 @@ DEFUNSH (VTYSH_ALL,
   return CMD_SUCCESS;
 }
 
+ALIAS_SH (VTYSH_ALL,
+         no_vtysh_log_file,
+         no_vtysh_log_file_level_cmd,
+         "no log file FILENAME LEVEL",
+         NO_STR
+         "Logging control\n"
+         "Cancel logging to file\n"
+         "Logging file name\n"
+         "Logging level\n")
+
+DEFUNSH (VTYSH_ALL,
+        vtysh_log_monitor,
+        vtysh_log_monitor_cmd,
+        "log monitor",
+        "Logging control\n"
+        "Set terminal line (monitor) logging level\n")
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH (VTYSH_ALL,
+        vtysh_log_monitor_level,
+        vtysh_log_monitor_level_cmd,
+        "log monitor "LOG_LEVELS,
+        "Logging control\n"
+        "Set terminal line (monitor) logging level\n"
+        LOG_LEVEL_DESC)
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH (VTYSH_ALL,
+        no_vtysh_log_monitor,
+        no_vtysh_log_monitor_cmd,
+        "no log monitor [LEVEL]",
+        NO_STR
+        "Logging control\n"
+        "Disable terminal line (monitor) logging\n"
+        "Logging level\n")
+{
+  return CMD_SUCCESS;
+}
+
 DEFUNSH (VTYSH_ALL,
         vtysh_log_syslog,
         vtysh_log_syslog_cmd,
         "log syslog",
         "Logging control\n"
-        "Logging goes to syslog\n")
+        "Set syslog logging level\n")
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH (VTYSH_ALL,
+        vtysh_log_syslog_level,
+        vtysh_log_syslog_level_cmd,
+        "log syslog "LOG_LEVELS,
+        "Logging control\n"
+        "Set syslog logging level\n"
+        LOG_LEVEL_DESC)
 {
   return CMD_SUCCESS;
 }
@@ -1317,32 +1398,60 @@ DEFUNSH (VTYSH_ALL,
 DEFUNSH (VTYSH_ALL,
         no_vtysh_log_syslog,
         no_vtysh_log_syslog_cmd,
-        "no log syslog",
+        "no log syslog [LEVEL]",
         NO_STR
         "Logging control\n"
-        "Cancel logging to syslog\n")
+        "Cancel logging to syslog\n"
+        "Logging level\n")
 {
   return CMD_SUCCESS;
 }
 
 DEFUNSH (VTYSH_ALL,
-        vtysh_log_trap,
-        vtysh_log_trap_cmd,
-        "log trap (emergencies|alerts|critical|errors|warnings|\
-                   notifications|informational|debugging)",
+        vtysh_log_facility,
+        vtysh_log_facility_cmd,
+        "log facility "LOG_FACILITIES,
         "Logging control\n"
-        "Limit logging to specifed level\n")
+        "Facility parameter for syslog messages\n"
+        LOG_FACILITY_DESC)
+
 {
   return CMD_SUCCESS;
 }
 
 DEFUNSH (VTYSH_ALL,
-        no_vtysh_log_trap,
-        no_vtysh_log_trap_cmd,
-        "no log trap",
+        no_vtysh_log_facility,
+        no_vtysh_log_facility_cmd,
+        "no log facility [FACILITY]",
         NO_STR
         "Logging control\n"
-        "Permit all logging information\n")
+        "Reset syslog facility to default (daemon)\n"
+        "Syslog facility\n")
+
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH_DEPRECATED (VTYSH_ALL,
+                   vtysh_log_trap,
+                   vtysh_log_trap_cmd,
+                   "log trap "LOG_LEVELS,
+                   "Logging control\n"
+                   "(Deprecated) Set logging level and default for all destinations\n"
+                   LOG_LEVEL_DESC)
+
+{
+  return CMD_SUCCESS;
+}
+
+DEFUNSH_DEPRECATED (VTYSH_ALL,
+                   no_vtysh_log_trap,
+                   no_vtysh_log_trap_cmd,
+                   "no log trap [LEVEL]",
+                   NO_STR
+                   "Logging control\n"
+                   "Permit all logging information\n"
+                   "Logging level\n")
 {
   return CMD_SUCCESS;
 }
@@ -1521,7 +1630,8 @@ DEFUN (no_vtysh_integrated_config,
   return CMD_SUCCESS;
 }
 
-int write_config_integrated(void)
+static int
+write_config_integrated(void)
 {
   int ret;
   char line[] = "write terminal\n";
@@ -1702,7 +1812,7 @@ DEFUN (vtysh_show_daemons,
 }
 
 /* Execute command in child process. */
-int
+static int
 execute_command (const char *command, int argc, const char *arg1,
                 const char *arg2)
 {
@@ -1867,14 +1977,14 @@ DEFUN (vtysh_start_zsh,
   return CMD_SUCCESS;
 }
 
-void
+static void
 vtysh_install_default (enum node_type node)
 {
   install_element (node, &config_list_cmd);
 }
 
 /* Making connection to protocol daemon. */
-int
+static int
 vtysh_connect (struct vtysh_client *vclient, const char *path)
 {
   int ret;
@@ -1957,7 +2067,7 @@ vtysh_connect_all()
 }
 
 /* To disable readline's filename completion. */
-char *
+static char *
 vtysh_completion_entry_function (const char *ignore, int invoking_key)
 {
   return NULL;
@@ -2190,13 +2300,22 @@ vtysh_init_vty ()
   install_element (ENABLE_NODE, &vtysh_start_zsh_cmd);
 
   install_element (CONFIG_NODE, &vtysh_log_stdout_cmd);
+  install_element (CONFIG_NODE, &vtysh_log_stdout_level_cmd);
   install_element (CONFIG_NODE, &no_vtysh_log_stdout_cmd);
   install_element (CONFIG_NODE, &vtysh_log_file_cmd);
+  install_element (CONFIG_NODE, &vtysh_log_file_level_cmd);
   install_element (CONFIG_NODE, &no_vtysh_log_file_cmd);
+  install_element (CONFIG_NODE, &no_vtysh_log_file_level_cmd);
+  install_element (CONFIG_NODE, &vtysh_log_monitor_cmd);
+  install_element (CONFIG_NODE, &vtysh_log_monitor_level_cmd);
+  install_element (CONFIG_NODE, &no_vtysh_log_monitor_cmd);
   install_element (CONFIG_NODE, &vtysh_log_syslog_cmd);
+  install_element (CONFIG_NODE, &vtysh_log_syslog_level_cmd);
   install_element (CONFIG_NODE, &no_vtysh_log_syslog_cmd);
   install_element (CONFIG_NODE, &vtysh_log_trap_cmd);
   install_element (CONFIG_NODE, &no_vtysh_log_trap_cmd);
+  install_element (CONFIG_NODE, &vtysh_log_facility_cmd);
+  install_element (CONFIG_NODE, &no_vtysh_log_facility_cmd);
   install_element (CONFIG_NODE, &vtysh_log_record_priority_cmd);
   install_element (CONFIG_NODE, &no_vtysh_log_record_priority_cmd);
 
index c38b47de2c5142664b85cc4e6e17ca6e025b8724..d22ba6308fe1a255ae397bb4e7de479c6cb9297b 100644 (file)
@@ -1,3 +1,10 @@
+2004-12-07 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
+       * main.c: (main) The 2nd argument to openzlog has been removed.
+         So stdout logging will no longer be enabled by default.
+       * irdp_main.c: (irdp_finish) Reduce severity of shutdown message
+         from LOG_WARNING to LOG_INFO.
+
 2004-12-03 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
        * main.c: (sigint) Use zlog_notice for termination message.
index 8f0250bf7de224833dc07a2c7ad5e33341ae0e77..10062db5e271f2251aeb558b6080b5859bc5cdd6 100644 (file)
@@ -322,7 +322,7 @@ void irdp_finish()
   struct zebra_if *zi;
   struct irdp_interface *irdp;
 
-  zlog_warn("IRDP: Received shutdown notification.");
+  zlog_info("IRDP: Received shutdown notification.");
   
   for (node = listhead (iflist); node; node = nextnode (node))
     {
index 96420da6759867ce8e03a62eb260cff93871cba0..019e8d20f8806178b18a2c4a63661e3fed3c4489 100644 (file)
@@ -224,7 +224,7 @@ main (int argc, char **argv)
   /* preserve my name */
   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
 
-  zlog_default = openzlog (progname, ZLOG_STDOUT, ZLOG_ZEBRA,
+  zlog_default = openzlog (progname, ZLOG_ZEBRA,
                           LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
 
   while (1)