From b90f8af4fb0b2a8ce60014144e47fdbb0922e34d Mon Sep 17 00:00:00 2001 From: Deepti Kulkarni <deepti@vyatta.com> Date: Tue, 13 Dec 2011 02:49:29 -0800 Subject: Bug fix 7397 - Conntrack log creation and deletion. --- src/vyatta-conntrack-logging.c | 254 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 src/vyatta-conntrack-logging.c (limited to 'src/vyatta-conntrack-logging.c') diff --git a/src/vyatta-conntrack-logging.c b/src/vyatta-conntrack-logging.c new file mode 100644 index 0000000..27f426b --- /dev/null +++ b/src/vyatta-conntrack-logging.c @@ -0,0 +1,254 @@ +/* +UNIX Daemon Server program for monitoring conntrack logging +processes. +Usage: ./vyatta-conntrack-logging + -p <proto-name> -e <events> [-s <proto-state>] +*/ + +#include <stdio.h> +#include <fcntl.h> +#include <signal.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <error.h> +#include <syslog.h> + + +#define RUNNING_DIR "/var/run/vyatta" +#define LOCK_FILE "connlogd.lock" +#define MAX_PROCESS 17 + +// Global variables +pid_t pids[MAX_PROCESS]; +char *cmds[MAX_PROCESS]; +long int nbuffer[MAX_PROCESS]; +int pcounter=0; +long int netlink_buffer_size = 2097152; +long int netlink_buffer_maxsize= 8388608; + +// Initialise the nbuffer to 2MB +void init_nbuffer() +{ + int i; + for (i=0;i<MAX_PROCESS;i++) { + nbuffer[i]=netlink_buffer_size; + } + return; +} + +// Function to write to syslog + +void sys_logger(char *message) +{ + openlog("log-conntrack", "LOG_PID", LOG_USER); + syslog(LOG_INFO, message); + closelog(); +} + +//Signal handler for SIGHUP and SIGTERM +void signal_handler(sig) +{ + switch(sig) { + case SIGHUP: + sys_logger("Stopping conntrack logging daemon"); + int i; + for(i=0;i<pcounter;i++) { + kill(pids[i], SIGKILL); + } + exit(0); + break; + case SIGTERM: + exit(0); + break; + } +} + +//Create child process to start conntrack logger +void start_child(char *cmd, int index) +{ + pid_t pid; + int west; + int ret; + + pid=fork(); + if (pid<0) { + perror("Conntrack logging error:"); + exit(1); /* fork error */ + } + if (pid==0) { + pids[index]=getpid(); + ret=system(cmd); + if (WIFSIGNALED(ret) && + (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT)) { + exit(0); + } + else { + exit(0); + } + } + else { + pids[index]=pid; + } +} + +//Daemonize the process to run in the background +void daemonize() +{ + int p,i,fptr; + char str[10]; + + p=fork(); + if (p<0) { + perror("Conntrack logging error:"); + exit(1); + } + if (p>0) { + exit(0); + } + /* child (daemon) continues */ + setsid(); + for (i=getdtablesize();i>=0;--i) + close(i); + i=open("/dev/null",O_RDWR); dup(i); dup(i); + umask(027); + chdir(RUNNING_DIR); + fptr=open(LOCK_FILE,O_RDWR|O_CREAT,0640); + if (fptr<0) + exit(1); + if (lockf(fptr,F_TLOCK,0)<0) + exit(0); + sprintf(str,"%d\n",getpid()); + write(fptr,str,strlen(str)); + + signal(SIGHUP,signal_handler); + signal(SIGTERM,signal_handler); +} + +int main(int argc, char *argv[]) +{ + FILE *logfile; + int other=0; + int i, pid; + char *conn="conntrack -E"; + char *logger="logger -t log-conntrack -p daemon.notice"; + char *fother="grep -vE 'tcp|udp|icmp'"; + char cmd[1024]; + char cmd_to_run[1024]; + int length = 0; + char * temp_cmd = cmd; + + for (i=1; i<argc; i++) { + switch(argv[i][1]) { + case 'p': + if (i+1 < argc && argv[i+1][0] != '-') { + if (strncmp(argv[i+1], "other", + strlen(argv[i+1])) == 0) { + other=1; + snprintf(cmd, sizeof (cmd), "%s", conn); + length = strlen (cmd); + temp_cmd = cmd + length; + i++; + } else if ((strncmp(argv[i+1], "tcp", + strlen(argv[i+1])) == 0) || + (strncmp(argv[i+1], "udp", + strlen(argv[i+1])) == 0) || + (strncmp(argv[i+1], "icmp", + strlen(argv[i+1])) == 0)) { + snprintf(cmd, sizeof (cmd), "%s%s%s", conn, " -p ", argv[i+1]); + other=0; + length = strlen (cmd); + temp_cmd = cmd + length; + i++; + } + } + break; + case 'e': + if (i+1 < argc && argv[i+1][0] != '-') { + if ((strncmp(argv[i+1], "NEW", + strlen(argv[i+1])) == 0) || + (strncmp(argv[i+1], "UPDATES", + strlen(argv[i+1])) == 0) || + (strncmp(argv[i+1], "DESTROY", + strlen(argv[i+1])) == 0)) { + if (other == 1) { + snprintf(temp_cmd, sizeof (cmd) - length, "%s%s%s%s%s%s%s%s", " -e ", + argv[i+1], " -o id", " -b %d", " | ", fother, " | ", logger); + cmds[pcounter] = malloc(strlen+1); + strcpy(cmds[pcounter],cmd); + pcounter++; + } else if ((strncmp(argv[i-1], "tcp",strlen(argv[i-1]))==0) && + (strncmp(argv[i+1], "UPDATES",strlen(argv[i+1])) == 0)){ + snprintf(temp_cmd, sizeof (cmd) - length, "%s%s", " -e ", argv[i+1]); + } else { + snprintf(temp_cmd, sizeof (cmd) - length, "%s%s%s%s%s%s", " -e ", + argv[i+1], " -o id", " -b %d", " | ", logger); + cmds[pcounter] = malloc(strlen+1); + strcpy(cmds[pcounter],cmd); + pcounter++; + } + length = strlen (cmd); + temp_cmd = cmd + length; + i++; + } + } + break; + case 's': + if (i+1 < argc && argv[i+1][0] != '-') { + if ((strncmp(argv[i+1], "SYN_RECV", + strlen(argv[i+1])) == 0) || + (strncmp(argv[i+1], "ESTABLISHED", + strlen(argv[i+1])) == 0) || + (strncmp(argv[i+1], "FIN_WAIT", + strlen(argv[i+1])) == 0) || + (strncmp(argv[i+1], "CLOSE_WAIT", + strlen(argv[i+1])) == 0) || + (strncmp(argv[i+1], "LAST_ACK", + strlen(argv[i+1])) == 0) || + (strncmp(argv[i+1], "TIME_WAIT", + strlen(argv[i+1])) == 0)) { + snprintf(temp_cmd, sizeof (cmd) - length, "%s%s%s%s%s%s", " --state ", + argv[i+1], " -o id", " -b %d", " | ", logger); + cmds[pcounter] = malloc(strlen+1); + strcpy(cmds[pcounter],cmd); + pcounter++; + length = strlen (cmd); + temp_cmd = cmd + length; + i++; + } + } + break; + } + } + // Daemonize the connlog process. + sys_logger("Starting conntrack logging daemon"); + daemonize(); + + // Call to init_nbuffer + init_nbuffer(); + + //Start the conntrack logging processes + for(i=0;i<pcounter;i++) { + sprintf(cmd_to_run, cmds[i], nbuffer[i]); + start_child(cmd_to_run,i); + } + pid_t dead_child; + int status; + while(dead_child=wait(&status)) { + for(i=0;i<pcounter;i++) { + if (pids[i]==dead_child) { + nbuffer[i] += netlink_buffer_size; + if (nbuffer[i] <= netlink_buffer_maxsize) { + sprintf(cmd_to_run, cmds[i], nbuffer[i]); + } else { + nbuffer[i] -= netlink_buffer_size; + sprintf(cmd_to_run, cmds[i], nbuffer[i]); + } + sys_logger("Restarting conntrack logging process"); + start_child(cmd_to_run,i); + } + } + } +} + +/* EOF */ -- cgit v1.2.3 From 135649553b958477e957155c4bae3b8a35474c3d Mon Sep 17 00:00:00 2001 From: Deepti Kulkarni <deepti@vyatta.com> Date: Tue, 13 Dec 2011 14:26:57 -0800 Subject: Add messages to syslog on daemon start, stop or crash. --- src/vyatta-conntrack-logging.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) (limited to 'src/vyatta-conntrack-logging.c') diff --git a/src/vyatta-conntrack-logging.c b/src/vyatta-conntrack-logging.c index 27f426b..d31e598 100644 --- a/src/vyatta-conntrack-logging.c +++ b/src/vyatta-conntrack-logging.c @@ -37,21 +37,14 @@ void init_nbuffer() return; } -// Function to write to syslog - -void sys_logger(char *message) -{ - openlog("log-conntrack", "LOG_PID", LOG_USER); - syslog(LOG_INFO, message); - closelog(); -} - //Signal handler for SIGHUP and SIGTERM void signal_handler(sig) { switch(sig) { case SIGHUP: - sys_logger("Stopping conntrack logging daemon"); + openlog("log-conntrack", LOG_PID, LOG_USER); + syslog(LOG_ALERT,"STOPPING CONNTRACK DAEMON"); + closelog(); int i; for(i=0;i<pcounter;i++) { kill(pids[i], SIGKILL); @@ -78,6 +71,9 @@ void start_child(char *cmd, int index) } if (pid==0) { pids[index]=getpid(); + openlog("log-conntrack", LOG_PID, LOG_USER); + syslog(LOG_ALERT, "STARTED PROCESS: %s", cmd); + closelog(); ret=system(cmd); if (WIFSIGNALED(ret) && (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT)) { @@ -107,6 +103,9 @@ void daemonize() exit(0); } /* child (daemon) continues */ + openlog("log-conntrack", LOG_PID, LOG_USER); + syslog(LOG_ALERT,"STARTING CONNTRACK DAEMON"); + closelog(); setsid(); for (i=getdtablesize();i>=0;--i) close(i); @@ -221,7 +220,6 @@ int main(int argc, char *argv[]) } } // Daemonize the connlog process. - sys_logger("Starting conntrack logging daemon"); daemonize(); // Call to init_nbuffer @@ -237,6 +235,9 @@ int main(int argc, char *argv[]) while(dead_child=wait(&status)) { for(i=0;i<pcounter;i++) { if (pids[i]==dead_child) { + sprintf(cmd_to_run, cmds[i], nbuffer[i]); + openlog("log-conntrack", LOG_PID, LOG_USER); + syslog(LOG_ALERT, "PROCESS EXITED: %s ", cmd_to_run); nbuffer[i] += netlink_buffer_size; if (nbuffer[i] <= netlink_buffer_maxsize) { sprintf(cmd_to_run, cmds[i], nbuffer[i]); @@ -244,7 +245,8 @@ int main(int argc, char *argv[]) nbuffer[i] -= netlink_buffer_size; sprintf(cmd_to_run, cmds[i], nbuffer[i]); } - sys_logger("Restarting conntrack logging process"); + syslog(LOG_ALERT,"RESTARTING PROCESS (Increase netlink buffer to %d bytes)", nbuffer[i]); + closelog(); start_child(cmd_to_run,i); } } -- cgit v1.2.3