#!/usr/bin/perl use constant { UTIME => 0, UNIQUEID => 1, QUEUE => 2, MEMBER => 3, DISPOSITION => 4 }; # UniqID StartTime CallerID QueueName WaitTime OrigPos Disposition QueueMember TalkTime QuitPos print "UniqueID\tStartTime\tCallerID\tQueueName\tWaitTime\tOrigPos\tDisposition\tQueueMember\tTalkTime\tQuitPos\n"; open Q, ") { chomp; my @d = split /\|/; next if $d[DISPOSITION] eq 'QUEUESTART'; next if $d[DISPOSITION] eq 'ADDMEMBER'; next if $d[DISPOSITION] eq 'REMOVEMEMBER'; # Timestamp | Uniq ID | QueueName | Member | Action [ | OptArgs ] if ($d[DISPOSITION] eq 'ENTERQUEUE') { # 5=url | 6=calleridnum # Create a new record $records{$d[UNIQUEID]} = { queue => $d[QUEUE], callerid => $d[6], starttime => $d[UTIME] }; } elsif ($d[DISPOSITION] eq 'ABANDON') { # 5=pos | 6=opos | 7=timelen my $record = $records{$d[UNIQUEID]}; # UniqID StartTime CallerID QueueName WaitTime OrigPos Disposition QueueMember TalkTime QuitPos print "$d[UNIQUEID]\t" . format_date($record->{starttime}) . "\t$record->{callerid}\t$record->{queue}\t" . format_time($d[7]) . "\t$d[6]\t$d[DISPOSITION]\t$d[MEMBER]\t0\t$d[5]\n"; } elsif ($d[DISPOSITION] eq 'CONNECT') { # 5=WaitTime | 6=PeerUniqID my $record = $records{$d[UNIQUEID]}; $record->{peer_uniqueid} = $d[6]; $record->{waittime} = $d[5]; } elsif ($d[DISPOSITION] =~ m#^COMPLETE#) { # 5=WaitTime | 6=TalkTime | 7=OrigPos my $record = $records{$d[UNIQUEID]}; # UniqID StartTime CallerID QueueName WaitTime OrigPos Disposition QueueMember TalkTime QuitPos print "$d[UNIQUEID]\t" . format_date($record->{starttime}) . "\t$record->{callerid}\t$record->{queue}\t" . format_time($d[5]) . "\t$d[7]\t$d[DISPOSITION]\t$d[MEMBER]\t" . format_time($d[6]) . "\t0\n"; } elsif ($d[DISPOSITION] eq 'TRANSFER') { # 5=Exten | 6=Context | 7=WaitTime | 8=TalkTime my $record = $records{$d[UNIQUEID]}; # UniqID StartTime CallerID QueueName WaitTime OrigPos Disposition QueueMember TalkTime QuitPos print "$d[UNIQUEID]\t" . format_date($record->{starttime}) . "\t$record->{callerid}\t$record->{queue}\t" . format_time($d[7]) . "\tUnknown\t$d[DISPOSITION]\t$d[MEMBER]\t" . format_time($d[8]) . "\t0\n"; } elsif ($d[DISPOSITION] =~ m#^EXIT#) { # 5=Pos | 6=OrigPos | 7=WaitTime my $record = $records{$d[UNIQUEID]}; # UniqID StartTime CallerID QueueName WaitTime OrigPos Disposition QueueMember TalkTime QuitPos print "$d[UNIQUEID]\t" . format_date($record->{starttime}) . "\t$record->{callerid}\t$record->{queue}\t" . format_time($d[7]) . "\t$d[6]\t$d[DISPOSITION]\t$d[MEMBER]\t0\t$d[5]\n"; } elsif ($d[DISPOSITION] eq 'AGENTDUMP') { my $record = $records{$d[UNIQUEID]}; # UniqID StartTime CallerID QueueName WaitTime OrigPos Disposition QueueMember TalkTime QuitPos print "$d[UNIQUEID]\t" . format_date($record->{starttime}) . "\t$record->{callerid}\t$record->{queue}\t" . format_time($record->{waittime}) . "\tUnknown\t$d[DISPOSITION]\t$d[MEMBER]\t0\t0\n"; } } close Q; sub format_date { my $utime = shift; my @broken = localtime($utime); return sprintf("%04d-%02d-%02d %02d:%02d:%02d", $broken[5] + 1900, $broken[4] + 1, $broken[3], $broken[2], $broken[1], $broken[0]); } sub format_time { my $sec = shift; my $hours = int($sec / 3600); my $mins = int(($sec % 3600) / 60); my $secs = $sec % 60; if ($hours) { return sprintf("\%d:%02d:%02d", $hours, $mins, $secs); } else { return sprintf("\%d:%02d", $mins, $secs); } }