Project

General

Profile

Bug #7 » 0001-Fixing-alert-unified-log-file-rotation.-Adding-unitt.patch

Pablo Rincon, 11/12/2009 04:02 PM

View differences:

src/alert-debuglog.c
printf("ERROR: failed to open %s: %s\n", log_path, strerror(errno));
return -1;
}
if(file_ctx->config_file == NULL)
file_ctx->config_file = strdup("configfile.ad");
/** Remember the config file (or NULL if not indicated) */
}
return ret;
src/alert-fastlog.c
printf("ERROR: failed to open %s: %s\n", log_path, strerror(errno));
return -1;
}
if(file_ctx->config_file == NULL)
file_ctx->config_file = strdup("config.af");
/** Remember the config file (or NULL if not indicated) */
}
return 0;
src/alert-unified-alert.c
TmEcode AlertUnifiedAlertThreadInit(ThreadVars *, void *, void **);
TmEcode AlertUnifiedAlertThreadDeinit(ThreadVars *, void *);
int AlertUnifiedAlertOpenFileCtx(LogFileCtx *, char *);
void AlertUnifiedAlertRegisterTests (void);
void TmModuleAlertUnifiedAlertRegister (void) {
tmm_modules[TMM_ALERTUNIFIEDALERT].name = "AlertUnifiedAlert";
tmm_modules[TMM_ALERTUNIFIEDALERT].ThreadInit = AlertUnifiedAlertThreadInit;
tmm_modules[TMM_ALERTUNIFIEDALERT].Func = AlertUnifiedAlert;
tmm_modules[TMM_ALERTUNIFIEDALERT].ThreadDeinit = AlertUnifiedAlertThreadDeinit;
tmm_modules[TMM_ALERTUNIFIEDALERT].RegisterTests = NULL;
tmm_modules[TMM_ALERTUNIFIEDALERT].RegisterTests = AlertUnifiedAlertRegisterTests;
}
typedef struct AlertUnifiedAlertThread_ {
......
}
int AlertUnifiedAlertCloseFile(ThreadVars *t, AlertUnifiedAlertThread *aun) {
if (aun->file_ctx->fp != NULL)
if (aun->file_ctx->fp != NULL) {
fclose(aun->file_ctx->fp);
if (aun->file_ctx->filename != NULL) {
free(aun->file_ctx->filename);
aun->file_ctx->filename = NULL;
}
}
return 0;
}
......
}
/** Use the Ouptut Context (file pointer and mutex) */
aun->file_ctx = (LogFileCtx*) initdata;
aun->size_limit = 30;
/** Write Unified header */
int ret = AlertUnifiedAlertWriteFileHeader(t, aun);
......
* */
LogFileCtx *AlertUnifiedAlertInitCtx(char *config_file)
{
int ret=0;
LogFileCtx* file_ctx=LogFileNewCtx();
int ret = 0;
LogFileCtx *file_ctx = LogFileNewCtx();
if(file_ctx == NULL)
{
if (file_ctx == NULL) {
printf("AlertUnifiedAlertInitCtx: Couldn't create new file_ctx\n");
return NULL;
}
/** fill the new LogFileCtx with the specific AlertUnifiedAlert configuration */
ret=AlertUnifiedAlertOpenFileCtx(file_ctx, config_file);
ret = AlertUnifiedAlertOpenFileCtx(file_ctx, config_file);
if(ret < 0)
if (ret < 0)
return NULL;
/** In AlertUnifiedAlertOpenFileCtx the second parameter should be the configuration file to use
* but it's not implemented yet, so passing NULL to load the default
* configuration
/** In AlertUnifiedAlertOpenFileCtx the second parameter should be
* the configuration file to use but it's not implemented yet, so
* passing NULL to load the default configuration
*/
return file_ctx;
......
* */
int AlertUnifiedAlertOpenFileCtx(LogFileCtx *file_ctx, char *config_file)
{
char filename[PATH_MAX]; /* XXX some sane default? */
char *filename = malloc(PATH_MAX); /* XXX some sane default? */
if(config_file == NULL)
{
if (config_file == NULL) {
/** Separate config files not implemented at the moment,
* but it must be able to load from separate config file.
* Load the default configuration.
......
char *log_dir;
if (ConfGet("default-log-dir", &log_dir) != 1)
log_dir = DEFAULT_LOG_DIR;
snprintf(filename, sizeof(filename), "%s/%s.%" PRIu32, log_dir, "unified.alert", (uint32_t)ts.tv_sec);
snprintf(filename, PATH_MAX, "%s/%s.%" PRIu32, log_dir, "unified.alert", (uint32_t)ts.tv_sec);
/* XXX filename & location */
file_ctx->fp = fopen(filename, "wb");
......
printf("Error: fopen %s failed: %s\n", filename, strerror(errno)); /* XXX errno threadsafety? */
return -1;
}
if(file_ctx->config_file == NULL)
file_ctx->config_file = strdup("configfile.aua");
/** Remember the config file (or NULL if not indicated) */
file_ctx->filename = filename;
}
return 0;
}
#ifdef UNITTESTS
/**
* \test Test the Rotate process
*
* \retval 1 on succces
* \retval 0 on failure
*/
static int AlertUnifiedAlertTestRotate01(void)
{
int ret = 0;
int r = 0;
ThreadVars tv;
LogFileCtx *lf;
void *data = NULL;
lf = AlertUnifiedAlertInitCtx(NULL);
char *filename = strdup(lf->filename);
memset(&tv, 0, sizeof(ThreadVars));
if (lf == NULL)
return 0;
ret = AlertUnifiedAlertThreadInit(&tv, lf, &data);
if (ret == TM_ECODE_FAILED) {
LogFileFreeCtx(lf);
return 0;
}
sleep(1);
ret = AlertUnifiedAlertRotateFile(&tv, data);
if (ret == -1)
goto error;
if (strcmp(filename, lf->filename) == 0)
goto error;
r = 1;
error:
AlertUnifiedAlertThreadDeinit(&tv, data);
if (lf != NULL) LogFileFreeCtx(lf);
if (filename != NULL) free(filename);
return r;
}
#endif /* UNITTESTS */
/**
* \brief this function registers unit tests for Unified2
*/
void AlertUnifiedAlertRegisterTests (void) {
#ifdef UNITTESTS
UtRegisterTest("UnifiedAlertTestRotate01 -- Rotate File",
AlertUnifiedAlertTestRotate01, 1);
#endif /* UNITTESTS */
}
src/alert-unified-log.c
TmEcode AlertUnifiedLogThreadInit(ThreadVars *, void *, void **);
TmEcode AlertUnifiedLogThreadDeinit(ThreadVars *, void *);
int AlertUnifiedLogOpenFileCtx(LogFileCtx *, char *);
void AlertUnifiedLogRegisterTests(void);
void TmModuleAlertUnifiedLogRegister (void) {
tmm_modules[TMM_ALERTUNIFIEDLOG].name = "AlertUnifiedLog";
tmm_modules[TMM_ALERTUNIFIEDLOG].ThreadInit = AlertUnifiedLogThreadInit;
tmm_modules[TMM_ALERTUNIFIEDLOG].Func = AlertUnifiedLog;
tmm_modules[TMM_ALERTUNIFIEDLOG].ThreadDeinit = AlertUnifiedLogThreadDeinit;
tmm_modules[TMM_ALERTUNIFIEDLOG].RegisterTests = NULL;
tmm_modules[TMM_ALERTUNIFIEDLOG].RegisterTests = AlertUnifiedLogRegisterTests;
}
typedef struct AlertUnifiedLogThread_ {
......
}
int AlertUnifiedLogCloseFile(ThreadVars *t, AlertUnifiedLogThread *aun) {
if (aun->file_ctx->fp != NULL)
if (aun->file_ctx->fp != NULL) {
fclose(aun->file_ctx->fp);
if (aun->file_ctx->filename != NULL) {
free(aun->file_ctx->filename);
aun->file_ctx->filename = NULL;
}
}
return 0;
}
......
* */
int AlertUnifiedLogOpenFileCtx(LogFileCtx *file_ctx, char *config_file)
{
char filename[PATH_MAX]; /* XXX some sane default? */
char *filename = malloc(PATH_MAX); /* XXX some sane default? */
if(config_file == NULL)
{
......
char *log_dir;
if (ConfGet("default-log-dir", &log_dir) != 1)
log_dir = DEFAULT_LOG_DIR;
snprintf(filename, sizeof(filename), "%s/%s.%" PRIu32, log_dir, "unified.log", (uint32_t)ts.tv_sec);
snprintf(filename, PATH_MAX, "%s/%s.%" PRIu32, log_dir, "unified.log", (uint32_t)ts.tv_sec);
/* XXX filename & location */
file_ctx->fp = fopen(filename, "wb");
......
printf("Error: fopen %s failed: %s\n", filename, strerror(errno)); /* XXX errno threadsafety? */
return -1;
}
file_ctx->filename = filename;
}
return 0;
}
#ifdef UNITTESTS
/**
* \test Test the Rotate process
*
* \retval 1 on succces
* \retval 0 on failure
*/
static int AlertUnifiedLogTestRotate01(void)
{
int ret = 0;
int r = 0;
ThreadVars tv;
LogFileCtx *lf;
void *data = NULL;
if(file_ctx->config_file == NULL)
file_ctx->config_file = strdup("configfile.aul");
/** Remember the config file (or NULL if not indicated) */
lf = AlertUnifiedLogInitCtx(NULL);
char *filename = strdup(lf->filename);
memset(&tv, 0, sizeof(ThreadVars));
if (lf == NULL)
return 0;
ret = AlertUnifiedLogThreadInit(&tv, lf, &data);
if (ret == TM_ECODE_FAILED) {
LogFileFreeCtx(lf);
return 0;
}
return 0;
sleep(1);
ret = AlertUnifiedLogRotateFile(&tv, data);
if (ret == -1)
goto error;
if (strcmp(filename, lf->filename) == 0)
goto error;
r = 1;
error:
AlertUnifiedLogThreadDeinit(&tv, data);
if (lf != NULL) LogFileFreeCtx(lf);
if (filename != NULL) free(filename);
return r;
}
#endif /* UNITTESTS */
/**
* \brief this function registers unit tests for Unified2
*/
void AlertUnifiedLogRegisterTests (void) {
#ifdef UNITTESTS
UtRegisterTest("UnifiedAlertTestRotate01 -- Rotate File",
AlertUnifiedLogTestRotate01, 1);
#endif /* UNITTESTS */
}
src/alert-unified2-alert.c
*/
int Unified2AlertCloseFile(ThreadVars *t, Unified2AlertThread *aun) {
if (aun->file_ctx->fp != NULL)
if (aun->file_ctx->fp != NULL) {
fclose(aun->file_ctx->fp);
if (aun->file_ctx->filename != NULL) {
free(aun->file_ctx->filename);
aun->file_ctx->filename = NULL;
}
}
return 0;
}
......
* */
int Unified2AlertOpenFileCtx(LogFileCtx *file_ctx, char *config_file)
{
char filename[PATH_MAX]; /* XXX some sane default? */
char *filename = malloc(PATH_MAX); /* XXX some sane default? */
if(config_file == NULL)
{
if (config_file == NULL) {
/** Separate config files not implemented at the moment,
* but it must be able to load from separate config file.
* Load the default configuration.
......
* This is used both during init and runtime, so it must be thread
* safe. */
struct timeval ts;
memset (&ts, 0, sizeof(struct timeval));
memset(&ts, 0, sizeof(struct timeval));
gettimeofday(&ts, NULL);
/* create the filename to use */
char *log_dir;
if (ConfGet("default-log-dir", &log_dir) != 1)
log_dir = DEFAULT_LOG_DIR;
snprintf(filename, sizeof(filename), "%s/%s.%" PRIu32, log_dir, "unified2.alert", (uint32_t)ts.tv_sec);
snprintf(filename, PATH_MAX, "%s/%s.%" PRIu32, log_dir, "unified2.alert", (uint32_t)ts.tv_sec);
/* XXX filename & location */
file_ctx->fp = fopen(filename, "wb");
......
printf("Error: fopen %s failed: %s\n", filename, strerror(errno)); /* XXX errno threadsafety? */
return -1;
}
if(file_ctx->config_file == NULL)
file_ctx->config_file = strdup("configfile.au2a");
/** Remember the config file (or NULL if not indicated) */
file_ctx->filename = filename;
}
return 0;
......
return 1;
}
/**
* \test Test the Rotate process
*
* \retval 1 on succces
* \retval 0 on failure
*/
static int Unified2TestRotate01(void)
{
int ret = 0;
int r = 0;
ThreadVars tv;
LogFileCtx *lf;
void *data = NULL;
lf = Unified2AlertInitCtx(NULL);
char *filename = strdup(lf->filename);
memset(&tv, 0, sizeof(ThreadVars));
if (lf == NULL)
return 0;
ret = Unified2AlertThreadInit(&tv, lf, &data);
if (ret == TM_ECODE_FAILED) {
LogFileFreeCtx(lf);
return 0;
}
sleep(1);
ret = Unified2AlertRotateFile(&tv, data);
if (ret == -1)
goto error;
if (strcmp(filename, lf->filename) == 0)
goto error;
r = 1;
error:
Unified2AlertThreadDeinit(&tv, data);
if (lf != NULL) LogFileFreeCtx(lf);
if (filename != NULL) free(filename);
return r;
}
#endif
/**
* \brief this function registers unit tests for Unified2
*/
void Unified2RegisterTests (void) {
#ifdef UNITTESTS
UtRegisterTest("Unified2Test01 -- Ipv4 test", Unified2Test01, 1);
......
UtRegisterTest("Unified2Test03 -- GRE test", Unified2Test03, 1);
UtRegisterTest("Unified2Test04 -- PPP test", Unified2Test04, 1);
UtRegisterTest("Unified2Test05 -- Inline test", Unified2Test05, 1);
UtRegisterTest("Unified2TestRotate01 -- Rotate File", Unified2TestRotate01, 1);
#endif /* UNITTESTS */
}
(1-1/2)