2005-10-18 07:21:59 +04:00
2005-10-14 20:07:00 +04:00
/*
* Samba Unix / Linux SMB client utility
2005-10-17 19:53:12 +04:00
* Write Eventlog records to a tdb , perform other eventlog related functions
*
2005-10-14 20:07:00 +04:00
*
* Copyright ( C ) Brian Moran 2005.
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2007-07-09 23:25:36 +04:00
* the Free Software Foundation ; either version 3 of the License , or
2005-10-14 20:07:00 +04:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2007-07-10 09:23:25 +04:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2005-10-14 20:07:00 +04:00
*/
# include "includes.h"
# undef DBGC_CLASS
# define DBGC_CLASS DBGC_UTIL_EVENTLOG
extern int optind ;
extern char * optarg ;
int opt_debug = 0 ;
static void usage ( char * s )
{
2005-10-18 07:21:59 +04:00
printf ( " \n Usage: %s [OPTION] \n \n " , s ) ;
printf ( " -o write <Eventlog Name> \t \t \t \t \t Writes records to eventlog from STDIN \n " ) ;
printf ( " -o addsource <EventlogName> <sourcename> <msgfileDLLname> \t Adds the specified source & DLL eventlog registry entry \n " ) ;
printf ( " \n Miscellaneous options: \n " ) ;
printf ( " -d \t \t \t \t \t \t \t \t turn debug on \n " ) ;
printf ( " -h \t \t \t \t \t \t \t \t display help \n \n " ) ;
2005-10-14 20:07:00 +04:00
}
static void display_eventlog_names ( void )
{
const char * * elogs ;
int i ;
elogs = lp_eventlog_list ( ) ;
printf ( " Active eventlog names (from smb.conf): \n " ) ;
printf ( " -------------------------------------- \n " ) ;
2005-12-15 21:39:28 +03:00
if ( elogs ) {
for ( i = 0 ; elogs [ i ] ; i + + ) {
printf ( " \t %s \n " , elogs [ i ] ) ;
}
}
else
printf ( " \t <None specified> \n " ) ;
2005-10-14 20:07:00 +04:00
}
2007-10-19 04:40:25 +04:00
static int DoAddSourceCommand ( int argc , char * * argv , bool debugflag , char * exename )
2005-10-14 20:07:00 +04:00
{
2005-10-18 07:21:59 +04:00
if ( argc < 3 ) {
printf ( " need more arguments: \n " ) ;
2005-10-20 18:29:24 +04:00
printf ( " -o addsource EventlogName SourceName /path/to/EventMessageFile.dll \n " ) ;
2005-10-18 07:21:59 +04:00
return - 1 ;
2005-10-14 20:07:00 +04:00
}
2005-10-18 07:21:59 +04:00
/* must open the registry before we access it */
if ( ! regdb_init ( ) ) {
printf ( " Can't open the registry. \n " ) ;
return - 1 ;
2005-10-14 20:07:00 +04:00
}
2005-10-18 07:21:59 +04:00
if ( ! eventlog_add_source ( argv [ 0 ] , argv [ 1 ] , argv [ 2 ] ) )
return - 2 ;
return 0 ;
}
2007-10-19 04:40:25 +04:00
static int DoWriteCommand ( int argc , char * * argv , bool debugflag , char * exename )
2005-10-18 07:21:59 +04:00
{
FILE * f1 ;
char * argfname ;
2005-11-18 00:07:24 +03:00
ELOG_TDB * etdb ;
2005-10-14 20:07:00 +04:00
2005-10-18 07:21:59 +04:00
/* fixed constants are bad bad bad */
2007-12-05 03:56:18 +03:00
char linein [ 1024 ] ;
2007-10-19 04:40:25 +04:00
bool is_eor ;
2005-10-18 07:21:59 +04:00
Eventlog_entry ee ;
2006-06-29 01:56:03 +04:00
int rcnum ;
2005-10-14 20:07:00 +04:00
f1 = stdin ;
if ( ! f1 ) {
printf ( " Can't open STDIN \n " ) ;
return - 1 ;
}
2005-10-18 07:21:59 +04:00
if ( debugflag ) {
printf ( " Starting write for eventlog [%s] \n " , argv [ 0 ] ) ;
2005-10-14 20:07:00 +04:00
display_eventlog_names ( ) ;
}
argfname = argv [ 0 ] ;
2005-11-18 00:07:24 +03:00
if ( ! ( etdb = elog_open_tdb ( argfname , False ) ) ) {
2005-10-18 07:21:59 +04:00
printf ( " can't open the eventlog TDB (%s) \n " , argfname ) ;
2005-10-14 20:07:00 +04:00
return - 1 ;
}
ZERO_STRUCT ( ee ) ; /* MUST initialize between records */
while ( ! feof ( f1 ) ) {
fgets ( linein , sizeof ( linein ) - 1 , f1 ) ;
linein [ strlen ( linein ) - 1 ] = 0 ; /* whack the line delimiter */
2005-10-18 07:21:59 +04:00
if ( debugflag )
2005-10-14 20:07:00 +04:00
printf ( " Read line [%s] \n " , linein ) ;
is_eor = False ;
2005-10-18 07:21:59 +04:00
2006-06-29 01:56:03 +04:00
parse_logentry ( ( char * ) & linein , & ee , & is_eor ) ;
2005-10-18 07:21:59 +04:00
/* should we do something with the return code? */
2005-10-14 20:07:00 +04:00
if ( is_eor ) {
fixup_eventlog_entry ( & ee ) ;
if ( opt_debug )
2005-10-18 07:21:59 +04:00
printf ( " record number [%d], tg [%d] , tw [%d] \n " , ee . record . record_number , ee . record . time_generated , ee . record . time_written ) ;
2005-10-14 20:07:00 +04:00
if ( ee . record . time_generated ! = 0 ) {
/* printf("Writing to the event log\n"); */
2005-11-18 00:07:24 +03:00
rcnum = write_eventlog_tdb ( ELOG_TDB_CTX ( etdb ) , & ee ) ;
2005-10-14 20:07:00 +04:00
if ( ! rcnum ) {
printf ( " Can't write to the event log \n " ) ;
} else {
if ( opt_debug )
printf ( " Wrote record %d \n " ,
rcnum ) ;
}
} else {
if ( opt_debug )
printf ( " <null record> \n " ) ;
}
ZERO_STRUCT ( ee ) ; /* MUST initialize between records */
}
}
2005-11-18 00:07:24 +03:00
elog_close_tdb ( etdb , False ) ;
2005-10-14 20:07:00 +04:00
return 0 ;
}
2005-10-18 07:21:59 +04:00
/* would be nice to use the popT stuff here, however doing so forces us to drag in a lot of other infrastructure */
int main ( int argc , char * argv [ ] )
{
int opt , rc ;
char * exename ;
2007-11-23 16:34:13 +03:00
TALLOC_CTX * frame = talloc_stackframe ( ) ;
2005-10-18 07:21:59 +04:00
fstring opname ;
2005-12-29 01:48:54 +03:00
load_case_tables ( ) ;
2005-10-18 07:21:59 +04:00
opt_debug = 0 ; /* todo set this from getopts */
2007-12-10 22:30:37 +03:00
lp_load ( get_dyn_CONFIGFILE ( ) , True , False , False , True ) ;
2005-10-18 07:21:59 +04:00
exename = argv [ 0 ] ;
/* default */
fstrcpy ( opname , " write " ) ; /* the default */
#if 0 /* TESTING CODE */
eventlog_add_source ( " System " , " TestSourceX " , " SomeTestPathX " ) ;
# endif
while ( ( opt = getopt ( argc , argv , " dho: " ) ) ! = EOF ) {
switch ( opt ) {
case ' o ' :
fstrcpy ( opname , optarg ) ;
break ;
case ' h ' :
2006-06-29 01:56:03 +04:00
usage ( exename ) ;
2005-10-18 07:21:59 +04:00
display_eventlog_names ( ) ;
exit ( 0 ) ;
break ;
case ' d ' :
opt_debug = 1 ;
break ;
}
}
argc - = optind ;
argv + = optind ;
if ( argc < 1 ) {
printf ( " \n Not enough arguments! \n " ) ;
usage ( exename ) ;
exit ( 1 ) ;
}
/* note that the separate command types should call usage if they need to... */
while ( 1 ) {
if ( ! StrCaseCmp ( opname , " addsource " ) ) {
rc = DoAddSourceCommand ( argc , argv , opt_debug ,
exename ) ;
break ;
}
if ( ! StrCaseCmp ( opname , " write " ) ) {
rc = DoWriteCommand ( argc , argv , opt_debug , exename ) ;
break ;
}
printf ( " unknown command [%s] \n " , opname ) ;
usage ( exename ) ;
exit ( 1 ) ;
break ;
}
2007-11-23 16:34:13 +03:00
TALLOC_FREE ( frame ) ;
2005-10-18 07:21:59 +04:00
return rc ;
}