aboutsummaryrefslogtreecommitdiff
path: root/tests/ftpserver.pl
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ftpserver.pl')
-rw-r--r--tests/ftpserver.pl212
1 files changed, 134 insertions, 78 deletions
diff --git a/tests/ftpserver.pl b/tests/ftpserver.pl
index dd16c2a56..4187d980a 100644
--- a/tests/ftpserver.pl
+++ b/tests/ftpserver.pl
@@ -39,14 +39,8 @@
# All socket/network/TCP related stuff is done by the 'sockfilt' program.
#
-use strict;
-use warnings;
-use IPC::Open2;
-
-require "getpart.pm";
-require "ftp.pm";
-
BEGIN {
+ @INC=(@INC, $ENV{'srcdir'}, '.');
# sub second timestamping needs Time::HiRes
eval {
no warnings "all";
@@ -55,29 +49,53 @@ BEGIN {
}
}
+use strict;
+use warnings;
+use IPC::Open2;
+
+require "getpart.pm";
+require "ftp.pm";
+
+use serverhelp qw(
+ servername_str
+ server_pidfilename
+ server_logfilename
+ mainsockf_pidfilename
+ mainsockf_logfilename
+ datasockf_pidfilename
+ datasockf_logfilename
+ );
+
#**********************************************************************
# global vars...
#
my $verbose = 0; # set to 1 for debugging
-my $ftpdnum = ""; # server instance number
+my $idstr = ""; # server instance string
+my $idnum = 1; # server instance number
my $ipvnum = 4; # server IPv number (4 or 6)
-my $proto = 'ftp'; # server protocol
-my $srcdir = '.'; # directory where ftpserver.pl is located
-my $ipv6 = "";
-my $ext = "";
+my $proto = 'ftp'; # default server protocol
+my $srcdir; # directory where ftpserver.pl is located
+my $srvrname; # server name for presentation purposes
my $grok_eprt;
+my $path = '.';
+my $logdir = $path .'/log';
+
#**********************************************************************
# global vars used for server address and primary listener port
#
-my $port = 8921; # server primary listener port
-my $listenaddr = '127.0.0.1'; # server address for listener port
+my $port = 8921; # default primary listener port
+my $listenaddr = '127.0.0.1'; # default address for listener port
#**********************************************************************
# global vars used for file names
#
-my $logfilename = 'log/logfile.log'; # Override this for each test server
-my $pidfile = '.ftpd.pid'; # a default, use --pidfile
+my $pidfile; # server pid file name
+my $logfile; # server log file name
+my $mainsockf_pidfile; # pid file for primary connection sockfilt process
+my $mainsockf_logfile; # log file for primary connection sockfilt process
+my $datasockf_pidfile; # pid file for secondary connection sockfilt process
+my $datasockf_logfile; # log file for secondary connection sockfilt process
#**********************************************************************
# global vars used for server logs advisor read lock handling
@@ -133,7 +151,7 @@ my $exit_signal; # first signal handled in exit_signal_handler
sub exit_signal_handler {
my $signame = shift;
# For now, simply mimic old behavior.
- ftpkillslaves($verbose);
+ killsockfilters($proto, $ipvnum, $idnum, $verbose);
unlink($pidfile);
if($serverlogslocked) {
$serverlogslocked = 0;
@@ -143,19 +161,6 @@ sub exit_signal_handler {
}
#**********************************************************************
-# getlogfilename returns a log file name depending on given arguments.
-#
-sub getlogfilename {
- my ($proto, $ipversion, $ssl, $instance, $sockfilter) = @_;
- my $filename;
-
- # For now, simply mimic old behavior.
- $filename = "log/ftpd$ftpdnum.log";
-
- return $filename;
-}
-
-#**********************************************************************
# logmsg is general message logging subroutine for our test servers.
#
sub logmsg {
@@ -173,7 +178,7 @@ sub logmsg {
localtime($seconds);
$now = sprintf("%02d:%02d:%02d ", $hour, $min, $sec);
}
- if(open(LOGFILEFH, ">>$logfilename")) {
+ if(open(LOGFILEFH, ">>$logfile")) {
print LOGFILEFH $now;
print LOGFILEFH @_;
close(LOGFILEFH);
@@ -182,8 +187,8 @@ sub logmsg {
sub ftpmsg {
# append to the server.input file
- open(INPUT, ">>log/server$ftpdnum.input") ||
- logmsg "failed to open log/server$ftpdnum.input\n";
+ open(INPUT, ">>log/server$idstr.input") ||
+ logmsg "failed to open log/server$idstr.input\n";
print INPUT @_;
close(INPUT);
@@ -207,11 +212,11 @@ sub sysread_or_die {
if(not defined $result) {
($fcaller, $lcaller) = (caller)[1,2];
logmsg "Failed to read input\n";
- logmsg "Error: ftp$ftpdnum$ext sysread error: $!\n";
+ logmsg "Error: $srvrname server, sysread error: $!\n";
kill(9, $sfpid);
waitpid($sfpid, 0);
logmsg "Exited from sysread_or_die() at $fcaller " .
- "line $lcaller. ftp$ftpdnum$ext sysread error: $!\n";
+ "line $lcaller. $srvrname server, sysread error: $!\n";
unlink($pidfile);
if($serverlogslocked) {
$serverlogslocked = 0;
@@ -222,11 +227,11 @@ sub sysread_or_die {
elsif($result == 0) {
($fcaller, $lcaller) = (caller)[1,2];
logmsg "Failed to read input\n";
- logmsg "Error: ftp$ftpdnum$ext read zero\n";
+ logmsg "Error: $srvrname server, read zero\n";
kill(9, $sfpid);
waitpid($sfpid, 0);
logmsg "Exited from sysread_or_die() at $fcaller " .
- "line $lcaller. ftp$ftpdnum$ext read zero\n";
+ "line $lcaller. $srvrname server, read zero\n";
unlink($pidfile);
if($serverlogslocked) {
$serverlogslocked = 0;
@@ -239,17 +244,20 @@ sub sysread_or_die {
}
sub startsf {
- my $cmd="./server/sockfilt --port $port --logfile log/sockctrl$ftpdnum$ext.log --pidfile .sockfilt$ftpdnum$ext.pid $ipv6";
- $sfpid = open2(*SFREAD, *SFWRITE, $cmd);
+ my $mainsockfcmd = "./server/sockfilt " .
+ "--ipv$ipvnum --port $port " .
+ "--pidfile \"$mainsockf_pidfile\" " .
+ "--logfile \"$mainsockf_logfile\"";
+ $sfpid = open2(*SFREAD, *SFWRITE, $mainsockfcmd);
- print STDERR "$cmd\n" if($verbose);
+ print STDERR "$mainsockfcmd\n" if($verbose);
print SFWRITE "PING\n";
my $pong;
sysread SFREAD, $pong, 5;
if($pong !~ /^PONG/) {
- logmsg "Failed sockfilt command: $cmd\n";
+ logmsg "Failed sockfilt command: $mainsockfcmd\n";
kill(9, $sfpid);
waitpid($sfpid, 0);
unlink($pidfile);
@@ -922,9 +930,8 @@ sub STOR_ftp {
sub PASV_ftp {
my ($arg, $cmd)=@_;
my $pasvport;
- my $pidf=".sockdata$ftpdnum$ext.pid";
- my $prev = processexists($pidf);
+ my $prev = processexists($datasockf_pidfile);
if($prev > 0) {
print "kill existing server: $prev\n" if($verbose);
kill(9, $prev);
@@ -932,8 +939,11 @@ sub PASV_ftp {
}
# We fire up a new sockfilt to do the data transfer for us.
- $slavepid = open2(\*DREAD, \*DWRITE,
- "./server/sockfilt --port 0 --logfile log/sockdata$ftpdnum$ext.log --pidfile $pidf $ipv6");
+ my $datasockfcmd = "./server/sockfilt " .
+ "--ipv$ipvnum --port 0 " .
+ "--pidfile \"$datasockf_pidfile\" " .
+ "--logfile \"$datasockf_logfile\"";
+ $slavepid = open2(\*DREAD, \*DWRITE, $datasockfcmd);
print DWRITE "PING\n";
my $pong;
@@ -1067,11 +1077,13 @@ sub PORT_ftp {
}
# We fire up a new sockfilt to do the data transfer for us.
- # FIX: make it use IPv6 if need be
- my $filtcmd="./server/sockfilt --connect $port --addr $addr --logfile log/sockdata$ftpdnum$ext.log --pidfile .sockdata$ftpdnum$ext.pid $ipv6";
- $slavepid = open2(\*DREAD, \*DWRITE, $filtcmd);
+ my $datasockfcmd = "./server/sockfilt " .
+ "--ipv$ipvnum --connect $port --addr \"$addr\" " .
+ "--pidfile \"$datasockf_pidfile\" " .
+ "--logfile \"$datasockf_logfile\"";
+ $slavepid = open2(\*DREAD, \*DWRITE, $datasockfcmd);
- print STDERR "$filtcmd\n" if($verbose);
+ print STDERR "$datasockfcmd\n" if($verbose);
print DWRITE "PING\n";
my $pong;
@@ -1163,74 +1175,118 @@ sub customize {
#
# Options:
#
-# -v # verbose
-# -s # source directory
+# --verbose # verbose
+# --srcdir # source directory
# --id # server instance number
# --proto # server protocol
# --pidfile # server pid file
+# --logfile # server log file
+# --ipv4 # server IP version 4
# --ipv6 # server IP version 6
# --port # server listener port
# --addr # server address for listener port binding
#
while(@ARGV) {
- if($ARGV[0] eq '-v') {
+ if($ARGV[0] eq '--verbose') {
$verbose = 1;
}
- elsif($ARGV[0] eq '-s') {
- $srcdir = $ARGV[1];
- shift @ARGV;
+ elsif($ARGV[0] eq '--srcdir') {
+ if($ARGV[1]) {
+ $srcdir = $ARGV[1];
+ shift @ARGV;
+ }
}
elsif($ARGV[0] eq '--id') {
- if($ARGV[1] =~ /^(\d+)$/) {
- $ftpdnum = $1 if($1 > 0);
+ if($ARGV[1] && ($ARGV[1] =~ /^(\d+)$/)) {
+ $idnum = $1 if($1 > 0);
+ shift @ARGV;
}
- shift @ARGV;
}
elsif($ARGV[0] eq '--proto') {
- if($ARGV[1] =~ /^(ftp|imap|pop3|smtp)$/) {
+ if($ARGV[1] && ($ARGV[1] =~ /^(ftp|imap|pop3|smtp)$/)) {
$proto = $1;
+ shift @ARGV;
}
else {
die "unsupported protocol $ARGV[1]";
}
- shift @ARGV;
}
elsif($ARGV[0] eq '--pidfile') {
- $pidfile = $ARGV[1];
- shift @ARGV;
+ if($ARGV[1]) {
+ $pidfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--logfile') {
+ if($ARGV[1]) {
+ $logfile = $ARGV[1];
+ shift @ARGV;
+ }
+ }
+ elsif($ARGV[0] eq '--ipv4') {
+ $ipvnum = 4;
+ $listenaddr = '127.0.0.1' if($listenaddr eq '::1');
+ $grok_eprt = 0;
}
elsif($ARGV[0] eq '--ipv6') {
$ipvnum = 6;
$listenaddr = '::1' if($listenaddr eq '127.0.0.1');
- $ipv6 = '--ipv6';
- $ext = 'ipv6';
$grok_eprt = 1;
}
elsif($ARGV[0] eq '--port') {
- if($ARGV[1] =~ /^(\d+)$/) {
+ if($ARGV[1] && ($ARGV[1] =~ /^(\d+)$/)) {
$port = $1 if($1 > 1024);
+ shift @ARGV;
}
- shift @ARGV;
}
elsif($ARGV[0] eq '--addr') {
- my $tmpstr = $ARGV[1];
- if($tmpstr =~ /^(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)$/) {
- $listenaddr = "$1.$2.$3.$4" if($ipvnum == 4);
- }
- elsif($ipvnum == 6) {
- $listenaddr = $tmpstr;
- $listenaddr =~ s/^\[(.*)\]$/$1/;
+ if($ARGV[1]) {
+ my $tmpstr = $ARGV[1];
+ if($tmpstr =~ /^(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)$/) {
+ $listenaddr = "$1.$2.$3.$4" if($ipvnum == 4);
+ }
+ elsif($ipvnum == 6) {
+ $listenaddr = $tmpstr;
+ $listenaddr =~ s/^\[(.*)\]$/$1/;
+ }
+ shift @ARGV;
}
- shift @ARGV;
+ }
+ else {
+ print STDERR "\nWarning: ftpserver.pl unknown parameter: $ARGV[0]\n";
}
shift @ARGV;
-};
+}
#***************************************************************************
# Initialize command line option dependant variables
#
-$logfilename = getlogfilename();
+if(!$srcdir) {
+ $srcdir = $ENV{'srcdir'} || '.';
+}
+if(!$pidfile) {
+ $pidfile = "$path/". server_pidfilename($proto, $ipvnum, $idnum);
+}
+if(!$logfile) {
+ $logfile = server_logfilename($logdir, $proto, $ipvnum, $idnum);
+}
+
+$mainsockf_pidfile = "$path/".
+ mainsockf_pidfilename($proto, $ipvnum, $idnum);
+$mainsockf_logfile =
+ mainsockf_logfilename($logdir, $proto, $ipvnum, $idnum);
+
+if($proto eq 'ftp') {
+ $datasockf_pidfile = "$path/".
+ datasockf_pidfilename($proto, $ipvnum, $idnum);
+ $datasockf_logfile =
+ datasockf_logfilename($logdir, $proto, $ipvnum, $idnum);
+}
+
+$srvrname = servername_str($proto, $ipvnum, $idnum);
+
+$idstr = "$idnum" if($idnum > 1);
protocolsetup($proto);
@@ -1239,8 +1295,8 @@ $SIG{TERM} = \&exit_signal_handler;
startsf();
-logmsg sprintf("%s server listens on port IPv%d/$port\n", uc($proto),
- $ipv6?6:4);
+logmsg sprintf("%s server listens on port IPv${ipvnum}/${port}\n", uc($proto));
+
open(PID, ">$pidfile");
print PID $$."\n";
close(PID);