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