2 # Net.pl: FTP//HTTP helper
4 # Version: v0.1 (20000309)
10 use vars qw(%ftp %param);
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(
23 ### 'BlockSize' => 1024, # ???
29 if ( $ftp->login() ) {
30 &status('FTP: logged in successfully.') if ($verbose_ftp);
33 &status('FTP: login failed.');
39 if ( $ftp->cwd($dir) ) {
40 &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;
55 $lsize = -s $thisfile;
57 &status("FTP: local size is $lsize; downloading.")
61 &status('FTP: same size; skipping.');
62 system("touch $thisfile"); # lame hack.
69 &status('FTP: file does not exist.');
74 my $start_time = &timeget();
75 if ( defined $lfile ) {
76 &status("FTP: getting $file as $lfile.") if ($verbose_ftp);
77 $ftp->get( $file, $lfile );
80 &status("FTP: getting $file.") if ($verbose_ftp);
84 if ( defined $lsize ) {
85 &DEBUG("FTP: locsize => '$lsize'.");
86 if ( $size != $lsize ) {
87 &FIXME('FTP: downloaded file seems truncated.');
91 my $delta_time = &timedelta($start_time);
92 if ( $delta_time > 0 and $verbose_ftp ) {
93 &status( sprintf( 'FTP: %.02f sec to complete.', $delta_time ) );
94 my ( $rateunit, $rate ) = ( 'B', $size / $delta_time );
99 &status( sprintf( "FTP: %.01f ${rateunit}/sec.", $rate ) );
107 # Usage: &ftpList($host,$dir);
109 my ( $host, $dir ) = @_;
112 return unless &loadPerlModule('Net::FTP');
114 &status("FTP: opening connection to $host.") if ($verbose_ftp);
115 my $ftp = Net::FTP->new( $host, 'Timeout' => 60 );
120 if ( $ftp->login() ) {
121 &status('FTP: logged in successfully.') if ($verbose_ftp);
124 &status('FTP: login failed.');
129 # change directories.
130 if ( $ftp->cwd($dir) ) {
131 &status("FTP: changed dirs to $dir.") if ($verbose_ftp);
134 &status("FTP: cwd dir ($dir) does not exist.");
139 &status('FTP: doing ls.') if ($verbose_ftp);
140 foreach ( $ftp->dir() ) {
142 # modes d uid gid size month day time file.
144 /^(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+) (\S{3})\s+(\d+) \d+:\d+ (.*)$/
152 &DEBUG("FTP: UNKNOWN => '$_'.");
155 &status( 'FTP: ls done. ' . scalar( keys %ftp ) . ' entries.' );
162 # Usage: &getURL($url, [$post]);
163 # TODO: rename this to getHTTP
165 my ( $url, $post ) = @_;
166 my ( $ua, $res, $req );
168 return unless &loadPerlModule('LWP::UserAgent');
170 $ua = new LWP::UserAgent;
171 $ua->proxy( 'http', $param{'httpProxy'} ) if &IsParam('httpProxy');
173 if ( defined $post ) {
174 $req = new HTTP::Request( 'POST', $url );
175 $req->content_type('application/x-www-form-urlencoded');
176 $req->content($post);
179 $req = new HTTP::Request( 'GET', $url );
182 &status("getURL: getting '$url'");
184 $res = $ua->request($req);
185 my $size = length( $res->content );
186 if ( $size and time - $time ) {
187 my $rate = int( $size / 1000 / ( time - $time ) );
188 &status('getURL: Done (took '
189 . &Time2String( time - $time )
190 . ", $rate k/sec)" );
193 # return NULL upon error.
194 return unless ( $res->is_success );
196 return ( split '\n', $res->content );
200 my ( $url, $file ) = @_;
201 my ( $ua, $res, $req );
204 unless ( &loadPerlModule('LWP::UserAgent') ) {
205 &::DEBUG('getURLAsFile: LWP::UserAgent not installed');
209 $ua = new LWP::UserAgent;
210 $ua->proxy( 'http', $param{'httpProxy'} ) if &IsParam('httpProxy');
211 $req = HTTP::Request->new( 'GET', $url );
212 &status("getURLAsFile: getting '$url' as '$file'");
213 $res = $ua->request( $req, $file );
215 my $delta_time = time() - $time;
217 my $size = -s $file || 0;
218 my $rate = int( $size / $delta_time / 1024 );
219 &status("getURLAsFile: Done. ($rate kB/sec)");
227 # vim:ts=4:sw=4:expandtab:tw=80