You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
4.6 KiB
116 lines
4.6 KiB
4 weeks ago
|
From 0de0c4b274e7e33ed4a27b02d6046b62d612e29b Mon Sep 17 00:00:00 2001
|
||
|
From: alakatos <alakatos@redhat.com>
|
||
|
Date: Tue, 24 Oct 2023 15:43:19 +0200
|
||
|
Subject: [PATCH] Do not preserve statefile on file move
|
||
|
|
||
|
---
|
||
|
plugins/imfile/imfile.c | 45 ++++++++++++++++++++++++++++++-----------
|
||
|
1 file changed, 33 insertions(+), 12 deletions(-)
|
||
|
|
||
|
diff --git a/plugins/imfile/imfile.c b/plugins/imfile/imfile.c
|
||
|
index 5febd6db6..8769a185f 100644
|
||
|
--- a/plugins/imfile/imfile.c
|
||
|
+++ b/plugins/imfile/imfile.c
|
||
|
@@ -264,6 +264,7 @@ struct modConfData_s {
|
||
|
Must be manually reset to 0 if desired. Helper for
|
||
|
polling mode.
|
||
|
*/
|
||
|
+ sbool deleteStateOnFileMove;
|
||
|
};
|
||
|
static modConfData_t *loadModConf = NULL;/* modConf ptr to use for the current load process */
|
||
|
static modConfData_t *runModConf = NULL;/* modConf ptr to use for run process */
|
||
|
@@ -310,7 +311,8 @@ static struct cnfparamdescr modpdescr[] = {
|
||
|
{ "sortfiles", eCmdHdlrBinary, 0 },
|
||
|
{ "statefile.directory", eCmdHdlrString, 0 },
|
||
|
{ "normalizepath", eCmdHdlrBinary, 0 },
|
||
|
- { "mode", eCmdHdlrGetWord, 0 }
|
||
|
+ { "mode", eCmdHdlrGetWord, 0 },
|
||
|
+ { "deletestateonfilemove", eCmdHdlrBinary, 0 }
|
||
|
};
|
||
|
static struct cnfparamblk modpblk =
|
||
|
{ CNFPARAMBLK_VERSION,
|
||
|
@@ -551,11 +553,18 @@ static int
|
||
|
in_setupWatch(act_obj_t *const act, const int is_file)
|
||
|
{
|
||
|
int wd = -1;
|
||
|
+ int flags;
|
||
|
if(runModConf->opMode != OPMODE_INOTIFY)
|
||
|
goto done;
|
||
|
|
||
|
- wd = inotify_add_watch(ino_fd, act->name,
|
||
|
- (is_file) ? IN_MODIFY|IN_DONT_FOLLOW : IN_CREATE|IN_DELETE|IN_MOVED_FROM|IN_MOVED_TO);
|
||
|
+ if (is_file)
|
||
|
+ flags = IN_MODIFY|IN_DONT_FOLLOW;
|
||
|
+ else if (runModConf->deleteStateOnFileMove)
|
||
|
+ flags = IN_CREATE|IN_DELETE|IN_MOVED_TO;
|
||
|
+ else
|
||
|
+ flags = IN_CREATE|IN_DELETE|IN_MOVED_FROM|IN_MOVED_TO;
|
||
|
+
|
||
|
+ wd = inotify_add_watch(ino_fd, act->name, flags);
|
||
|
if(wd < 0) {
|
||
|
if (errno == EACCES) { /* There is high probability of selinux denial on top-level paths */
|
||
|
DBGPRINTF("imfile: permission denied when adding watch for '%s'\n", act->name);
|
||
|
@@ -1059,7 +1068,7 @@ act_obj_destroy(act_obj_t *const act, const int is_deleted)
|
||
|
persistStrmState(act);
|
||
|
strm.Destruct(&act->pStrm);
|
||
|
/* we delete state file after destruct in case strm obj initiated a write */
|
||
|
- if(is_deleted && !act->in_move && inst->bRMStateOnDel) {
|
||
|
+ if(is_deleted && inst->bRMStateOnDel && (!act->in_move || runModConf->deleteStateOnFileMove)) {
|
||
|
DBGPRINTF("act_obj_destroy: deleting state file %s\n", statefn);
|
||
|
unlink((char*)statefn);
|
||
|
}
|
||
|
@@ -2090,6 +2099,7 @@ CODESTARTbeginCnfLoad
|
||
|
loadModConf->timeoutGranularity = 1000; /* default: 1 second */
|
||
|
loadModConf->haveReadTimeouts = 0; /* default: no timeout */
|
||
|
loadModConf->normalizePath = 1;
|
||
|
+ loadModConf->deleteStateOnFileMove = 0;
|
||
|
loadModConf->sortFiles = GLOB_NOSORT;
|
||
|
loadModConf->stateFileDirectory = NULL;
|
||
|
loadModConf->conf_tree = calloc(sizeof(fs_node_t), 1);
|
||
|
@@ -2149,6 +2159,8 @@ CODESTARTsetModCnf
|
||
|
loadModConf->stateFileDirectory = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
|
||
|
} else if(!strcmp(modpblk.descr[i].name, "normalizepath")) {
|
||
|
loadModConf->normalizePath = (sbool) pvals[i].val.d.n;
|
||
|
+ } else if(!strcmp(modpblk.descr[i].name, "deletestateonfilemove")) {
|
||
|
+ loadModConf->deleteStateOnFileMove = (sbool) pvals[i].val.d.n;
|
||
|
} else if(!strcmp(modpblk.descr[i].name, "mode")) {
|
||
|
if(!es_strconstcmp(pvals[i].val.d.estr, "polling"))
|
||
|
loadModConf->opMode = OPMODE_POLLING;
|
||
|
@@ -2452,16 +2464,25 @@ in_processEvent(struct inotify_event *ev)
|
||
|
DBGPRINTF("in_processEvent process Event %x is_file %d, act->name '%s'\n",
|
||
|
ev->mask, etry->act->edge->is_file, etry->act->name);
|
||
|
|
||
|
- if((ev->mask & IN_MOVED_FROM)) {
|
||
|
- flag_in_move(etry->act->edge->node->edges, ev->name);
|
||
|
- }
|
||
|
- if(ev->mask & (IN_MOVED_FROM | IN_MOVED_TO)) {
|
||
|
- fs_node_walk(etry->act->edge->node, poll_tree);
|
||
|
- } else if(etry->act->edge->is_file && !(etry->act->is_symlink)) {
|
||
|
- in_handleFileEvent(ev, etry); // esentially poll_file()!
|
||
|
+ if (!runModConf->deleteStateOnFileMove) {
|
||
|
+ if((ev->mask & IN_MOVED_FROM)) {
|
||
|
+ flag_in_move(etry->act->edge->node->edges, ev->name);
|
||
|
+ }
|
||
|
+ if(ev->mask & (IN_MOVED_FROM | IN_MOVED_TO)) {
|
||
|
+ fs_node_walk(etry->act->edge->node, poll_tree);
|
||
|
+ } else if(etry->act->edge->is_file && !(etry->act->is_symlink)) {
|
||
|
+ in_handleFileEvent(ev, etry); // esentially poll_file()!
|
||
|
+ } else {
|
||
|
+ fs_node_walk(etry->act->edge->node, poll_tree);
|
||
|
+ }
|
||
|
} else {
|
||
|
- fs_node_walk(etry->act->edge->node, poll_tree);
|
||
|
+ if((ev->mask & IN_MODIFY) && etry->act->edge->is_file && !(etry->act->is_symlink)) {
|
||
|
+ in_handleFileEvent(ev, etry); // esentially poll_file()!
|
||
|
+ } else {
|
||
|
+ fs_node_walk(etry->act->edge->node, poll_tree);
|
||
|
+ }
|
||
|
}
|
||
|
+
|
||
|
done: return;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.41.0
|
||
|
|