56
62
static uchar *pszWorkDir = NULL;
57
63
static int bOptimizeUniProc = 1; /* enable uniprocessor optimizations */
58
static int bHUPisRestart = 0; /* should SIGHUP cause a full system restart? */
64
static int bParseHOSTNAMEandTAG = 1; /* parser modification (based on startup params!) */
59
65
static int bPreserveFQDN = 0; /* should FQDNs always be preserved? */
60
66
static int iMaxLine = 2048; /* maximum length of a syslog message */
61
67
static int iDefPFFamily = PF_UNSPEC; /* protocol family (IPv4, IPv6 or both) */
64
70
static int bDisableDNS = 0; /* don't look up IP addresses of remote messages */
65
71
static prop_t *propLocalHostName = NULL;/* our hostname as FQDN - read-only after startup */
66
72
static uchar *LocalHostName = NULL;/* our hostname - read-only after startup */
73
static uchar *LocalHostNameOverride = NULL;/* user-overridden hostname - read-only after startup */
67
74
static uchar *LocalFQDNName = NULL;/* our hostname as FQDN - read-only after startup */
68
75
static uchar *LocalDomain; /* our local domain name - read-only after startup */
69
76
static char **StripDomains = NULL;/* these domains may be stripped before writing logs - r/o after s.u., never touched by init */
72
79
static uchar *pszDfltNetstrmDrvrCAF = NULL; /* default CA file for the netstrm driver */
73
80
static uchar *pszDfltNetstrmDrvrKeyFile = NULL; /* default key file for the netstrm driver (server) */
74
81
static uchar *pszDfltNetstrmDrvrCertFile = NULL; /* default cert file for the netstrm driver (server) */
82
static int bTerminateInputs = 0; /* global switch that inputs shall terminate ASAP (1=> terminate) */
83
#ifndef HAVE_ATOMIC_BUILTINS
84
static DEF_ATOMIC_HELPER_MUT(mutTerminateInputs);
86
#ifdef USE_UNLIMITED_SELECT
87
static int iFdSetSize = howmany(FD_SETSIZE, __NFDBITS) * sizeof (fd_mask); /* size of select() bitmask in bytes */
77
91
/* define a macro for the simple properties' set and get functions
93
107
return(nameVar); \
110
SIMP_PROP(ParseHOSTNAMEandTAG, bParseHOSTNAMEandTAG, int)
96
111
SIMP_PROP(OptimizeUniProc, bOptimizeUniProc, int)
97
112
SIMP_PROP(PreserveFQDN, bPreserveFQDN, int)
98
SIMP_PROP(HUPisRestart, bHUPisRestart, int)
99
113
SIMP_PROP(MaxLine, iMaxLine, int)
100
114
SIMP_PROP(DefPFFamily, iDefPFFamily, int) /* note that in the future we may check the family argument */
101
115
SIMP_PROP(DropMalPTRMsgs, bDropMalPTRMsgs, int)
104
118
SIMP_PROP(LocalDomain, LocalDomain, uchar*)
105
119
SIMP_PROP(StripDomains, StripDomains, char**)
106
120
SIMP_PROP(LocalHosts, LocalHosts, char**)
121
#ifdef USE_UNLIMITED_SELECT
122
SIMP_PROP(FdSetSize, iFdSetSize, int)
108
125
SIMP_PROP_SET(LocalFQDNName, LocalFQDNName, uchar*)
109
126
SIMP_PROP_SET(LocalHostName, LocalHostName, uchar*)
117
134
#undef SIMP_PROP_GET
137
/* return global input termination status
138
* rgerhards, 2009-07-20
140
static int GetGlobalInputTermState(void)
142
return ATOMIC_FETCH_32BIT(&bTerminateInputs, &mutTerminateInputs);
146
/* set global termiantion state to "terminate". Note that this is a
147
* "once in a lifetime" action which can not be undone. -- gerhards, 2009-07-20
149
static void SetGlobalInputTermination(void)
151
ATOMIC_STORE_1_TO_INT(&bTerminateInputs, &mutTerminateInputs);
155
/* This function is used to set the global work directory name.
156
* It verifies that the provided directory actually exists and
157
* emits an error message if not.
158
* rgerhards, 2011-02-16
160
static rsRetVal setWorkDir(void __attribute__((unused)) *pVal, uchar *pNewVal)
165
if(stat((char*) pNewVal, &sb) != 0) {
166
errmsg.LogError(0, RS_RET_ERR_WRKDIR, "$WorkDirectory: %s can not be "
167
"accessed, probably does not exist - directive ignored", pNewVal);
168
ABORT_FINALIZE(RS_RET_ERR_WRKDIR);
171
if(!S_ISDIR(sb.st_mode)) {
172
errmsg.LogError(0, RS_RET_ERR_WRKDIR, "$WorkDirectory: %s not a directory - directive ignored",
174
ABORT_FINALIZE(RS_RET_ERR_WRKDIR);
178
pszWorkDir = pNewVal;
120
184
/* return our local hostname. if it is not set, "[localhost]" is returned
150
220
prop.Destruct(&propLocalHostName);
152
222
CHKiRet(prop.Construct(&propLocalHostName));
153
if(LocalHostName == NULL)
154
pszName = (uchar*) "[localhost]";
156
if(GetPreserveFQDN() == 1)
157
pszName = LocalFQDNName;
159
pszName = LocalHostName;
223
if(LocalHostNameOverride == NULL) {
224
if(LocalHostName == NULL)
225
pszName = (uchar*) "[localhost]";
227
if(GetPreserveFQDN() == 1)
228
pszName = LocalFQDNName;
230
pszName = LocalHostName;
232
} else { /* local hostname is overriden via config */
233
pszName = LocalHostNameOverride;
235
DBGPRINTF("GenerateLocalHostName uses '%s'\n", pszName);
161
236
CHKiRet(prop.SetString(propLocalHostName, pszName, ustrlen(pszName)));
162
237
CHKiRet(prop.ConstructFinalize(propLocalHostName));
241
317
pIf->GetWorkDir = GetWorkDir;
242
318
pIf->GenerateLocalHostNameProperty = GenerateLocalHostNameProperty;
243
319
pIf->GetLocalHostNameProp = GetLocalHostNameProp;
320
pIf->SetGlobalInputTermination = SetGlobalInputTermination;
321
pIf->GetGlobalInputTermState = GetGlobalInputTermState;
244
322
#define SIMP_PROP(name) \
245
323
pIf->Get##name = Get##name; \
246
324
pIf->Set##name = Set##name;
247
325
SIMP_PROP(MaxLine);
248
326
SIMP_PROP(OptimizeUniProc);
327
SIMP_PROP(ParseHOSTNAMEandTAG);
249
328
SIMP_PROP(PreserveFQDN);
250
SIMP_PROP(HUPisRestart);
251
329
SIMP_PROP(DefPFFamily);
252
330
SIMP_PROP(DropMalPTRMsgs);
253
331
SIMP_PROP(Option_DisallowWarning);
287
368
free(pszDfltNetstrmDrvrCertFile);
288
369
pszDfltNetstrmDrvrCertFile = NULL;
371
if(LocalHostNameOverride != NULL) {
372
free(LocalHostNameOverride);
373
LocalHostNameOverride = NULL;
290
375
if(pszWorkDir != NULL) {
291
376
free(pszWorkDir);
292
377
pszWorkDir = NULL;
294
379
bDropMalPTRMsgs = 0;
295
380
bOptimizeUniProc = 1;
297
381
bPreserveFQDN = 0;
382
#ifdef USE_UNLIMITED_SELECT
383
iFdSetSize = howmany(FD_SETSIZE, __NFDBITS) * sizeof (fd_mask);
298
385
return RS_RET_OK;
307
394
BEGINAbstractObjClassInit(glbl, 1, OBJ_IS_CORE_MODULE) /* class, version */
308
395
/* request objects we use */
309
396
CHKiRet(objUse(prop, CORE_COMPONENT));
397
CHKiRet(objUse(errmsg, CORE_COMPONENT));
311
399
/* register config handlers (TODO: we need to implement a way to unregister them) */
312
CHKiRet(regCfSysLineHdlr((uchar *)"workdirectory", 0, eCmdHdlrGetWord, NULL, &pszWorkDir, NULL));
400
CHKiRet(regCfSysLineHdlr((uchar *)"workdirectory", 0, eCmdHdlrGetWord, setWorkDir, NULL, NULL));
313
401
CHKiRet(regCfSysLineHdlr((uchar *)"dropmsgswithmaliciousdnsptrrecords", 0, eCmdHdlrBinary, NULL, &bDropMalPTRMsgs, NULL));
314
402
CHKiRet(regCfSysLineHdlr((uchar *)"defaultnetstreamdriver", 0, eCmdHdlrGetWord, NULL, &pszDfltNetstrmDrvr, NULL));
315
403
CHKiRet(regCfSysLineHdlr((uchar *)"defaultnetstreamdrivercafile", 0, eCmdHdlrGetWord, NULL, &pszDfltNetstrmDrvrCAF, NULL));
316
404
CHKiRet(regCfSysLineHdlr((uchar *)"defaultnetstreamdriverkeyfile", 0, eCmdHdlrGetWord, NULL, &pszDfltNetstrmDrvrKeyFile, NULL));
317
405
CHKiRet(regCfSysLineHdlr((uchar *)"defaultnetstreamdrivercertfile", 0, eCmdHdlrGetWord, NULL, &pszDfltNetstrmDrvrCertFile, NULL));
406
CHKiRet(regCfSysLineHdlr((uchar *)"localhostname", 0, eCmdHdlrGetWord, NULL, &LocalHostNameOverride, NULL));
318
407
CHKiRet(regCfSysLineHdlr((uchar *)"optimizeforuniprocessor", 0, eCmdHdlrBinary, NULL, &bOptimizeUniProc, NULL));
319
CHKiRet(regCfSysLineHdlr((uchar *)"hupisrestart", 0, eCmdHdlrBinary, NULL, &bHUPisRestart, NULL));
320
408
CHKiRet(regCfSysLineHdlr((uchar *)"preservefqdn", 0, eCmdHdlrBinary, NULL, &bPreserveFQDN, NULL));
321
409
CHKiRet(regCfSysLineHdlr((uchar *)"resetconfigvariables", 1, eCmdHdlrCustomHandler, resetConfigVariables, NULL, NULL));
411
INIT_ATOMIC_HELPER_MUT(mutTerminateInputs);
322
412
ENDObjClassInit(glbl)