]> git.donarmstrong.com Git - infobot.git/blob - src/Net.pl
dunno
[infobot.git] / src / Net.pl
1 #
2 #   Net.pl: FTP//HTTP helper
3 #   Author: dms
4 #  Version: v0.1 (20000309)
5 #  Created: 20000309
6 #
7
8 use strict;
9
10 use vars qw(%ftp %param);
11
12 # Usage: &ftpGet($host,$dir,$file,[$lfile]);
13 sub ftpGet {
14     my ( $host, $dir, $file, $lfile ) = @_;
15     my $verbose_ftp = 1;
16
17     return unless &loadPerlModule('Net::FTP');
18
19     &status("FTP: opening connection to $host.") if ($verbose_ftp);
20     my $ftp = Net::FTP->new(
21         $host,
22         'Timeout' => 1 * 60,
23 ###     'BlockSize'     => 1024,        # ???
24     );
25
26     return if ($@);
27
28     # login.
29     if ( $ftp->login() ) {
30         &status('FTP: logged in successfully.') if ($verbose_ftp);
31     }
32     else {
33         &status('FTP: login failed.');
34         $ftp->quit();
35         return 0;
36     }
37
38     # change directories.
39     if ( $ftp->cwd($dir) ) {
40         &status("FTP: changed dirs to $dir.") if ($verbose_ftp);
41     }
42     else {
43         &status("FTP: cwd dir ($dir) does not exist.");
44         $ftp->quit();
45         return 0;
46     }
47
48     # get the size of the file.
49     my ( $size, $lsize );
50     if ( $size = $ftp->size($file) ) {
51         &status("FTP: file size is $size") if ($verbose_ftp);
52         my $thisfile = $file || $lfile;
53
54         if ( -f $thisfile ) {
55             $lsize = -s $thisfile;
56             if ( $_ != $lsize ) {
57                 &status("FTP: local size is $lsize; downloading.")
58                   if ($verbose_ftp);
59             }
60             else {
61                 &status('FTP: same size; skipping.');
62                 system("touch $thisfile");    # lame hack.
63                 $ftp->quit();
64                 return 1;
65             }
66         }
67     }
68     else {
69         &status('FTP: file does not exist.');
70         $ftp->quit();
71         return 0;
72     }
73
74     my $start_time = &timeget();
75     if ( defined $lfile ) {
76         &status("FTP: getting $file as $lfile.") if ($verbose_ftp);
77         $ftp->get( $file, $lfile );
78     }
79     else {
80         &status("FTP: getting $file.") if ($verbose_ftp);
81         $ftp->get($file);
82     }
83
84     if ( defined $lsize ) {
85         &DEBUG("FTP: locsize => '$lsize'.");
86         if ( $size != $lsize ) {
87             &FIXME('FTP: downloaded file seems truncated.');
88         }
89     }
90
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 );
95         if ( $rate > 1024 ) {
96             $rate /= 1024;
97             $rateunit = 'kB';
98         }
99         &status( sprintf( "FTP: %.01f ${rateunit}/sec.", $rate ) );
100     }
101
102     $ftp->quit();
103
104     return 1;
105 }
106
107 # Usage: &ftpList($host,$dir);
108 sub ftpList {
109     my ( $host, $dir ) = @_;
110     my $verbose_ftp = 1;
111
112     return unless &loadPerlModule('Net::FTP');
113
114     &status("FTP: opening connection to $host.") if ($verbose_ftp);
115     my $ftp = Net::FTP->new( $host, 'Timeout' => 60 );
116
117     return if ($@);
118
119     # login.
120     if ( $ftp->login() ) {
121         &status('FTP: logged in successfully.') if ($verbose_ftp);
122     }
123     else {
124         &status('FTP: login failed.');
125         $ftp->quit();
126         return;
127     }
128
129     # change directories.
130     if ( $ftp->cwd($dir) ) {
131         &status("FTP: changed dirs to $dir.") if ($verbose_ftp);
132     }
133     else {
134         &status("FTP: cwd dir ($dir) does not exist.");
135         $ftp->quit();
136         return;
137     }
138
139     &status('FTP: doing ls.') if ($verbose_ftp);
140     foreach ( $ftp->dir() ) {
141
142         # modes d uid gid size month day time file.
143         if (
144 /^(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+) (\S{3})\s+(\d+) \d+:\d+ (.*)$/
145           )
146         {
147
148             # name = size.
149             $ftp{$8} = $5;
150         }
151         else {
152             &DEBUG("FTP: UNKNOWN  => '$_'.");
153         }
154     }
155     &status( 'FTP: ls done. ' . scalar( keys %ftp ) . ' entries.' );
156     $ftp->quit();
157
158     return %ftp;
159 }
160
161 ### LWP.
162 # Usage: &getURL($url, [$post]);
163 # TODO: rename this to getHTTP
164 sub getURL {
165     my ( $url, $post ) = @_;
166     my ( $ua, $res, $req );
167
168     return unless &loadPerlModule('LWP::UserAgent');
169
170     $ua = new LWP::UserAgent;
171     $ua->proxy( 'http', $param{'httpProxy'} ) if &IsParam('httpProxy');
172
173     if ( defined $post ) {
174         $req = new HTTP::Request( 'POST', $url );
175         $req->content_type('application/x-www-form-urlencoded');
176         $req->content($post);
177     }
178     else {
179         $req = new HTTP::Request( 'GET', $url );
180     }
181
182     &status("getURL: getting '$url'");
183     my $time = time();
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)" );
191     }
192
193     # return NULL upon error.
194     return unless ( $res->is_success );
195
196     return ( split '\n', $res->content );
197 }
198
199 sub getURLAsFile {
200     my ( $url, $file ) = @_;
201     my ( $ua, $res, $req );
202     my $time = time();
203
204     unless ( &loadPerlModule('LWP::UserAgent') ) {
205         &::DEBUG('getURLAsFile: LWP::UserAgent not installed');
206         return;
207     }
208
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 );
214
215     my $delta_time = time() - $time;
216     if ($delta_time) {
217         my $size = -s $file || 0;
218         my $rate = int( $size / $delta_time / 1024 );
219         &status("getURLAsFile: Done. ($rate kB/sec)");
220     }
221
222     return $res;
223 }
224
225 1;
226
227 # vim:ts=4:sw=4:expandtab:tw=80