schema and module should agree on column names
[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_v );
20 getopts('e:d: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   my $error = FS::cdr::batch_import( {
65     'file'     => "$cachedir/$filename"
66     'format'   => $format,
67     'params'   => { 'cdrbatch' => $filename, },
68     'empty_ok' => 1,
69   } );
70   die $error if $error;
71
72   close FILE;
73
74   if ( $opt_d ) {
75     my $mv_sftp = sftp();
76     $mv_sftp->rename($filename, "$opt_d/$filename")
77       or die "can't move $filename to $opt_d: ". $mv_sftp->error;
78   }
79
80   unlink "$cachedir/$filename";
81
82 }
83
84 1;
85
86 ###
87 # sub
88 ###
89
90 sub usage {
91   "Usage: \n  cdr.import user format servername\n";
92 }
93
94 use vars qw( $sftp );
95
96 sub sftp {
97
98   #reuse connections
99   return $sftp if $sftp && $sftp->cwd;
100
101   my %sftp = ( host => $servername );
102
103   #XXX remove these
104   $sftp{port} = 10022;
105   #$sftp{more} = '-v';
106
107   $sftp = Net::SFTP::Foreign->new(%sftp);
108   $sftp->error and die "SFTP connection failed: ". $sftp->error;
109
110   $sftp;
111 }
112