diff options
-rw-r--r-- | bgpd/ChangeLog | 4 | ||||
-rw-r--r-- | bgpd/bgp_main.c | 2 | ||||
-rw-r--r-- | doc/ChangeLog | 5 | ||||
-rw-r--r-- | doc/basic.texi | 141 | ||||
-rw-r--r-- | doc/quagga.info | 513 | ||||
-rw-r--r-- | isisd/ChangeLog | 4 | ||||
-rw-r--r-- | isisd/isis_main.c | 2 | ||||
-rw-r--r-- | lib/ChangeLog | 69 | ||||
-rw-r--r-- | lib/command.c | 636 | ||||
-rw-r--r-- | lib/command.h | 29 | ||||
-rw-r--r-- | lib/log.c | 167 | ||||
-rw-r--r-- | lib/log.h | 82 | ||||
-rw-r--r-- | lib/vty.c | 36 | ||||
-rw-r--r-- | lib/vty.h | 6 | ||||
-rw-r--r-- | ospf6d/ChangeLog | 6 | ||||
-rw-r--r-- | ospf6d/ospf6_main.c | 8 | ||||
-rw-r--r-- | ospfd/ChangeLog | 4 | ||||
-rw-r--r-- | ospfd/ospf_main.c | 2 | ||||
-rw-r--r-- | ripd/ChangeLog | 4 | ||||
-rw-r--r-- | ripd/rip_main.c | 2 | ||||
-rw-r--r-- | ripngd/ChangeLog | 4 | ||||
-rw-r--r-- | ripngd/ripng_main.c | 2 | ||||
-rw-r--r-- | vtysh/ChangeLog | 6 | ||||
-rw-r--r-- | vtysh/vtysh.c | 175 | ||||
-rw-r--r-- | zebra/ChangeLog | 7 | ||||
-rw-r--r-- | zebra/irdp_main.c | 2 | ||||
-rw-r--r-- | zebra/main.c | 2 |
27 files changed, 1291 insertions, 629 deletions
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog index c76627b6..705d76f9 100644 --- a/bgpd/ChangeLog +++ b/bgpd/ChangeLog @@ -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. diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c index ee498b0c..6de0a8a0 100644 --- a/bgpd/bgp_main.c +++ b/bgpd/bgp_main.c @@ -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. */ diff --git a/doc/ChangeLog b/doc/ChangeLog index 6afe5a3d..0327be2b 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -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 diff --git a/doc/basic.texi b/doc/basic.texi index ab976445..cbbdea49 100644 --- a/doc/basic.texi +++ b/doc/basic.texi @@ -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 diff --git a/doc/quagga.info b/doc/quagga.info index b2db6d9a..c6045838 100644 --- a/doc/quagga.info +++ b/doc/quagga.info @@ -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 -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. @@ -841,9 +880,46 @@ normal character. So in the above example '!' will not be regarded as a comment and the password is set to 'zebra!password'. +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. + + 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. 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. 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. 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: 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. 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. 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. 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. 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. 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. 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) File: quagga.info, Node: VTY Key Index, Prev: Command Index, Up: Top @@ -5912,138 +6018,139 @@ Ref: Linux notes-Footnote-121476 Node: Build the Software21542 Node: Install the Software22090 Node: Basic commands23550 -Node: Config Commands24264 -Node: Basic Config Commands25126 -Node: Sample Config File27530 -Node: Common Invocation Options28300 -Node: Virtual Terminal Interfaces29707 -Node: VTY Overview30218 -Node: VTY Modes31469 -Node: VTY View Mode31919 -Node: VTY Enable Mode32169 -Node: VTY Other Modes32447 -Node: VTY CLI Commands32623 -Node: CLI Movement Commands33083 -Node: CLI Editing Commands33606 -Node: CLI Advanced Commands34194 -Node: Zebra34960 -Node: Invoking zebra35469 -Node: Interface Commands36048 -Node: Static Route Commands37580 -Node: zebra Terminal Mode Commands40853 -Node: RIP41818 -Node: Starting and Stopping ripd42755 -Node: RIP netmask44168 -Node: RIP Configuration45267 -Node: How to Announce RIP route49532 -Node: Filtering RIP Routes52095 -Node: RIP Metric Manipulation53562 -Node: RIP distance54475 -Node: RIP route-map55290 -Node: RIP Authentication57806 -Node: RIP Timers58913 -Node: Show RIP Information60199 -Node: RIP Debug Commands61572 -Node: RIPng62568 -Node: Invoking ripngd62888 -Node: ripngd Configuration63137 -Node: ripngd Terminal Mode Commands63888 -Node: ripngd Filtering Commands64252 -Node: OSPFv264761 -Node: Configuring ospfd65320 -Node: OSPF router65788 -Node: OSPF area68944 -Node: OSPF interface74126 -Node: Redistribute routes to OSPF77509 -Node: Showing OSPF information79672 -Node: Debugging OSPF80918 -Node: OSPFv381957 -Node: OSPF6 router82277 -Node: OSPF6 area82631 -Node: OSPF6 interface82809 -Node: Redistribute routes to OSPF683686 -Node: Showing OSPF6 information84002 -Node: BGP84822 -Node: Starting BGP85712 -Node: BGP router86289 -Node: BGP distance87533 -Node: BGP decision process87971 -Node: BGP network88241 -Node: BGP route88431 -Node: Route Aggregation88987 -Node: Redistribute to BGP89556 -Node: BGP Peer90083 -Node: Defining Peer90270 -Node: BGP Peer commands90883 -Node: Peer filtering93287 -Node: BGP Peer Group93795 -Node: BGP Address Family94108 -Node: Autonomous System94262 -Node: AS Path Regular Expression95099 -Node: Display BGP Routes by AS Path96346 -Node: AS Path Access List96786 -Node: Using AS Path in Route Map97253 -Node: Private AS Numbers97534 -Node: BGP Communities Attribute97692 -Node: BGP Community Lists100159 -Node: Numbered BGP Community Lists102813 -Node: BGP Community in Route Map104400 -Node: Display BGP Routes by Community106343 -Node: Using BGP Communities Attribute107512 -Node: BGP Extended Communities Attribute111080 -Node: BGP Extended Community Lists112852 -Node: BGP Extended Communities in Route Map114727 -Node: Displaying BGP routes115186 -Node: Show IP BGP115423 -Node: More Show IP BGP116123 -Node: Capability Negotiation117274 -Node: Route Reflector120578 -Node: Route Server120857 -Node: Multiple instance121923 -Node: BGP instance and view123734 -Node: Routing policy125114 -Node: Viewing the view125882 -Node: How to set up a 6-Bone connection126167 -Node: Dump BGP packets and table127539 -Node: Configuring Quagga as a Route Server128086 -Node: Description of the Route Server model129047 -Ref: fig:normal-processing130624 -Ref: fig:full-mesh130774 -Ref: fig:route-server130870 -Ref: filter-delegation131284 -Ref: Route Server tasks132468 -Ref: Route-server path filter process132839 -Ref: fig:rs-processing135153 -Node: Commands for configuring a Route Server135270 -Node: Example of Route Server Configuration138297 -Node: Configuration of the BGP routers without Route Server139218 -Node: Configuration of the BGP routers with Route Server142101 -Node: Configuration of the Route Server itself143402 -Node: Further considerations about Import and Export route-maps148401 -Node: VTY shell151445 -Node: VTY shell username152114 -Node: VTY shell integrated configuration152746 -Node: Filtering154124 -Node: IP Access List154477 -Node: IP Prefix List154863 -Node: ip prefix-list description157882 -Node: ip prefix-list sequential number control158409 -Node: Showing ip prefix-list158951 -Node: Clear counter of ip prefix-list160059 -Node: Route Map160498 -Node: Route Map Command161003 -Node: Route Map Match Command161200 -Node: Route Map Set Command161824 -Node: IPv6 Support162701 -Node: Router Advertisement163273 -Node: Kernel Interface167074 -Node: SNMP Support169031 -Node: Getting and installing an SNMP agent169603 -Node: SMUX configuration170176 -Node: MIB and command reference172312 -Node: Zebra Protocol173699 -Node: Packet Binary Dump Format175613 -Node: Command Index187223 -Node: VTY Key Index241352 +Node: Config Commands24325 +Node: Basic Config Commands25218 +Node: Sample Config File30316 +Node: Terminal Mode Commands31086 +Node: Common Invocation Options32183 +Node: Virtual Terminal Interfaces33590 +Node: VTY Overview34101 +Node: VTY Modes35352 +Node: VTY View Mode35802 +Node: VTY Enable Mode36052 +Node: VTY Other Modes36330 +Node: VTY CLI Commands36506 +Node: CLI Movement Commands36966 +Node: CLI Editing Commands37489 +Node: CLI Advanced Commands38077 +Node: Zebra38843 +Node: Invoking zebra39352 +Node: Interface Commands39931 +Node: Static Route Commands41463 +Node: zebra Terminal Mode Commands44736 +Node: RIP45701 +Node: Starting and Stopping ripd46638 +Node: RIP netmask48051 +Node: RIP Configuration49150 +Node: How to Announce RIP route53415 +Node: Filtering RIP Routes55978 +Node: RIP Metric Manipulation57445 +Node: RIP distance58358 +Node: RIP route-map59173 +Node: RIP Authentication61689 +Node: RIP Timers62796 +Node: Show RIP Information64082 +Node: RIP Debug Commands65455 +Node: RIPng66451 +Node: Invoking ripngd66771 +Node: ripngd Configuration67020 +Node: ripngd Terminal Mode Commands67771 +Node: ripngd Filtering Commands68135 +Node: OSPFv268644 +Node: Configuring ospfd69203 +Node: OSPF router69671 +Node: OSPF area72827 +Node: OSPF interface78009 +Node: Redistribute routes to OSPF81392 +Node: Showing OSPF information83555 +Node: Debugging OSPF84801 +Node: OSPFv385840 +Node: OSPF6 router86160 +Node: OSPF6 area86514 +Node: OSPF6 interface86692 +Node: Redistribute routes to OSPF687569 +Node: Showing OSPF6 information87885 +Node: BGP88705 +Node: Starting BGP89595 +Node: BGP router90172 +Node: BGP distance91416 +Node: BGP decision process91854 +Node: BGP network92124 +Node: BGP route92314 +Node: Route Aggregation92870 +Node: Redistribute to BGP93439 +Node: BGP Peer93966 +Node: Defining Peer94153 +Node: BGP Peer commands94766 +Node: Peer filtering97170 +Node: BGP Peer Group97678 +Node: BGP Address Family97991 +Node: Autonomous System98145 +Node: AS Path Regular Expression98982 +Node: Display BGP Routes by AS Path100229 +Node: AS Path Access List100669 +Node: Using AS Path in Route Map101136 +Node: Private AS Numbers101417 +Node: BGP Communities Attribute101575 +Node: BGP Community Lists104042 +Node: Numbered BGP Community Lists106696 +Node: BGP Community in Route Map108283 +Node: Display BGP Routes by Community110226 +Node: Using BGP Communities Attribute111395 +Node: BGP Extended Communities Attribute114963 +Node: BGP Extended Community Lists116735 +Node: BGP Extended Communities in Route Map118610 +Node: Displaying BGP routes119069 +Node: Show IP BGP119306 +Node: More Show IP BGP120006 +Node: Capability Negotiation121157 +Node: Route Reflector124461 +Node: Route Server124740 +Node: Multiple instance125806 +Node: BGP instance and view127617 +Node: Routing policy128997 +Node: Viewing the view129765 +Node: How to set up a 6-Bone connection130050 +Node: Dump BGP packets and table131422 +Node: Configuring Quagga as a Route Server131969 +Node: Description of the Route Server model132930 +Ref: fig:normal-processing134507 +Ref: fig:full-mesh134657 +Ref: fig:route-server134753 +Ref: filter-delegation135167 +Ref: Route Server tasks136351 +Ref: Route-server path filter process136722 +Ref: fig:rs-processing139036 +Node: Commands for configuring a Route Server139153 +Node: Example of Route Server Configuration142180 +Node: Configuration of the BGP routers without Route Server143101 +Node: Configuration of the BGP routers with Route Server145984 +Node: Configuration of the Route Server itself147285 +Node: Further considerations about Import and Export route-maps152284 +Node: VTY shell155328 +Node: VTY shell username155997 +Node: VTY shell integrated configuration156629 +Node: Filtering158007 +Node: IP Access List158360 +Node: IP Prefix List158746 +Node: ip prefix-list description161765 +Node: ip prefix-list sequential number control162292 +Node: Showing ip prefix-list162834 +Node: Clear counter of ip prefix-list163942 +Node: Route Map164381 +Node: Route Map Command164886 +Node: Route Map Match Command165083 +Node: Route Map Set Command165707 +Node: IPv6 Support166584 +Node: Router Advertisement167156 +Node: Kernel Interface170957 +Node: SNMP Support172914 +Node: Getting and installing an SNMP agent173486 +Node: SMUX configuration174059 +Node: MIB and command reference176195 +Node: Zebra Protocol177582 +Node: Packet Binary Dump Format179496 +Node: Command Index191106 +Node: VTY Key Index247299 End Tag Table diff --git a/isisd/ChangeLog b/isisd/ChangeLog index e241d54d..32905516 100644 --- a/isisd/ChangeLog +++ b/isisd/ChangeLog @@ -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. diff --git a/isisd/isis_main.c b/isisd/isis_main.c index 9aa487a7..027e47b4 100644 --- a/isisd/isis_main.c +++ b/isisd/isis_main.c @@ -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 */ diff --git a/lib/ChangeLog b/lib/ChangeLog index 79062cae..986c67aa 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -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 diff --git a/lib/command.c b/lib/command.c index 99036d17..18829672 100644 --- a/lib/command.c +++ b/lib/command.c @@ -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); diff --git a/lib/command.h b/lib/command.h index 52cfded9..c8699e10 100644 --- a/lib/command.h +++ b/lib/command.h @@ -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 *); @@ -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(); } /* 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; @@ -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. @@ -40,12 +43,6 @@ * 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 */ @@ -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) { @@ -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 */ diff --git a/ospf6d/ChangeLog b/ospf6d/ChangeLog index 7bb6b4bf..a3e8c949 100644 --- a/ospf6d/ChangeLog +++ b/ospf6d/ChangeLog @@ -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 diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c index ba266d95..073e9d68 100644 --- a/ospf6d/ospf6_main.c +++ b/ospf6d/ospf6_main.c @@ -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); diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog index 9d5b1fb8..33c790ad 100644 --- a/ospfd/ChangeLog +++ b/ospfd/ChangeLog @@ -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 diff --git a/ospfd/ospf_main.c b/ospfd/ospf_main.c index d155c980..7955162d 100644 --- a/ospfd/ospf_main.c +++ b/ospfd/ospf_main.c @@ -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. */ diff --git a/ripd/ChangeLog b/ripd/ChangeLog index 1c703dfa..46b7f193 100644 --- a/ripd/ChangeLog +++ b/ripd/ChangeLog @@ -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. diff --git a/ripd/rip_main.c b/ripd/rip_main.c index 2b2939dd..ba60b36f 100644 --- a/ripd/rip_main.c +++ b/ripd/rip_main.c @@ -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. */ diff --git a/ripngd/ChangeLog b/ripngd/ChangeLog index 840f4130..a6682567 100644 --- a/ripngd/ChangeLog +++ b/ripngd/ChangeLog @@ -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. diff --git a/ripngd/ripng_main.c b/ripngd/ripng_main.c index ac63abbb..ea30c1bf 100644 --- a/ripngd/ripng_main.c +++ b/ripngd/ripng_main.c @@ -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) diff --git a/vtysh/ChangeLog b/vtysh/ChangeLog index ea611179..5e32f015 100644 --- a/vtysh/ChangeLog +++ b/vtysh/ChangeLog @@ -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 diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index 08bd1275..0a043cf9 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -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; } @@ -1293,6 +1308,18 @@ DEFUNSH (VTYSH_ALL, } 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, "no log file [FILENAME]", @@ -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); diff --git a/zebra/ChangeLog b/zebra/ChangeLog index c38b47de..d22ba630 100644 --- a/zebra/ChangeLog +++ b/zebra/ChangeLog @@ -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. diff --git a/zebra/irdp_main.c b/zebra/irdp_main.c index 8f0250bf..10062db5 100644 --- a/zebra/irdp_main.c +++ b/zebra/irdp_main.c @@ -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)) { diff --git a/zebra/main.c b/zebra/main.c index 96420da6..019e8d20 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -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) |