/* * (c) 2000 venglin / buffer0verfl0w security (www.b0f.com) * * syslogd-to-MySQL wrapper v0.1 prebeta (FreeBSD) * * 1. compile it: cc -O6 -Wall -pipe -m486 -L/usr/local/lib/mysql \ * -I/usr/local/include -o /usr/local/sbin/sqlsyslogd \ * sqlsyslogd.c -lmysqlclient * * 2. create table in some database: * CREATE TABLE logs ( * id int(10) DEFAULT '0' NOT NULL auto_increment, * timestamp varchar(16), * host varchar(255), * prog varchar(255), * mesg text, * PRIMARY KEY (id) * ); * * 3. put mysql password into /etc/sqlsyslogd.conf * * 4. add "*.* |/usr/local/sbin/sqlsyslogd [params]" * to /etc/syslog.conf and rehash syslogd. * * $Log: sqlsyslogd.c,v $ * Revision 1.4 2000/04/19 08:55:13 venglin * Small changes. * * Revision 1.3 2000/04/19 08:50:05 venglin * Fixes. * * Revision 1.2 2000/04/18 19:53:40 venglin * Fixes * * Revision 1.1 2000/04/18 19:51:25 venglin * Initial revision * */ #include #include #include #include #include #include #define BUFSIZE 1024 #define CONF "/etc/sqlsyslogd.conf" #define CR 13 #define LF 10 MYSQL db; static char rcsid[] = "$Id: sqlsyslogd.c,v 1.4 2000/04/19 08:55:13 venglin Exp $"; void usage(av0) char *av0; { fprintf(stderr, "usage: %s [-h hostname] <-u username> [-p]" " <-t table> [database]\n\n", av0); exit(0); } void cleanup(x) int x; { mysql_close(&db); exit(0); } char *password(void) { FILE *fp; static char passwd[BUFSIZE/16]; char *p; if ((fp=fopen(CONF, "r")) == NULL) return NULL; fgets(passwd, sizeof(passwd), fp); if (p = index(passwd, CR)) *p = '\0'; if (p = index(passwd, LF)) *p = '\0'; return passwd; } int main(argc, argv) int argc; char **argv; { extern char *optarg; extern int optind; int ch; char buf[BUFSIZE], querybuf[BUFSIZE+100]; char *loghost, *host, *user, *passwd, *av0, *table, *logprog, *logmesg; av0 = argv[0]; loghost = host = user = passwd = table = logprog = logmesg = NULL; while ((ch = getopt(argc, argv, "h:u:pt:")) != -1) switch((char)ch) { case 'h': host = optarg; break; case 'u': user = optarg; break; case 'p': passwd = password(); break; case 't': table = optarg; break; case '?': default: (void)usage(av0); } argc -= optind; argv += optind; if (!user || !table) (void)usage(av0); if (argc < 1) (void)usage(av0); mysql_init(&db); if (!mysql_real_connect(&db, host, user, passwd, *argv, 0, NULL, 0)) { fprintf(stderr, "failed to connect to database: %s\n", mysql_error(&db)); exit(1); } signal(SIGHUP, cleanup); signal(SIGINT, cleanup); signal(SIGQUIT, cleanup); signal(SIGTERM, cleanup); signal(SIGSEGV, cleanup); signal(SIGBUS, cleanup); while(fgets(buf, sizeof(buf), stdin)) { if (strlen(buf) > 18) { loghost = strtok(buf + 16, " "); logprog = strtok(NULL, ":"); logmesg = buf + 16 + strlen(loghost) + strlen(logprog) + 3; if (loghost && logprog && logmesg) { snprintf(querybuf, sizeof(querybuf), "INSERT INTO %s (timestamp, host, " "prog, mesg) VALUES ('%.15s', '%s', " "'%s', '%s')", table, buf, loghost, logprog, logmesg); if (mysql_query(&db, querybuf)) fprintf(stderr, "failed to run " "query: %s\n", mysql_error(&db)); } } } mysql_close(&db); exit(0); }