next if $line =~ /^\s*$/; #skip empty lines
$line = &{$row_callback}($line) if $row_callback;
+
+ next if $line =~ /^\s*$/; #skip empty lines
$parser->parse($line) or do {
$dbh->rollback if $oldAutoCommit;
- return "can't parse: ". $parser->error_input();
+ return "can't parse: ". $parser->error_input() . " " . $parser->error_diag;
};
@columns = $parser->fields();
my $iopt = _import_options;
$opt->{$_} = $iopt->{$_} foreach keys %$iopt;
+ if ( defined $opt->{'cdrtypenum'} ) {
+ $opt->{'preinsert_callback'} = sub {
+ my($record,$param) = (shift,shift);
+ $record->cdrtypenum($opt->{'cdrtypenum'});
+ '';
+ };
+ }
+
FS::Record::batch_import( $opt );
}
--- /dev/null
+package FS::cdr::kannel;
+
+use strict;
+use vars qw( @ISA %info );
+use FS::cdr qw( _cdr_date_parser_maker );
+
+@ISA = qw(FS::cdr);
+
+%info = (
+ 'name' => 'Kannel',
+ 'weight' => 25,
+ 'header' => 1,
+ 'type' => 'csv',
+ 'row_callback' => sub { my $row = shift;
+ return ' ' if $row =~ /.*Log (begins|ends)$/;
+ die "invalid row format" unless
+ $row =~ /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) ([A-Za-z ]+) (\[SMSC:\w+\] \[SVC:\w*\] \[ACT:\w*\] \[BINF:\w*\] \[FID:\w*\]) \[from:(|\+)(\d+)\] \[to:(|\+)(\d+)\] (\[flags:.*?\]) \[msg:(\d+):(.*?)\] (\[udh:.*?\])$/;
+ $row = "$1,$2,$3,$5,$7,$8,$9,$11";
+ $row;
+ },
+ 'import_fields' => [
+ _cdr_date_parser_maker('startdate'),
+ 'disposition',
+ 'userfield', # [SMSC: ... FID...], five fields
+ 'src',
+ 'dst',
+
+ sub { my($cdr, $flags) = @_;
+ $cdr->userfield($cdr->userfield." $flags");
+ },
+
+ # setting billsec to the msg length as we need billsec set non-zero
+ 'billsec',
+
+ sub { my($cdr, $udh) = @_;
+ $cdr->userfield($cdr->userfield." $udh");
+ },
+ ],
+);
+
+sub skip { map {''} (1..$_[0]) }
+
+1;
# parse command line
###
-use vars qw( $opt_m $opt_p $opt_r $opt_e $opt_d $opt_v $opt_P $opt_a );
-getopts('m:p:r:e:d:v:P:a');
+use vars qw( $opt_m $opt_p $opt_r $opt_e $opt_d $opt_v $opt_P $opt_a $opt_c );
+getopts('c:m:p:r:e:d:v:P:a');
$opt_e ||= 'csv';
#$opt_e = ".$opt_e" unless $opt_e =~ /^\./;
$opt_p ||= '';
+die "invalid cdrtypenum" if $opt_c && $opt_c !~ /^\d+$/;
+
my %options = ();
my $user = shift or die &usage;
warn "Processing $filename\n" if $opt_v;
- my $error = FS::cdr::batch_import( {
+ my $import_options = {
'file' => "$cachedir/$filename",
'format' => $format,
'batch_namevalue' => $filename,
'empty_ok' => 1,
- } );
+ };
+ $import_options->{'cdrtypenum'} = $opt_c if $opt_c;
+
+ my $error = FS::cdr::batch_import($import_options);
die $error if $error;
if ( $opt_d ) {
cdr.sftp_and_import [ -m method ] [ -p prefix ] [ -e extension ]
[ -r remotefolder ] [ -d donefolder ] [ -v level ] [ -P port ]
- [ -a ] user format [sftpuser@]servername
+ [ -a ] [ -c cdrtypenum ] user format [sftpuser@]servername
=head1 DESCRIPTION
-v: set verbosity level; this script only has one level, but it will
be passed as the 'debug' argument to the transport method
+-c: cdrtypenum to set, defaults to none
+
user: freeside username
format: CDR format name