1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
#!/usr/bin/perl
use strict;
use Getopt::Std;
use Net::SFTP::Foreign;
use FS::UID qw(adminsuidsetup datasrc);
use FS::cdr;
###
# parse command line
###
use vars qw( $opt_p $opt_r $opt_e $opt_d $opt_v );
getopts('p:r:e:d:v');
$opt_e ||= 'csv';
#$opt_e = ".$opt_e" unless $opt_e =~ /^\./;
$opt_e =~ s/^\.//;
$opt_p ||= '';
my $user = shift or die &usage;
adminsuidsetup $user;
# %%%FREESIDE_CACHE%%%
my $cachedir = '/usr/local/etc/freeside/cache.'. datasrc. '/cdrs';
mkdir $cachedir unless -d $cachedir;
my $format = shift or die &usage;
use vars qw( $servername );
$servername = shift or die &usage;
###
# get the file list
###
warn "Retreiving directory listing\n" if $opt_v;
my $ls_sftp = sftp();
$ls_sftp->setcwd($opt_r) or die "can't chdir to $opt_r\n"
if $opt_r;
my $ls = $ls_sftp->ls('.', wanted => qr/^$opt_p.*\.$opt_e$/i );
###
# import each file
###
foreach my $file ( @$ls ) {
my $filename = $file->{filename};
warn "Downloading $filename\n" if $opt_v;
#get the file
my $get_sftp = sftp();
$get_sftp->get($filename, "$cachedir/$filename")
or die "Can't get $filename: ". $get_sftp->error;
warn "Processing $filename\n" if $opt_v;
my $error = FS::cdr::batch_import( {
'file' => "$cachedir/$filename",
'format' => $format,
'params' => { 'cdrbatch' => $filename, },
'empty_ok' => 1,
} );
die $error if $error;
if ( $opt_d ) {
my $mv_sftp = sftp();
$mv_sftp->rename($filename, "$opt_d/$filename")
or die "can't move $filename to $opt_d: ". $mv_sftp->error;
}
unlink "$cachedir/$filename";
}
###
# subs
###
sub usage {
"Usage: \n cdr.import user format servername\n";
}
use vars qw( $sftp );
sub sftp {
#reuse connections
return $sftp if $sftp && $sftp->cwd;
my %sftp = ( host => $servername );
$sftp = Net::SFTP::Foreign->new(%sftp);
$sftp->error and die "SFTP connection failed: ". $sftp->error;
$sftp;
}
=head1 NAME
cdr.sftp_and_import - Download CDR files from a remote server via SFTP
=head1 SYNOPSIS
cdr.sftp_and_import [ -p prefix ] [ -e extension ] [ -r remotefolder ] [ -d donefolder ] [ -v ] user format [sftpuser@]servername
=head1 DESCRIPTION
Command line tool to download CDR files from a remote server via SFTP and then
import them into the database.
-p: file prefix, if specified
-e: file extension, defaults to .csv
-r: if specified, changes into this remote folder before starting
-d: if specified, moves files to the specified folder when done
-v: verbose
user: freeside username
format: CDR format name
[sftpuser@]servername: remote server
=head1 BUGS
Only supports SFTP right now.
=head1 SEE ALSO
L<FS::cdr>
=cut
1;
|