]> granicus.if.org Git - curl/commitdiff
Start using the centralized pidfile and logfile name generation
authorYang Tse <yangsita@gmail.com>
Fri, 15 Jan 2010 18:55:01 +0000 (18:55 +0000)
committerYang Tse <yangsita@gmail.com>
Fri, 15 Jan 2010 18:55:01 +0000 (18:55 +0000)
subroutines for ssh and socks test suite servers.

tests/runtests.pl
tests/sshhelp.pm
tests/sshserver.pl

index c5091e841f7e84305d5244f44670c02e3a6ddfcb..6dac50e014778cd80e24f185d93a919ec99f3b5a 100755 (executable)
@@ -154,20 +154,7 @@ my $TESTCASES="all";
 # No variables below this point should need to be modified
 #
 
-my $HTTPPIDFILE=".http.pid";
-my $HTTP6PIDFILE=".http6.pid";
-my $HTTPSPIDFILE=".https.pid";
-my $FTPPIDFILE=".ftp.pid";
-my $FTP6PIDFILE=".ftp6.pid";
-my $FTP2PIDFILE=".ftp2.pid";
-my $FTPSPIDFILE=".ftps.pid";
-my $TFTPPIDFILE=".tftpd.pid";
-my $TFTP6PIDFILE=".tftp6.pid";
-my $SSHPIDFILE=".ssh.pid";
-my $SOCKSPIDFILE=".socks.pid";
-my $POP3PIDFILE=".pop3.pid";
-my $IMAPPIDFILE=".imap.pid";
-my $SMTPPIDFILE=".smtp.pid";
+my $SOCKSPIDFILE;
 
 # invoke perl like this:
 my $perl="perl -I$srcdir";
@@ -616,7 +603,7 @@ sub stopserver {
 # assign requested address" #
 
 sub verifyhttp {
-    my ($proto, $ip, $port) = @_;
+    my ($proto, $ip, $port, $ipvnum, $idnum) = @_;
     my $cmd = "$VCURL --max-time $server_response_maxtime --output $LOGDIR/verifiedserver --insecure --silent --verbose --globoff \"$proto://$ip:$port/verifiedserver\" 2>$LOGDIR/verifyhttp";
     my $pid;
 
@@ -665,7 +652,7 @@ sub verifyhttp {
 # assign requested address" #
 
 sub verifyftp {
-    my ($proto, $ip, $port) = @_;
+    my ($proto, $ip, $port, $ipvnum, $idnum) = @_;
     my $pid;
     my $time=time();
     my $extra;
@@ -717,9 +704,10 @@ sub verifyftp {
 # actually alive.
 
 sub verifyssh {
-    my ($proto, $ip, $port) = @_;
+    my ($proto, $ip, $port, $ipvnum, $idnum) = @_;
+    my $pidfile = server_pidfilename($proto, $ipvnum, $idnum);
     my $pid = 0;
-    if(open(FILE, "<$SSHPIDFILE")) {
+    if(open(FILE, "<$pidfile")) {
         $pid=0+<FILE>;
         close(FILE);
     }
@@ -729,7 +717,7 @@ sub verifyssh {
         if(!kill(0, $pid)) {
             logmsg "RUN: SSH server has died after starting up\n";
             checkdied($pid);
-            unlink($SSHPIDFILE);
+            unlink($pidfile);
             $pid = -1;
         }
     }
@@ -741,7 +729,7 @@ sub verifyssh {
 # with generated config and key files and run a simple remote pwd.
 
 sub verifysftp {
-    my ($proto, $ip, $port) = @_;
+    my ($proto, $ip, $port, $ipvnum, $idnum) = @_;
     my $verified = 0;
     # Find out sftp client canonical file name
     my $sftp = find_sftp();
@@ -777,9 +765,10 @@ sub verifysftp {
 # STUB for verifying socks
 
 sub verifysocks {
-    my ($proto, $ip, $port) = @_;
+    my ($proto, $ip, $port, $ipvnum, $idnum) = @_;
+    my $pidfile = server_pidfilename($proto, $ipvnum, $idnum);
     my $pid = 0;
-    if(open(FILE, "<$SOCKSPIDFILE")) {
+    if(open(FILE, "<$pidfile")) {
         $pid=0+<FILE>;
         close(FILE);
     }
@@ -789,7 +778,7 @@ sub verifysocks {
         if(!kill(0, $pid)) {
             logmsg "RUN: SOCKS server has died after starting up\n";
             checkdied($pid);
-            unlink($SOCKSPIDFILE);
+            unlink($pidfile);
             $pid = -1;
         }
     }
@@ -815,7 +804,7 @@ my %protofunc = ('http' => \&verifyhttp,
                  'socks' => \&verifysocks);
 
 sub verifyserver {
-    my ($proto, $ip, $port) = @_;
+    my ($proto, $ip, $port, $ipvnum, $idnum) = @_;
 
     my $count = 30; # try for this many seconds
     my $pid;
@@ -823,7 +812,7 @@ sub verifyserver {
     while($count--) {
         my $fun = $protofunc{$proto};
 
-        $pid = &$fun($proto, $ip, $port);
+        $pid = &$fun($proto, $ip, $port, $ipvnum, $idnum);
 
         if($pid > 0) {
             last;
@@ -897,7 +886,7 @@ sub runhttpserver {
     }
 
     # Server is up. Verify that we can speak to it.
-    my $pid3 = verifyserver($proto, $ip, $port);
+    my $pid3 = verifyserver($proto, $ip, $port, $ipvnum, $idnum);
     if(!$pid3) {
         logmsg "RUN: $srvrname server failed verification\n";
         # failed to talk to it properly. Kill the server and return failure
@@ -974,7 +963,7 @@ sub runhttpsserver {
     }
 
     # Server is up. Verify that we can speak to it.
-    my $pid3 = verifyserver("https", $ip, $HTTPSPORT);
+    my $pid3 = verifyserver($proto, $ip, $HTTPSPORT, $ipvnum, $idnum);
     if(!$pid3) {
         logmsg "RUN: $srvrname server failed verification\n";
         # failed to talk to it properly. Kill the server and return failure
@@ -1066,7 +1055,7 @@ sub runpingpongserver {
     }
 
     # Server is up. Verify that we can speak to it.
-    my $pid3 = verifyserver($proto, $ip, $port);
+    my $pid3 = verifyserver($proto, $ip, $port, $ipvnum, $idnum);
     if(!$pid3) {
         logmsg "RUN: $srvrname server failed verification\n";
         # failed to talk to it properly. Kill the server and return failure
@@ -1143,7 +1132,7 @@ sub runftpsserver {
     }
 
     # Server is up. Verify that we can speak to it.
-    my $pid3 = verifyserver("ftps", $ip, $FTPSPORT);
+    my $pid3 = verifyserver($proto, $ip, $FTPSPORT, $ipvnum, $idnum);
     if(!$pid3) {
         logmsg "RUN: $srvrname server failed verification\n";
         # failed to talk to it properly. Kill the server and return failure
@@ -1220,7 +1209,7 @@ sub runtftpserver {
     }
 
     # Server is up. Verify that we can speak to it.
-    my $pid3 = verifyserver($proto, $ip, $port);
+    my $pid3 = verifyserver($proto, $ip, $port, $ipvnum, $idnum);
     if(!$pid3) {
         logmsg "RUN: $srvrname server failed verification\n";
         # failed to talk to it properly. Kill the server and return failure
@@ -1242,36 +1231,47 @@ sub runtftpserver {
 
 
 #######################################################################
-# Start the scp/sftp server
+# Start the ssh (scp/sftp) server
 #
 sub runsshserver {
     my ($id, $verbose, $ipv6) = @_;
     my $ip=$HOSTIP;
     my $port = $SSHPORT;
     my $socksport = $SOCKSPORT;
-    my $pidfile = $SSHPIDFILE;
     my $proto = 'ssh';
     my $ipvnum = 4;
     my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
     my $srvrname;
+    my $pidfile;
+    my $logfile;
+    my $flags = "";
+
+    $pidfile = server_pidfilename($proto, $ipvnum, $idnum);
 
     # don't retry if the server doesn't work
     if ($doesntrun{$pidfile}) {
         return (0,0);
     }
 
-    $srvrname = servername_str($proto, $ipvnum, $idnum);
-
     my $pid = processexists($pidfile);
     if($pid > 0) {
         stopserver($pid);
     }
     unlink($pidfile);
 
-    my $flag=$verbose?'-v ':'';
-    $flag .= '-d ' if($debugprotocol);
+    $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+    $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
 
-    my $cmd="$perl $srcdir/sshserver.pl ${flag}-u $USER -l $ip -p $port -s $socksport";
+    $flags .= "--verbose " if($verbose);
+    $flags .= "--debugprotocol " if($debugprotocol);
+    $flags .= "--pidfile \"$pidfile\" ";
+    $flags .= "--id $idnum " if($idnum > 1);
+    $flags .= "--ipv$ipvnum --addr \"$ip\" ";
+    $flags .= "--sshport $port --socksport $socksport ";
+    $flags .= "--user \"$USER\"";
+
+    my $cmd = "$perl $srcdir/sshserver.pl $flags";
     my ($sshpid, $pid2) = startnew($cmd, $pidfile, 60, 0);
 
     # on loaded systems sshserver start up can take longer than the timeout
@@ -1290,7 +1290,7 @@ sub runsshserver {
     # and gives us the opportunity of recovering the pid from the pidfile, when
     # this verification succeeds the recovered pid is assigned to pid2.
 
-    my $pid3 = verifyserver("ssh",$ip,$port);
+    my $pid3 = verifyserver($proto, $ip, $port, $ipvnum, $idnum);
     if(!$pid3) {
         logmsg "RUN: $srvrname server failed verification\n";
         # failed to fetch server pid. Kill the server and return failure
@@ -1304,7 +1304,10 @@ sub runsshserver {
     # is performed actually connecting to it, authenticating and performing a
     # very simple remote command.  This verification is tried only one time.
 
-    if(verifysftp("sftp",$ip,$port) < 1) {
+    $sshdlog = server_logfilename($LOGDIR, 'ssh', $ipvnum, $idnum);
+    $sftplog = server_logfilename($LOGDIR, 'sftp', $ipvnum, $idnum);
+
+    if(verifysftp("sftp", $ip, $port, $ipvnum, $idnum) < 1) {
         logmsg "RUN: SFTP server failed verification\n";
         # failed to talk to it properly. Kill the server and return failure
         display_sftplog();
@@ -1330,25 +1333,32 @@ sub runsocksserver {
     my ($id, $verbose, $ipv6) = @_;
     my $ip=$HOSTIP;
     my $port = $SOCKSPORT;
-    my $pidfile = $SOCKSPIDFILE;
     my $proto = 'socks';
     my $ipvnum = 4;
     my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
     my $srvrname;
+    my $pidfile;
+    my $logfile;
+    my $flags = "";
+
+    $pidfile = server_pidfilename($proto, $ipvnum, $idnum);
+    $SOCKSPIDFILE = $pidfile;
 
     # don't retry if the server doesn't work
     if ($doesntrun{$pidfile}) {
         return (0,0);
     }
 
-    $srvrname = servername_str($proto, $ipvnum, $idnum);
-
     my $pid = processexists($pidfile);
     if($pid > 0) {
         stopserver($pid);
     }
     unlink($pidfile);
 
+    $srvrname = servername_str($proto, $ipvnum, $idnum);
+
+    $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
+
     # The ssh server must be already running
     if(!$run{'ssh'}) {
         logmsg "RUN: SOCKS server cannot find running SSH server\n";
@@ -1417,6 +1427,8 @@ sub runsocksserver {
         return (0,0);
     }
 
+    $sshlog  = server_logfilename($LOGDIR, 'socks', $ipvnum, $idnum);
+
     # start our socks server
     my $cmd="$ssh -N -F $sshconfig $ip > $sshlog 2>&1";
     my ($sshpid, $pid2) = startnew($cmd, $pidfile, 30, 1);
@@ -1434,7 +1446,7 @@ sub runsocksserver {
     }
 
     # Ugly hack but ssh doesn't support pid files
-    my $pid3 = verifyserver("socks",$ip,$port);
+    my $pid3 = verifyserver($proto, $ip, $port, $ipvnum, $idnum);
     if(!$pid3) {
         logmsg "RUN: $srvrname server failed verification\n";
         # failed to talk to it properly. Kill the server and return failure
@@ -1922,7 +1934,6 @@ sub singletest {
         logmsg "Warning: test$testnum not present in tests/data/Makefile.am\n";
     }
 
-
     # load the test case file definition
     if(loadtest("${TESTDIR}/test${testnum}")) {
         if($verbose) {
@@ -2392,13 +2403,13 @@ sub singletest {
         foreach my $server (@killservers) {
             chomp $server;
             if($run{$server}) {
-                $pidlist .= " $run{$server}";
+                $pidlist .= "$run{$server} ";
                 $run{$server} = 0;
             }
             if($server =~ /^(ftp|http|imap|pop3|smtp)s(.*)$/) {
                 $server = "$1$2";
                 if($run{$server}) {
-                    $pidlist .= " $run{$server}";
+                    $pidlist .= "$run{$server} ";
                     $run{$server} = 0;
                 }
             }
index 7cd4b5c5511a317249034e421f2d81ac8e775f55..e6fd3f847a92f3615e7d5b3642396ca61c05c54a 100644 (file)
@@ -5,7 +5,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -24,7 +24,7 @@
 package sshhelp;
 
 use strict;
-#use warnings;
+use warnings;
 use Exporter;
 use File::Spec;
 
@@ -111,9 +111,9 @@ $sshkeygenexe = 'ssh-keygen'  .exe_ext(); # base name and ext of ssh-keygen
 $sshdconfig   = 'curl_sshd_config';       # ssh daemon config file
 $sshconfig    = 'curl_ssh_config';        # ssh client config file
 $sftpconfig   = 'curl_sftp_config';       # sftp client config file
-$sshdlog      = 'log/sshd.log';           # ssh daemon log file
-$sshlog       = 'log/ssh.log';            # ssh client log file
-$sftplog      = 'log/sftp.log';           # sftp client log file
+$sshdlog      = undef;                    # ssh daemon log file
+$sshlog       = undef;                    # ssh client log file
+$sftplog      = undef;                    # sftp client log file
 $sftpcmds     = 'curl_sftp_cmds';         # sftp client commands batch file
 $knownhosts   = 'curl_client_knownhosts'; # ssh knownhosts file
 $hstprvkeyf   = 'curl_host_dsa_key';      # host private key file
@@ -240,6 +240,7 @@ sub display_sftpconfig {
 # Display contents of the ssh daemon log file
 #
 sub display_sshdlog {
+    die "error: \$sshdlog uninitialized" if(not defined $sshdlog);
     display_file($sshdlog);
 }
 
@@ -248,6 +249,7 @@ sub display_sshdlog {
 # Display contents of the ssh client log file
 #
 sub display_sshlog {
+    die "error: \$sshlog uninitialized" if(not defined $sshlog);
     display_file($sshlog);
 }
 
@@ -256,6 +258,7 @@ sub display_sshlog {
 # Display contents of the sftp client log file
 #
 sub display_sftplog {
+    die "error: \$sftplog uninitialized" if(not defined $sftplog);
     display_file($sftplog);
 }
 
index 564e615503d42e21ca36a6cda65e9a9ee076fb25..f0290e22471faa6d1d713af58dbb703edcd981a3 100644 (file)
@@ -6,7 +6,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
 # Starts sshd for use in the SCP, SFTP and SOCKS curl test harness tests.
 # Also creates the ssh configuration files needed for these tests.
 
-# Options:
-#
-# -v
-# -d
-# -u user
-# -l listen address
-# -p SCP/SFTP server port
-# -s SOCKS4/5 server port
-
 use strict;
-#use warnings;
+use warnings;
 use Cwd;
 
 #***************************************************************************
@@ -75,6 +66,14 @@ use sshhelp qw(
     sshversioninfo
     );
 
+#***************************************************************************
+# Subs imported from serverhelp module
+#
+use serverhelp qw(
+    server_pidfilename
+    server_logfilename
+    );
+
 
 #***************************************************************************
 
@@ -83,8 +82,13 @@ my $debugprotocol = 0;        # set to 1 for protocol debugging
 my $port = 8999;              # our default SCP/SFTP server port
 my $socksport = $port + 1;    # our default SOCKS4/5 server port
 my $listenaddr = '127.0.0.1'; # default address on which to listen
+my $ipvnum = 4;               # default IP version of listener address
+my $idnum = 1;                # dafault ssh daemon instance number
+my $proto = 'ssh';            # protocol the ssh daemon speaks
 my $path = getcwd();          # current working directory
+my $logdir = $path .'/log';   # directory for log files
 my $username = $ENV{USER};    # default user
+my $pidfile;                  # ssh daemon pid file
 
 my $error;
 my @cfgarr;
@@ -94,35 +98,92 @@ my @cfgarr;
 # Parse command line options
 #
 while(@ARGV) {
-    if($ARGV[0] eq '-v') {
+    if($ARGV[0] eq '--verbose') {
         $verbose = 1;
     }
-    elsif($ARGV[0] eq '-d') {
+    elsif($ARGV[0] eq '--debugprotocol') {
         $verbose = 1;
         $debugprotocol = 1;
     }
-    elsif($ARGV[0] eq '-u') {
-        $username = $ARGV[1];
-        shift @ARGV;
+    elsif($ARGV[0] eq '--user') {
+        if($ARGV[1]) {
+            $username = $ARGV[1];
+            shift @ARGV;
+        }
+    }
+    elsif($ARGV[0] eq '--id') {
+        if($ARGV[1]) {
+            if($ARGV[1] =~ /^(\d+)$/) {
+                $idnum = $1 if($1 > 0);
+                shift @ARGV;
+            }
+        }
+    }
+    elsif($ARGV[0] eq '--ipv4') {
+        $ipvnum = 4;
+        $listenaddr = '127.0.0.1' if($listenaddr eq '::1');
+    }
+    elsif($ARGV[0] eq '--ipv6') {
+        $ipvnum = 6;
+        $listenaddr = '::1' if($listenaddr eq '127.0.0.1');
     }
-    elsif($ARGV[0] eq '-l') {
-        $listenaddr = $ARGV[1];
-        shift @ARGV;
+    elsif($ARGV[0] eq '--addr') {
+        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);
+                shift @ARGV;
+            }
+            elsif($ipvnum == 6) {
+                $listenaddr = $tmpstr;
+                $listenaddr =~ s/^\[(.*)\]$/$1/;
+                shift @ARGV;
+            }
+        }
     }
-    elsif($ARGV[0] eq '-p') {
-        if($ARGV[1] =~ /^(\d+)$/) {
-            $port = $1;
+    elsif($ARGV[0] eq '--pidfile') {
+        if($ARGV[1]) {
+            $pidfile = "$path/". $ARGV[1];
+            shift @ARGV;
         }
-        shift @ARGV;
     }
-    elsif($ARGV[0] eq '-s') {
-        if($ARGV[1] =~ /^(\d+)$/) {
-            $socksport = $1;
+    elsif($ARGV[0] eq '--sshport') {
+        if($ARGV[1]) {
+            if($ARGV[1] =~ /^(\d+)$/) {
+                $port = $1;
+                shift @ARGV;
+            }
         }
-        shift @ARGV;
+    }
+    elsif($ARGV[0] eq '--socksport') {
+        if($ARGV[1]) {
+            if($ARGV[1] =~ /^(\d+)$/) {
+                $socksport = $1;
+                shift @ARGV;
+            }
+        }
+    }
+    else {
+        print STDERR "\nWarning: sshserver.pl unknown parameter: $ARGV[0]\n";
     }
     shift @ARGV;
-};
+}
+
+
+#***************************************************************************
+# Default ssh daemon pid file name
+#
+if(!$pidfile) {
+    $pidfile = "$path/". server_pidfilename($proto, $ipvnum, $idnum);
+}
+
+
+#***************************************************************************
+# ssh, socks and sftp server log file names
+#
+$sshdlog = server_logfilename($logdir, 'ssh', $ipvnum, $idnum);
+$sftplog = server_logfilename($logdir, 'sftp', $ipvnum, $idnum);
+$sshlog  = server_logfilename($logdir, 'socks', $ipvnum, $idnum);
 
 
 #***************************************************************************
@@ -420,7 +481,7 @@ push @cfgarr, '#';
 push @cfgarr, "AuthorizedKeysFile $path/$clipubkeyf";
 push @cfgarr, "AuthorizedKeysFile2 $path/$clipubkeyf";
 push @cfgarr, "HostKey $path/$hstprvkeyf";
-push @cfgarr, "PidFile $path/.ssh.pid";
+push @cfgarr, "PidFile $pidfile";
 push @cfgarr, '#';
 push @cfgarr, "Port $port";
 push @cfgarr, "ListenAddress $listenaddr";