Gracefully handle empty/missing shadow file

When a shadow file is empty/missing during rotation, Zeek aborts
with an error message, but if the shadow file was empty, it'll still
be there after the restart, causing an endless restart loop. This
solution gracefully handles the rotation in such cases using the
default file extension and post processing function.
This commit is contained in:
Peter Cullen 2024-04-18 18:39:41 +00:00
parent d566961da5
commit 49123d3a94

View file

@ -116,10 +116,14 @@ TEST_CASE("writers.ascii prefix_basename_with") {
static std::optional<LeftoverLog> parse_shadow_log(const std::string& fname) {
auto sfname = prefix_basename_with(fname, shadow_file_prefix);
string default_ext = "." + Ascii::LogExt();
if ( BifConst::LogAscii::gzip_level > 0 )
default_ext += ".gz";
LeftoverLog rval = {};
rval.filename = fname;
rval.shadow_filename = std::move(sfname);
rval.extension = default_ext;
auto sf_stream = fopen(rval.shadow_filename.data(), "r");
@ -165,15 +169,16 @@ static std::optional<LeftoverLog> parse_shadow_log(const std::string& fname) {
auto sf_lines = util::tokenize_string(sf_view, '\n');
if ( sf_lines.size() < 2 ) {
rval.error = util::
fmt("Found leftover log, '%s', but the associated shadow "
" file, '%s', required to process it is invalid",
rval.filename.data(), rval.shadow_filename.data());
return rval;
reporter->Warning("Found leftover log, '%s', but the associated shadow "
" file, '%s', required to process it is invalid: using default "
" for extension (%s) and post_proc_func",
rval.filename.data(), rval.shadow_filename.data(),
default_ext.data());
}
else {
rval.extension = sf_lines[0];
rval.post_proc_func = sf_lines[1];
}
rval.extension = sf_lines[0];
rval.post_proc_func = sf_lines[1];
struct stat st;