2 # Net.pl: FTP//HTTP helper
4 # Version: v0.1 (20000309)
8 if (&IsParam("useStrict")) { use strict; }
12 # Usage: &ftpGet($host,$dir,$file,[$lfile]);
14 my ($host,$dir,$file,$lfile) = @_;
17 return unless &loadPerlModule("Net::FTP");
19 &status("FTP: opening connection to $host.") if ($verbose_ftp);
20 my $ftp = Net::FTP->new($host,
32 &status("FTP: logged in successfully.") if ($verbose_ftp);
34 &status("FTP: login failed.");
40 if ($ftp->cwd($dir)) {
41 &status("FTP: changed dirs to $dir.") if ($verbose_ftp);
43 &status("FTP: cwd dir ($dir) does not exist.");
48 # get the size of the file.
50 if ($size = $ftp->size($file)) {
51 &status("FTP: file size is $size") if ($verbose_ftp);
52 my $thisfile = $file || $lfile;
53 &DEBUG("lfile => '$lfile'.");
55 $lsize = -s $thisfile;
57 &status("FTP: local size is $lsize; downloading.") if ($verbose_ftp);
59 &status("FTP: same size; skipping.");
60 &system("touch $thisfile"); # lame hack.
66 &status("FTP: file does not exist.");
71 my $start_time = &gettimeofday();
73 &status("FTP: getting $file as $lfile.") if ($verbose_ftp);
74 $ftp->get($file,$lfile);
76 &status("FTP: getting $file.") if ($verbose_ftp);
79 &DEBUG("FTP: remsize => '$size'.");
81 &DEBUG("FTP: locsize => '$lsize'.");
82 if ($size != $lsize) {
83 &WARN("FTP: downloaded file seems truncated. FIXME.");
87 my $delta_time = &gettimeofday() - $start_time;
88 if ($delta_time > 0 and $verbose_ftp) {
89 &status(sprintf("FTP: %.02f sec to complete.", $delta_time));
90 my ($rateunit,$rate) = ("B", $size / $delta_time);
95 &status(sprintf("FTP: %.01f ${rateunit}/sec.", $rate));
103 # Usage: &ftpList($host,$dir);
105 my ($host,$dir) = @_;
108 return unless &loadPerlModule("Net::FTP");
110 &status("FTP: opening connection to $host.") if ($verbose_ftp);
111 my $ftp = Net::FTP->new($host,'Timeout'=>600);
120 &status("FTP: logged in successfully.") if ($verbose_ftp);
122 &status("FTP: login failed.");
127 # change directories.
128 if ($ftp->cwd($dir)) {
129 &status("FTP: changed dirs to $dir.") if ($verbose_ftp);
131 &status("FTP: cwd dir ($dir) does not exist.");
136 &status("FTP: doing ls.") if ($verbose_ftp);
137 foreach ($ftp->dir()) {
138 # modes d uid gid size month day time file.
139 if (/^(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+) (\S{3})\s+(\d+) \d+:\d+ (.*)$/) {
143 &DEBUG("FTP: UNKNOWN => '$_'.");
146 &status("FTP: ls done. ". scalar(keys %ftp) ." entries.");
153 # Usage: &getURL($url, [$post]);
155 my ($url,$post) = @_;
158 return unless &loadPerlModule("LWP::UserAgent");
160 $ua = new LWP::UserAgent;
161 $ua->proxy('http', $param{'httpProxy'}) if &IsParam("httpProxy");
164 $req = new HTTP::Request('POST',$url);
165 $req->content_type('application/x-www-form-urlencoded');
166 $req->content($post);
168 $req = new HTTP::Request('GET',$url);
171 &status("getURL: getting '$url'");
173 $res = $ua->request($req);
174 my $size = length($res->content);
175 if ($size and time - $time) {
176 my $rate = int( $size/1000/(time - $time) );
177 &status("getURL: Done (took ".&Time2String(time - $time).", $rate k/sec)");
180 # return NULL upon error.
181 return unless ($res->is_success);
183 return(split '\n', $res->content);
187 my ($url,$file) = @_;
190 return unless &loadPerlModule("LWP::Simple");
192 ### PROXY NOT SUPPORTED WITH SIMPLE?
193 ### $ua->proxy('http', $param{'httpProxy'}) if &IsParam("httpProxy");
195 &status("getURLAsFile: getting '$url' as '$file'");
196 my $retval = getstore($url, $file);
197 my $delta_time = time() - $time;
199 my $size = -s $file || 0;
200 my $rate = int($size / $delta_time / 1024);
201 &status("getURLAsFile: Done. ($rate kB/sec)");