エラ〜(警告!!)が出たので・・・
src の中にある
logtail.c を編集しました。
[root@sub logcheck-1.1.1]# ls
CHANGES INSTALL Makefile README.how.to.interpret
src
CREDITS LICENSE README README.keywords systems
[root@sub logcheck-1.1.1]# cd
src
[root@sub src]# ls
logtail
logtail.c
[root@sub src]# vi logtail.c
/* ------------------------------------------------------------------*/
/* logtail.c -- ASCII file tail program that
remembers last position.*/
/* */
/* Author: */
/* Craig H. Rowland <crowland@psionic.com>
15-JAN-96 */
/* <crowland@vni.net> */
/* */
/* Please send me any hacks/bug fixes you
make to the code. All */
/* comments are welcome! */
/* */
/* Idea for program based upon the retail
utility featured in the */
/* Gauntlet(tm) firewall protection package
published by Trusted */
/* Information Systems Inc. <info@tis.com>
*/
/* */
/* This program will read in a standard text
file and create an */
/* offset marker when it reads the end. The
offset marker is read */
/* the next time logtail is run and the text
file pointer is moved */
/* to the offset location. This allows logtail
to read in the next */
/* lines of data following the marker. This
is good for marking log */
/* files for automatic log file checkers
to monitor system events. */
/* */
/* This program covered by the GNU License.
This program is free to */
/* use as long as the above copyright notices
are left intact. This */
/* program has no warranty of any kind. */
/* */
/* VERSION 1.1: Initial release */
/* */
/* 1.11: Minor typo fix. Fixed NULL comparison.
*/
/* ------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#define MAX 1024 /* buffer */
#define MAX_PATH 255 /* increase this size
if you need a longer path */
#define VERSION "1.11"
/* Prototypes */
void usage(void);
int check_log(char *logname, char *offset_filename);
void main(int argc, char *argv[]) ←
void main を int mainに書き換えて保存。
{
int status=1; /* Set status flag to error
*/
char offset_filename[MAX];
/* Check args */
if((argc < 2) || (argc > 3))
{
usage();
exit(EX_USAGE);
}
/* Do sanity check on all user supplied data
*/
if ((strlen(argv[1])) > MAX_PATH - 8)
/* longer than MAX_PATH characters? */
{
printf("Input filename %s is too long.\n",argv[1]);
exit(EX_DATAERR);
}
if (argc == 3) /* check user supplied alternate
filename */
{
if ((strlen(argv[2])) > MAX_PATH - 8 )
/* longer than MAX_PATH characters? */
{
printf("Input filename %s is too long.\n",argv[1]);
exit(EX_DATAERR);
}
strcpy(offset_filename,argv[2]);
}
else /* If no alternate filename given, make
our own */
{
strcpy(offset_filename,argv[1]);
strcat(offset_filename,".offset");
}
status=check_log(argv[1], offset_filename);
/* check the logs */
if(status == 0)
exit(EX_OK);
else if(status == 1)
exit(EX_SOFTWARE);
else if(status == 2)
exit(EX_NOINPUT);
else if(status == 3)
exit(EX_DATAERR);
else if(status == 4)
exit(EX_CANTCREAT);
else
{
printf("An unknown error has occurred\n\n");
exit(EX_SOFTWARE);
}
}
int check_log(char *logname, char *offset_filename)
{
FILE *input, /* Value user supplies for input
file */
*offset_output; /* name of the offset output
file */
struct stat file_stat;
char inode_buffer[MAX], /* Inode temp storage
*/
offset_buffer[MAX], /* Offset temp storage
*/
buffer[MAX]; /* I/O Buffer */
long offset_position; /* position in the
file to offset */
/* Check if the file exists in specified
directory */
/* Open as a binary in case the user reads
in non-text files */
if((input=fopen(logname, "rb"))
== NULL)
{
printf("File %s cannot be read.\n",logname);
return(2);
}
/* see if we can open an existing offset
file and read in the inode */
/* and offset */
if((offset_output=fopen(offset_filename,
"rb")) != NULL)
{ /* read in the saved inode number */
if((fgets(buffer,MAX,offset_output)) !=NULL)
/* nested if()...yuch */
strcpy(inode_buffer,buffer); /* copy in inode
*/
/* read in the saved decimal offset */
if((fgets(buffer,MAX,offset_output)) !=NULL)
/* nested if()...yuch */
strcpy(offset_buffer,buffer); /* copy in
offset */
fclose(offset_output); /* We're done, clean
up */
}
else /* can't read the file? then assume
no offset file exists */
{
strcpy(inode_buffer,"0"); /* this
inode will be set later */
offset_position=0L; /* if the file doesn't
exist, assume */
/* offset of 0 because we've never */
/* tailed it before */
}
if((stat(logname,&file_stat)) != 0) /*
load struct */
{
printf("Cannot get %s file size.\n",logname);
return(3);
}
/* if the current file inode is the same,
but the file size has */
/* grown SMALLER than the last time we checked,
then something */
/* suspicous has happened (log file edited)
and we'll report it */
if(((atol(inode_buffer)) == (file_stat.st_ino))
&& (atol(offset_buffer) > (file_stat.st_size)))
{
offset_position=0L; /* reset offset and report
everything */
printf("***************\n");
printf("*** WARNING ***: Log file %s
is smaller than last time checked!\n",logname);
printf("*************** This could indicate
tampering.\n");
}
/* if the current file inode or size is different
than that in the */
/* offset file then assume it has been rotated
and set offset to zero */
if(((atol(inode_buffer)) != (file_stat.st_ino))
|| (atol(offset_buffer) > (file_stat.st_size)))
offset_position=0L;
else /* If the file inode is the same as
old inode set the new offset */
offset_position=atol(offset_buffer); /*get
value and convert */
#ifdef DEBUG
printf("inodebuf: %s offsetbuf: %s offsetpos:
%ld\n",inode_buffer,offset_buffer,offset_position);
#endif
fseek(input, offset_position, 0); /* set
the input file stream to */
/* the offset position */
/* Print the file */
while ((fgets(buffer,MAX,input)) !=NULL)
printf("%s",buffer);
/* after we are done we need to write the
new offset */
if((offset_output=fopen(offset_filename,
"w")) == NULL)
{
printf("File %s cannot be created. Check
your permissions.\n",offset_filename);
fclose(input);
fclose(offset_output);
return(4);
}
else
{
if ((chmod(offset_filename,00600)) != 0)
/* Don't let anyone read offset */
{
printf("Cannot set permissions on file
%s\n",offset_filename);
return(3);
}
else
{
offset_position=ftell(input); /* set new
offset */
fprintf(offset_output,"%ld\n%ld",(long)file_stat.st_ino,offset_position);
/* write it */
}
}
fclose(input); /* clean up */
fclose(offset_output);
return(0); /* everything A-OK */
}
/* Tell them how to use this */
void usage(void)
{
printf("\nlogtail: version %s \n\n",VERSION);
printf("Written by Craig H. Rowland
<crowland@psionic.com>\n");
printf("Based upon original utility:
retail (c)Trusted Information Systems\n");
printf("This program is covered by the
GNU license.\n");
printf("\nUsage: logtail [LOG_FILE]
<offset_file>\n");
printf("\nlogtail will read in a file
and output to stdout.\n\n");
printf("After outputing the file, logtail
will create a file called\n");
printf("[LOG_FILE].offset in the same
directory that will contain the\n");
printf("decimal offset and inode of
the file in ASCII format. \n\n");
printf("Next time logtail is run on
FILE the offset file is read and\n");
printf("output begins at the saved offset.\n\n");
printf("Rotated log files will be automatically
accounted for by having\n");
printf("the offset reset to zero.\n\n");
printf("The optional <offset_file>
parameter can be used to specify your\n");
printf("own name for the offset file.
\n\n");
}
------------------------------------------------------------------------------
もう一度 make linux してみます(*^^)v
[root@sub logcheck-1.1.1]# make
linux
make install SYSTYPE=linux
make[1]: 入ります ディレクトリ `/usr/local/src/logcheck-1.1.1'
Making linux
cc -O -o ./src/logtail ./src/logtail.c
Creating temp directory /usr/local/etc/tmp
Setting temp directory permissions
chmod 700 /usr/local/etc/tmp
Copying files
cp ./systems/linux/logcheck.hacking /usr/local/etc
cp ./systems/linux/logcheck.violations /usr/local/etc
cp ./systems/linux/logcheck.violations.ignore
/usr/local/etc
cp ./systems/linux/logcheck.ignore /usr/local/etc
cp ./systems/linux/logcheck.sh /usr/local/etc
cp ./src/logtail /usr/local/bin
Setting permissions
chmod 700 /usr/local/etc/logcheck.sh
chmod 700 /usr/local/bin/logtail
chmod 600 /usr/local/etc/logcheck.violations.ignore
chmod 600 /usr/local/etc/logcheck.violations
chmod 600 /usr/local/etc/logcheck.hacking
chmod 600 /usr/local/etc/logcheck.ignore
Done. Don't forget to set your crontab.
make[1]: 出ます ディレクトリ
`/usr/local/src/logcheck-1.1.1'
おぉっ!! 今度は 大丈夫ね♪