RADIUS-XMLParser

 view release on metacpan or  search on metacpan

RADIUS/XMLParser.pm  view on Meta::CPAN

use File::Basename;
use File::Spec;
use Storable qw(lock_store lock_retrieve);
use Carp;
use IO::File;
use XML::Writer;

our $VERSION = '2.30';

my $interimUpdate;
my $writer;
my $labelref;
my $mapRef;
my $startDbm;
my $interimDbm;
my $daysForOrphan  = 1;
my $purgeOrphan    = 0;
my $writeAllEvents = 0;
my $outputDir;
my $orphanDir;
my $xmlencoding = "utf-8";

my %map;
my @labels;
my %tags = ();
my %event;
my %start;
my %stop;
my %interim;

#--------------------------------------------------
# Constructor
#--------------------------------------------------
sub new {

	my $this   = shift;
	my $class  = ref($this) || $this;
	my $ref    = shift;
	my %params = %$ref;

	#Load parameters if any
	$mapRef         = $params{MAP}           if $params{MAP};
	$purgeOrphan    = $params{AUTOPURGE}     if $params{AUTOPURGE};
	$daysForOrphan  = $params{DAYSFORORPHAN} if $params{DAYSFORORPHAN};
	$writeAllEvents = $params{ALLEVENTS}     if $params{ALLEVENTS};
	$xmlencoding    = $params{XMLENCODING}   if $params{XMLENCODING};
	$outputDir      = $params{OUTPUTDIR}     if $params{OUTPUTDIR};
	$orphanDir      = $params{ORPHANDIR}     if $params{ORPHANDIR};
	%map            = %$mapRef               if $mapRef;

	#Get current directory
	my $curdir = File::Spec->tmpdir();
	$outputDir = $curdir if ( not defined $outputDir );
	$orphanDir = $curdir if ( not defined $orphanDir );

	#Get orphan files
	$startDbm   = File::Spec->catfile( $orphanDir, "orphan.start" );
	$interimDbm = File::Spec->catfile( $orphanDir, "orphan.interim" );

	my $self = {};
	bless $self => $class;

	#Load orphan start and interim hash (if any)
	_loadHash();

	$self;
}

#--------------------------------------------------
# Clean up orphanage on demand
# Note that this is done at startup, but might
# be required some times to times
# (especially for deamons process)
#--------------------------------------------------
sub flush($) {
	my ($self) = @_;
	_loadHash();
}

#--------------------------------------------------
# Open log file and parse each line.
# Group then all event based on same session ID
#--------------------------------------------------
sub convert($$) {

	my ( $self, $log ) = @_;

	#Initialize counters
	my $processedLines = 0;

	#Open log file to be parsed
	croak "Log file not supplied" if ( not defined $log );

	#Get absolute path
	$log = File::Spec->rel2abs($log);

	open( LOG, $log ) or croak "Cannot open file; File=$log; $!";

	#Boolean that becomes true (1) when the first blank lines have been skipped.
	my $begining_skipped = 0;

	#Get each line
	while (<LOG>) {

		$processedLines++;

		# Skip the begining of the log file if it only contains blank lines.
		if ( /^(\s)*$/ && !$begining_skipped ) {
			next;
		} else {
			$begining_skipped = 1;
		}

		# Analyze line
		_analyseRadiusLine( $_, $processedLines, $log );
	}

	#Store file into XML
	my $xmlReturnRef = _event2xml($log);
	my %xmlReturn    = %$xmlReturnRef;



( run in 0.574 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )