#!/usr/bin/perl  
# ftp_url.pl
# Ftp URL listing
# RJM Programming
# November, 2017
# Thanks to https://www.foo.be/docs/tpj/issues/vol1_3/tpj0103-0007.html

use Net::FTP; 	
#use File::Listing qw(parse_dir); 	

# Create a new connection to the ftp server  
sub connection {    # Create a new NET::FTP object  
        $ftp = Net::FTP->new($CPANhost, Timeout => 60) 
               or die "Can't contact $CPANhost: $!";  
        # We shall login to the ftp server as anonymous; 	          
        $ftp->login($CPANusername,$CPANpassword) 
               or die "Can't login ($CPANhost):" . 
               $ftp->message;  
        # Change the working directory  
        $ftp->cwd($CPANpath) or die 
               "Can't change directory ($CPANhost):". 
               $ftp->message;  
        return $ftp; 
    }  
    
    
# The path to the CPAN/modules directory on most CPAN hosts
$CPANpath = '/';  

$CPANusername = 'mkuulma@ozemail.com.au';
$CPANpassword = '';
    
# Change this to the name of your nearest CPAN host
$CPANhost = '';
my $msg = '';
my $size = @ARGV;
my $fexists = '';
if ($size == 2) { 
  $CPANhost = 'ftp.ozemail.com.au';  
  $CPANpath = $ARGV[1];  
  $CPANpassword = $ARGV[0];
} else {
 if ($size == 1) { 
  $CPANhost = 'ftp.ozemail.com.au';  
  $CPANpassword = $ARGV[0];
 } else {
  if ($size == 3) { 
   $CPANhost = $ARGV[0];  
   $CPANusername = $ARGV[1];
   $CPANpassword = $ARGV[2];
  } else {
   if ($size == 4) { 
    $CPANhost = $ARGV[0];  
    $CPANusername = $ARGV[1];
    $CPANpassword = $ARGV[2];
    $CPANpath = $ARGV[3];  
   } else {
    if ($size == 5) { 
     $CPANhost = $ARGV[0];  
     $CPANusername = $ARGV[1];
     $CPANpassword = $ARGV[2];
     $CPANpath = $ARGV[3]; 
     $dotpos = rindex $CPANpath,'.';
     $slashpos = rindex $CPANpath,'/';
     $nohost = substr $CPANpath,1;
     $justfile = substr $CPANpath,(1 + $slashpos);
     if ($dotpos == -1) {
      $size = 4;
      print "Entry $nohost is not a single file.\n";
      #$CPANpassword = '';
     } else {
      if (-e $justfile) {
       $fexists = 'y';
      }
      if ($fexists eq 'y') {
       print "File $justfile already exists.\n";
       $CPANpath =~ s/$justfile//g;
       $size = 4;
       #$CPANpassword = '';
      } else {
       $CPANpath =~ s/$justfile//g;
      } 
     }
    } else {
     print "Usage is via ... perl ftp_url.pl [ftphost=ftp.ozemail.com.au] [ftpusername=mkuulma@ozemail.com.au] ftppassword [subpath=/] [download=]\n";
    }
   }
  }
 }
}

if ($CPANpassword eq '') {
 $CPANpassword = '';
} else {
 # Create the initial connection 	
 $ftp = connection(); 
 if ($size == 5) { 
  # Get the file from the ftp server 		
  print "Got $justfile from $CPANhost .\n";
  $ftp->get($justfile) or 
        warn "Couldn't get '$justfile', skipped: $!";
  # Close the connection to the FTP server. 
  $ftp->quit or die "Couldn't close the connection cleanly: $!";   
 } else {
  $ftp->pasv(); # passive mode

  # Retrieve a recursive directory listing 
  my @ls = $ftp->ls('-l');  

  for my $filex (@ls) {
   my $file = $filex;
   my (@description, $size);
   if (-e $file) {
    push @description, 'binary' if (-B _);
    push @description, 'a socket' if (-S _);
    push @description, 'a text file' if (-T _);
    push @description, 'a block special file' if (-b _);
    push @description, 'a character special file' if (-c _);
    push @description, 'a directory' if (-d _);
    push @description, 'executable' if (-x _);
    push @description, (($size = -s _)) ? "$size bytes" : 'empty';
    push @description, (($daysago = -M _)) ? " modified $daysago days ago" : '';
    print "\n\t$file is ", join(', ',@description),"";
   }
  }
  print "\n\t\n";
  print $msg;
 }
}

