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. $!"; # 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;