From 1e736116d2aad179f5bb11ddb40d5d810e758f0c Mon Sep 17 00:00:00 2001 From: Stefan Schantl Date: Wed, 25 Nov 2015 09:04:55 +0100 Subject: [PATCH] Introduce "Base" module This module just contains some basic functions of guardian. Signed-off-by: Stefan Schantl --- modules/Base.pm | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 modules/Base.pm diff --git a/modules/Base.pm b/modules/Base.pm new file mode 100644 index 0000000..e4ff8a0 --- /dev/null +++ b/modules/Base.pm @@ -0,0 +1,89 @@ +package Guardian::Base; +use strict; +use warnings; + +use Exporter qw(import); + +our @EXPORT_OK = qw(GenerateMonitoredFiles); + +# +## Function for fileposition initialization. +# +## This function is used to get the cursor position of the end of file (EOF) of +## a specified file. +# +## In order to prevent from permanently read and keep files opened, or dealing +## with huge logfiles, at initialization time of the worker processes, the file will +## be opened once and the cursor position of the end of file (EOF) get stored. +# +sub InitFileposition ($) { + my $file = $_[0]; + + # Open the file. + open(FILE, $file) or die "Could not open $file. $!\n"; + + # Just seek to the end of the file (EOF). + seek(FILE, 0, 2); + + # Get and store the position. + my $position = tell(FILE), + + # Close the file again. + close(FILE); + + # Return the position. + return $position; +} + +# +## Function to generate a hash of monitored files and their file positions. +# +## This function is responsible for creating the hash of which files should be +## monitored by guardian. In order to do this, all options from the given hash of +## main settings will be parsed and all files to monitor extracted and stored into +## a temporary hash. +# +## Next step will be to check if the the file allready is part of the existing hash +## of monitored files and if true to use the stored value of the current cursor position. +## If this check fails, the responsible function to initialize the cursor position of +## EOF (end of file) will be called and stored. +# +sub GenerateMonitoredFiles (\%\%) { + # Dereference the given hash-refs and store + # them into a new temporary hashes. + my %mainsettings = %{ $_[0] }; + my %current_monitored_files = %{ $_[1] }; + + # Private hash for storing the new monitored files. + my %new_monitored_files = (); + + # Loop through the temporary hash which contains the main settings + # and search for files which should be monitored. Compare if the file + # already was part of the Add them to the + # private new hash of monitored files which will be returned. + foreach my $config_option (keys %mainsettings) { + # Skip option if it does not look like "Monitor_XYZ". + next unless($config_option =~ m/^Monitor_/); + + # Get the configured file for this option. + my $file = $mainsettings{$config_option}; + + # Skip the file, if it does not exist or is not read-able. + next unless(-r "$file"); + + # Check if the file not yet has been added to the hash + # of monitored files. + unless(exists($current_monitored_files{$file})) { + # Add the file, init and store the fileposition. + $new_monitored_files{$file} = &InitFileposition($file); + } else { + # Add the file and grab the fileposition from the existing hash. + $new_monitored_files{$file} = $current_monitored_files{$file}; + } + } + + # Return the new_monitored_files hash. + return %new_monitored_files; +} + +1; -- 2.39.2