releasing/cbrtools/perl/RemoteSite/FTP/Experimental.pm
changeset 607 378360dbbdba
parent 602 3145852acc89
equal deleted inserted replaced
591:22486c9c7b15 607:378360dbbdba
       
     1 # RemoteSite::FTP.pm
       
     2 #
       
     3 #Copyright (c) 2000-2006, The Perl Foundation. All rights reserved.
       
     4 #This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
       
     5 #
       
     6 
       
     7 package RemoteSite::FTP::Experimental;
       
     8 
       
     9 use strict;
       
    10 
       
    11 use RemoteSite::FTP;
       
    12 use vars qw(@ISA);
       
    13 @ISA=("RemoteSite::FTP");
       
    14 
       
    15 sub DirList {
       
    16   my $self = shift;
       
    17   my $remoteDir = shift;
       
    18 
       
    19   print "Listing FTP directory $remoteDir\n" if ($self->{verbose});
       
    20 
       
    21   my $dirlist_retries = 3;
       
    22   
       
    23   $remoteDir =~ s{\\}{\/}g;   #convert back slashes to forward slashes
       
    24   
       
    25   my $retry;
       
    26   for ($retry = 0; $retry < $dirlist_retries; $retry++) {
       
    27 
       
    28     unless ($self->Connected()) {
       
    29       $self->Connect();
       
    30     }
       
    31 
       
    32     # The Net::FTP module that we're using here has two options for listing the contents 
       
    33     # of a directory. They are the 'ls' and 'dir' calls.
       
    34     # The 'ls' call is great, and just returns a list of the items. But, irritatingly, it
       
    35     # misses out directories: the returned list just contains names of *files*.
       
    36     # dir is better, in some ways, as it lists directories too, but its output format
       
    37     # varies from one FTP site to the next. So we have to stick with ls.
       
    38     print "About to call dir(\"$remoteDir\")\n" if ($self->{verbose});
       
    39     my %hash = $self->dir($remoteDir);
       
    40     my @items = keys %hash;
       
    41     @items = grep { $_ ne "." && $_ ne ".." } @items;
       
    42     @items = map { "$remoteDir/$_" } @items; # prepend the path as that's the output format
       
    43       # that is expected of this function
       
    44     return \@items;
       
    45   }
       
    46   die "Error: have tried to list \"$remoteDir\" $retry times with no success - giving up\n";
       
    47 }
       
    48 
       
    49 # Code from Net::FTP::Common v 4.0a
       
    50 sub dir {       
       
    51   my ($self, $directory) = @_;
       
    52 
       
    53   my $ftp = $self->{ftp};
       
    54 
       
    55   my $dir = $ftp->dir($directory);
       
    56   if (!defined($dir)) {
       
    57     return ();
       
    58   } else
       
    59   {
       
    60     my %HoH;
       
    61 
       
    62     # Comments were made on this code in this thread:
       
    63     # http://perlmonks.org/index.pl?node_id=287552
       
    64 
       
    65     foreach (@{$dir})
       
    66         {
       
    67 	      $_ = m#([a-z-]*)\s*([0-9]*)\s*([0-9a-zA-Z]*)\s*([0-9a-zA-Z]*)\s*([0-9]*)\s*([A-Za-z]*)\s*([0-9]*)\s*([0-9A-Za-z:]*)\s*([\w*\W*\s*\S*]*)#;
       
    68 
       
    69         my $perm = $1;
       
    70         my $inode = $2;
       
    71         my $owner = $3;
       
    72         my $group = $4;
       
    73         my $size = $5;
       
    74         my $month = $6;
       
    75         my $day = $7;
       
    76         my $yearOrTime = $8;
       
    77         my $name = $9;
       
    78         my $linkTarget;
       
    79 
       
    80         if ( $' =~ m#\s*->\s*([A-Za-z0-9.-/]*)# )       # it's a symlink
       
    81                 { $linkTarget = $1; }
       
    82 
       
    83         $HoH{$name}{perm} = $perm;
       
    84         $HoH{$name}{inode} = $inode;
       
    85         $HoH{$name}{owner} = $owner;
       
    86         $HoH{$name}{group} = $group;
       
    87         $HoH{$name}{size} = $size;
       
    88         $HoH{$name}{month} = $month;
       
    89         $HoH{$name}{day} = $day;
       
    90         $HoH{$name}{yearOrTime} =  $yearOrTime;
       
    91         $HoH{$name}{linkTarget} = $linkTarget;
       
    92 
       
    93         }
       
    94   return(%HoH);
       
    95   }
       
    96 }
       
    97 
       
    98 
       
    99 1;
       
   100 
       
   101 =head1 NAME
       
   102 
       
   103 RemoteSite::FTP::Experimental.pm - Access a remote FTP site.
       
   104 
       
   105 =head1 DESCRIPTION
       
   106 
       
   107 C<RemoteSite::FTP::Experimental> is inherited from the abstract base class C<RemoteSite>, implementing the abstract methods required for transfer of files to and from a remote site when the remote site is an FTP server.
       
   108 
       
   109 This class differs from C<RemoteSite::FTP> only in using a different mechanism for listing the contents of directories on FTP sites.
       
   110 
       
   111 =head1 KNOWN BUGS
       
   112 
       
   113 None
       
   114 
       
   115 =head1 COPYRIGHT
       
   116 
       
   117 Copyright (c) 2000-2006, The Perl Foundation. All rights reserved.
       
   118 This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
       
   119 
       
   120 =cut