| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Net::FTPTurboSync::PrgOpts; |
|
2
|
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
1018
|
use Net::Netrc; |
|
|
1
|
|
|
|
|
15173
|
|
|
|
1
|
|
|
|
|
2964
|
|
|
4
|
|
|
|
|
|
|
# singleton :) |
|
5
|
|
|
|
|
|
|
our $theOpts = undef; |
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
sub new { |
|
8
|
0
|
|
|
0
|
0
|
|
my ($class, $argv ) = @_; |
|
9
|
0
|
|
|
|
|
|
my $self = { |
|
10
|
|
|
|
|
|
|
dbh=>undef, |
|
11
|
|
|
|
|
|
|
newDB=>0, |
|
12
|
|
|
|
|
|
|
dbpath=>"", |
|
13
|
|
|
|
|
|
|
uildDB=>0, |
|
14
|
|
|
|
|
|
|
nodelete=>0, |
|
15
|
|
|
|
|
|
|
returncode=>0, |
|
16
|
|
|
|
|
|
|
configfile=>$ENV{"HOME"}."/.turbo-ftp-sync", |
|
17
|
|
|
|
|
|
|
# basics |
|
18
|
|
|
|
|
|
|
localdir=>"", |
|
19
|
|
|
|
|
|
|
remoteURL=>"", |
|
20
|
|
|
|
|
|
|
ftpuser=>"anonymous", |
|
21
|
|
|
|
|
|
|
ftppasswd=>"anonymos", |
|
22
|
|
|
|
|
|
|
ftpserver=>"localhost", |
|
23
|
|
|
|
|
|
|
ftpdir=>"", |
|
24
|
|
|
|
|
|
|
maxerrors=> 3, |
|
25
|
|
|
|
|
|
|
ftptimeout=>120, |
|
26
|
|
|
|
|
|
|
# verbosity |
|
27
|
|
|
|
|
|
|
doverbose=>1, |
|
28
|
|
|
|
|
|
|
dodebug=>0, |
|
29
|
|
|
|
|
|
|
doquiet=>0, |
|
30
|
|
|
|
|
|
|
doinfoonly=>0, |
|
31
|
|
|
|
|
|
|
infotext=>"", |
|
32
|
|
|
|
|
|
|
docheckfirst=>0, |
|
33
|
|
|
|
|
|
|
ignoremask => "", |
|
34
|
|
|
|
|
|
|
followsymlinks=>0, |
|
35
|
|
|
|
|
|
|
doflat=>0, |
|
36
|
|
|
|
|
|
|
}; |
|
37
|
0
|
|
|
|
|
|
bless $self, $class; |
|
38
|
0
|
|
|
|
|
|
$self->parseCommandLineParameters( $argv ); |
|
39
|
0
|
|
|
|
|
|
return $self; |
|
40
|
|
|
|
|
|
|
} |
|
41
|
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
# return cfgfoptions |
|
43
|
|
|
|
|
|
|
sub readConfigFile { |
|
44
|
0
|
|
|
0
|
0
|
|
my ( $self ) = @_; |
|
45
|
0
|
|
|
|
|
|
my @cfgfoptions=(); |
|
46
|
0
|
0
|
|
|
|
|
if ($self->{configfile} ne "") { |
|
47
|
0
|
0
|
|
|
|
|
if (-r $self->{configfile}) { |
|
48
|
|
|
|
|
|
|
#print "Reading config file.\n"; # For major problem debugging |
|
49
|
0
|
|
|
|
|
|
open (CONFIGFILE,"<$self->{configfile}"); |
|
50
|
0
|
|
|
|
|
|
while () { |
|
51
|
0
|
|
|
|
|
|
$_ =~ s/([ \n\r]*$|\.\.|#.*$)//gs; |
|
52
|
0
|
0
|
|
|
|
|
if ($_ eq "") { next; } |
|
|
0
|
|
|
|
|
|
|
|
53
|
0
|
0
|
0
|
|
|
|
if ( ($_ =~ /[^=]+=[^=]+/) || ($_ =~ /^-[a-zA-Z]+$/) ) { push @cfgfoptions, $_; } |
|
|
0
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
} |
|
55
|
0
|
|
|
|
|
|
close (CONFIGFILE); |
|
56
|
|
|
|
|
|
|
} # else { print "Config file does not exist.\n"; } # For major problem debugging |
|
57
|
|
|
|
|
|
|
} # else { print "No config file to read.\n"; } # For major problem debugging |
|
58
|
0
|
|
|
|
|
|
return \@cfgfoptions; |
|
59
|
|
|
|
|
|
|
} |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
sub print_options() { |
|
62
|
0
|
|
|
0
|
0
|
|
my ( $self ) = @_; |
|
63
|
0
|
|
|
|
|
|
print "\nPrinting options:\n"; |
|
64
|
|
|
|
|
|
|
# meta |
|
65
|
0
|
|
|
|
|
|
print "returncode = ", $self->{returncode} , "\n"; |
|
66
|
0
|
|
|
|
|
|
print "configfile = ", $self->{configfile} , "\n"; |
|
67
|
|
|
|
|
|
|
# basiscs |
|
68
|
0
|
|
|
|
|
|
print "localdir = ", $self->{localdir} , "\n"; |
|
69
|
|
|
|
|
|
|
# FTP stuff |
|
70
|
0
|
|
|
|
|
|
print "remoteURL = ", $self->{remoteURL} , "\n"; |
|
71
|
0
|
|
|
|
|
|
print "ftpuser = ", $self->{ftpuser} , "\n"; |
|
72
|
0
|
|
|
|
|
|
print "ftppasswd = ", $self->{ftppasswd} , "\n"; |
|
73
|
0
|
|
|
|
|
|
print "ftpserver = ", $self->{ftpserver} , "\n"; |
|
74
|
0
|
|
|
|
|
|
print "ftpdir = ", $self->{ftpdir} , "\n"; |
|
75
|
|
|
|
|
|
|
# verbsityosity |
|
76
|
0
|
|
|
|
|
|
print "doverbose = ", $self->{doverbose} , "\n"; |
|
77
|
0
|
|
|
|
|
|
print "dodebug = ", $self->{dodebug} , "\n"; |
|
78
|
0
|
|
|
|
|
|
print "doquiet = ", $self->{doquiet} , "\n"; |
|
79
|
|
|
|
|
|
|
# print "db = ", $dbh , "\n"; |
|
80
|
|
|
|
|
|
|
# |
|
81
|
0
|
|
|
|
|
|
print "doinfoonly = ", $self->{doinfoonly} , "\n"; |
|
82
|
0
|
|
|
|
|
|
print "\n"; |
|
83
|
|
|
|
|
|
|
} |
|
84
|
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
sub print_syntax() { |
|
86
|
0
|
|
|
0
|
0
|
|
print "\n"; |
|
87
|
0
|
|
|
|
|
|
print "turbo-ftp-sync.pl $VERSION (2011-05-12)\n"; |
|
88
|
0
|
|
|
|
|
|
print "author is Daneel S. Yaitskov ( rtfm.rtfm.rtfm\@gmail.com )\n"; |
|
89
|
0
|
|
|
|
|
|
print "\n"; |
|
90
|
0
|
|
|
|
|
|
print " turbo-ftp-sync [ options ] [ localdir remoteURL ]\n"; |
|
91
|
0
|
|
|
|
|
|
print " options = [-dfgpqv] [ cfg|ftpuser|ftppasswd|ftpserver|ftpdir=value ... ] \n"; |
|
92
|
0
|
|
|
|
|
|
print " localdir local directory, defaults to \".\".\n"; |
|
93
|
0
|
|
|
|
|
|
print " remoteUrl full FTP URL, scheme\n"; |
|
94
|
0
|
|
|
|
|
|
print ' ftp://[ftpuser[:ftppasswd]@]ftpserver/ftpdir'."\n"; |
|
95
|
0
|
|
|
|
|
|
print " ftpdir is relative, so double / for absolute paths as well as /\n"; |
|
96
|
0
|
|
|
|
|
|
print " -c | -C like -i, but then prompts whether to actually do work\n"; |
|
97
|
0
|
|
|
|
|
|
print " -d | -D turns debug output (including verbose output) on\n"; |
|
98
|
0
|
|
|
|
|
|
print " -f | -F flat operation, no subdir recursion\n"; |
|
99
|
0
|
|
|
|
|
|
print " -h | -H prints out this help text\n"; |
|
100
|
0
|
|
|
|
|
|
print " -i | -I forces info mode, only telling what would be done\n"; |
|
101
|
0
|
|
|
|
|
|
print " -n | -N no deletion of obsolete files or directories\n"; |
|
102
|
0
|
|
|
|
|
|
print " -l | -L follow local symbolic links as if they were directories\n"; |
|
103
|
0
|
|
|
|
|
|
print " -q | -Q turns quiet operation on\n"; |
|
104
|
0
|
|
|
|
|
|
print " -b | -B build DB only - i.e don't upload data to remote host\n"; |
|
105
|
0
|
|
|
|
|
|
print " -v | -V turnes verbose output on\n"; |
|
106
|
0
|
|
|
|
|
|
print " maxerrors= if not 0 then program exit with nonzero code.\n"; |
|
107
|
0
|
|
|
|
|
|
print " cfg= read parameters and options from file defined by value.\n"; |
|
108
|
0
|
|
|
|
|
|
print " ftpserver= defines the FTP server, defaults to \"localhost\".\n"; |
|
109
|
0
|
|
|
|
|
|
print " ftpuser= defines the FTP user, defaults to \"ftp\".\n"; |
|
110
|
0
|
|
|
|
|
|
print " db= defines the file where info about uploaded files is stored.\n"; |
|
111
|
0
|
|
|
|
|
|
print " ftppasswd= defines the FTP password, defaults to \"anonymous\".\n"; |
|
112
|
0
|
|
|
|
|
|
print " ignoremask= defines a regexp to ignore certain files, like .svn"."\n"; |
|
113
|
0
|
|
|
|
|
|
print "\n"; |
|
114
|
0
|
|
|
|
|
|
print " Later mentioned options and parameters overwrite those mentioned earlier.\n"; |
|
115
|
0
|
|
|
|
|
|
print " Command line options and parameters overwrite those in the config file.\n"; |
|
116
|
0
|
|
|
|
|
|
print " Don't use '\"', although mentioned default values might motiviate you to.\n"; |
|
117
|
0
|
|
|
|
|
|
print "\n"; |
|
118
|
0
|
|
|
|
|
|
print " If ftpuser or ftppasswd resovle to ? (no matter through which options),\n"; |
|
119
|
0
|
|
|
|
|
|
print " turbo-ftp-sync.pl asks you for those interactively.\n"; |
|
120
|
0
|
|
|
|
|
|
print "\n"; |
|
121
|
0
|
|
|
|
|
|
print " PROGRAM CAN UPLOAD CHANGES ONLY IN ONE DIRECTION\n"; |
|
122
|
0
|
|
|
|
|
|
print " FROM YOUR MACHINE TO REMOTE MACHINE.\n"; |
|
123
|
0
|
|
|
|
|
|
print " ALSO PROGRAM CANNOT KNOW ABOUT CHANGES WERE MADE ON A REMOTE MACHINE.\n"; |
|
124
|
0
|
|
|
|
|
|
print "\n"; |
|
125
|
0
|
|
|
|
|
|
print " Demo usage: turbo-ftp-sync.pl db=db.db webroot ftp://yaitskov:secret\@ftp.vosi.biz//\n"; |
|
126
|
0
|
|
|
|
|
|
print "\n"; |
|
127
|
|
|
|
|
|
|
} |
|
128
|
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
sub parseParameters { |
|
130
|
0
|
|
|
0
|
0
|
|
my ( $self, $curopt ) = @_; |
|
131
|
0
|
|
|
|
|
|
$self->{noofopts}++; |
|
132
|
0
|
|
|
|
|
|
my ($fname, $fvalue) = split /=/, $curopt, 2; |
|
133
|
0
|
0
|
|
|
|
|
if ($fname eq "cfg") { return; } |
|
|
0
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
elsif ($fname eq "ftpdir") { |
|
135
|
0
|
|
|
|
|
|
$self->{ftpdir} =$fvalue; |
|
136
|
0
|
0
|
|
|
|
|
if ($self->{ftpdir} ne "/") { $self->{ftpdir}=~s/\/$//; } |
|
|
0
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
} |
|
138
|
|
|
|
|
|
|
elsif ($fname =~ m/ftppass(w(or)?d)?/i) { |
|
139
|
0
|
|
|
|
|
|
$self->{ftppasswd}=$fvalue; |
|
140
|
|
|
|
|
|
|
} |
|
141
|
|
|
|
|
|
|
elsif ($fname eq "ftpserver") { |
|
142
|
0
|
|
|
|
|
|
$self->{ftpserver} =$fvalue; |
|
143
|
|
|
|
|
|
|
} |
|
144
|
|
|
|
|
|
|
elsif ($fname eq "ftpuser") { |
|
145
|
0
|
|
|
|
|
|
$self->{ftpuser} =$fvalue; |
|
146
|
|
|
|
|
|
|
}elsif ( $fname eq "maxerrors" ){ |
|
147
|
0
|
0
|
|
|
|
|
if ( $fvalue =~ /^[0-9]{1,3}$/ ){ |
|
148
|
0
|
|
|
|
|
|
$self->{maxerrors} = $fvalue; |
|
149
|
|
|
|
|
|
|
}else { |
|
150
|
0
|
|
|
|
|
|
$self->{returncode} += 1; |
|
151
|
0
|
|
|
|
|
|
print STDERR "maxerrors must non-negative integer but got: '$fvalue'\n" ; |
|
152
|
|
|
|
|
|
|
} |
|
153
|
|
|
|
|
|
|
}elsif ($fname eq "localdir") { |
|
154
|
0
|
|
|
|
|
|
$self->{localdir} =$fvalue; $self->{localdir}=~s/\/$//; |
|
|
0
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
} |
|
156
|
0
|
0
|
|
|
|
|
elsif ($fname eq "timeout") { if ($fvalue>0) { $self->{ftptimeout} =$fvalue; } } |
|
|
0
|
|
|
|
|
|
|
|
157
|
0
|
|
|
|
|
|
elsif ($fname eq "ignoremask") { $self->{ignoremask} = $fvalue; } |
|
158
|
|
|
|
|
|
|
elsif ($fname eq "db" ){ |
|
159
|
0
|
|
|
|
|
|
$self->{dbpath} = $fvalue; |
|
160
|
|
|
|
|
|
|
} |
|
161
|
|
|
|
|
|
|
} |
|
162
|
|
|
|
|
|
|
sub parseFtpParameter { |
|
163
|
0
|
|
|
0
|
0
|
|
my ( $self, $curopt ) = @_; |
|
164
|
0
|
|
|
|
|
|
$self->{noofopts}++; |
|
165
|
0
|
|
|
|
|
|
$self->{remoteURL} = $curopt; |
|
166
|
0
|
|
|
|
|
|
$self->parseRemoteURL(); |
|
167
|
|
|
|
|
|
|
} |
|
168
|
|
|
|
|
|
|
sub parseRemoteURL() { |
|
169
|
0
|
|
|
0
|
0
|
|
my ( $self ) = @_; |
|
170
|
0
|
0
|
|
|
|
|
if ($self->{remoteURL} =~ /^ftp:\/\/(([^@\/\\\:]+)(:([^@\/\\\:]+))?@)?([a-zA-Z01-9\.\-]+)\/(.*)/) { |
|
171
|
|
|
|
|
|
|
#print "DEBUG: parsing ".$remoteURL."\n"; |
|
172
|
|
|
|
|
|
|
#print "match 1 = ".$1."\n"; |
|
173
|
|
|
|
|
|
|
#print "match 2 = ".$2."\n"; |
|
174
|
|
|
|
|
|
|
#print "match 3 = ".$3."\n"; |
|
175
|
|
|
|
|
|
|
#print "match 4 = ".$4."\n"; |
|
176
|
|
|
|
|
|
|
#print "match 5 = ".$5."\n"; |
|
177
|
|
|
|
|
|
|
#print "match 6 = ".$6."\n"; |
|
178
|
|
|
|
|
|
|
#print "match 7 = ".$7."\n"; |
|
179
|
0
|
0
|
|
|
|
|
if (length($2) > 0) { $self->{ftpuser} = $2; } |
|
|
0
|
|
|
|
|
|
|
|
180
|
0
|
0
|
|
|
|
|
if (length($4) > 0) { $self->{ftppasswd} = $4; } |
|
|
0
|
|
|
|
|
|
|
|
181
|
0
|
|
|
|
|
|
$self->{ftpserver} = $5; |
|
182
|
0
|
|
|
|
|
|
$self->{ftpdir} = $6; |
|
183
|
0
|
0
|
|
|
|
|
if ($self->{ftpdir} ne "/") { $self->{ftpdir}=~s/\/$//; } |
|
|
0
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
} |
|
185
|
|
|
|
|
|
|
} |
|
186
|
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
sub parseOptions { |
|
188
|
0
|
|
|
0
|
0
|
|
my ( $self, $curopt ) = @_; |
|
189
|
0
|
|
|
|
|
|
my $i; |
|
190
|
0
|
|
|
|
|
|
for ($i=1; $i < length($curopt); $i++) { |
|
191
|
0
|
|
|
|
|
|
my $curoptchar = substr ($curopt, $i, 1); |
|
192
|
0
|
|
|
|
|
|
$self->{noofopts}++; |
|
193
|
0
|
0
|
|
|
|
|
if ($curoptchar =~ /[cC]/) { $self->{docheckfirst}=1; } |
|
|
0
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
194
|
0
|
|
|
|
|
|
elsif ($curoptchar =~ /[dD]/) { $self->{dodebug}=1; $self->{doverbose}=3; $self->{doquiet}=0; } |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
195
|
0
|
|
|
|
|
|
elsif ($curoptchar =~ /[fF]/) { $self->{doflat}=1; } |
|
196
|
0
|
|
|
|
|
|
elsif ($curoptchar =~ /[hH?]/) { $self->print_syntax(); exit 0; } |
|
|
0
|
|
|
|
|
|
|
|
197
|
0
|
|
|
|
|
|
elsif ($curoptchar =~ /[iI]/) { $self->{doinfoonly}=1; } |
|
198
|
0
|
|
|
|
|
|
elsif ($curoptchar =~ /[lL]/) { $self->{followsymlinks}=1; } |
|
199
|
0
|
|
|
|
|
|
elsif ($curoptchar =~ /[qQ]/) { $self->{dodebug}=0; $self->{doverbose}=0; $self->{doquiet}=1; } |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
200
|
0
|
|
|
|
|
|
elsif ($curoptchar =~ /[vV]/) { $self->{doverbose}++; } |
|
201
|
0
|
|
|
|
|
|
elsif ($curoptchar =~ /[nN]/) { $self->{nodelete}=1; } |
|
202
|
0
|
|
|
|
|
|
elsif ($curoptchar =~ /[bB]/) { $self->{buildDB} = 1 ; } |
|
203
|
0
|
|
|
|
|
|
else { print "ERROR: Unknown option: \"-".$curoptchar."\"\n"; $self->{returncode}+=1; } |
|
|
0
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
} |
|
205
|
|
|
|
|
|
|
} |
|
206
|
|
|
|
|
|
|
sub parseLocalDir { |
|
207
|
0
|
|
|
0
|
0
|
|
my ( $self, $curopt ) = @_; |
|
208
|
0
|
0
|
|
|
|
|
if ($self->{localdir} eq "") { |
|
209
|
0
|
|
|
|
|
|
$self->{noofopts}++; |
|
210
|
0
|
|
|
|
|
|
$self->{localdir} = $curopt; |
|
211
|
|
|
|
|
|
|
} else { |
|
212
|
0
|
|
|
|
|
|
print "ERROR: Unknown parameter: \"".$curopt."\"\n"; $self->{returncode}+=1 |
|
|
0
|
|
|
|
|
|
|
|
213
|
|
|
|
|
|
|
} |
|
214
|
|
|
|
|
|
|
} |
|
215
|
|
|
|
|
|
|
# function has side effect; return nothing |
|
216
|
|
|
|
|
|
|
# it changes variables of current package |
|
217
|
|
|
|
|
|
|
sub parseOptionsAndParameters { |
|
218
|
0
|
|
|
0
|
0
|
|
my ( $self, $cfgfoptions, $cloptions ) = @_; |
|
219
|
0
|
|
|
|
|
|
$self->{noofopts}=0; |
|
220
|
0
|
|
|
|
|
|
for my $curopt (@$cfgfoptions, @$cloptions) { |
|
221
|
0
|
0
|
|
|
|
|
if ($curopt =~ /^-[a-zA-Z]/) { |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
222
|
0
|
|
|
|
|
|
$self->parseOptions( $curopt ); |
|
223
|
|
|
|
|
|
|
} |
|
224
|
|
|
|
|
|
|
elsif ($curopt =~ /^ftp:\/\/(([^@\/\\\:]+)(:([^@\/\\\:]+))?@)?([a-zA-Z01-9\.\-]+)\/(.*)/) { |
|
225
|
0
|
|
|
|
|
|
$self->parseFtpParameter ( $curopt ); |
|
226
|
|
|
|
|
|
|
} |
|
227
|
|
|
|
|
|
|
elsif ($curopt =~ /^[a-z]+=.+/) { |
|
228
|
0
|
|
|
|
|
|
$self->parseParameters ( $curopt ); |
|
229
|
|
|
|
|
|
|
} |
|
230
|
|
|
|
|
|
|
else { |
|
231
|
0
|
|
|
|
|
|
$self->parseLocalDir ( $curopt ); |
|
232
|
|
|
|
|
|
|
} |
|
233
|
|
|
|
|
|
|
} |
|
234
|
0
|
0
|
|
|
|
|
if (0 == $self->{noofopts}) { $self->print_syntax(); exit 0; } |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
235
|
|
|
|
|
|
|
} |
|
236
|
|
|
|
|
|
|
sub parseCfg { |
|
237
|
0
|
|
|
0
|
0
|
|
my ( $self, $argv ) = @_ ; |
|
238
|
0
|
|
|
|
|
|
my @cloptions=(); |
|
239
|
0
|
|
|
|
|
|
for my $curopt (@ARGV) { |
|
240
|
0
|
0
|
|
|
|
|
if ($curopt =~ /^cfg=/) { |
|
241
|
0
|
|
|
|
|
|
$self->{configfile}="$'"; |
|
242
|
0
|
0
|
|
|
|
|
if (! -r $self->{configfile}) { |
|
243
|
0
|
|
|
|
|
|
print "Config file does not exist: " |
|
244
|
|
|
|
|
|
|
. $self->{configfile} . "\n"; |
|
245
|
0
|
|
|
|
|
|
$self->{returncode} += 1; |
|
246
|
|
|
|
|
|
|
} |
|
247
|
|
|
|
|
|
|
} else { |
|
248
|
0
|
|
|
|
|
|
push @cloptions, $curopt; |
|
249
|
|
|
|
|
|
|
} |
|
250
|
|
|
|
|
|
|
} |
|
251
|
0
|
|
|
|
|
|
return \@cloptions; |
|
252
|
|
|
|
|
|
|
} |
|
253
|
|
|
|
|
|
|
sub netRC { |
|
254
|
0
|
|
|
0
|
0
|
|
my ( $self ) = @_; |
|
255
|
0
|
0
|
0
|
|
|
|
if ( ($self->{ftpserver} ne "") and ($self->{ftppasswd} eq "anonymous") ) { |
|
256
|
0
|
0
|
|
|
|
|
if ($self->{ftpuser} eq "ftp") { |
|
257
|
0
|
|
|
|
|
|
my $netrcdata = Net::Netrc->lookup($self->{ftpserver}); |
|
258
|
0
|
0
|
|
|
|
|
if ( defined $netrcdata ) { |
|
259
|
0
|
|
|
|
|
|
$self->{ftpuser} = $netrcdata->login; |
|
260
|
0
|
|
|
|
|
|
$self->{ftppasswd} = $netrcdata->password; |
|
261
|
|
|
|
|
|
|
} |
|
262
|
|
|
|
|
|
|
} else { |
|
263
|
0
|
|
|
|
|
|
my $netrcdata = Net::Netrc->lookup($self->{ftpserver},$self->{ftpuser}); |
|
264
|
0
|
0
|
|
|
|
|
if ( defined $netrcdata ) { |
|
265
|
0
|
|
|
|
|
|
$self->{ftppasswd} = $netrcdata->password; |
|
266
|
|
|
|
|
|
|
} |
|
267
|
|
|
|
|
|
|
} |
|
268
|
|
|
|
|
|
|
} |
|
269
|
|
|
|
|
|
|
} |
|
270
|
|
|
|
|
|
|
sub validateFtp { |
|
271
|
0
|
|
|
0
|
0
|
|
my ( $self ) = @_; |
|
272
|
0
|
0
|
|
|
|
|
if ($self->{ftpuser} eq "?") { print "User: "; $self->{ftpuser}=; chomp($self->{ftpuser}); } |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
273
|
0
|
0
|
|
|
|
|
if ($self->{ftppasswd} eq "?") { print "Password: "; $self->{ftppasswd}=; chomp($self->{ftppasswd}); } |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
274
|
0
|
0
|
|
|
|
|
if ($self->{ftpserver} eq "") { print "ERROR: No FTP server given.\n"; $self->{returncode}+=1; } |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
275
|
0
|
0
|
|
|
|
|
if ($self->{ftpdir} eq "") { print "ERROR: No FTP directory given.\n"; $self->{returncode}+=1; } |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
276
|
0
|
0
|
|
|
|
|
if ($self->{ftpuser} eq "") { print "ERROR: No FTP user given.\n"; $self->{returncode}+=1; } |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
277
|
0
|
0
|
|
|
|
|
if ($self->{ftppasswd} eq "") { print "ERROR: No FTP password given.\n"; $self->{returncode}+=1; } |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
} |
|
279
|
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
sub parseCommandLineParameters { |
|
281
|
0
|
|
|
0
|
0
|
|
my ( $self, $argv ) = @_; |
|
282
|
0
|
|
|
|
|
|
my $cloptions = $self->parseCfg ( $argv ); |
|
283
|
0
|
|
|
|
|
|
my $cfgfoptions = $self->readConfigFile (); |
|
284
|
0
|
|
|
|
|
|
$self->parseOptionsAndParameters( $cfgfoptions, $cloptions ); |
|
285
|
0
|
0
|
|
|
|
|
if ( $self->{dbpath} eq "" ){ |
|
286
|
0
|
|
|
|
|
|
die "Required path to a file with the database (use parameter db=)"; |
|
287
|
|
|
|
|
|
|
} |
|
288
|
0
|
0
|
|
|
|
|
if ( $self->{dodebug} ) { $self->print_options(); } |
|
|
0
|
|
|
|
|
|
|
|
289
|
0
|
0
|
0
|
|
|
|
if ( ($self->{localdir} eq "" ) || (! -d $self->{localdir} ) ) { |
|
290
|
0
|
|
|
|
|
|
print "ERROR: Local directory does not exist: '$self->{localdir}'\n"; |
|
291
|
0
|
|
|
|
|
|
$self->{returncode}+=1; |
|
292
|
|
|
|
|
|
|
} |
|
293
|
0
|
|
|
|
|
|
$self->{newDB} = ! -f $self->{dbpath}; |
|
294
|
0
|
0
|
|
|
|
|
if ( ! $self->{buildDB} ) { |
|
295
|
0
|
|
|
|
|
|
$self->netRC(); |
|
296
|
0
|
|
|
|
|
|
$self->validateFtp(); |
|
297
|
|
|
|
|
|
|
} |
|
298
|
0
|
0
|
|
|
|
|
if ($self->{returncode} > 0) { |
|
299
|
0
|
|
|
|
|
|
die "Aborting due to missing or wrong options!" |
|
300
|
|
|
|
|
|
|
. "Call turbo-ftp-sync -? for more information.\n"; |
|
301
|
|
|
|
|
|
|
} |
|
302
|
|
|
|
|
|
|
} |
|
303
|
|
|
|
|
|
|
|
|
304
|
|
|
|
|
|
|
1; |