diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-05-26 19:48:17 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-05-26 19:48:17 +0000 |
commit | 25f8c236a419b3afed194e4f2067cba96ffdc3a3 (patch) | |
tree | 3acc5d1eb4bfcc4c9e20f880d286e146afe1551c | |
parent | 9e3edfdd277b77aeddd0987940e7a6e1f3c211bc (diff) |
Add ability to disable log / verbose output to remote consoles (issue #6524 reported by mavetju)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@30603 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | asterisk.c | 65 | ||||
-rw-r--r-- | cli.c | 14 | ||||
-rw-r--r-- | include/asterisk/logger.h | 3 | ||||
-rw-r--r-- | logger.c | 4 |
4 files changed, 80 insertions, 6 deletions
diff --git a/asterisk.c b/asterisk.c index 2ab474ed8..203e18560 100644 --- a/asterisk.c +++ b/asterisk.c @@ -160,6 +160,7 @@ struct ast_flags ast_options = { AST_DEFAULT_OPTIONS }; int option_verbose = 0; /*!< Verbosity level */ int option_debug = 0; /*!< Debug level */ +int option_mute = 0; /*!< Mute console */ double option_maxload = 0.0; /*!< Max load avg on system */ int option_maxcalls = 0; /*!< Max number of active calls */ @@ -176,6 +177,7 @@ struct console { int fd; /*!< File descriptor */ int p[2]; /*!< Pipe */ pthread_t t; /*!< Thread of handler */ + int mute; /*!< Is the console muted for logs */ }; struct ast_atexit { @@ -681,6 +683,51 @@ int ast_safe_system(const char *s) } /*! + * mute or unmute a console from logging + */ +void ast_console_mute(int fd) { + int x; + for (x=0;x<AST_MAX_CONNECTS; x++) { + if (fd == consoles[x].fd) { + if (consoles[x].mute) { + consoles[x].mute=0; + ast_cli(fd, "Console is not muted anymore.\n"); + } else { + consoles[x].mute=1; + ast_cli(fd, "Console is muted.\n"); + } + return; + } + } + ast_cli(fd, "Couldn't find remote console.\n"); +} + +/*! + * log the string to all attached console clients + */ +static void ast_network_puts_mutable(const char *string) +{ + int x; + for (x=0;x < AST_MAX_CONNECTS; x++) { + if (consoles[x].mute) + continue;; + if (consoles[x].fd > -1) + fdprint(consoles[x].p[1], string); + } +} + +/*! + * log the string to the console, and all attached + * console clients + */ +void ast_console_puts_mutable(const char *string) +{ + fputs(string, stdout); + fflush(stdout); + ast_network_puts_mutable(string); +} + +/*! * write the string to all attached console clients */ static void ast_network_puts(const char *string) @@ -711,14 +758,14 @@ static void network_verboser(const char *s, int pos, int replace, int complete) if ((t = alloca(strlen(s) + 2))) { sprintf(t, "\r%s", s); if (complete) - ast_network_puts(t); + ast_network_puts_mutable(t); } else { ast_log(LOG_ERROR, "Out of memory\n"); - ast_network_puts(s); + ast_network_puts_mutable(s); } } else { if (complete) - ast_network_puts(s); + ast_network_puts_mutable(s); } } @@ -819,6 +866,7 @@ static void *listener(void *unused) flags = fcntl(consoles[x].p[1], F_GETFL); fcntl(consoles[x].p[1], F_SETFL, flags | O_NONBLOCK); consoles[x].fd = s; + consoles[x].mute = 0; if (ast_pthread_create(&consoles[x].t, &attr, netconsole, &consoles[x])) { ast_log(LOG_ERROR, "Unable to spawn thread to handle connection: %s\n", strerror(errno)); close(consoles[x].p[0]); @@ -2025,6 +2073,10 @@ static void ast_remotecontrol(char * data) fdprint(ast_consock, tmp); snprintf(tmp, sizeof(tmp), "set debug atleast %d", option_debug); fdprint(ast_consock, tmp); + if (option_mute) { + snprintf(tmp, sizeof(tmp), "logger mute"); + fdprint(ast_consock, tmp); + } ast_verbose("Connected to Asterisk %s currently running on %s (pid = %d)\n", version, hostname, pid); remotehostname = hostname; if (getenv("HOME")) @@ -2093,6 +2145,7 @@ static int show_cli_help(void) { printf(" -I Enable internal timing if Zaptel timer is available\n"); printf(" -L <load> Limit the maximum load average before rejecting new calls\n"); printf(" -M <value> Limit the maximum number of calls to the specified value\n"); + printf(" -m Mute the console from debugging and verbose output\n"); printf(" -n Disable console colorization\n"); printf(" -p Run as pseudo-realtime thread\n"); printf(" -q Quiet mode (suppress output)\n"); @@ -2311,7 +2364,7 @@ int main(int argc, char *argv[]) if (getenv("HOME")) snprintf(filename, sizeof(filename), "%s/.asterisk_history", getenv("HOME")); /* Check for options */ - while ((c = getopt(argc, argv, "tThfdvVqprRgciInx:U:G:C:L:M:")) != -1) { + while ((c = getopt(argc, argv, "mtThfdvVqprRgciInx:U:G:C:L:M:")) != -1) { switch (c) { case 'F': ast_set_flag(&ast_options, AST_OPT_FLAG_ALWAYS_FORK); @@ -2342,6 +2395,10 @@ int main(int argc, char *argv[]) option_verbose++; ast_set_flag(&ast_options, AST_OPT_FLAG_NO_FORK); break; + case 'm': + option_mute++; + ast_set_flag(&ast_options, AST_OPT_FLAG_NO_FORK); + break; case 'M': if ((sscanf(optarg, "%d", &option_maxcalls) != 1) || (option_maxcalls < 0)) option_maxcalls = 0; @@ -114,6 +114,11 @@ static char set_debug_help[] = " no messages should be displayed. Equivalent to -d[d[d...]]\n" " on startup.\n"; +static char logger_mute_help[] = +"Usage: logger mute\n" +" Disables logging output to the current console, making it possible to\n" +" gather information without being disturbed by scrolling lines.\n"; + static char softhangup_help[] = "Usage: soft hangup <channel>\n" " Request that a channel be hung up. The hangup takes effect\n" @@ -213,6 +218,14 @@ static int handle_set_debug(int fd, int argc, char *argv[]) return RESULT_SUCCESS; } +static int handle_logger_mute(int fd, int argc, char *argv[]) +{ + if (argc != 2) + return RESULT_SHOWUSAGE; + ast_console_mute(fd); + return RESULT_SUCCESS; +} + static int handle_unload(int fd, int argc, char *argv[]) { int x; @@ -919,6 +932,7 @@ static struct ast_cli_entry builtins[] = { { { "reload", NULL }, handle_reload, "Reload configuration", reload_help, complete_mod_2 }, { { "set", "debug", NULL }, handle_set_debug, "Set level of debug chattiness", set_debug_help }, { { "set", "verbose", NULL }, handle_set_verbose, "Set level of verboseness", set_verbose_help }, + { { "logger", "mute", NULL }, handle_logger_mute, "Disable logging output to a console", logger_mute_help }, { { "show", "channel", NULL }, handle_showchan, "Display information on a specific channel", showchan_help, complete_ch_3 }, { { "show", "channels", NULL }, handle_chanlist, "Display information on channels", chanlist_help, complete_show_channels }, { { "show", "modules", NULL }, handle_modlist, "List modules and info", modlist_help }, diff --git a/include/asterisk/logger.h b/include/asterisk/logger.h index 2543e7949..9d00fba30 100644 --- a/include/asterisk/logger.h +++ b/include/asterisk/logger.h @@ -82,6 +82,9 @@ int ast_unregister_verbose(void (*verboser)(const char *string, int opos, int re int ast_verbose_dmesg(void (*verboser)(const char *string, int opos, int replacelast, int complete)); void ast_console_puts(const char *string); +extern void ast_console_puts_mutable(const char *string); +extern void ast_console_mute(int fd); + #define _A_ __FILE__, __LINE__, __PRETTY_FUNCTION__ #ifdef LOG_DEBUG @@ -756,11 +756,11 @@ void ast_log(int level, const char *file, int line, const char *function, const term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)), term_color(tmp4, function, COLOR_BRWHITE, 0, sizeof(tmp4))); - ast_console_puts(buf); + ast_console_puts_mutable(buf); va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); - ast_console_puts(buf); + ast_console_puts_mutable(buf); } /* File channels */ } else if ((chan->logmask & (1 << level)) && (chan->fileptr)) { |