add CDR batch TFTP feature, RT#3113
[freeside.git] / bin / cdr.sftp_and_import
1 #!/usr/bin/perl
2 #
3 # Usage:
4 #  cdr.sftp_and_import [ -e extension ] [ -d donefolder ] [ -v ] user format [sftpuser@]servername
5 #
6 # -e: file extension, defaults to .csv
7 # -d: if specified, moves files to the specified folder when done
8
9 use strict;
10 use Getopt::Std;
11 use Net::SFTP::Foreign;
12 use FS::UID qw(adminsuidsetup datasrc);
13 use FS::cdr;
14
15 ###
16 # parse command line
17 ###
18
19 use vars qw( $opt_e $opt_d $opt_u $opt_v );
20 getopts('e:d:u:v');
21
22 $opt_e ||= 'csv';
23 #$opt_e = ".$opt_e" unless $opt_e =~ /^\./;
24 $opt_e =~ s/^\.//;
25
26 my $user = shift or die &usage;
27 adminsuidsetup $user;
28
29 # %%%FREESIDE_CACHE%%%
30 my $cachedir = '/usr/local/etc/freeside/cache.'. datasrc. '/cdrs';
31 mkdir $cachedir unless -d $cachedir;
32
33 my $format = shift or die &usage;
34
35 use vars qw( $servername );
36 $servername = shift or die &usage;
37
38 ###
39 # get the file list
40 ###
41
42 warn "Retreiving directory listing\n" if $opt_v;
43
44 my $ls_sftp = sftp();
45
46 my $ls = $ls_sftp->ls('.', wanted => qr/\.*$opt_e$/i );
47
48 ###
49 # import each file
50 ###
51
52 foreach my $file ( @$ls ) {
53
54   my $filename = $file->{filename};
55   warn "Downloading $filename\n" if $opt_v;
56
57   #get the file
58   my $get_sftp = sftp();
59   $get_sftp->get($filename, "$cachedir/$filename")
60     or die "Can't get $filename: ". $get_sftp->error;
61
62   warn "Processing $filename\n" if $opt_v;
63
64   open(FILE, "$cachedir/$filename") or die "can't read $cachedir/$filename: $!";
65
66   my $error = FS::cdr::batch_import( {
67     'filehandle' => *FILE{IO},
68     'format'     => $format,
69     'cdrbatch'   => $filename,
70     'empty_ok'   => 1,
71   } );
72   die $error if $error;
73
74   close FILE;
75
76   if ( $opt_d ) {
77     my $mv_sftp = sftp();
78     $mv_sftp->rename($filename, "$opt_d/$filename")
79       or die "can't move $filename to $opt_d: ". $mv_sftp->error;
80   }
81
82   unlink "$cachedir/$filename";
83
84 }
85
86 1;
87
88 ###
89 # sub
90 ###
91
92 sub usage {
93   "Usage: \n  cdr.import user format servername\n";
94 }
95
96 use vars qw( $sftp );
97
98 sub sftp {
99
100   #reuse connections
101   return $sftp if $sftp && $sftp->cwd;
102
103   my %sftp = ( host => $servername );
104
105   #XXX remove these
106   $sftp{port} = 10022;
107   #$sftp{more} = '-v';
108
109   $sftp = Net::SFTP::Foreign->new(%sftp);
110   $sftp->error and die "SFTP connection failed: ". $sftp->error;
111
112   $sftp;
113 }
114