6 use Net::SFTP::Foreign::Compat;
7 use FS::UID qw(adminsuidsetup datasrc);
10 ### So much false laziness with freeside-cdr-sftp_and_import
11 ### but vocus needs special handling to choose which files to load
17 use vars qw( $opt_r $opt_d $opt_v $opt_s );
20 my $user = shift or die &usage;
23 # %%%FREESIDE_CACHE%%%
24 my $cachedir = '%%%FREESIDE_CACHE%%%/cache.'. datasrc. '/cdrs';
25 mkdir $cachedir unless -d $cachedir;
27 use vars qw( $servername );
28 $servername = shift or die &usage;
34 warn "Retrieving directory listing\n" if $opt_v;
40 $ls_sftp->setcwd($opt_r) or die "can't chdir to $opt_r\n"
43 $ls = $ls_sftp->ls('.', wanted => qr/^VAP.*\.csv\.gz$/i,
48 # vocus-specific part -- only use highest-numbered file for day
51 foreach my $filename ( @$ls ) {
52 my ($filepre,$filedate,$iter) = $filename =~ /^(VAP\d+\-)(\d{4}\-\d{2}\-\d{2})(\.\d+)?.csv.gz$/;
53 unless ($filepre && $filedate) {
54 die "unparsable filename $filename"; #no warn and skip, might process wrong file for date
56 $iter =~ s/\.// if length($iter);
57 #not clear if same day can have different initial digits after VAP,
58 # stated rule is "use the highest-numbered file for a given day",
59 # so using date as key, but die if iter can't resolve conflict
60 if (!$dates{$filedate}) {
61 $dates{$filedate} = {};
62 } elsif ($dates{$filedate}{'iter'} eq $iter) {
63 die "duplicate iterators found for $filedate\n"
65 $dates{$filedate}{'files'} ||= [];
66 push @{$dates{$filedate}{'files'}}, $filename;
67 # don't actually expect iter of 0, but just in case, 0 trumps undef
68 if (!defined($dates{$filedate}{'iter'}) or (($iter || 0) > $dates{$filedate}{'iter'})) {
69 $dates{$filedate}{'iter'} = $iter;
70 $dates{$filedate}{'pre'} = $filepre;
78 foreach my $filedate ( keys %dates ) {
80 my $filename = $dates{$filedate}{'pre'} . $filedate;
81 $filename .= '.'.$dates{$filedate}{'iter'}
82 if defined($dates{$filedate}{'iter'});
83 $filename .= '.csv.gz';
85 warn "Downloading $filename\n" if $opt_v;
89 $sftp->get($filename, "$cachedir/$filename")
91 unlink "$cachedir/$filename";
92 my $error = "Can't get $filename: ". $sftp->error . "\n";
101 warn "Processing $filename\n" if $opt_v;
103 my $ungziped = $filename;
104 $ungziped =~ s/\.gz$//;
105 if(system('gunzip', "$cachedir/$filename") != 0) {
106 unlink "$cachedir/$filename";
107 my $error = "gunzip of '$cachedir/$filename' failed\n";
116 my $import_options = {
117 'file' => "$cachedir/$ungziped",
119 'batch_namevalue' => 'vocus-'.$filedate, #should further ensure only one file per date
123 my $error = FS::cdr::batch_import($import_options);
127 unlink "$cachedir/$filename";
128 unlink "$cachedir/$ungziped";
129 $error = "Error importing $ungziped: $error\n";
140 my $timestamp = time2str('%Y-%m-%d', time);
142 foreach my $mfilename (@{$dates{$filedate}{'files'}}) {
143 warn "Moving $mfilename\n" if $opt_v;
144 $sftp->rename($mfilename, "$opt_d/$mfilename-$timestamp")
146 unlink "$cachedir/$filename";
147 unlink "$cachedir/$ungziped";
148 $error = "$mfilename imported, but can't move to $opt_d: ". $sftp->error . "\n";
161 unlink "$cachedir/$filename";
162 unlink "$cachedir/$ungziped";
173 [ -r remotefolder ] [ -d donefolder ] [ -v level ]
174 [ -s ] user [sftpuser@]servername
178 use vars qw( $sftp );
183 return $sftp if $sftp && $sftp->cwd;
185 my %sftp = ( host => $servername );
187 $sftp = Net::SFTP::Foreign->new(%sftp);
188 $sftp->error and die "SFTP connection failed: ". $sftp->error;
195 freeside-cdr-vocus - Download Vocus CDR files
200 [ -r remotefolder ] [ -d donefolder ] [ -v level ]
201 [ -s ] user [sftpuser@]servername
205 Command line tool to download Vocus CDR files from a remote server via SFTP
206 and then import them into the database. CDR tarrif types need to be
207 configured as CDR types in freeside. If multiple files for a given day are
208 found, the one with the highest iterator will be used (though upon successful
209 import, all existing files for the day will be moved by the -d option.)
211 -r: if specified, changes into this remote folder before starting
213 -d: if specified, moves files to the specified folder when done
217 -s: Warn and skip files which could not be imported rather than abort
219 user: freeside username
221 [sftpuser@]servername: remote server