diff options
Diffstat (limited to 'source3/utils/eventlogadm.c')
-rw-r--r-- | source3/utils/eventlogadm.c | 199 |
1 files changed, 194 insertions, 5 deletions
diff --git a/source3/utils/eventlogadm.c b/source3/utils/eventlogadm.c index 15b8d207a2..fc69332d31 100644 --- a/source3/utils/eventlogadm.c +++ b/source3/utils/eventlogadm.c @@ -26,11 +26,7 @@ #include "lib/eventlog/eventlog.h" #include "registry.h" #include "registry/reg_backend_db.h" -#include "registry/reg_eventlog.h" - -#undef DBGC_CLASS -#define DBGC_CLASS DBGC_UTIL_EVENTLOG - +#include "registry/reg_objects.h" extern int optind; extern char *optarg; @@ -66,6 +62,199 @@ static void display_eventlog_names( void ) printf( "\t<None specified>\n"); } +/********************************************************************* + for an eventlog, add in a source name. If the eventlog doesn't + exist (not in the list) do nothing. If a source for the log + already exists, change the information (remove, replace) +*********************************************************************/ +static bool eventlog_add_source( const char *eventlog, const char *sourcename, + const char *messagefile ) +{ + /* Find all of the eventlogs, add keys for each of them */ + /* need to add to the value KEY_EVENTLOG/<eventlog>/Sources string (Creating if necessary) + need to add KEY of source to KEY_EVENTLOG/<eventlog>/<source> */ + + const char **elogs = lp_eventlog_list( ); + const char **wrklist, **wp; + char *evtlogpath = NULL; + struct regsubkey_ctr *subkeys; + struct regval_ctr *values; + struct regval_blob *rval; + int ii = 0; + bool already_in; + int i; + int numsources = 0; + TALLOC_CTX *ctx = talloc_tos(); + WERROR werr; + DATA_BLOB blob; + + if (!elogs) { + return False; + } + + for ( i = 0; elogs[i]; i++ ) { + if ( strequal( elogs[i], eventlog ) ) + break; + } + + if ( !elogs[i] ) { + d_printf("Eventlog [%s] not found in list of valid event logs\n", + eventlog); + return false; /* invalid named passed in */ + } + + /* have to assume that the evenlog key itself exists at this point */ + /* add in a key of [sourcename] under the eventlog key */ + + /* todo add to Sources */ + + werr = regval_ctr_init(ctx, &values); + if(!W_ERROR_IS_OK(werr)) { + d_printf("talloc() failure!\n"); + return false; + } + + evtlogpath = talloc_asprintf(ctx, "%s\\%s", KEY_EVENTLOG, eventlog); + if (!evtlogpath) { + TALLOC_FREE(values); + return false; + } + + regdb_fetch_values( evtlogpath, values ); + + + if ( !( rval = regval_ctr_getvalue( values, "Sources" ) ) ) { + d_printf("No Sources value for [%s]!\n", eventlog); + return False; + } + /* perhaps this adding a new string to a multi_sz should be a fn? */ + /* check to see if it's there already */ + + if ( regval_type(rval) != REG_MULTI_SZ ) { + d_printf("Wrong type for Sources, should be REG_MULTI_SZ\n"); + return False; + } + /* convert to a 'regulah' chars to do some comparisons */ + + already_in = False; + wrklist = NULL; + dump_data(1, regval_data_p(rval), regval_size(rval)); + + blob = data_blob_const(regval_data_p(rval), regval_size(rval)); + if (!pull_reg_multi_sz(talloc_tos(), &blob, &wrklist)) { + return false; + } + + for (ii=0; wrklist[ii]; ii++) { + numsources++; + } + + if (numsources > 0) { + /* see if it's in there already */ + wp = wrklist; + + while (wp && *wp ) { + if ( strequal( *wp, sourcename ) ) { + d_printf("Source name [%s] already in list for [%s] \n", + sourcename, eventlog); + already_in = True; + break; + } + wp++; + } + } else { + d_printf("Nothing in the sources list, this might be a problem\n"); + } + + wp = wrklist; + + if ( !already_in ) { + /* make a new list with an additional entry; copy values, add another */ + wp = TALLOC_ARRAY(ctx, const char *, numsources + 2 ); + + if ( !wp ) { + d_printf("talloc() failed \n"); + return False; + } + memcpy( wp, wrklist, sizeof( char * ) * numsources ); + *( wp + numsources ) = ( char * ) sourcename; + *( wp + numsources + 1 ) = NULL; + if (!push_reg_multi_sz(ctx, &blob, wp)) { + return false; + } + dump_data( 1, blob.data, blob.length); + regval_ctr_addvalue( values, "Sources", REG_MULTI_SZ, + blob.data, blob.length); + regdb_store_values( evtlogpath, values ); + data_blob_free(&blob); + } else { + d_printf("Source name [%s] found in existing list of sources\n", + sourcename); + } + TALLOC_FREE(values); + TALLOC_FREE(wrklist); /* */ + + werr = regsubkey_ctr_init(ctx, &subkeys); + if (!W_ERROR_IS_OK(werr)) { + d_printf("talloc() failure!\n"); + return False; + } + TALLOC_FREE(evtlogpath); + evtlogpath = talloc_asprintf(ctx, "%s\\%s", KEY_EVENTLOG, eventlog ); + if (!evtlogpath) { + TALLOC_FREE(subkeys); + return false; + } + + regdb_fetch_keys( evtlogpath, subkeys ); + + if ( !regsubkey_ctr_key_exists( subkeys, sourcename ) ) { + d_printf(" Source name [%s] for eventlog [%s] didn't exist, adding \n", + sourcename, eventlog); + regsubkey_ctr_addkey( subkeys, sourcename ); + if ( !regdb_store_keys( evtlogpath, subkeys ) ) + return False; + } + TALLOC_FREE(subkeys); + + /* at this point KEY_EVENTLOG/<eventlog>/<sourcename> key is in there. Now need to add EventMessageFile */ + + /* now allocate room for the source's subkeys */ + + werr = regsubkey_ctr_init(ctx, &subkeys); + if (!W_ERROR_IS_OK(werr)) { + d_printf("talloc() failure!\n"); + return False; + } + TALLOC_FREE(evtlogpath); + evtlogpath = talloc_asprintf(ctx, "%s\\%s\\%s", + KEY_EVENTLOG, eventlog, sourcename); + if (!evtlogpath) { + TALLOC_FREE(subkeys); + return false; + } + + regdb_fetch_keys( evtlogpath, subkeys ); + + /* now add the values to the KEY_EVENTLOG/Application form key */ + werr = regval_ctr_init(ctx, &values); + if (!W_ERROR_IS_OK(werr)) { + d_printf("talloc() failure!\n"); + return False; + } + d_printf("Storing EventMessageFile [%s] to eventlog path of [%s]\n", + messagefile, evtlogpath); + + regdb_fetch_values( evtlogpath, values ); + + regval_ctr_addvalue_sz(values, "EventMessageFile", messagefile); + regdb_store_values( evtlogpath, values ); + + TALLOC_FREE(values); + + return True; +} + static int DoAddSourceCommand( int argc, char **argv, bool debugflag, char *exename ) { |