#!/usr/bin/perl use Device::SerialPort; use DBI; # Install signal handler use sigtrap qw(handler trapper normal-signals error-signals); # Define configuration parameters $PORT = "/dev/ttyS3"; $BAUD = 19200; $DATA = 8; $PARITY = "none"; $STOP = 1; # Open device, in quiet mode, create lockfile $port = new Device::SerialPort($PORT, 1, 1) || die "Cannot open serial port"; # Set flow control to RTS/CTS $port->handshake("rts"); # Set port parameters $port->baudrate($BAUD); $port->databits($DATA); $port->parity($PARITY); $port->stopbits($STOP); # Initialize database connection my $drh = DBI->install_driver("mysql"); my $db = DBI->connect("DBI:mysql:pbx:localhost:3306;mysql_socket=/var/lib/mysql/mysql.sock", "root", "ssiu2085058", {'RaiseError' => 1}); # Set global date variable ($Y, $M, $D) = (localtime)[5, 4, 3]; $Y += 1900; $M++; $date = FormatDate($Y, $M, $D); # Collect SMDR $done = 0; while (!$done) { ($count, $char) = $port->read(1); if ($count) { if ($char ne "\x00") { $smdr .= $char; } if ($char eq "\n") { ParseSMDR($smdr); open(SMDROUT,">>smdr.out"); print SMDROUT $smdr; close(SMDROUT); $smdr = ""; } } } # Close serial port $port->close || warn "Could not close serial port"; undef $port; # Close database $db->disconnect(); exit(); # SMDR parser sub ParseSMDR($) { my ($smdr) = @_; $code{"I"} = "I"; $code{"G"} = "O"; $code{"P"} = "P"; $time = substr($smdr, 0, 5) . ":00"; ($hours, $minutes, $seconds) = split /[:.]/, substr($smdr, 6, 6); $duration = sprintf("%.2d:%2d:%.2d", $hours, $minutes, (6 * $seconds)); $type = $code{substr($smdr, 13, 1)}; $trunk = substr($smdr, 16, 4); $route = substr($smdr, 21, 4); $number = substr($smdr, 26, 26); $number =~ s/^\s+//; $station = substr($smdr, 53, 4); if ($type eq "P") { ($M, $D) = split /-/, substr($smdr, 0, 5); $Y = (localtime)[5] + 1900; $date = FormatDate($Y, $M, $D); } else { $query = "INSERT smdr SET date = '$date', time = '$time', duration = '$duration', type = '$type', number = '$number', station = '$station', trunk = '$trunk', route = '$route'"; if (!$db->do($query)) { LogError("Unable to insert record"); } } } # Date formatter sub FormatDate($$$) { my ($Y, $M, $D) = @_; return (sprintf "%4d-%.2d-%.2d", $Y, $M, $D); } # Error logger sub LogError($) { my ($message) = @_; ($s, $m, $h, $M, $D, $Y) = (localtime)[0, 1, 2, 4, 3, 5]; $M++; $Y += 1900; open(ERROR, ">>error.log"); printf ERROR "%.2d/%.2d/%4d %.2d:%.2d:%.2d %s\n", $M, $D, $Y, $h, $m, $s, $message; close(ERROR); } # Signal handler sub trapper($) { my ($signal) = @_; ($s, $m, $h, $M, $D, $Y) = (localtime)[0, 1, 2, 4, 3, 5]; $M++; $Y += 1900; LogError("Trapped $signal"); $done = 1; }