Merge branch 'v5-stable-elasticsearch' into v5-devel-tmp
[rsyslog.git] / action.h
1 /* action.h
2  * Header file for the action object
3  *
4  * File begun on 2007-08-06 by RGerhards (extracted from syslogd.c, which
5  * was under BSD license at the time of rsyslog fork)
6  *
7  * Copyright 2007-2012 Adiscon GmbH.
8  *
9  * This file is part of rsyslog.
10  *
11  * Licensed under the Apache License, Version 2.0 (the "License");
12  * you may not use this file except in compliance with the License.
13  * You may obtain a copy of the License at
14  * 
15  *       http://www.apache.org/licenses/LICENSE-2.0
16  *       -or-
17  *       see COPYING.ASL20 in the source distribution
18  * 
19  * Unless required by applicable law or agreed to in writing, software
20  * distributed under the License is distributed on an "AS IS" BASIS,
21  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22  * See the License for the specific language governing permissions and
23  * limitations under the License.
24  */
25 #ifndef ACTION_H_INCLUDED
26 #define ACTION_H_INCLUDED 1
27
28 #include "syslogd-types.h"
29 #include "sync.h"
30 #include "queue.h"
31
32 /* external data - this is to be removed when we change the action
33  * object interface (will happen some time..., at latest when the
34  * config file format is changed). -- rgerhards, 2008-01-28
35  */
36 extern int glbliActionResumeRetryCount;
37
38
39 typedef enum {
40         ACT_STATE_DIED = 0,     /* action permanently failed and now disabled  - MUST BE ZEO! */
41         ACT_STATE_RDY  = 1,     /* action ready, waiting for new transaction */
42         ACT_STATE_ITX  = 2,     /* transaction active, waiting for new data or commit */
43         ACT_STATE_COMM = 3,     /* transaction finished (a transient state) */
44         ACT_STATE_RTRY = 4,     /* failure occured, trying to restablish ready state */
45         ACT_STATE_SUSP = 5      /* suspended due to failure (return fail until timeout expired) */
46 } action_state_t;
47
48 /* the following struct defines the action object data structure
49  */
50 typedef struct action_s action_t;
51 struct action_s {
52         time_t  f_time;         /* used for "message repeated n times" - be careful, old, old code */
53         time_t  tActNow;        /* the current time for an action execution. Initially set to -1 and
54                                    populated on an as-needed basis. This is a performance optimization. */
55         time_t  tLastExec;      /* time this action was last executed */
56         sbool   bExecWhenPrevSusp;/* execute only when previous action is suspended? */
57         sbool   bWriteAllMarkMsgs;/* should all mark msgs be written (not matter how recent the action was executed)? */
58         int     iSecsExecOnceInterval; /* if non-zero, minimum seconds to wait until action is executed again */
59         action_state_t eState;  /* current state of action */
60         sbool   bHadAutoCommit; /* did an auto-commit happen during doAction()? */
61         time_t  ttResumeRtry;   /* when is it time to retry the resume? */
62         int     iResumeOKinRow; /* number of times in a row that resume said OK with an immediate failure following */
63         int     iResumeInterval;/* resume interval for this action */
64         int     iResumeRetryCount;/* how often shall we retry a suspended action? (-1 --> eternal) */
65         int     iNbrResRtry;    /* number of retries since last suspend */
66         int     iNbrNoExec;     /* number of matches that did not yet yield to an exec */
67         int     iExecEveryNthOccur;/* execute this action only every n-th occurence (with n=0,1 -> always) */
68         int     iExecEveryNthOccurTO;/* timeout for n-th occurence feature */
69         time_t  tLastOccur;     /* time last occurence was seen (for timing them out) */
70         struct modInfo_s *pMod;/* pointer to output module handling this selector */
71         void    *pModData;      /* pointer to module data - content is module-specific */
72         sbool   bRepMsgHasMsg;  /* "message repeated..." has msg fragment in it (0-no, 1-yes) */
73         short   f_ReduceRepeated;/* reduce repeated lines 0 - no, 1 - yes */
74         int     f_prevcount;    /* repetition cnt of prevline */
75         int     f_repeatcount;  /* number of "repeated" msgs */
76         rsRetVal (*submitToActQ)(action_t *, batch_t *);/* function submit message to action queue */
77         rsRetVal (*qConstruct)(struct queue_s *pThis);
78         enum    { ACT_STRING_PASSING = 0, ACT_ARRAY_PASSING = 1, ACT_MSG_PASSING }
79                 eParamPassing;  /* mode of parameter passing to action */
80         int     iNumTpls;       /* number of array entries for template element below */
81         struct template **ppTpl;/* array of template to use - strings must be passed to doAction
82                                  * in this order. */
83         msg_t *f_pMsg;          /* pointer to the message (this will replace the other vars with msg
84                                  * content later). This is preserved after the message has been
85                                  * processed - it is also used to detect duplicates.
86                                  */
87         qqueue_t *pQueue;       /* action queue */
88         SYNC_OBJ_TOOL;          /* required for mutex support */
89         pthread_mutex_t mutActExec; /* mutex to guard actual execution of doAction for single-threaded modules */
90         uchar *pszName;         /* action name (for documentation) */
91         DEF_ATOMIC_HELPER_MUT(mutCAS);
92         /* for statistics subsystem */
93         statsobj_t *statsobj;
94         STATSCOUNTER_DEF(ctrProcessed, mutCtrProcessed);
95         STATSCOUNTER_DEF(ctrFail, mutCtrFail);
96 };
97
98
99 /* function prototypes
100  */
101 rsRetVal actionConstruct(action_t **ppThis);
102 rsRetVal actionConstructFinalize(action_t *pThis);
103 rsRetVal actionDestruct(action_t *pThis);
104 rsRetVal actionDbgPrint(action_t *pThis);
105 rsRetVal actionSetGlobalResumeInterval(int iNewVal);
106 rsRetVal actionDoAction(action_t *pAction);
107 rsRetVal actionWriteToAction(action_t *pAction);
108 rsRetVal actionCallHUPHdlr(action_t *pAction);
109 rsRetVal actionClassInit(void);
110 rsRetVal addAction(action_t **ppAction, modInfo_t *pMod, void *pModData, omodStringRequest_t *pOMSR, int bSuspended);
111
112 #endif /* #ifndef ACTION_H_INCLUDED */