Ignore:
Timestamp:
Nov 14, 2012, 12:59:34 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to 3.6.0

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/utils/eventlogadm.c

    r414 r740  
    2424
    2525#include "includes.h"
    26 
    27 #undef  DBGC_CLASS
    28 #define DBGC_CLASS DBGC_UTIL_EVENTLOG
    29 
     26#include "lib/eventlog/eventlog.h"
     27#include "registry.h"
     28#include "registry/reg_backend_db.h"
     29#include "registry/reg_objects.h"
     30#include "../libcli/registry/util_reg.h"
    3031
    3132extern int optind;
     
    4142        printf( " -o dump <Eventlog Name> <starting_record>\t\t\t\t\tDump stored eventlog entries on STDOUT\n" );
    4243        printf( "\nMiscellaneous options:\n" );
     44        printf( " -s <filename>\t\t\t\t\t\t\tUse configuration file <filename>.\n");
    4345        printf( " -d\t\t\t\t\t\t\t\tturn debug on\n" );
    4446        printf( " -h\t\t\t\t\t\t\t\tdisplay help\n\n" );
     
    5153
    5254        elogs = lp_eventlog_list(  );
    53         printf( "Active eventlog names (from smb.conf):\n" );
     55        printf( "Active eventlog names:\n" );
    5456        printf( "--------------------------------------\n" );
    5557        if ( elogs ) {
     
    6062        else
    6163                printf( "\t<None specified>\n");
     64}
     65
     66/*********************************************************************
     67 for an eventlog, add in a source name. If the eventlog doesn't
     68 exist (not in the list) do nothing.   If a source for the log
     69 already exists, change the information (remove, replace)
     70*********************************************************************/
     71static bool eventlog_add_source( const char *eventlog, const char *sourcename,
     72                                 const char *messagefile )
     73{
     74        /* Find all of the eventlogs, add keys for each of them */
     75        /* need to add to the value KEY_EVENTLOG/<eventlog>/Sources string (Creating if necessary)
     76           need to add KEY of source to KEY_EVENTLOG/<eventlog>/<source> */
     77
     78        const char **elogs = lp_eventlog_list(  );
     79        const char **wrklist, **wp;
     80        char *evtlogpath = NULL;
     81        struct regsubkey_ctr *subkeys;
     82        struct regval_ctr *values;
     83        struct regval_blob *rval;
     84        int ii = 0;
     85        bool already_in;
     86        int i;
     87        int numsources = 0;
     88        TALLOC_CTX *ctx = talloc_tos();
     89        WERROR werr;
     90        DATA_BLOB blob;
     91
     92        if (!elogs) {
     93                return False;
     94        }
     95
     96        for ( i = 0; elogs[i]; i++ ) {
     97                if ( strequal( elogs[i], eventlog ) )
     98                        break;
     99        }
     100
     101        if ( !elogs[i] ) {
     102                d_printf("Eventlog [%s] not found in list of valid event logs\n",
     103                         eventlog);
     104                return false;   /* invalid named passed in */
     105        }
     106
     107        /* have to assume that the evenlog key itself exists at this point */
     108        /* add in a key of [sourcename] under the eventlog key */
     109
     110        /* todo add to Sources */
     111
     112        werr = regval_ctr_init(ctx, &values);
     113        if(!W_ERROR_IS_OK(werr)) {
     114                d_printf("talloc() failure!\n");
     115                return false;
     116        }
     117
     118        evtlogpath = talloc_asprintf(ctx, "%s\\%s", KEY_EVENTLOG, eventlog);
     119        if (!evtlogpath) {
     120                TALLOC_FREE(values);
     121                return false;
     122        }
     123
     124        regdb_fetch_values( evtlogpath, values );
     125
     126
     127        if ( !( rval = regval_ctr_getvalue( values, "Sources" ) ) ) {
     128                d_printf("No Sources value for [%s]!\n", eventlog);
     129                return False;
     130        }
     131        /* perhaps this adding a new string to a multi_sz should be a fn? */
     132        /* check to see if it's there already */
     133
     134        if ( regval_type(rval) != REG_MULTI_SZ ) {
     135                d_printf("Wrong type for Sources, should be REG_MULTI_SZ\n");
     136                return False;
     137        }
     138        /* convert to a 'regulah' chars to do some comparisons */
     139
     140        already_in = False;
     141        wrklist = NULL;
     142        dump_data(1, regval_data_p(rval), regval_size(rval));
     143
     144        blob = data_blob_const(regval_data_p(rval), regval_size(rval));
     145        if (!pull_reg_multi_sz(talloc_tos(), &blob, &wrklist)) {
     146                return false;
     147        }
     148
     149        for (ii=0; wrklist[ii]; ii++) {
     150                numsources++;
     151        }
     152
     153        if (numsources > 0) {
     154                /* see if it's in there already */
     155                wp = wrklist;
     156
     157                while (wp && *wp ) {
     158                        if ( strequal( *wp, sourcename ) ) {
     159                                d_printf("Source name [%s] already in list for [%s] \n",
     160                                         sourcename, eventlog);
     161                                already_in = True;
     162                                break;
     163                        }
     164                        wp++;
     165                }
     166        } else {
     167                d_printf("Nothing in the sources list, this might be a problem\n");
     168        }
     169
     170        wp = wrklist;
     171
     172        if ( !already_in ) {
     173                /* make a new list with an additional entry; copy values, add another */
     174                wp = TALLOC_ARRAY(ctx, const char *, numsources + 2 );
     175
     176                if ( !wp ) {
     177                        d_printf("talloc() failed \n");
     178                        return False;
     179                }
     180                memcpy( wp, wrklist, sizeof( char * ) * numsources );
     181                *( wp + numsources ) = ( char * ) sourcename;
     182                *( wp + numsources + 1 ) = NULL;
     183                if (!push_reg_multi_sz(ctx, &blob, wp)) {
     184                        return false;
     185                }
     186                dump_data( 1, blob.data, blob.length);
     187                regval_ctr_addvalue( values, "Sources", REG_MULTI_SZ,
     188                                     blob.data, blob.length);
     189                regdb_store_values( evtlogpath, values );
     190                data_blob_free(&blob);
     191        } else {
     192                d_printf("Source name [%s] found in existing list of sources\n",
     193                         sourcename);
     194        }
     195        TALLOC_FREE(values);
     196        TALLOC_FREE(wrklist);   /*  */
     197
     198        werr = regsubkey_ctr_init(ctx, &subkeys);
     199        if (!W_ERROR_IS_OK(werr)) {
     200                d_printf("talloc() failure!\n");
     201                return False;
     202        }
     203        TALLOC_FREE(evtlogpath);
     204        evtlogpath = talloc_asprintf(ctx, "%s\\%s", KEY_EVENTLOG, eventlog );
     205        if (!evtlogpath) {
     206                TALLOC_FREE(subkeys);
     207                return false;
     208        }
     209
     210        regdb_fetch_keys( evtlogpath, subkeys );
     211
     212        if ( !regsubkey_ctr_key_exists( subkeys, sourcename ) ) {
     213                d_printf(" Source name [%s] for eventlog [%s] didn't exist, adding \n",
     214                         sourcename, eventlog);
     215                regsubkey_ctr_addkey( subkeys, sourcename );
     216                if ( !regdb_store_keys( evtlogpath, subkeys ) )
     217                        return False;
     218        }
     219        TALLOC_FREE(subkeys);
     220
     221        /* at this point KEY_EVENTLOG/<eventlog>/<sourcename> key is in there. Now need to add EventMessageFile */
     222
     223        /* now allocate room for the source's subkeys */
     224
     225        werr = regsubkey_ctr_init(ctx, &subkeys);
     226        if (!W_ERROR_IS_OK(werr)) {
     227                d_printf("talloc() failure!\n");
     228                return False;
     229        }
     230        TALLOC_FREE(evtlogpath);
     231        evtlogpath = talloc_asprintf(ctx, "%s\\%s\\%s",
     232                  KEY_EVENTLOG, eventlog, sourcename);
     233        if (!evtlogpath) {
     234                TALLOC_FREE(subkeys);
     235                return false;
     236        }
     237
     238        regdb_fetch_keys( evtlogpath, subkeys );
     239
     240        /* now add the values to the KEY_EVENTLOG/Application form key */
     241        werr = regval_ctr_init(ctx, &values);
     242        if (!W_ERROR_IS_OK(werr)) {
     243                d_printf("talloc() failure!\n");
     244                return False;
     245        }
     246        d_printf("Storing EventMessageFile [%s] to eventlog path of [%s]\n",
     247                 messagefile, evtlogpath);
     248
     249        regdb_fetch_values( evtlogpath, values );
     250
     251        regval_ctr_addvalue_sz(values, "EventMessageFile", messagefile);
     252        regdb_store_values( evtlogpath, values );
     253
     254        TALLOC_FREE(values);
     255
     256        return True;
    62257}
    63258
     
    221416        int opt, rc;
    222417        char *exename;
     418        char *configfile = NULL;
    223419        TALLOC_CTX *frame = talloc_stackframe();
    224420
     
    229425
    230426        opt_debug = 0;          /* todo set this from getopts */
    231 
    232         lp_load(get_dyn_CONFIGFILE(), True, False, False, True);
    233427
    234428        exename = argv[0];
     
    241435        eventlog_add_source( "System", "TestSourceX", "SomeTestPathX" );
    242436#endif
    243         while ( ( opt = getopt( argc, argv, "dho:" ) ) != EOF ) {
     437        while ( ( opt = getopt( argc, argv, "dho:s:" ) ) != EOF ) {
    244438                switch ( opt ) {
    245439
     
    257451                        opt_debug = 1;
    258452                        break;
     453                case 's':
     454                        configfile = talloc_strdup(frame, optarg);
     455                        break;
     456
    259457                }
    260458        }
     
    266464                printf( "\nNot enough arguments!\n" );
    267465                usage( exename );
     466                exit( 1 );
     467        }
     468
     469        if ( configfile == NULL ) {
     470                lp_load(get_dyn_CONFIGFILE(), True, False, False, True);
     471        } else if (!lp_load(configfile, True, False, False, True)) {
     472                printf("Unable to parse configfile '%s'\n",configfile);
    268473                exit( 1 );
    269474        }
Note: See TracChangeset for help on using the changeset viewer.