releasing/cbrtools/perl/RemoteSite/FTP/Proxy.pm
changeset 602 3145852acc89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RemoteSite/FTP/Proxy.pm	Fri Jun 25 18:37:20 2010 +0800
@@ -0,0 +1,212 @@
+# Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# RemoteSite::FTP::Proxy.pm
+#
+
+package RemoteSite::FTP::Proxy;
+
+use strict;
+use Net::FTP;
+
+use RemoteSite::FTP;
+use vars qw(@ISA);
+@ISA=("RemoteSite::FTP");
+
+#
+# Initialization 
+#
+
+sub Initialize {
+  my $self = shift;
+
+  my %args = @_;
+  $self->{proxy} = $args{proxy};
+  $self->{proxyUsername} = $args{proxy_username};
+  $self->{proxyPassword} = $args{proxy_password};
+
+  #if proxy username or password not defined ask for them interactively
+  unless ($self->ProxyUsername()) {
+    print 'Proxy FTP username: ';
+    my $userName = <STDIN>;
+    if ($userName) {
+      chomp ($userName);
+      $self->ProxyUsername($userName);
+    }
+  }
+  unless ($self->ProxyPassword()) {
+    print 'Proxy FTP password: ';
+    $self->ProxyPassword(Utils::QueryPassword());
+  }
+  
+  #call base class initialization
+  $self->SUPER::Initialize(@_);
+}
+
+#
+# Public getters/setters
+#
+
+sub Proxy {
+  my $self = shift;
+  if (defined $_[0]) {$self->{proxy} = shift;}
+  return $self->{proxy};
+}
+
+sub ProxyUsername {
+  my $self = shift;
+  if (defined $_[0]) {$self->{proxyUsername} = shift;}
+  return $self->{proxyUsername};
+}
+
+sub ProxyPassword {
+  my $self = shift;
+  if (defined $_[0]) {$self->{proxyPassword} = shift;}
+  return $self->{proxyPassword};
+}
+
+#
+# Private
+#
+
+sub Connect {
+  my $self = shift;
+
+  unless ($self->Proxy()) {
+    $self->HandleError("Cannot connect to proxy, host name not defined");
+  }
+  unless ($self->Host()) {
+    $self->HandleError("Cannot connect to FTP site from proxy, host name not defined");
+  } 
+
+  my $debug = (($self->{verbose} > 1) ? 1 : 0);
+
+  #Attempt to connect (or reconnect of connection fails)
+  for (1..$self->Reconnects()) {
+    $self->{ftp} = undef;    
+    if ($self->{verbose}) {
+      print "Connecting to proxy server ".$self->Proxy()."...\n";
+    }
+    $self->{ftp} = Net::FTP->new($self->Proxy(),
+				 Passive => $self->PassiveMode(),
+				 Debug => $debug,
+				 Timeout => $self->Timeout());
+    if (defined $self->{ftp}) {
+      # code to support Blue Coat proxy ftp server
+
+      if ($self->{ftp}->message =~ /Blue Coat Ftp Service/) {
+      # do BC login
+      $self->{ftp}->login($self->Username().'@'.$self->Host()." ".$self->ProxyUsername(),
+        $self->Password(),
+        $self->ProxyPassword())
+        or $self->HandleError("FTP via Blue Coat proxy login failed");
+      }
+      else {
+        #login to proxy server
+        $self->{ftp}->login($self->ProxyUsername(), $self->ProxyPassword())
+          or $self->HandleError("Proxy server login failed");
+
+        #login to ftp site from proxy server
+        $self->{ftp}->login($self->Username().'@'.$self->Host(), $self->Password())
+          or $self->HandleError("FTP login failed");
+        }
+      #change transfer mode to binary
+      $self->{ftp}->binary()
+        or $self->HandleError("Failed to set FTP server to binary transfer mode");
+      return; 
+    }
+  }
+  $self->HandleError("Cannot connect to proxy server ".$self->Proxy());
+}  
+
+1;
+
+=head1 NAME
+
+RemoteSite::FTP::Proxy.pm - Access a remote FTP site via a proxy.
+
+=head1 SYNOPSIS
+
+ use RemoteSite::FTP::Proxy;
+
+ $ftp = RemoteSite::FTP::Proxy->New(host => 'ftp.somehost.com',
+				    username => 'myusername',
+				    password => 'mypassword',
+				    proxy => 'ftp.proxyhost.com',
+				    proxy_username => 'myproxyuser',
+				    proxy_password => 'myproxypass',
+				    verbose => 1);
+
+ if ($ftp->FileExists('/somedir/someremotefile')) {
+   do something...
+ }
+ $ftp->SendFile('somelocalfile', 'someremotefile');
+ $ftp->GetFile('someremotefile', 'somelocalfile'); 
+
+=head1 DESCRIPTION
+
+C<RemoteSite::FTP::Proxy> is inherited from C<RemoteSite::FTP>, it modifies base module methods to implement accessing an FTP site via a proxy server
+
+=head1 INTERFACE
+
+=head2 New
+
+Passed an argument list in the form of hash key value pairs. The supported arguments are...
+
+  host           => $host_address_string
+  username       => $user_name_string
+  password       => $pass_word_string
+  proxy          => $proxy_address_string
+  proxy_username => $proxy_username_string
+  proxy_password => $proxy_password_string
+  verbose        => $verbosity_integer
+
+Returns a reference to a C<RemoteSite::FTP::Proxy> object
+
+=head2 Proxy
+
+Returns the current value of the C<proxy> attribute which contains the proxy FTP address. If passed an argument sets the attribute to this new value.
+
+=head2 ProxyUsername
+
+Returns the current value of the C<proxyUsername> attribute which stores the user name required to access the proxy FTP site. If passed an argument sets the attribute to this new value.
+
+=head2 ProxyPassword
+
+Returns the current value of the C<proxyPassword> attribute which stores the password required to access the proxy FTP site. If passed an argument sets the attribute to this new value.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+ All rights reserved.
+ This component and the accompanying materials are made available
+ under the terms of the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut