summaryrefslogtreecommitdiff
path: root/bin/cdr.sftp_and_import
blob: 79e743f39eab1f89e056acf044ff8539155a1840 (plain)
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
#!/usr/bin/perl
#
# Usage:
#  cdr.sftp_and_import [ -e extension ] [ -d donefolder ] [ -v ] user format [sftpuser@]servername
#
# -e: file extension, defaults to .csv
# -d: if specified, moves files to the specified folder when done

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_e $opt_d $opt_v );
getopts('e:d:v');

$opt_e ||= 'csv';
#$opt_e = ".$opt_e" unless $opt_e =~ /^\./;
$opt_e =~ s/^\.//;

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();

my $ls = $ls_sftp->ls('.', wanted => qr/\.*$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;

  close FILE;

  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";

}

1;

###
# sub
###

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 );

  #XXX remove these
  $sftp{port} = 10022;
  #$sftp{more} = '-v';

  $sftp = Net::SFTP::Foreign->new(%sftp);
  $sftp->error and die "SFTP connection failed: ". $sftp->error;

  $sftp;
}