diff --git a/asterisk.h b/asterisk.h index ea3a9a7f2d07f238ae470dfb5791c865aacb4c34..d221f2f9050cc046548f2b31e03fe8d4bb604602 100755 --- a/asterisk.h +++ b/asterisk.h @@ -43,7 +43,7 @@ extern int init_logger(void); /* Provided by frame.c */ extern int init_framer(void); /* Provided by logger.c */ -extern int reload_logger(void); +extern int reload_logger(int); /* Provided by term.c */ extern int term_init(void); /* Provided by db.c */ diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 0e8f66cedf5bf6d355595185275ca60f5af4eda4..bfbe4e3296981d1ae31afa7c7863a4e86ad23b6e 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -5057,6 +5057,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc ast_queue_frame(p->owner, &af, 0); } else if (sipdebug) ast_verbose("Ignoring this request\n"); + strncpy(p->our_contact, get_header(req, "Contact"), sizeof(p->our_contact) - 1); if (!p->lastinvite) { /* Handle authentication if this is our first invite */ res = check_user(p, req, cmd, e, 1, sin); @@ -5276,6 +5277,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc } else if (sipdebug) ast_verbose("Ignoring this request\n"); + strncpy(p->our_contact, get_header(req, "Contact"), sizeof(p->our_contact) - 1); if (!p->lastinvite) { /* Handle authentication if this is our first subscribe */ res = check_user(p, req, cmd, e, 0, sin); diff --git a/configs/logger.conf.sample b/configs/logger.conf.sample index 0b03e67f2ebca25f121364fb8ca07e473106cda4..7d7e73afa064582edef41d0ac92bb7266b33f1a6 100755 --- a/configs/logger.conf.sample +++ b/configs/logger.conf.sample @@ -15,3 +15,11 @@ console => notice,warning,error ;console => notice,warning,error,debug messages => notice,warning,error + +;syslog keyword : This special keyword logs to syslog facility +;local0 edit /etc/syslog.conf and add +;local0.* /var/log/myastlog +; +;syslog => notice,warning,error + + diff --git a/logger.c b/logger.c index 7fa4dec3105b7319495b14141c8332fd0fa48c7c..bcd29e851d5e8511f15ca2b2b16309eba6a8714f 100755 --- a/logger.c +++ b/logger.c @@ -11,6 +11,7 @@ * */ +#include <signal.h> #include <stdarg.h> #include <stdio.h> #include <unistd.h> @@ -27,6 +28,7 @@ #include <errno.h> #include <pthread.h> #include <sys/stat.h> +#include <syslog.h> #include "asterisk.h" #include "astconf.h" @@ -44,6 +46,7 @@ struct logfile { char fn[256]; int logflags; FILE *f; + int facility; /* syslog */ struct logfile *next; }; @@ -69,6 +72,8 @@ static int colors[] = { COLOR_RED }; + + static int make_components(char *s, int lineno) { char *w; @@ -109,6 +114,9 @@ static struct logfile *make_logfile(char *fn, char *components, int lineno) f->f = NULL; } else if (!strcasecmp(fn, "console")) { f->f = stdout; + } else if (!strcasecmp(fn, "syslog")) { + f->f = NULL; + f->facility = LOG_LOCAL0; } else { if (fn[0] == '/') strncpy(tmp, fn, sizeof(tmp) - 1); @@ -174,14 +182,73 @@ static void init_logger_chain(void) } -int reload_logger(void) +int reload_logger(int rotate) { + char old[AST_CONFIG_MAX_PATH]; char tmp[AST_CONFIG_MAX_PATH]; + char new[AST_CONFIG_MAX_PATH]; + struct logfile *f; + + int x; + ast_mutex_lock(&loglock); - if (eventlog) - fclose(eventlog); + if (eventlog) + fclose(eventlog); + else + rotate = 0; + + + mkdir((char *)ast_config_AST_LOG_DIR, 0755); - snprintf(tmp, sizeof(tmp), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG); + snprintf(old, sizeof(old), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG); + + for(x=0;;x++) { + snprintf(new, sizeof(new), "%s/%s.%d", (char *)ast_config_AST_LOG_DIR, EVENTLOG,x); + eventlog = fopen((char *)new, "r"); + if(eventlog) + fclose(eventlog); + else + break; + } + + if(rotate) { + /* do it */ + if(! link(old,new)) + unlink(old); + strcpy(tmp,old); + } + + + f = logfiles; + while(f) { + if (f->f && (f->f != stdout) && (f->f != stderr)) { + fclose(f->f); + snprintf(old, sizeof(old), "%s/%s", (char *)ast_config_AST_LOG_DIR,f->fn); + + for(x=0;;x++) { + snprintf(new, sizeof(new), "%s/%s.%d", (char *)ast_config_AST_LOG_DIR,f->fn,x); + eventlog = fopen((char *)new, "r"); + if(eventlog) + fclose(eventlog); + else + break; + } + + if(rotate) { + /* do it */ + if(! link(old,new)) + unlink(old); + f->f = fopen((char *)old, "a"); + } + + + } + + + f = f->next; + } + + eventlog = fopen((char *)tmp, "a"); ast_mutex_unlock(&loglock); @@ -199,7 +266,25 @@ int reload_logger(void) static int handle_logger_reload(int fd, int argc, char *argv[]) { - if(reload_logger()) + if(reload_logger(0)) + { + ast_cli(fd, "Failed to reloadthe logger\n"); + return RESULT_FAILURE; + } + else + return RESULT_SUCCESS; +} + + + + + + + + +static int handle_logger_rotate(int fd, int argc, char *argv[]) +{ + if(reload_logger(1)) { ast_cli(fd, "Failed to reloadthe logger\n"); return RESULT_FAILURE; @@ -218,18 +303,46 @@ static char logger_reload_help[] = "Usage: logger reload\n" " Reopens the log files. Use after a rotating the log files\n"; + +static char logger_rotate_help[] = +"Usage: logger reload\n" +" Rotates and Reopens the log files.\n"; + + static struct ast_cli_entry reload_logger_cli = { { "logger", "reload", NULL }, handle_logger_reload, "Reopens the log files", logger_reload_help }; +static struct ast_cli_entry rotate_logger_cli = + { { "logger", "rotate", NULL }, + handle_logger_rotate, "Reopens the log files", + logger_rotate_help }; + + + +static int handle_SIGXFSZ(int sig) { + reload_logger(1); + ast_log(LOG_EVENT,"Rotated Logs Per SIGXFSZ\n"); + if (option_verbose) + ast_verbose("Rotated Logs Per SIGXFSZ\n"); + + return 0; +} + int init_logger(void) { char tmp[AST_CONFIG_MAX_PATH]; + + + /* auto rotate if sig SIGXFSZ comes a-knockin */ + (void) signal(SIGXFSZ,(void *) handle_SIGXFSZ); + /* register the relaod logger cli command */ ast_cli_register(&reload_logger_cli); + ast_cli_register(&rotate_logger_cli); mkdir((char *)ast_config_AST_LOG_DIR, 0755); snprintf(tmp, sizeof(tmp), "%s/%s", (char *)ast_config_AST_LOG_DIR, EVENTLOG); @@ -283,7 +396,18 @@ extern void ast_log(int level, const char *file, int line, const char *function, if (logfiles) { f = logfiles; while(f) { - if (f->logflags & (1 << level) && f->f) { + if (f->logflags & (1 << level) && f->facility) { + time(&t); + localtime_r(&t,&tm); + strftime(date, sizeof(date), "%b %e %T", &tm); + + openlog("asterisk_pbx",LOG_PID,f->facility); + syslog(LOG_INFO|f->facility,"%s %s[%ld]: File %s, Line %d (%s): ",date, + levels[level], (long)pthread_self(), file, line, function); + closelog(); + + } + else if (f->logflags & (1 << level) && f->f) { if ((f->f != stdout) && (f->f != stderr)) { time(&t); localtime_r(&t,&tm); @@ -355,7 +479,7 @@ extern void ast_verbose(const char *fmt, ...) last = m; } else { msgcnt--; - ast_log(LOG_DEBUG, "Out of memory\n"); + ast_log(LOG_ERROR, "Out of memory\n"); free(m); } }