#!/usr/bin/perl 

use strict;

use Sys::Syslog qw(:DEFAULT setlogsock);

my $ident    = 'radacc';
my $logopt   = 'pid';
my $facility = 'local7';
my $level    = 'info';
my $priority = "$facility|$level";

my $recipients = {
    recipient1 => {
        servers => [qw{ loghost1.example.com }],
        format  => [
            qw{ Date Timestamp !Client-IP NAS-IP-Address Framed-IP-Address Acct-Status-Type
                Calling-Station-Id Called-Station-Id Acct-Status-Type User-Name User-Name }
        ],
        separator => '|',
    },
    recipient2 => {
        servers => [qw{ loghost2.example.com loghost3.example.com }],
        format  => [
            qw{ User-Name Date Acct-Status-Type Framed-IP-Address NAS-IP-Address Calling-Station-Id }
        ],
        separator => ':',
    },
};

my %data = ( Blank => '' );

# read date from first line
my $date = <STDIN>;
chomp $date;
$data{'Date'} = $date;

# read radius-data from stdin
while (<STDIN>) {

    # skip line if it's not in "key = value" format
    next unless $_ =~ m/([^\s]*) = (.*)$/;
    my ( $key, $value ) = ( $1, $2 );

    # remove quotation marks, if present
    if ( $value =~ m/^"(.*)"$/ ) { $value = $1; }
    $data{$key} = $value;
}

setlogsock('udp');
foreach my $receiver ( keys %$recipients ) {

    # build logline
    my @keys = @{ $recipients->{$receiver}->{format} };
    my $logdata = join $recipients->{$receiver}->{separator}, @data{@keys};

    # send line to each syslog server
    foreach my $syslog_server ( @{ $recipients->{$receiver}->{servers} } ) {
        $Sys::Syslog::host = $syslog_server;
        openlog( $ident, $logopt, $facility );
        syslog( $priority, $logdata );
        closelog;
    }
}
