xref: /aosp_15_r20/external/curl/tests/servers.pm (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker#                                  _   _ ____  _
3*6236dae4SAndroid Build Coastguard Worker#  Project                     ___| | | |  _ \| |
4*6236dae4SAndroid Build Coastguard Worker#                             / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker#                            | (__| |_| |  _ <| |___
6*6236dae4SAndroid Build Coastguard Worker#                             \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker#
8*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker#
10*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker#
14*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker#
18*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker#
21*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker#
23*6236dae4SAndroid Build Coastguard Worker###########################################################################
24*6236dae4SAndroid Build Coastguard Worker
25*6236dae4SAndroid Build Coastguard Worker# This module contains functions that are useful for managing the lifecycle of
26*6236dae4SAndroid Build Coastguard Worker# test servers required when running tests. It is not intended for use within
27*6236dae4SAndroid Build Coastguard Worker# those servers, but rather for starting and stopping them.
28*6236dae4SAndroid Build Coastguard Worker
29*6236dae4SAndroid Build Coastguard Workerpackage servers;
30*6236dae4SAndroid Build Coastguard Worker
31*6236dae4SAndroid Build Coastguard Workeruse IO::Socket;
32*6236dae4SAndroid Build Coastguard Workeruse strict;
33*6236dae4SAndroid Build Coastguard Workeruse warnings;
34*6236dae4SAndroid Build Coastguard Worker
35*6236dae4SAndroid Build Coastguard WorkerBEGIN {
36*6236dae4SAndroid Build Coastguard Worker    use base qw(Exporter);
37*6236dae4SAndroid Build Coastguard Worker
38*6236dae4SAndroid Build Coastguard Worker    our @EXPORT = (
39*6236dae4SAndroid Build Coastguard Worker        # variables
40*6236dae4SAndroid Build Coastguard Worker        qw(
41*6236dae4SAndroid Build Coastguard Worker            $SOCKSIN
42*6236dae4SAndroid Build Coastguard Worker            $err_unexpected
43*6236dae4SAndroid Build Coastguard Worker            $debugprotocol
44*6236dae4SAndroid Build Coastguard Worker            $stunnel
45*6236dae4SAndroid Build Coastguard Worker        ),
46*6236dae4SAndroid Build Coastguard Worker
47*6236dae4SAndroid Build Coastguard Worker        # functions
48*6236dae4SAndroid Build Coastguard Worker        qw(
49*6236dae4SAndroid Build Coastguard Worker            initserverconfig
50*6236dae4SAndroid Build Coastguard Worker        )
51*6236dae4SAndroid Build Coastguard Worker    );
52*6236dae4SAndroid Build Coastguard Worker
53*6236dae4SAndroid Build Coastguard Worker    our @EXPORT_OK = (
54*6236dae4SAndroid Build Coastguard Worker        # functions
55*6236dae4SAndroid Build Coastguard Worker        qw(
56*6236dae4SAndroid Build Coastguard Worker            checkcmd
57*6236dae4SAndroid Build Coastguard Worker            clearlocks
58*6236dae4SAndroid Build Coastguard Worker            serverfortest
59*6236dae4SAndroid Build Coastguard Worker            stopserver
60*6236dae4SAndroid Build Coastguard Worker            stopservers
61*6236dae4SAndroid Build Coastguard Worker            subvariables
62*6236dae4SAndroid Build Coastguard Worker            localhttp
63*6236dae4SAndroid Build Coastguard Worker        ),
64*6236dae4SAndroid Build Coastguard Worker
65*6236dae4SAndroid Build Coastguard Worker        # for debugging only
66*6236dae4SAndroid Build Coastguard Worker        qw(
67*6236dae4SAndroid Build Coastguard Worker            protoport
68*6236dae4SAndroid Build Coastguard Worker        )
69*6236dae4SAndroid Build Coastguard Worker    );
70*6236dae4SAndroid Build Coastguard Worker}
71*6236dae4SAndroid Build Coastguard Worker
72*6236dae4SAndroid Build Coastguard Workeruse serverhelp qw(
73*6236dae4SAndroid Build Coastguard Worker    serverfactors
74*6236dae4SAndroid Build Coastguard Worker    servername_id
75*6236dae4SAndroid Build Coastguard Worker    servername_str
76*6236dae4SAndroid Build Coastguard Worker    servername_canon
77*6236dae4SAndroid Build Coastguard Worker    server_pidfilename
78*6236dae4SAndroid Build Coastguard Worker    server_portfilename
79*6236dae4SAndroid Build Coastguard Worker    server_logfilename
80*6236dae4SAndroid Build Coastguard Worker    );
81*6236dae4SAndroid Build Coastguard Worker
82*6236dae4SAndroid Build Coastguard Workeruse sshhelp qw(
83*6236dae4SAndroid Build Coastguard Worker    $hstpubmd5f
84*6236dae4SAndroid Build Coastguard Worker    $hstpubsha256f
85*6236dae4SAndroid Build Coastguard Worker    $sshexe
86*6236dae4SAndroid Build Coastguard Worker    $sftpexe
87*6236dae4SAndroid Build Coastguard Worker    $sftpconfig
88*6236dae4SAndroid Build Coastguard Worker    $sshdlog
89*6236dae4SAndroid Build Coastguard Worker    $sftplog
90*6236dae4SAndroid Build Coastguard Worker    $sftpcmds
91*6236dae4SAndroid Build Coastguard Worker    display_sshdconfig
92*6236dae4SAndroid Build Coastguard Worker    display_sftpconfig
93*6236dae4SAndroid Build Coastguard Worker    display_sshdlog
94*6236dae4SAndroid Build Coastguard Worker    display_sftplog
95*6236dae4SAndroid Build Coastguard Worker    find_sshd
96*6236dae4SAndroid Build Coastguard Worker    find_ssh
97*6236dae4SAndroid Build Coastguard Worker    find_sftp
98*6236dae4SAndroid Build Coastguard Worker    find_httptlssrv
99*6236dae4SAndroid Build Coastguard Worker    sshversioninfo
100*6236dae4SAndroid Build Coastguard Worker    );
101*6236dae4SAndroid Build Coastguard Worker
102*6236dae4SAndroid Build Coastguard Workeruse pathhelp qw(
103*6236dae4SAndroid Build Coastguard Worker    exe_ext
104*6236dae4SAndroid Build Coastguard Worker    os_is_win
105*6236dae4SAndroid Build Coastguard Worker    build_sys_abs_path
106*6236dae4SAndroid Build Coastguard Worker    sys_native_abs_path
107*6236dae4SAndroid Build Coastguard Worker    );
108*6236dae4SAndroid Build Coastguard Worker
109*6236dae4SAndroid Build Coastguard Workeruse processhelp;
110*6236dae4SAndroid Build Coastguard Workeruse globalconfig;
111*6236dae4SAndroid Build Coastguard Workeruse testutil qw(
112*6236dae4SAndroid Build Coastguard Worker    logmsg
113*6236dae4SAndroid Build Coastguard Worker    runclient
114*6236dae4SAndroid Build Coastguard Worker    runclientoutput
115*6236dae4SAndroid Build Coastguard Worker    );
116*6236dae4SAndroid Build Coastguard Worker
117*6236dae4SAndroid Build Coastguard Worker
118*6236dae4SAndroid Build Coastguard Workermy %serverpidfile; # all server pid file names, identified by server id
119*6236dae4SAndroid Build Coastguard Workermy %serverportfile;# all server port file names, identified by server id
120*6236dae4SAndroid Build Coastguard Workermy $sshdvernum;  # for socks server, ssh daemon version number
121*6236dae4SAndroid Build Coastguard Workermy $sshdverstr;  # for socks server, ssh daemon version string
122*6236dae4SAndroid Build Coastguard Workermy $sshderror;   # for socks server, ssh daemon version error
123*6236dae4SAndroid Build Coastguard Workermy %doesntrun;    # servers that don't work, identified by pidfile
124*6236dae4SAndroid Build Coastguard Workermy %PORT = (nolisten => 47); # port we use for a local non-listening service
125*6236dae4SAndroid Build Coastguard Workermy $server_response_maxtime=13;
126*6236dae4SAndroid Build Coastguard Workermy $httptlssrv = find_httptlssrv();
127*6236dae4SAndroid Build Coastguard Workermy %run;          # running server
128*6236dae4SAndroid Build Coastguard Workermy %runcert;      # cert file currently in use by an ssl running server
129*6236dae4SAndroid Build Coastguard Workermy $CLIENTIP="127.0.0.1";  # address which curl uses for incoming connections
130*6236dae4SAndroid Build Coastguard Workermy $CLIENT6IP="[::1]";     # address which curl uses for incoming connections
131*6236dae4SAndroid Build Coastguard Workermy $posix_pwd = build_sys_abs_path($pwd);  # current working directory in POSIX format
132*6236dae4SAndroid Build Coastguard Workermy $h2cver = "h2c"; # this version is decided by the nghttp2 lib being used
133*6236dae4SAndroid Build Coastguard Workermy $portrange = 999;       # space from which to choose a random port
134*6236dae4SAndroid Build Coastguard Worker                           # don't increase without making sure generated port
135*6236dae4SAndroid Build Coastguard Worker                           # numbers will always be valid (<=65535)
136*6236dae4SAndroid Build Coastguard Workermy $HOSTIP="127.0.0.1";    # address on which the test server listens
137*6236dae4SAndroid Build Coastguard Workermy $HOST6IP="[::1]";       # address on which the test server listens
138*6236dae4SAndroid Build Coastguard Workermy $HTTPUNIXPATH;          # HTTP server Unix domain socket path
139*6236dae4SAndroid Build Coastguard Workermy $SOCKSUNIXPATH;         # socks server Unix domain socket path
140*6236dae4SAndroid Build Coastguard Workermy $SSHSRVMD5 = "[uninitialized]";    # MD5 of ssh server public key
141*6236dae4SAndroid Build Coastguard Workermy $SSHSRVSHA256 = "[uninitialized]"; # SHA256 of ssh server public key
142*6236dae4SAndroid Build Coastguard Workermy $USER;                  # name of the current user
143*6236dae4SAndroid Build Coastguard Workermy $sshdid;                # for socks server, ssh daemon version id
144*6236dae4SAndroid Build Coastguard Workermy $ftpchecktime=1;        # time it took to verify our test FTP server
145*6236dae4SAndroid Build Coastguard Worker
146*6236dae4SAndroid Build Coastguard Worker# Variables shared with runtests.pl
147*6236dae4SAndroid Build Coastguard Workerour $SOCKSIN="socksd-request.log"; # what curl sent to the SOCKS proxy
148*6236dae4SAndroid Build Coastguard Workerour $err_unexpected; # error instead of warning on server unexpectedly alive
149*6236dae4SAndroid Build Coastguard Workerour $debugprotocol;  # nonzero for verbose server logs
150*6236dae4SAndroid Build Coastguard Workerour $stunnel;        # path to stunnel command
151*6236dae4SAndroid Build Coastguard Worker
152*6236dae4SAndroid Build Coastguard Worker
153*6236dae4SAndroid Build Coastguard Worker#######################################################################
154*6236dae4SAndroid Build Coastguard Worker# Check for a command in the PATH of the test server.
155*6236dae4SAndroid Build Coastguard Worker#
156*6236dae4SAndroid Build Coastguard Workersub checkcmd {
157*6236dae4SAndroid Build Coastguard Worker    my ($cmd, @extrapaths)=@_;
158*6236dae4SAndroid Build Coastguard Worker    my @paths;
159*6236dae4SAndroid Build Coastguard Worker    if ($^O eq 'MSWin32' || $^O eq 'dos' || $^O eq 'os2') {
160*6236dae4SAndroid Build Coastguard Worker        # PATH separator is different
161*6236dae4SAndroid Build Coastguard Worker        @paths=(split(';', $ENV{'PATH'}), @extrapaths);
162*6236dae4SAndroid Build Coastguard Worker    }
163*6236dae4SAndroid Build Coastguard Worker    else {
164*6236dae4SAndroid Build Coastguard Worker        @paths=(split(':', $ENV{'PATH'}), "/usr/sbin", "/usr/local/sbin",
165*6236dae4SAndroid Build Coastguard Worker                "/sbin", "/usr/bin", "/usr/local/bin", @extrapaths);
166*6236dae4SAndroid Build Coastguard Worker    }
167*6236dae4SAndroid Build Coastguard Worker    for(@paths) {
168*6236dae4SAndroid Build Coastguard Worker        if( -x "$_/$cmd" . exe_ext('SYS') && ! -d "$_/$cmd" . exe_ext('SYS')) {
169*6236dae4SAndroid Build Coastguard Worker            # executable bit but not a directory!
170*6236dae4SAndroid Build Coastguard Worker            return "$_/$cmd";
171*6236dae4SAndroid Build Coastguard Worker        }
172*6236dae4SAndroid Build Coastguard Worker    }
173*6236dae4SAndroid Build Coastguard Worker    return "";
174*6236dae4SAndroid Build Coastguard Worker}
175*6236dae4SAndroid Build Coastguard Worker
176*6236dae4SAndroid Build Coastguard Worker#######################################################################
177*6236dae4SAndroid Build Coastguard Worker# Create a server socket on a random (unused) port, then close it and
178*6236dae4SAndroid Build Coastguard Worker# return the port number
179*6236dae4SAndroid Build Coastguard Worker#
180*6236dae4SAndroid Build Coastguard Workersub getfreeport {
181*6236dae4SAndroid Build Coastguard Worker    my ($ipnum) = @_;
182*6236dae4SAndroid Build Coastguard Worker    my $server = IO::Socket->new(LocalPort => 0,
183*6236dae4SAndroid Build Coastguard Worker                                 Domain => $ipnum == 6 ? AF_INET6 : AF_INET,
184*6236dae4SAndroid Build Coastguard Worker                                 Type      => SOCK_STREAM,
185*6236dae4SAndroid Build Coastguard Worker                                 Reuse     => 1,
186*6236dae4SAndroid Build Coastguard Worker                                 Listen    => 10 )
187*6236dae4SAndroid Build Coastguard Worker        or die "Couldn't create tcp server socket: $@\n";
188*6236dae4SAndroid Build Coastguard Worker
189*6236dae4SAndroid Build Coastguard Worker    return $server->sockport();
190*6236dae4SAndroid Build Coastguard Worker}
191*6236dae4SAndroid Build Coastguard Worker
192*6236dae4SAndroid Build Coastguard Workeruse File::Temp qw/ tempfile/;
193*6236dae4SAndroid Build Coastguard Worker
194*6236dae4SAndroid Build Coastguard Worker#######################################################################
195*6236dae4SAndroid Build Coastguard Worker# Initialize configuration variables
196*6236dae4SAndroid Build Coastguard Workersub initserverconfig {
197*6236dae4SAndroid Build Coastguard Worker    my ($fh, $socks) = tempfile("curl-socksd-XXXXXXXX", TMPDIR => 1);
198*6236dae4SAndroid Build Coastguard Worker    close($fh);
199*6236dae4SAndroid Build Coastguard Worker    unlink($socks);
200*6236dae4SAndroid Build Coastguard Worker    my ($f2, $http) = tempfile("curl-http-XXXXXXXX", TMPDIR => 1);
201*6236dae4SAndroid Build Coastguard Worker    close($f2);
202*6236dae4SAndroid Build Coastguard Worker    unlink($http);
203*6236dae4SAndroid Build Coastguard Worker    $SOCKSUNIXPATH = $socks; # SOCKS Unix domain socket
204*6236dae4SAndroid Build Coastguard Worker    $HTTPUNIXPATH = $http;   # HTTP Unix domain socket
205*6236dae4SAndroid Build Coastguard Worker    $stunnel = checkcmd("stunnel4") || checkcmd("tstunnel") || checkcmd("stunnel");
206*6236dae4SAndroid Build Coastguard Worker
207*6236dae4SAndroid Build Coastguard Worker    # get the name of the current user
208*6236dae4SAndroid Build Coastguard Worker    $USER = $ENV{USER};          # Linux
209*6236dae4SAndroid Build Coastguard Worker    if (!$USER) {
210*6236dae4SAndroid Build Coastguard Worker        $USER = $ENV{USERNAME};     # Windows
211*6236dae4SAndroid Build Coastguard Worker        if (!$USER) {
212*6236dae4SAndroid Build Coastguard Worker            $USER = $ENV{LOGNAME};  # Some Unix (I think)
213*6236dae4SAndroid Build Coastguard Worker        }
214*6236dae4SAndroid Build Coastguard Worker    }
215*6236dae4SAndroid Build Coastguard Worker    init_serverpidfile_hash();
216*6236dae4SAndroid Build Coastguard Worker}
217*6236dae4SAndroid Build Coastguard Worker
218*6236dae4SAndroid Build Coastguard Worker#######################################################################
219*6236dae4SAndroid Build Coastguard Worker# Load serverpidfile and serverportfile hashes with file names for all
220*6236dae4SAndroid Build Coastguard Worker# possible servers.
221*6236dae4SAndroid Build Coastguard Worker#
222*6236dae4SAndroid Build Coastguard Workersub init_serverpidfile_hash {
223*6236dae4SAndroid Build Coastguard Worker  for my $proto (('ftp', 'gopher', 'http', 'imap', 'pop3', 'smtp', 'http/2', 'http/3')) {
224*6236dae4SAndroid Build Coastguard Worker    for my $ssl (('', 's')) {
225*6236dae4SAndroid Build Coastguard Worker      for my $ipvnum ((4, 6)) {
226*6236dae4SAndroid Build Coastguard Worker        for my $idnum ((1, 2, 3)) {
227*6236dae4SAndroid Build Coastguard Worker          my $serv = servername_id("$proto$ssl", $ipvnum, $idnum);
228*6236dae4SAndroid Build Coastguard Worker          my $pidf = server_pidfilename("$LOGDIR/$PIDDIR", "$proto$ssl",
229*6236dae4SAndroid Build Coastguard Worker                                        $ipvnum, $idnum);
230*6236dae4SAndroid Build Coastguard Worker          $serverpidfile{$serv} = $pidf;
231*6236dae4SAndroid Build Coastguard Worker          my $portf = server_portfilename("$LOGDIR/$PIDDIR", "$proto$ssl",
232*6236dae4SAndroid Build Coastguard Worker                                          $ipvnum, $idnum);
233*6236dae4SAndroid Build Coastguard Worker          $serverportfile{$serv} = $portf;
234*6236dae4SAndroid Build Coastguard Worker        }
235*6236dae4SAndroid Build Coastguard Worker      }
236*6236dae4SAndroid Build Coastguard Worker    }
237*6236dae4SAndroid Build Coastguard Worker  }
238*6236dae4SAndroid Build Coastguard Worker  for my $proto (('tftp', 'sftp', 'socks', 'ssh', 'rtsp', 'httptls',
239*6236dae4SAndroid Build Coastguard Worker                  'dict', 'smb', 'smbs', 'telnet', 'mqtt')) {
240*6236dae4SAndroid Build Coastguard Worker    for my $ipvnum ((4, 6)) {
241*6236dae4SAndroid Build Coastguard Worker      for my $idnum ((1, 2)) {
242*6236dae4SAndroid Build Coastguard Worker        my $serv = servername_id($proto, $ipvnum, $idnum);
243*6236dae4SAndroid Build Coastguard Worker        my $pidf = server_pidfilename("$LOGDIR/$PIDDIR", $proto, $ipvnum,
244*6236dae4SAndroid Build Coastguard Worker                                      $idnum);
245*6236dae4SAndroid Build Coastguard Worker        $serverpidfile{$serv} = $pidf;
246*6236dae4SAndroid Build Coastguard Worker        my $portf = server_portfilename("$LOGDIR/$PIDDIR", $proto, $ipvnum,
247*6236dae4SAndroid Build Coastguard Worker                                        $idnum);
248*6236dae4SAndroid Build Coastguard Worker        $serverportfile{$serv} = $portf;
249*6236dae4SAndroid Build Coastguard Worker      }
250*6236dae4SAndroid Build Coastguard Worker    }
251*6236dae4SAndroid Build Coastguard Worker  }
252*6236dae4SAndroid Build Coastguard Worker  for my $proto (('http', 'imap', 'pop3', 'smtp', 'http/2', 'http/3')) {
253*6236dae4SAndroid Build Coastguard Worker    for my $ssl (('', 's')) {
254*6236dae4SAndroid Build Coastguard Worker      my $serv = servername_id("$proto$ssl", "unix", 1);
255*6236dae4SAndroid Build Coastguard Worker      my $pidf = server_pidfilename("$LOGDIR/$PIDDIR", "$proto$ssl",
256*6236dae4SAndroid Build Coastguard Worker                                    "unix", 1);
257*6236dae4SAndroid Build Coastguard Worker      $serverpidfile{$serv} = $pidf;
258*6236dae4SAndroid Build Coastguard Worker      my $portf = server_portfilename("$LOGDIR/$PIDDIR", "$proto$ssl",
259*6236dae4SAndroid Build Coastguard Worker                                      "unix", 1);
260*6236dae4SAndroid Build Coastguard Worker      $serverportfile{$serv} = $portf;
261*6236dae4SAndroid Build Coastguard Worker    }
262*6236dae4SAndroid Build Coastguard Worker  }
263*6236dae4SAndroid Build Coastguard Worker}
264*6236dae4SAndroid Build Coastguard Worker
265*6236dae4SAndroid Build Coastguard Worker
266*6236dae4SAndroid Build Coastguard Worker#######################################################################
267*6236dae4SAndroid Build Coastguard Worker# Kill the processes that still have lock files in a directory
268*6236dae4SAndroid Build Coastguard Worker#
269*6236dae4SAndroid Build Coastguard Workersub clearlocks {
270*6236dae4SAndroid Build Coastguard Worker    my $dir = $_[0];
271*6236dae4SAndroid Build Coastguard Worker    my $done = 0;
272*6236dae4SAndroid Build Coastguard Worker
273*6236dae4SAndroid Build Coastguard Worker    if(os_is_win()) {
274*6236dae4SAndroid Build Coastguard Worker        $dir = sys_native_abs_path($dir);
275*6236dae4SAndroid Build Coastguard Worker        # Must use backslashes for handle64 to find a match
276*6236dae4SAndroid Build Coastguard Worker        if ($^O eq 'MSWin32') {
277*6236dae4SAndroid Build Coastguard Worker            $dir =~ s/\//\\/g;
278*6236dae4SAndroid Build Coastguard Worker        }
279*6236dae4SAndroid Build Coastguard Worker        else {
280*6236dae4SAndroid Build Coastguard Worker            $dir =~ s/\//\\\\/g;
281*6236dae4SAndroid Build Coastguard Worker        }
282*6236dae4SAndroid Build Coastguard Worker        my $handle = "handle";
283*6236dae4SAndroid Build Coastguard Worker        if($ENV{"PROCESSOR_ARCHITECTURE"} =~ /64$/) {
284*6236dae4SAndroid Build Coastguard Worker            $handle = "handle64";
285*6236dae4SAndroid Build Coastguard Worker        }
286*6236dae4SAndroid Build Coastguard Worker        if(checkcmd($handle)) {
287*6236dae4SAndroid Build Coastguard Worker            # https://learn.microsoft.com/sysinternals/downloads/handle#usage
288*6236dae4SAndroid Build Coastguard Worker            my $cmd = "$handle $dir -accepteula -nobanner";
289*6236dae4SAndroid Build Coastguard Worker            logmsg "clearlocks: Executing query: '$cmd'\n";
290*6236dae4SAndroid Build Coastguard Worker            my @handles = `$cmd`;
291*6236dae4SAndroid Build Coastguard Worker            for my $tryhandle (@handles) {
292*6236dae4SAndroid Build Coastguard Worker                # Skip the "No matching handles found." warning when returned
293*6236dae4SAndroid Build Coastguard Worker                if($tryhandle =~ /^(\S+)\s+pid:\s+(\d+)\s+type:\s+(\w+)\s+([0-9A-F]+):\s+(.+)\r\r/) {
294*6236dae4SAndroid Build Coastguard Worker                    logmsg "clearlocks: Found $3 lock of '$5' ($4) by $1 ($2)\n";
295*6236dae4SAndroid Build Coastguard Worker                    # Ignore stunnel since we cannot do anything about its locks
296*6236dae4SAndroid Build Coastguard Worker                    if("$3" eq "File" && "$1" ne "tstunnel.exe") {
297*6236dae4SAndroid Build Coastguard Worker                        logmsg "clearlocks: Killing IMAGENAME eq $1 and PID eq $2\n";
298*6236dae4SAndroid Build Coastguard Worker                        # https://ss64.com/nt/taskkill.html
299*6236dae4SAndroid Build Coastguard Worker                        my $cmd = "taskkill.exe -f -t -fi \"IMAGENAME eq $1\" -fi \"PID eq $2\" >nul 2>&1";
300*6236dae4SAndroid Build Coastguard Worker                        logmsg "clearlocks: Executing kill: '$cmd'\n";
301*6236dae4SAndroid Build Coastguard Worker                        system($cmd);
302*6236dae4SAndroid Build Coastguard Worker                        $done = 1;
303*6236dae4SAndroid Build Coastguard Worker                    }
304*6236dae4SAndroid Build Coastguard Worker                }
305*6236dae4SAndroid Build Coastguard Worker            }
306*6236dae4SAndroid Build Coastguard Worker        }
307*6236dae4SAndroid Build Coastguard Worker        else {
308*6236dae4SAndroid Build Coastguard Worker            logmsg "Warning: 'handle' tool not found.\n";
309*6236dae4SAndroid Build Coastguard Worker        }
310*6236dae4SAndroid Build Coastguard Worker    }
311*6236dae4SAndroid Build Coastguard Worker    return $done;
312*6236dae4SAndroid Build Coastguard Worker}
313*6236dae4SAndroid Build Coastguard Worker
314*6236dae4SAndroid Build Coastguard Worker#######################################################################
315*6236dae4SAndroid Build Coastguard Worker# Check if a given child process has just died. Reaps it if so.
316*6236dae4SAndroid Build Coastguard Worker#
317*6236dae4SAndroid Build Coastguard Workersub checkdied {
318*6236dae4SAndroid Build Coastguard Worker    my $pid = $_[0];
319*6236dae4SAndroid Build Coastguard Worker    if((not defined $pid) || $pid <= 0) {
320*6236dae4SAndroid Build Coastguard Worker        return 0;
321*6236dae4SAndroid Build Coastguard Worker    }
322*6236dae4SAndroid Build Coastguard Worker    use POSIX ":sys_wait_h";
323*6236dae4SAndroid Build Coastguard Worker    my $rc = pidwait($pid, &WNOHANG);
324*6236dae4SAndroid Build Coastguard Worker    return ($rc == $pid)?1:0;
325*6236dae4SAndroid Build Coastguard Worker}
326*6236dae4SAndroid Build Coastguard Worker
327*6236dae4SAndroid Build Coastguard Worker
328*6236dae4SAndroid Build Coastguard Worker##############################################################################
329*6236dae4SAndroid Build Coastguard Worker# This function makes sure the right set of server is running for the
330*6236dae4SAndroid Build Coastguard Worker# specified test case. This is a useful design when we run single tests as not
331*6236dae4SAndroid Build Coastguard Worker# all servers need to run then!
332*6236dae4SAndroid Build Coastguard Worker#
333*6236dae4SAndroid Build Coastguard Worker# Returns: a string, blank if everything is fine or a reason why it failed, and
334*6236dae4SAndroid Build Coastguard Worker#          an integer:
335*6236dae4SAndroid Build Coastguard Worker#          0 for success
336*6236dae4SAndroid Build Coastguard Worker#          1 for an error starting the server
337*6236dae4SAndroid Build Coastguard Worker#          2 for not the first time getting an error starting the server
338*6236dae4SAndroid Build Coastguard Worker#          3 for a failure to stop a server in order to restart it
339*6236dae4SAndroid Build Coastguard Worker#          4 for an unsupported server type
340*6236dae4SAndroid Build Coastguard Worker#
341*6236dae4SAndroid Build Coastguard Workersub serverfortest {
342*6236dae4SAndroid Build Coastguard Worker    my (@what)=@_;
343*6236dae4SAndroid Build Coastguard Worker
344*6236dae4SAndroid Build Coastguard Worker    for(my $i = scalar(@what) - 1; $i >= 0; $i--) {
345*6236dae4SAndroid Build Coastguard Worker        my $srvrline = $what[$i];
346*6236dae4SAndroid Build Coastguard Worker        chomp $srvrline if($srvrline);
347*6236dae4SAndroid Build Coastguard Worker        if($srvrline =~ /^(\S+)((\s*)(.*))/) {
348*6236dae4SAndroid Build Coastguard Worker            my $server = "${1}";
349*6236dae4SAndroid Build Coastguard Worker            my $lnrest = "${2}";
350*6236dae4SAndroid Build Coastguard Worker            my $tlsext;
351*6236dae4SAndroid Build Coastguard Worker            if($server =~ /^(httptls)(\+)(ext|srp)(\d*)(-ipv6|)$/) {
352*6236dae4SAndroid Build Coastguard Worker                $server = "${1}${4}${5}";
353*6236dae4SAndroid Build Coastguard Worker                $tlsext = uc("TLS-${3}");
354*6236dae4SAndroid Build Coastguard Worker            }
355*6236dae4SAndroid Build Coastguard Worker            if(! grep /^\Q$server\E$/, @protocols) {
356*6236dae4SAndroid Build Coastguard Worker                if(substr($server,0,5) ne "socks") {
357*6236dae4SAndroid Build Coastguard Worker                    if($tlsext) {
358*6236dae4SAndroid Build Coastguard Worker                        return ("curl lacks $tlsext support", 4);
359*6236dae4SAndroid Build Coastguard Worker                    }
360*6236dae4SAndroid Build Coastguard Worker                    else {
361*6236dae4SAndroid Build Coastguard Worker                        return ("curl lacks $server server support", 4);
362*6236dae4SAndroid Build Coastguard Worker                    }
363*6236dae4SAndroid Build Coastguard Worker                }
364*6236dae4SAndroid Build Coastguard Worker            }
365*6236dae4SAndroid Build Coastguard Worker            $what[$i] = "$server$lnrest" if($tlsext);
366*6236dae4SAndroid Build Coastguard Worker        }
367*6236dae4SAndroid Build Coastguard Worker    }
368*6236dae4SAndroid Build Coastguard Worker
369*6236dae4SAndroid Build Coastguard Worker    return &startservers(@what);
370*6236dae4SAndroid Build Coastguard Worker}
371*6236dae4SAndroid Build Coastguard Worker
372*6236dae4SAndroid Build Coastguard Worker
373*6236dae4SAndroid Build Coastguard Worker#######################################################################
374*6236dae4SAndroid Build Coastguard Worker# Start a new thread/process and run the given command line in there.
375*6236dae4SAndroid Build Coastguard Worker# Return the pids (yes plural) of the new child process to the parent.
376*6236dae4SAndroid Build Coastguard Worker#
377*6236dae4SAndroid Build Coastguard Workersub startnew {
378*6236dae4SAndroid Build Coastguard Worker    my ($cmd, $pidfile, $timeout, $fakepidfile)=@_;
379*6236dae4SAndroid Build Coastguard Worker
380*6236dae4SAndroid Build Coastguard Worker    logmsg "startnew: $cmd\n" if ($verbose);
381*6236dae4SAndroid Build Coastguard Worker
382*6236dae4SAndroid Build Coastguard Worker    my $child = fork();
383*6236dae4SAndroid Build Coastguard Worker
384*6236dae4SAndroid Build Coastguard Worker    if(not defined $child) {
385*6236dae4SAndroid Build Coastguard Worker        logmsg "startnew: fork() failure detected\n";
386*6236dae4SAndroid Build Coastguard Worker        return (-1,-1);
387*6236dae4SAndroid Build Coastguard Worker    }
388*6236dae4SAndroid Build Coastguard Worker
389*6236dae4SAndroid Build Coastguard Worker    if(0 == $child) {
390*6236dae4SAndroid Build Coastguard Worker        # Here we are the child. Run the given command.
391*6236dae4SAndroid Build Coastguard Worker
392*6236dae4SAndroid Build Coastguard Worker        # Flush output.
393*6236dae4SAndroid Build Coastguard Worker        $| = 1;
394*6236dae4SAndroid Build Coastguard Worker
395*6236dae4SAndroid Build Coastguard Worker        # Put an "exec" in front of the command so that the child process
396*6236dae4SAndroid Build Coastguard Worker        # keeps this child's process ID.
397*6236dae4SAndroid Build Coastguard Worker        exec("exec $cmd") || die "Can't exec() $cmd: $!";
398*6236dae4SAndroid Build Coastguard Worker
399*6236dae4SAndroid Build Coastguard Worker        # exec() should never return back here to this process. We protect
400*6236dae4SAndroid Build Coastguard Worker        # ourselves by calling die() just in case something goes really bad.
401*6236dae4SAndroid Build Coastguard Worker        die "error: exec() has returned";
402*6236dae4SAndroid Build Coastguard Worker    }
403*6236dae4SAndroid Build Coastguard Worker
404*6236dae4SAndroid Build Coastguard Worker    # Ugly hack but ssh client and gnutls-serv don't support pid files
405*6236dae4SAndroid Build Coastguard Worker    if ($fakepidfile) {
406*6236dae4SAndroid Build Coastguard Worker        if(open(my $out, ">", "$pidfile")) {
407*6236dae4SAndroid Build Coastguard Worker            print $out $child . "\n";
408*6236dae4SAndroid Build Coastguard Worker            close($out) || die "Failure writing pidfile";
409*6236dae4SAndroid Build Coastguard Worker            logmsg "startnew: $pidfile faked with pid=$child\n" if($verbose);
410*6236dae4SAndroid Build Coastguard Worker        }
411*6236dae4SAndroid Build Coastguard Worker        else {
412*6236dae4SAndroid Build Coastguard Worker            logmsg "startnew: failed to write fake $pidfile with pid=$child\n";
413*6236dae4SAndroid Build Coastguard Worker        }
414*6236dae4SAndroid Build Coastguard Worker        # could/should do a while connect fails sleep a bit and loop
415*6236dae4SAndroid Build Coastguard Worker        portable_sleep($timeout);
416*6236dae4SAndroid Build Coastguard Worker        if (checkdied($child)) {
417*6236dae4SAndroid Build Coastguard Worker            logmsg "startnew: child process has failed to start\n" if($verbose);
418*6236dae4SAndroid Build Coastguard Worker            return (-1,-1);
419*6236dae4SAndroid Build Coastguard Worker        }
420*6236dae4SAndroid Build Coastguard Worker    }
421*6236dae4SAndroid Build Coastguard Worker
422*6236dae4SAndroid Build Coastguard Worker    my $pid2 = 0;
423*6236dae4SAndroid Build Coastguard Worker    my $count = $timeout;
424*6236dae4SAndroid Build Coastguard Worker    while($count--) {
425*6236dae4SAndroid Build Coastguard Worker        $pid2 = pidfromfile($pidfile);
426*6236dae4SAndroid Build Coastguard Worker        if(($pid2 > 0) && pidexists($pid2)) {
427*6236dae4SAndroid Build Coastguard Worker            # if $pid2 is valid, then make sure this pid is alive, as
428*6236dae4SAndroid Build Coastguard Worker            # otherwise it is just likely to be the _previous_ pidfile or
429*6236dae4SAndroid Build Coastguard Worker            # similar!
430*6236dae4SAndroid Build Coastguard Worker            last;
431*6236dae4SAndroid Build Coastguard Worker        }
432*6236dae4SAndroid Build Coastguard Worker        if (checkdied($child)) {
433*6236dae4SAndroid Build Coastguard Worker            logmsg "startnew: child process has died, server might start up\n"
434*6236dae4SAndroid Build Coastguard Worker                if($verbose);
435*6236dae4SAndroid Build Coastguard Worker            # We can't just abort waiting for the server with a
436*6236dae4SAndroid Build Coastguard Worker            # return (-1,-1);
437*6236dae4SAndroid Build Coastguard Worker            # because the server might have forked and could still start
438*6236dae4SAndroid Build Coastguard Worker            # up normally. Instead, just reduce the amount of time we remain
439*6236dae4SAndroid Build Coastguard Worker            # waiting.
440*6236dae4SAndroid Build Coastguard Worker            $count >>= 2;
441*6236dae4SAndroid Build Coastguard Worker        }
442*6236dae4SAndroid Build Coastguard Worker        sleep(1);
443*6236dae4SAndroid Build Coastguard Worker    }
444*6236dae4SAndroid Build Coastguard Worker
445*6236dae4SAndroid Build Coastguard Worker    # Return two PIDs, the one for the child process we spawned and the one
446*6236dae4SAndroid Build Coastguard Worker    # reported by the server itself (in case it forked again on its own).
447*6236dae4SAndroid Build Coastguard Worker    # Both (potentially) need to be killed at the end of the test.
448*6236dae4SAndroid Build Coastguard Worker    return ($child, $pid2);
449*6236dae4SAndroid Build Coastguard Worker}
450*6236dae4SAndroid Build Coastguard Worker
451*6236dae4SAndroid Build Coastguard Worker
452*6236dae4SAndroid Build Coastguard Worker#######################################################################
453*6236dae4SAndroid Build Coastguard Worker# Return the port to use for the given protocol.
454*6236dae4SAndroid Build Coastguard Worker#
455*6236dae4SAndroid Build Coastguard Workersub protoport {
456*6236dae4SAndroid Build Coastguard Worker    my ($proto) = @_;
457*6236dae4SAndroid Build Coastguard Worker    return $PORT{$proto} || "[not running]";
458*6236dae4SAndroid Build Coastguard Worker}
459*6236dae4SAndroid Build Coastguard Worker
460*6236dae4SAndroid Build Coastguard Worker
461*6236dae4SAndroid Build Coastguard Worker#######################################################################
462*6236dae4SAndroid Build Coastguard Worker# Stop a test server along with pids which aren't in the %run hash yet.
463*6236dae4SAndroid Build Coastguard Worker# This also stops all servers which are relative to the given one.
464*6236dae4SAndroid Build Coastguard Worker#
465*6236dae4SAndroid Build Coastguard Workersub stopserver {
466*6236dae4SAndroid Build Coastguard Worker    my ($server, $pidlist) = @_;
467*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
468*6236dae4SAndroid Build Coastguard Worker
469*6236dae4SAndroid Build Coastguard Worker    #
470*6236dae4SAndroid Build Coastguard Worker    # kill sockfilter processes for pingpong relative server
471*6236dae4SAndroid Build Coastguard Worker    #
472*6236dae4SAndroid Build Coastguard Worker    if($server =~ /^(ftp|imap|pop3|smtp)s?(\d*)(-ipv6|)$/) {
473*6236dae4SAndroid Build Coastguard Worker        my $proto  = $1;
474*6236dae4SAndroid Build Coastguard Worker        my $idnum  = ($2 && ($2 > 1)) ? $2 : 1;
475*6236dae4SAndroid Build Coastguard Worker        $ipvnum = ($3 && ($3 =~ /6$/)) ? 6 : 4;
476*6236dae4SAndroid Build Coastguard Worker        killsockfilters("$LOGDIR/$PIDDIR", $proto, $ipvnum, $idnum, $verbose);
477*6236dae4SAndroid Build Coastguard Worker    }
478*6236dae4SAndroid Build Coastguard Worker    #
479*6236dae4SAndroid Build Coastguard Worker    # All servers relative to the given one must be stopped also
480*6236dae4SAndroid Build Coastguard Worker    #
481*6236dae4SAndroid Build Coastguard Worker    my @killservers;
482*6236dae4SAndroid Build Coastguard Worker    if($server =~ /^(ftp|http|imap|pop3|smtp)s((\d*)(-ipv6|-unix|))$/) {
483*6236dae4SAndroid Build Coastguard Worker        # given a stunnel based ssl server, also kill non-ssl underlying one
484*6236dae4SAndroid Build Coastguard Worker        push @killservers, "${1}${2}";
485*6236dae4SAndroid Build Coastguard Worker    }
486*6236dae4SAndroid Build Coastguard Worker    elsif($server =~ /^(ftp|http|imap|pop3|smtp)((\d*)(-ipv6|-unix|))$/) {
487*6236dae4SAndroid Build Coastguard Worker        # given a non-ssl server, also kill stunnel based ssl piggybacking one
488*6236dae4SAndroid Build Coastguard Worker        push @killservers, "${1}s${2}";
489*6236dae4SAndroid Build Coastguard Worker    }
490*6236dae4SAndroid Build Coastguard Worker    elsif($server =~ /^(socks)((\d*)(-ipv6|))$/) {
491*6236dae4SAndroid Build Coastguard Worker        # given a socks server, also kill ssh underlying one
492*6236dae4SAndroid Build Coastguard Worker        push @killservers, "ssh${2}";
493*6236dae4SAndroid Build Coastguard Worker    }
494*6236dae4SAndroid Build Coastguard Worker    elsif($server =~ /^(ssh)((\d*)(-ipv6|))$/) {
495*6236dae4SAndroid Build Coastguard Worker        # given a ssh server, also kill socks piggybacking one
496*6236dae4SAndroid Build Coastguard Worker        push @killservers, "socks${2}";
497*6236dae4SAndroid Build Coastguard Worker    }
498*6236dae4SAndroid Build Coastguard Worker    if($server eq "http" or $server eq "https") {
499*6236dae4SAndroid Build Coastguard Worker        # since the http2+3 server is a proxy that needs to know about the
500*6236dae4SAndroid Build Coastguard Worker        # dynamic http port it too needs to get restarted when the http server
501*6236dae4SAndroid Build Coastguard Worker        # is killed
502*6236dae4SAndroid Build Coastguard Worker        push @killservers, "http/2";
503*6236dae4SAndroid Build Coastguard Worker        push @killservers, "http/3";
504*6236dae4SAndroid Build Coastguard Worker    }
505*6236dae4SAndroid Build Coastguard Worker    push @killservers, $server;
506*6236dae4SAndroid Build Coastguard Worker    #
507*6236dae4SAndroid Build Coastguard Worker    # kill given pids and server relative ones clearing them in %run hash
508*6236dae4SAndroid Build Coastguard Worker    #
509*6236dae4SAndroid Build Coastguard Worker    foreach my $server (@killservers) {
510*6236dae4SAndroid Build Coastguard Worker        if($run{$server}) {
511*6236dae4SAndroid Build Coastguard Worker            # we must prepend a space since $pidlist may already contain a pid
512*6236dae4SAndroid Build Coastguard Worker            $pidlist .= " $run{$server}";
513*6236dae4SAndroid Build Coastguard Worker            $run{$server} = 0;
514*6236dae4SAndroid Build Coastguard Worker        }
515*6236dae4SAndroid Build Coastguard Worker        $runcert{$server} = 0 if($runcert{$server});
516*6236dae4SAndroid Build Coastguard Worker    }
517*6236dae4SAndroid Build Coastguard Worker    killpid($verbose, $pidlist);
518*6236dae4SAndroid Build Coastguard Worker    #
519*6236dae4SAndroid Build Coastguard Worker    # cleanup server pid files
520*6236dae4SAndroid Build Coastguard Worker    #
521*6236dae4SAndroid Build Coastguard Worker    my $result = 0;
522*6236dae4SAndroid Build Coastguard Worker    foreach my $server (@killservers) {
523*6236dae4SAndroid Build Coastguard Worker        my $pidfile = $serverpidfile{$server};
524*6236dae4SAndroid Build Coastguard Worker        unlink($pidfile) if(-f $pidfile);
525*6236dae4SAndroid Build Coastguard Worker    }
526*6236dae4SAndroid Build Coastguard Worker    #
527*6236dae4SAndroid Build Coastguard Worker    # cleanup server lock files
528*6236dae4SAndroid Build Coastguard Worker    #
529*6236dae4SAndroid Build Coastguard Worker    foreach my $server (@killservers) {
530*6236dae4SAndroid Build Coastguard Worker        # servers seem to produce (some of) these lock files
531*6236dae4SAndroid Build Coastguard Worker        my @lockfiles = (
532*6236dae4SAndroid Build Coastguard Worker            "$LOGDIR/$LOCKDIR/$server.lock",
533*6236dae4SAndroid Build Coastguard Worker            "$LOGDIR/$LOCKDIR/$server-IPv$ipvnum.lock",
534*6236dae4SAndroid Build Coastguard Worker            "$LOGDIR/$LOCKDIR/sws-".uc($server)."-IPv$ipvnum.lock"
535*6236dae4SAndroid Build Coastguard Worker            );
536*6236dae4SAndroid Build Coastguard Worker        foreach my $lockfile (@lockfiles) {
537*6236dae4SAndroid Build Coastguard Worker            if(-f $lockfile) {
538*6236dae4SAndroid Build Coastguard Worker                unlink($lockfile);
539*6236dae4SAndroid Build Coastguard Worker                logmsg "RUN: kill $server, cleaned up $lockfile\n" if ($verbose);
540*6236dae4SAndroid Build Coastguard Worker            }
541*6236dae4SAndroid Build Coastguard Worker        }
542*6236dae4SAndroid Build Coastguard Worker    }
543*6236dae4SAndroid Build Coastguard Worker
544*6236dae4SAndroid Build Coastguard Worker    return $result;
545*6236dae4SAndroid Build Coastguard Worker}
546*6236dae4SAndroid Build Coastguard Worker
547*6236dae4SAndroid Build Coastguard Worker
548*6236dae4SAndroid Build Coastguard Worker#######################################################################
549*6236dae4SAndroid Build Coastguard Worker# Return flags to let curl use an external HTTP proxy
550*6236dae4SAndroid Build Coastguard Worker#
551*6236dae4SAndroid Build Coastguard Workersub getexternalproxyflags {
552*6236dae4SAndroid Build Coastguard Worker    return " --proxy $proxy_address ";
553*6236dae4SAndroid Build Coastguard Worker}
554*6236dae4SAndroid Build Coastguard Worker
555*6236dae4SAndroid Build Coastguard Worker#######################################################################
556*6236dae4SAndroid Build Coastguard Worker# Verify that the server that runs on $ip, $port is our server.  This also
557*6236dae4SAndroid Build Coastguard Worker# implies that we can speak with it, as there might be occasions when the
558*6236dae4SAndroid Build Coastguard Worker# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
559*6236dae4SAndroid Build Coastguard Worker# assign requested address")
560*6236dae4SAndroid Build Coastguard Worker#
561*6236dae4SAndroid Build Coastguard Workersub verifyhttp {
562*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port_or_path, $do_http3) = @_;
563*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
564*6236dae4SAndroid Build Coastguard Worker    my $bonus="";
565*6236dae4SAndroid Build Coastguard Worker    # $port_or_path contains a path for Unix sockets, sws ignores the port
566*6236dae4SAndroid Build Coastguard Worker    my $port = ($ipvnum eq "unix") ? 80 : $port_or_path;
567*6236dae4SAndroid Build Coastguard Worker    my $infix = ($do_http3) ? "_h3" : "";
568*6236dae4SAndroid Build Coastguard Worker
569*6236dae4SAndroid Build Coastguard Worker    my $verifyout = "$LOGDIR/".
570*6236dae4SAndroid Build Coastguard Worker        servername_canon($proto, $ipvnum, $idnum) .$infix .'_verify.out';
571*6236dae4SAndroid Build Coastguard Worker    unlink($verifyout) if(-f $verifyout);
572*6236dae4SAndroid Build Coastguard Worker
573*6236dae4SAndroid Build Coastguard Worker    my $verifylog = "$LOGDIR/".
574*6236dae4SAndroid Build Coastguard Worker        servername_canon($proto, $ipvnum, $idnum) .$infix .'_verify.log';
575*6236dae4SAndroid Build Coastguard Worker    unlink($verifylog) if(-f $verifylog);
576*6236dae4SAndroid Build Coastguard Worker
577*6236dae4SAndroid Build Coastguard Worker    if($proto eq "gopher") {
578*6236dae4SAndroid Build Coastguard Worker        # gopher is funny
579*6236dae4SAndroid Build Coastguard Worker        $bonus="1/";
580*6236dae4SAndroid Build Coastguard Worker    }
581*6236dae4SAndroid Build Coastguard Worker
582*6236dae4SAndroid Build Coastguard Worker    my $flags = "--max-time $server_response_maxtime ";
583*6236dae4SAndroid Build Coastguard Worker    $flags .= "--output $verifyout ";
584*6236dae4SAndroid Build Coastguard Worker    $flags .= "--silent ";
585*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose ";
586*6236dae4SAndroid Build Coastguard Worker    $flags .= "--globoff ";
587*6236dae4SAndroid Build Coastguard Worker    $flags .= "--unix-socket '$port_or_path' " if $ipvnum eq "unix";
588*6236dae4SAndroid Build Coastguard Worker    $flags .= "--insecure " if($proto eq 'https');
589*6236dae4SAndroid Build Coastguard Worker    if($proxy_address) {
590*6236dae4SAndroid Build Coastguard Worker        $flags .= getexternalproxyflags();
591*6236dae4SAndroid Build Coastguard Worker    }
592*6236dae4SAndroid Build Coastguard Worker    $flags .= "--http3-only " if($do_http3);
593*6236dae4SAndroid Build Coastguard Worker    $flags .= "\"$proto://$ip:$port/${bonus}verifiedserver\"";
594*6236dae4SAndroid Build Coastguard Worker
595*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$VCURL $flags 2>$verifylog";
596*6236dae4SAndroid Build Coastguard Worker
597*6236dae4SAndroid Build Coastguard Worker    # verify if our/any server is running on this port
598*6236dae4SAndroid Build Coastguard Worker    logmsg "RUN: $cmd\n" if($verbose);
599*6236dae4SAndroid Build Coastguard Worker    my $res = runclient($cmd);
600*6236dae4SAndroid Build Coastguard Worker
601*6236dae4SAndroid Build Coastguard Worker    $res >>= 8; # rotate the result
602*6236dae4SAndroid Build Coastguard Worker    if($res & 128) {
603*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: curl command died with a coredump\n";
604*6236dae4SAndroid Build Coastguard Worker        return -1;
605*6236dae4SAndroid Build Coastguard Worker    }
606*6236dae4SAndroid Build Coastguard Worker
607*6236dae4SAndroid Build Coastguard Worker    if($res && $verbose) {
608*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: curl command returned $res\n";
609*6236dae4SAndroid Build Coastguard Worker        if(open(my $file, "<", "$verifylog")) {
610*6236dae4SAndroid Build Coastguard Worker            while(my $string = <$file>) {
611*6236dae4SAndroid Build Coastguard Worker                logmsg "RUN: $string" if($string !~ /^([ \t]*)$/);
612*6236dae4SAndroid Build Coastguard Worker            }
613*6236dae4SAndroid Build Coastguard Worker            close($file);
614*6236dae4SAndroid Build Coastguard Worker        }
615*6236dae4SAndroid Build Coastguard Worker    }
616*6236dae4SAndroid Build Coastguard Worker
617*6236dae4SAndroid Build Coastguard Worker    my $data;
618*6236dae4SAndroid Build Coastguard Worker    if(open(my $file, "<", "$verifyout")) {
619*6236dae4SAndroid Build Coastguard Worker        while(my $string = <$file>) {
620*6236dae4SAndroid Build Coastguard Worker            $data = $string;
621*6236dae4SAndroid Build Coastguard Worker            last; # only want first line
622*6236dae4SAndroid Build Coastguard Worker        }
623*6236dae4SAndroid Build Coastguard Worker        close($file);
624*6236dae4SAndroid Build Coastguard Worker    }
625*6236dae4SAndroid Build Coastguard Worker
626*6236dae4SAndroid Build Coastguard Worker    my $pid = 0;
627*6236dae4SAndroid Build Coastguard Worker    if($data && ($data =~ /WE ROOLZ: (\d+)/)) {
628*6236dae4SAndroid Build Coastguard Worker        $pid = 0+$1;
629*6236dae4SAndroid Build Coastguard Worker    }
630*6236dae4SAndroid Build Coastguard Worker    elsif($res == 6) {
631*6236dae4SAndroid Build Coastguard Worker        # curl: (6) Couldn't resolve host '::1'
632*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to resolve host ($proto://$ip:$port/verifiedserver)\n";
633*6236dae4SAndroid Build Coastguard Worker        return -1;
634*6236dae4SAndroid Build Coastguard Worker    }
635*6236dae4SAndroid Build Coastguard Worker    elsif($data || ($res && ($res != 7))) {
636*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: Unknown server on our $server port: $port ($res)\n";
637*6236dae4SAndroid Build Coastguard Worker        return -1;
638*6236dae4SAndroid Build Coastguard Worker    }
639*6236dae4SAndroid Build Coastguard Worker    return $pid;
640*6236dae4SAndroid Build Coastguard Worker}
641*6236dae4SAndroid Build Coastguard Worker
642*6236dae4SAndroid Build Coastguard Worker#######################################################################
643*6236dae4SAndroid Build Coastguard Worker# Verify that the server that runs on $ip, $port is our server.  This also
644*6236dae4SAndroid Build Coastguard Worker# implies that we can speak with it, as there might be occasions when the
645*6236dae4SAndroid Build Coastguard Worker# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
646*6236dae4SAndroid Build Coastguard Worker# assign requested address")
647*6236dae4SAndroid Build Coastguard Worker#
648*6236dae4SAndroid Build Coastguard Workersub verifyftp {
649*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
650*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
651*6236dae4SAndroid Build Coastguard Worker    my $time=time();
652*6236dae4SAndroid Build Coastguard Worker    my $extra="";
653*6236dae4SAndroid Build Coastguard Worker
654*6236dae4SAndroid Build Coastguard Worker    my $verifylog = "$LOGDIR/".
655*6236dae4SAndroid Build Coastguard Worker        servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
656*6236dae4SAndroid Build Coastguard Worker    unlink($verifylog) if(-f $verifylog);
657*6236dae4SAndroid Build Coastguard Worker
658*6236dae4SAndroid Build Coastguard Worker    if($proto eq "ftps") {
659*6236dae4SAndroid Build Coastguard Worker        $extra .= "--insecure --ftp-ssl-control ";
660*6236dae4SAndroid Build Coastguard Worker    }
661*6236dae4SAndroid Build Coastguard Worker
662*6236dae4SAndroid Build Coastguard Worker    my $flags = "--max-time $server_response_maxtime ";
663*6236dae4SAndroid Build Coastguard Worker    $flags .= "--silent ";
664*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose ";
665*6236dae4SAndroid Build Coastguard Worker    $flags .= "--globoff ";
666*6236dae4SAndroid Build Coastguard Worker    $flags .= $extra;
667*6236dae4SAndroid Build Coastguard Worker    if($proxy_address) {
668*6236dae4SAndroid Build Coastguard Worker        $flags .= getexternalproxyflags();
669*6236dae4SAndroid Build Coastguard Worker    }
670*6236dae4SAndroid Build Coastguard Worker    $flags .= "\"$proto://$ip:$port/verifiedserver\"";
671*6236dae4SAndroid Build Coastguard Worker
672*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$VCURL $flags 2>$verifylog";
673*6236dae4SAndroid Build Coastguard Worker
674*6236dae4SAndroid Build Coastguard Worker    # check if this is our server running on this port:
675*6236dae4SAndroid Build Coastguard Worker    logmsg "RUN: $cmd\n" if($verbose);
676*6236dae4SAndroid Build Coastguard Worker    my @data = runclientoutput($cmd);
677*6236dae4SAndroid Build Coastguard Worker
678*6236dae4SAndroid Build Coastguard Worker    my $res = $? >> 8; # rotate the result
679*6236dae4SAndroid Build Coastguard Worker    if($res & 128) {
680*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: curl command died with a coredump\n";
681*6236dae4SAndroid Build Coastguard Worker        return -1;
682*6236dae4SAndroid Build Coastguard Worker    }
683*6236dae4SAndroid Build Coastguard Worker
684*6236dae4SAndroid Build Coastguard Worker    my $pid = 0;
685*6236dae4SAndroid Build Coastguard Worker    foreach my $line (@data) {
686*6236dae4SAndroid Build Coastguard Worker        if($line =~ /WE ROOLZ: (\d+)/) {
687*6236dae4SAndroid Build Coastguard Worker            # this is our test server with a known pid!
688*6236dae4SAndroid Build Coastguard Worker            $pid = 0+$1;
689*6236dae4SAndroid Build Coastguard Worker            last;
690*6236dae4SAndroid Build Coastguard Worker        }
691*6236dae4SAndroid Build Coastguard Worker    }
692*6236dae4SAndroid Build Coastguard Worker    if($pid <= 0 && @data && $data[0]) {
693*6236dae4SAndroid Build Coastguard Worker        # this is not a known server
694*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: Unknown server on our $server port: $port\n";
695*6236dae4SAndroid Build Coastguard Worker        return 0;
696*6236dae4SAndroid Build Coastguard Worker    }
697*6236dae4SAndroid Build Coastguard Worker    # we can/should use the time it took to verify the FTP server as a measure
698*6236dae4SAndroid Build Coastguard Worker    # on how fast/slow this host/FTP is.
699*6236dae4SAndroid Build Coastguard Worker    my $took = int(0.5+time()-$time);
700*6236dae4SAndroid Build Coastguard Worker
701*6236dae4SAndroid Build Coastguard Worker    if($verbose) {
702*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: Verifying our test $server server took $took seconds\n";
703*6236dae4SAndroid Build Coastguard Worker    }
704*6236dae4SAndroid Build Coastguard Worker    $ftpchecktime = $took>=1?$took:1; # make sure it never is below 1
705*6236dae4SAndroid Build Coastguard Worker
706*6236dae4SAndroid Build Coastguard Worker    return $pid;
707*6236dae4SAndroid Build Coastguard Worker}
708*6236dae4SAndroid Build Coastguard Worker
709*6236dae4SAndroid Build Coastguard Worker#######################################################################
710*6236dae4SAndroid Build Coastguard Worker# Verify that the server that runs on $ip, $port is our server.  This also
711*6236dae4SAndroid Build Coastguard Worker# implies that we can speak with it, as there might be occasions when the
712*6236dae4SAndroid Build Coastguard Worker# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
713*6236dae4SAndroid Build Coastguard Worker# assign requested address")
714*6236dae4SAndroid Build Coastguard Worker#
715*6236dae4SAndroid Build Coastguard Workersub verifyrtsp {
716*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
717*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
718*6236dae4SAndroid Build Coastguard Worker
719*6236dae4SAndroid Build Coastguard Worker    my $verifyout = "$LOGDIR/".
720*6236dae4SAndroid Build Coastguard Worker        servername_canon($proto, $ipvnum, $idnum) .'_verify.out';
721*6236dae4SAndroid Build Coastguard Worker    unlink($verifyout) if(-f $verifyout);
722*6236dae4SAndroid Build Coastguard Worker
723*6236dae4SAndroid Build Coastguard Worker    my $verifylog = "$LOGDIR/".
724*6236dae4SAndroid Build Coastguard Worker        servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
725*6236dae4SAndroid Build Coastguard Worker    unlink($verifylog) if(-f $verifylog);
726*6236dae4SAndroid Build Coastguard Worker
727*6236dae4SAndroid Build Coastguard Worker    my $flags = "--max-time $server_response_maxtime ";
728*6236dae4SAndroid Build Coastguard Worker    $flags .= "--output $verifyout ";
729*6236dae4SAndroid Build Coastguard Worker    $flags .= "--silent ";
730*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose ";
731*6236dae4SAndroid Build Coastguard Worker    $flags .= "--globoff ";
732*6236dae4SAndroid Build Coastguard Worker    if($proxy_address) {
733*6236dae4SAndroid Build Coastguard Worker        $flags .= getexternalproxyflags();
734*6236dae4SAndroid Build Coastguard Worker    }
735*6236dae4SAndroid Build Coastguard Worker    # currently verification is done using http
736*6236dae4SAndroid Build Coastguard Worker    $flags .= "\"http://$ip:$port/verifiedserver\"";
737*6236dae4SAndroid Build Coastguard Worker
738*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$VCURL $flags 2>$verifylog";
739*6236dae4SAndroid Build Coastguard Worker
740*6236dae4SAndroid Build Coastguard Worker    # verify if our/any server is running on this port
741*6236dae4SAndroid Build Coastguard Worker    logmsg "RUN: $cmd\n" if($verbose);
742*6236dae4SAndroid Build Coastguard Worker    my $res = runclient($cmd);
743*6236dae4SAndroid Build Coastguard Worker
744*6236dae4SAndroid Build Coastguard Worker    $res >>= 8; # rotate the result
745*6236dae4SAndroid Build Coastguard Worker    if($res & 128) {
746*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: curl command died with a coredump\n";
747*6236dae4SAndroid Build Coastguard Worker        return -1;
748*6236dae4SAndroid Build Coastguard Worker    }
749*6236dae4SAndroid Build Coastguard Worker
750*6236dae4SAndroid Build Coastguard Worker    if($res && $verbose) {
751*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: curl command returned $res\n";
752*6236dae4SAndroid Build Coastguard Worker        if(open(my $file, "<", "$verifylog")) {
753*6236dae4SAndroid Build Coastguard Worker            while(my $string = <$file>) {
754*6236dae4SAndroid Build Coastguard Worker                logmsg "RUN: $string" if($string !~ /^[ \t]*$/);
755*6236dae4SAndroid Build Coastguard Worker            }
756*6236dae4SAndroid Build Coastguard Worker            close($file);
757*6236dae4SAndroid Build Coastguard Worker        }
758*6236dae4SAndroid Build Coastguard Worker    }
759*6236dae4SAndroid Build Coastguard Worker
760*6236dae4SAndroid Build Coastguard Worker    my $data;
761*6236dae4SAndroid Build Coastguard Worker    if(open(my $file, "<", "$verifyout")) {
762*6236dae4SAndroid Build Coastguard Worker        while(my $string = <$file>) {
763*6236dae4SAndroid Build Coastguard Worker            $data = $string;
764*6236dae4SAndroid Build Coastguard Worker            last; # only want first line
765*6236dae4SAndroid Build Coastguard Worker        }
766*6236dae4SAndroid Build Coastguard Worker        close($file);
767*6236dae4SAndroid Build Coastguard Worker    }
768*6236dae4SAndroid Build Coastguard Worker
769*6236dae4SAndroid Build Coastguard Worker    my $pid = 0;
770*6236dae4SAndroid Build Coastguard Worker    if($data && ($data =~ /RTSP_SERVER WE ROOLZ: (\d+)/)) {
771*6236dae4SAndroid Build Coastguard Worker        $pid = 0+$1;
772*6236dae4SAndroid Build Coastguard Worker    }
773*6236dae4SAndroid Build Coastguard Worker    elsif($res == 6) {
774*6236dae4SAndroid Build Coastguard Worker        # curl: (6) Couldn't resolve host '::1'
775*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to resolve host ($proto://$ip:$port/verifiedserver)\n";
776*6236dae4SAndroid Build Coastguard Worker        return -1;
777*6236dae4SAndroid Build Coastguard Worker    }
778*6236dae4SAndroid Build Coastguard Worker    elsif($data || ($res != 7)) {
779*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: Unknown server on our $server port: $port\n";
780*6236dae4SAndroid Build Coastguard Worker        return -1;
781*6236dae4SAndroid Build Coastguard Worker    }
782*6236dae4SAndroid Build Coastguard Worker    return $pid;
783*6236dae4SAndroid Build Coastguard Worker}
784*6236dae4SAndroid Build Coastguard Worker
785*6236dae4SAndroid Build Coastguard Worker#######################################################################
786*6236dae4SAndroid Build Coastguard Worker# Verify that the ssh server has written out its pidfile, recovering
787*6236dae4SAndroid Build Coastguard Worker# the pid from the file and returning it if a process with that pid is
788*6236dae4SAndroid Build Coastguard Worker# actually alive, or a negative value if the process is dead.
789*6236dae4SAndroid Build Coastguard Worker#
790*6236dae4SAndroid Build Coastguard Workersub verifyssh {
791*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
792*6236dae4SAndroid Build Coastguard Worker    my $pidfile = server_pidfilename("$LOGDIR/$PIDDIR", $proto, $ipvnum,
793*6236dae4SAndroid Build Coastguard Worker                                     $idnum);
794*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
795*6236dae4SAndroid Build Coastguard Worker    if($pid < 0) {
796*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: SSH server has died after starting up\n";
797*6236dae4SAndroid Build Coastguard Worker    }
798*6236dae4SAndroid Build Coastguard Worker    return $pid;
799*6236dae4SAndroid Build Coastguard Worker}
800*6236dae4SAndroid Build Coastguard Worker
801*6236dae4SAndroid Build Coastguard Worker#######################################################################
802*6236dae4SAndroid Build Coastguard Worker# Verify that we can connect to the sftp server, properly authenticate
803*6236dae4SAndroid Build Coastguard Worker# with generated config and key files and run a simple remote pwd.
804*6236dae4SAndroid Build Coastguard Worker#
805*6236dae4SAndroid Build Coastguard Workersub verifysftp {
806*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
807*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
808*6236dae4SAndroid Build Coastguard Worker    my $verified = 0;
809*6236dae4SAndroid Build Coastguard Worker    # Find out sftp client canonical file name
810*6236dae4SAndroid Build Coastguard Worker    my $sftp = find_sftp();
811*6236dae4SAndroid Build Coastguard Worker    if(!$sftp) {
812*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: SFTP server cannot find $sftpexe\n";
813*6236dae4SAndroid Build Coastguard Worker        return -1;
814*6236dae4SAndroid Build Coastguard Worker    }
815*6236dae4SAndroid Build Coastguard Worker    # Find out ssh client canonical file name
816*6236dae4SAndroid Build Coastguard Worker    my $ssh = find_ssh();
817*6236dae4SAndroid Build Coastguard Worker    if(!$ssh) {
818*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: SFTP server cannot find $sshexe\n";
819*6236dae4SAndroid Build Coastguard Worker        return -1;
820*6236dae4SAndroid Build Coastguard Worker    }
821*6236dae4SAndroid Build Coastguard Worker    # Connect to sftp server, authenticate and run a remote pwd
822*6236dae4SAndroid Build Coastguard Worker    # command using our generated configuration and key files
823*6236dae4SAndroid Build Coastguard Worker    my $cmd = "\"$sftp\" -b $LOGDIR/$PIDDIR/$sftpcmds -F $LOGDIR/$PIDDIR/$sftpconfig -S \"$ssh\" $ip > $sftplog 2>&1";
824*6236dae4SAndroid Build Coastguard Worker    my $res = runclient($cmd);
825*6236dae4SAndroid Build Coastguard Worker    # Search for pwd command response in log file
826*6236dae4SAndroid Build Coastguard Worker    if(open(my $sftplogfile, "<", "$sftplog")) {
827*6236dae4SAndroid Build Coastguard Worker        while(<$sftplogfile>) {
828*6236dae4SAndroid Build Coastguard Worker            if(/^Remote working directory: /) {
829*6236dae4SAndroid Build Coastguard Worker                $verified = 1;
830*6236dae4SAndroid Build Coastguard Worker                last;
831*6236dae4SAndroid Build Coastguard Worker            }
832*6236dae4SAndroid Build Coastguard Worker        }
833*6236dae4SAndroid Build Coastguard Worker        close($sftplogfile);
834*6236dae4SAndroid Build Coastguard Worker    }
835*6236dae4SAndroid Build Coastguard Worker    return $verified;
836*6236dae4SAndroid Build Coastguard Worker}
837*6236dae4SAndroid Build Coastguard Worker
838*6236dae4SAndroid Build Coastguard Worker#######################################################################
839*6236dae4SAndroid Build Coastguard Worker# Verify that the non-stunnel HTTP TLS extensions capable server that runs
840*6236dae4SAndroid Build Coastguard Worker# on $ip, $port is our server.  This also implies that we can speak with it,
841*6236dae4SAndroid Build Coastguard Worker# as there might be occasions when the server runs fine but we cannot talk
842*6236dae4SAndroid Build Coastguard Worker# to it ("Failed to connect to ::1: Can't assign requested address")
843*6236dae4SAndroid Build Coastguard Worker#
844*6236dae4SAndroid Build Coastguard Workersub verifyhttptls {
845*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
846*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
847*6236dae4SAndroid Build Coastguard Worker    my $pidfile = server_pidfilename("$LOGDIR/$PIDDIR", $proto, $ipvnum,
848*6236dae4SAndroid Build Coastguard Worker                                     $idnum);
849*6236dae4SAndroid Build Coastguard Worker
850*6236dae4SAndroid Build Coastguard Worker    my $verifyout = "$LOGDIR/".
851*6236dae4SAndroid Build Coastguard Worker        servername_canon($proto, $ipvnum, $idnum) .'_verify.out';
852*6236dae4SAndroid Build Coastguard Worker    unlink($verifyout) if(-f $verifyout);
853*6236dae4SAndroid Build Coastguard Worker
854*6236dae4SAndroid Build Coastguard Worker    my $verifylog = "$LOGDIR/".
855*6236dae4SAndroid Build Coastguard Worker        servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
856*6236dae4SAndroid Build Coastguard Worker    unlink($verifylog) if(-f $verifylog);
857*6236dae4SAndroid Build Coastguard Worker
858*6236dae4SAndroid Build Coastguard Worker    my $flags = "--max-time $server_response_maxtime ";
859*6236dae4SAndroid Build Coastguard Worker    $flags .= "--output $verifyout ";
860*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose ";
861*6236dae4SAndroid Build Coastguard Worker    $flags .= "--globoff ";
862*6236dae4SAndroid Build Coastguard Worker    $flags .= "--insecure ";
863*6236dae4SAndroid Build Coastguard Worker    $flags .= "--tlsauthtype SRP ";
864*6236dae4SAndroid Build Coastguard Worker    $flags .= "--tlsuser jsmith ";
865*6236dae4SAndroid Build Coastguard Worker    $flags .= "--tlspassword abc ";
866*6236dae4SAndroid Build Coastguard Worker    if($proxy_address) {
867*6236dae4SAndroid Build Coastguard Worker        $flags .= getexternalproxyflags();
868*6236dae4SAndroid Build Coastguard Worker    }
869*6236dae4SAndroid Build Coastguard Worker    $flags .= "\"https://$ip:$port/verifiedserver\"";
870*6236dae4SAndroid Build Coastguard Worker
871*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$VCURL $flags 2>$verifylog";
872*6236dae4SAndroid Build Coastguard Worker
873*6236dae4SAndroid Build Coastguard Worker    # verify if our/any server is running on this port
874*6236dae4SAndroid Build Coastguard Worker    logmsg "RUN: $cmd\n" if($verbose);
875*6236dae4SAndroid Build Coastguard Worker    my $res = runclient($cmd);
876*6236dae4SAndroid Build Coastguard Worker
877*6236dae4SAndroid Build Coastguard Worker    $res >>= 8; # rotate the result
878*6236dae4SAndroid Build Coastguard Worker    if($res & 128) {
879*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: curl command died with a coredump\n";
880*6236dae4SAndroid Build Coastguard Worker        return -1;
881*6236dae4SAndroid Build Coastguard Worker    }
882*6236dae4SAndroid Build Coastguard Worker
883*6236dae4SAndroid Build Coastguard Worker    if($res && $verbose) {
884*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: curl command returned $res\n";
885*6236dae4SAndroid Build Coastguard Worker        if(open(my $file, "<", "$verifylog")) {
886*6236dae4SAndroid Build Coastguard Worker            while(my $string = <$file>) {
887*6236dae4SAndroid Build Coastguard Worker                logmsg "RUN: $string" if($string !~ /^([ \t]*)$/);
888*6236dae4SAndroid Build Coastguard Worker            }
889*6236dae4SAndroid Build Coastguard Worker            close($file);
890*6236dae4SAndroid Build Coastguard Worker        }
891*6236dae4SAndroid Build Coastguard Worker    }
892*6236dae4SAndroid Build Coastguard Worker
893*6236dae4SAndroid Build Coastguard Worker    my $data;
894*6236dae4SAndroid Build Coastguard Worker    if(open(my $file, "<", "$verifyout")) {
895*6236dae4SAndroid Build Coastguard Worker        while(my $string = <$file>) {
896*6236dae4SAndroid Build Coastguard Worker            $data .= $string;
897*6236dae4SAndroid Build Coastguard Worker        }
898*6236dae4SAndroid Build Coastguard Worker        close($file);
899*6236dae4SAndroid Build Coastguard Worker    }
900*6236dae4SAndroid Build Coastguard Worker
901*6236dae4SAndroid Build Coastguard Worker    my $pid = 0;
902*6236dae4SAndroid Build Coastguard Worker    if($data && ($data =~ /(GNUTLS|GnuTLS)/) && ($pid = processexists($pidfile))) {
903*6236dae4SAndroid Build Coastguard Worker        if($pid < 0) {
904*6236dae4SAndroid Build Coastguard Worker            logmsg "RUN: $server server has died after starting up\n";
905*6236dae4SAndroid Build Coastguard Worker        }
906*6236dae4SAndroid Build Coastguard Worker        return $pid;
907*6236dae4SAndroid Build Coastguard Worker    }
908*6236dae4SAndroid Build Coastguard Worker    elsif($res == 6) {
909*6236dae4SAndroid Build Coastguard Worker        # curl: (6) Couldn't resolve host '::1'
910*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to resolve host (https://$ip:$port/verifiedserver)\n";
911*6236dae4SAndroid Build Coastguard Worker        return -1;
912*6236dae4SAndroid Build Coastguard Worker    }
913*6236dae4SAndroid Build Coastguard Worker    elsif($data || ($res && ($res != 7))) {
914*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: Unknown server on our $server port: $port ($res)\n";
915*6236dae4SAndroid Build Coastguard Worker        return -1;
916*6236dae4SAndroid Build Coastguard Worker    }
917*6236dae4SAndroid Build Coastguard Worker    return $pid;
918*6236dae4SAndroid Build Coastguard Worker}
919*6236dae4SAndroid Build Coastguard Worker
920*6236dae4SAndroid Build Coastguard Worker#######################################################################
921*6236dae4SAndroid Build Coastguard Worker# STUB for verifying mqtt
922*6236dae4SAndroid Build Coastguard Worker#
923*6236dae4SAndroid Build Coastguard Workersub verifymqtt {
924*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
925*6236dae4SAndroid Build Coastguard Worker    my $pidfile = server_pidfilename("$LOGDIR/$PIDDIR", $proto, $ipvnum,
926*6236dae4SAndroid Build Coastguard Worker                                     $idnum);
927*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
928*6236dae4SAndroid Build Coastguard Worker    if($pid < 0) {
929*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: MQTT server has died after starting up\n";
930*6236dae4SAndroid Build Coastguard Worker    }
931*6236dae4SAndroid Build Coastguard Worker    return $pid;
932*6236dae4SAndroid Build Coastguard Worker}
933*6236dae4SAndroid Build Coastguard Worker
934*6236dae4SAndroid Build Coastguard Worker#######################################################################
935*6236dae4SAndroid Build Coastguard Worker# STUB for verifying socks
936*6236dae4SAndroid Build Coastguard Worker#
937*6236dae4SAndroid Build Coastguard Workersub verifysocks {
938*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
939*6236dae4SAndroid Build Coastguard Worker    my $pidfile = server_pidfilename("$LOGDIR/$PIDDIR", $proto, $ipvnum,
940*6236dae4SAndroid Build Coastguard Worker                                     $idnum);
941*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
942*6236dae4SAndroid Build Coastguard Worker    if($pid < 0) {
943*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: SOCKS server has died after starting up\n";
944*6236dae4SAndroid Build Coastguard Worker    }
945*6236dae4SAndroid Build Coastguard Worker    return $pid;
946*6236dae4SAndroid Build Coastguard Worker}
947*6236dae4SAndroid Build Coastguard Worker
948*6236dae4SAndroid Build Coastguard Worker#######################################################################
949*6236dae4SAndroid Build Coastguard Worker# Verify that the server that runs on $ip, $port is our server.  This also
950*6236dae4SAndroid Build Coastguard Worker# implies that we can speak with it, as there might be occasions when the
951*6236dae4SAndroid Build Coastguard Worker# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
952*6236dae4SAndroid Build Coastguard Worker# assign requested address")
953*6236dae4SAndroid Build Coastguard Worker#
954*6236dae4SAndroid Build Coastguard Workersub verifysmb {
955*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
956*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
957*6236dae4SAndroid Build Coastguard Worker    my $time=time();
958*6236dae4SAndroid Build Coastguard Worker    my $extra="";
959*6236dae4SAndroid Build Coastguard Worker
960*6236dae4SAndroid Build Coastguard Worker    my $verifylog = "$LOGDIR/".
961*6236dae4SAndroid Build Coastguard Worker        servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
962*6236dae4SAndroid Build Coastguard Worker    unlink($verifylog) if(-f $verifylog);
963*6236dae4SAndroid Build Coastguard Worker
964*6236dae4SAndroid Build Coastguard Worker    my $flags = "--max-time $server_response_maxtime ";
965*6236dae4SAndroid Build Coastguard Worker    $flags .= "--silent ";
966*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose ";
967*6236dae4SAndroid Build Coastguard Worker    $flags .= "--globoff ";
968*6236dae4SAndroid Build Coastguard Worker    $flags .= "-u 'curltest:curltest' ";
969*6236dae4SAndroid Build Coastguard Worker    $flags .= $extra;
970*6236dae4SAndroid Build Coastguard Worker    $flags .= "\"$proto://$ip:$port/SERVER/verifiedserver\"";
971*6236dae4SAndroid Build Coastguard Worker
972*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$VCURL $flags 2>$verifylog";
973*6236dae4SAndroid Build Coastguard Worker
974*6236dae4SAndroid Build Coastguard Worker    # check if this is our server running on this port:
975*6236dae4SAndroid Build Coastguard Worker    logmsg "RUN: $cmd\n" if($verbose);
976*6236dae4SAndroid Build Coastguard Worker    my @data = runclientoutput($cmd);
977*6236dae4SAndroid Build Coastguard Worker
978*6236dae4SAndroid Build Coastguard Worker    my $res = $? >> 8; # rotate the result
979*6236dae4SAndroid Build Coastguard Worker    if($res & 128) {
980*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: curl command died with a coredump\n";
981*6236dae4SAndroid Build Coastguard Worker        return -1;
982*6236dae4SAndroid Build Coastguard Worker    }
983*6236dae4SAndroid Build Coastguard Worker
984*6236dae4SAndroid Build Coastguard Worker    my $pid = 0;
985*6236dae4SAndroid Build Coastguard Worker    foreach my $line (@data) {
986*6236dae4SAndroid Build Coastguard Worker        if($line =~ /WE ROOLZ: (\d+)/) {
987*6236dae4SAndroid Build Coastguard Worker            # this is our test server with a known pid!
988*6236dae4SAndroid Build Coastguard Worker            $pid = 0+$1;
989*6236dae4SAndroid Build Coastguard Worker            last;
990*6236dae4SAndroid Build Coastguard Worker        }
991*6236dae4SAndroid Build Coastguard Worker    }
992*6236dae4SAndroid Build Coastguard Worker    if($pid <= 0 && @data && $data[0]) {
993*6236dae4SAndroid Build Coastguard Worker        # this is not a known server
994*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: Unknown server on our $server port: $port\n";
995*6236dae4SAndroid Build Coastguard Worker        return 0;
996*6236dae4SAndroid Build Coastguard Worker    }
997*6236dae4SAndroid Build Coastguard Worker    # we can/should use the time it took to verify the server as a measure
998*6236dae4SAndroid Build Coastguard Worker    # on how fast/slow this host is.
999*6236dae4SAndroid Build Coastguard Worker    my $took = int(0.5+time()-$time);
1000*6236dae4SAndroid Build Coastguard Worker
1001*6236dae4SAndroid Build Coastguard Worker    if($verbose) {
1002*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: Verifying our test $server server took $took seconds\n";
1003*6236dae4SAndroid Build Coastguard Worker    }
1004*6236dae4SAndroid Build Coastguard Worker
1005*6236dae4SAndroid Build Coastguard Worker    return $pid;
1006*6236dae4SAndroid Build Coastguard Worker}
1007*6236dae4SAndroid Build Coastguard Worker
1008*6236dae4SAndroid Build Coastguard Worker#######################################################################
1009*6236dae4SAndroid Build Coastguard Worker# Verify that the server that runs on $ip, $port is our server.  This also
1010*6236dae4SAndroid Build Coastguard Worker# implies that we can speak with it, as there might be occasions when the
1011*6236dae4SAndroid Build Coastguard Worker# server runs fine but we cannot talk to it ("Failed to connect to ::1: Can't
1012*6236dae4SAndroid Build Coastguard Worker# assign requested address")
1013*6236dae4SAndroid Build Coastguard Worker#
1014*6236dae4SAndroid Build Coastguard Workersub verifytelnet {
1015*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
1016*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1017*6236dae4SAndroid Build Coastguard Worker    my $time=time();
1018*6236dae4SAndroid Build Coastguard Worker    my $extra="";
1019*6236dae4SAndroid Build Coastguard Worker
1020*6236dae4SAndroid Build Coastguard Worker    my $verifylog = "$LOGDIR/".
1021*6236dae4SAndroid Build Coastguard Worker        servername_canon($proto, $ipvnum, $idnum) .'_verify.log';
1022*6236dae4SAndroid Build Coastguard Worker    unlink($verifylog) if(-f $verifylog);
1023*6236dae4SAndroid Build Coastguard Worker
1024*6236dae4SAndroid Build Coastguard Worker    my $flags = "--max-time $server_response_maxtime ";
1025*6236dae4SAndroid Build Coastguard Worker    $flags .= "--silent ";
1026*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose ";
1027*6236dae4SAndroid Build Coastguard Worker    $flags .= "--globoff ";
1028*6236dae4SAndroid Build Coastguard Worker    $flags .= "--upload-file - ";
1029*6236dae4SAndroid Build Coastguard Worker    $flags .= $extra;
1030*6236dae4SAndroid Build Coastguard Worker    $flags .= "\"$proto://$ip:$port\"";
1031*6236dae4SAndroid Build Coastguard Worker
1032*6236dae4SAndroid Build Coastguard Worker    my $cmd = "echo 'verifiedserver' | $VCURL $flags 2>$verifylog";
1033*6236dae4SAndroid Build Coastguard Worker
1034*6236dae4SAndroid Build Coastguard Worker    # check if this is our server running on this port:
1035*6236dae4SAndroid Build Coastguard Worker    logmsg "RUN: $cmd\n" if($verbose);
1036*6236dae4SAndroid Build Coastguard Worker    my @data = runclientoutput($cmd);
1037*6236dae4SAndroid Build Coastguard Worker
1038*6236dae4SAndroid Build Coastguard Worker    my $res = $? >> 8; # rotate the result
1039*6236dae4SAndroid Build Coastguard Worker    if($res & 128) {
1040*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: curl command died with a coredump\n";
1041*6236dae4SAndroid Build Coastguard Worker        return -1;
1042*6236dae4SAndroid Build Coastguard Worker    }
1043*6236dae4SAndroid Build Coastguard Worker
1044*6236dae4SAndroid Build Coastguard Worker    my $pid = 0;
1045*6236dae4SAndroid Build Coastguard Worker    foreach my $line (@data) {
1046*6236dae4SAndroid Build Coastguard Worker        if($line =~ /WE ROOLZ: (\d+)/) {
1047*6236dae4SAndroid Build Coastguard Worker            # this is our test server with a known pid!
1048*6236dae4SAndroid Build Coastguard Worker            $pid = 0+$1;
1049*6236dae4SAndroid Build Coastguard Worker            last;
1050*6236dae4SAndroid Build Coastguard Worker        }
1051*6236dae4SAndroid Build Coastguard Worker    }
1052*6236dae4SAndroid Build Coastguard Worker    if($pid <= 0 && @data && $data[0]) {
1053*6236dae4SAndroid Build Coastguard Worker        # this is not a known server
1054*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: Unknown server on our $server port: $port\n";
1055*6236dae4SAndroid Build Coastguard Worker        return 0;
1056*6236dae4SAndroid Build Coastguard Worker    }
1057*6236dae4SAndroid Build Coastguard Worker    # we can/should use the time it took to verify the server as a measure
1058*6236dae4SAndroid Build Coastguard Worker    # on how fast/slow this host is.
1059*6236dae4SAndroid Build Coastguard Worker    my $took = int(0.5+time()-$time);
1060*6236dae4SAndroid Build Coastguard Worker
1061*6236dae4SAndroid Build Coastguard Worker    if($verbose) {
1062*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: Verifying our test $server server took $took seconds\n";
1063*6236dae4SAndroid Build Coastguard Worker    }
1064*6236dae4SAndroid Build Coastguard Worker
1065*6236dae4SAndroid Build Coastguard Worker    return $pid;
1066*6236dae4SAndroid Build Coastguard Worker}
1067*6236dae4SAndroid Build Coastguard Worker
1068*6236dae4SAndroid Build Coastguard Worker#######################################################################
1069*6236dae4SAndroid Build Coastguard Worker# Verify that the server that runs on $ip, $port is our server.
1070*6236dae4SAndroid Build Coastguard Worker# Retry over several seconds before giving up.  The ssh server in
1071*6236dae4SAndroid Build Coastguard Worker# particular can take a long time to start if it needs to generate
1072*6236dae4SAndroid Build Coastguard Worker# keys on a slow or loaded host.
1073*6236dae4SAndroid Build Coastguard Worker#
1074*6236dae4SAndroid Build Coastguard Worker# Just for convenience, test harness uses 'https' and 'httptls' literals
1075*6236dae4SAndroid Build Coastguard Worker# as values for 'proto' variable in order to differentiate different
1076*6236dae4SAndroid Build Coastguard Worker# servers. 'https' literal is used for stunnel based https test servers,
1077*6236dae4SAndroid Build Coastguard Worker# and 'httptls' is used for non-stunnel https test servers.
1078*6236dae4SAndroid Build Coastguard Worker#
1079*6236dae4SAndroid Build Coastguard Worker
1080*6236dae4SAndroid Build Coastguard Workermy %protofunc = ('http' => \&verifyhttp,
1081*6236dae4SAndroid Build Coastguard Worker                 'https' => \&verifyhttp,
1082*6236dae4SAndroid Build Coastguard Worker                 'rtsp' => \&verifyrtsp,
1083*6236dae4SAndroid Build Coastguard Worker                 'ftp' => \&verifyftp,
1084*6236dae4SAndroid Build Coastguard Worker                 'pop3' => \&verifyftp,
1085*6236dae4SAndroid Build Coastguard Worker                 'imap' => \&verifyftp,
1086*6236dae4SAndroid Build Coastguard Worker                 'smtp' => \&verifyftp,
1087*6236dae4SAndroid Build Coastguard Worker                 'ftps' => \&verifyftp,
1088*6236dae4SAndroid Build Coastguard Worker                 'pop3s' => \&verifyftp,
1089*6236dae4SAndroid Build Coastguard Worker                 'imaps' => \&verifyftp,
1090*6236dae4SAndroid Build Coastguard Worker                 'mqtt' => \&verifymqtt,
1091*6236dae4SAndroid Build Coastguard Worker                 'smtps' => \&verifyftp,
1092*6236dae4SAndroid Build Coastguard Worker                 'tftp' => \&verifyftp,
1093*6236dae4SAndroid Build Coastguard Worker                 'ssh' => \&verifyssh,
1094*6236dae4SAndroid Build Coastguard Worker                 'socks' => \&verifysocks,
1095*6236dae4SAndroid Build Coastguard Worker                 'socks5unix' => \&verifysocks,
1096*6236dae4SAndroid Build Coastguard Worker                 'gopher' => \&verifyhttp,
1097*6236dae4SAndroid Build Coastguard Worker                 'httptls' => \&verifyhttptls,
1098*6236dae4SAndroid Build Coastguard Worker                 'dict' => \&verifyftp,
1099*6236dae4SAndroid Build Coastguard Worker                 'smb' => \&verifysmb,
1100*6236dae4SAndroid Build Coastguard Worker                 'telnet' => \&verifytelnet);
1101*6236dae4SAndroid Build Coastguard Worker
1102*6236dae4SAndroid Build Coastguard Workersub verifyserver {
1103*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port) = @_;
1104*6236dae4SAndroid Build Coastguard Worker
1105*6236dae4SAndroid Build Coastguard Worker    my $count = 30; # try for this many seconds
1106*6236dae4SAndroid Build Coastguard Worker    my $pid;
1107*6236dae4SAndroid Build Coastguard Worker
1108*6236dae4SAndroid Build Coastguard Worker    while($count--) {
1109*6236dae4SAndroid Build Coastguard Worker        my $fun = $protofunc{$proto};
1110*6236dae4SAndroid Build Coastguard Worker
1111*6236dae4SAndroid Build Coastguard Worker        $pid = &$fun($proto, $ipvnum, $idnum, $ip, $port);
1112*6236dae4SAndroid Build Coastguard Worker
1113*6236dae4SAndroid Build Coastguard Worker        if($pid > 0) {
1114*6236dae4SAndroid Build Coastguard Worker            last;
1115*6236dae4SAndroid Build Coastguard Worker        }
1116*6236dae4SAndroid Build Coastguard Worker        elsif($pid < 0) {
1117*6236dae4SAndroid Build Coastguard Worker            # a real failure, stop trying and bail out
1118*6236dae4SAndroid Build Coastguard Worker            return 0;
1119*6236dae4SAndroid Build Coastguard Worker        }
1120*6236dae4SAndroid Build Coastguard Worker        sleep(1);
1121*6236dae4SAndroid Build Coastguard Worker    }
1122*6236dae4SAndroid Build Coastguard Worker    return $pid;
1123*6236dae4SAndroid Build Coastguard Worker}
1124*6236dae4SAndroid Build Coastguard Worker
1125*6236dae4SAndroid Build Coastguard Worker#######################################################################
1126*6236dae4SAndroid Build Coastguard Worker# Single shot server responsiveness test. This should only be used
1127*6236dae4SAndroid Build Coastguard Worker# to verify that a server present in %run hash is still functional
1128*6236dae4SAndroid Build Coastguard Worker#
1129*6236dae4SAndroid Build Coastguard Workersub responsiveserver {
1130*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipvnum, $idnum, $ip, $port, $do_http3) = @_;
1131*6236dae4SAndroid Build Coastguard Worker    my $prev_verbose = $verbose;
1132*6236dae4SAndroid Build Coastguard Worker
1133*6236dae4SAndroid Build Coastguard Worker    $verbose = 0;
1134*6236dae4SAndroid Build Coastguard Worker    my $fun = $protofunc{$proto};
1135*6236dae4SAndroid Build Coastguard Worker    my $pid = &$fun($proto, $ipvnum, $idnum, $ip, $port, $do_http3);
1136*6236dae4SAndroid Build Coastguard Worker    $verbose = $prev_verbose;
1137*6236dae4SAndroid Build Coastguard Worker
1138*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1139*6236dae4SAndroid Build Coastguard Worker        return 1; # responsive
1140*6236dae4SAndroid Build Coastguard Worker    }
1141*6236dae4SAndroid Build Coastguard Worker
1142*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1143*6236dae4SAndroid Build Coastguard Worker    logmsg " server precheck FAILED (unresponsive $srvrname server)\n";
1144*6236dae4SAndroid Build Coastguard Worker    return 0;
1145*6236dae4SAndroid Build Coastguard Worker}
1146*6236dae4SAndroid Build Coastguard Worker
1147*6236dae4SAndroid Build Coastguard Worker
1148*6236dae4SAndroid Build Coastguard Worker#######################################################################
1149*6236dae4SAndroid Build Coastguard Worker# start the http server
1150*6236dae4SAndroid Build Coastguard Worker#
1151*6236dae4SAndroid Build Coastguard Workersub runhttpserver {
1152*6236dae4SAndroid Build Coastguard Worker    my ($proto, $verb, $alt, $port_or_path) = @_;
1153*6236dae4SAndroid Build Coastguard Worker    my $ip = $HOSTIP;
1154*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
1155*6236dae4SAndroid Build Coastguard Worker    my $idnum = 1;
1156*6236dae4SAndroid Build Coastguard Worker    my $exe = "$perl $srcdir/http-server.pl";
1157*6236dae4SAndroid Build Coastguard Worker    my $verbose_flag = "--verbose ";
1158*6236dae4SAndroid Build Coastguard Worker    my $keepalive_secs = 30; # forwarded to sws, was 5 by default which
1159*6236dae4SAndroid Build Coastguard Worker                             # led to pukes in CI jobs
1160*6236dae4SAndroid Build Coastguard Worker
1161*6236dae4SAndroid Build Coastguard Worker    if($alt eq "ipv6") {
1162*6236dae4SAndroid Build Coastguard Worker        # if IPv6, use a different setup
1163*6236dae4SAndroid Build Coastguard Worker        $ipvnum = 6;
1164*6236dae4SAndroid Build Coastguard Worker        $ip = $HOST6IP;
1165*6236dae4SAndroid Build Coastguard Worker    }
1166*6236dae4SAndroid Build Coastguard Worker    elsif($alt eq "proxy") {
1167*6236dae4SAndroid Build Coastguard Worker        # basically the same, but another ID
1168*6236dae4SAndroid Build Coastguard Worker        $idnum = 2;
1169*6236dae4SAndroid Build Coastguard Worker    }
1170*6236dae4SAndroid Build Coastguard Worker    elsif($alt eq "unix") {
1171*6236dae4SAndroid Build Coastguard Worker        # IP (protocol) is mutually exclusive with Unix sockets
1172*6236dae4SAndroid Build Coastguard Worker        $ipvnum = "unix";
1173*6236dae4SAndroid Build Coastguard Worker    }
1174*6236dae4SAndroid Build Coastguard Worker
1175*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1176*6236dae4SAndroid Build Coastguard Worker
1177*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
1178*6236dae4SAndroid Build Coastguard Worker
1179*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
1180*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
1181*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
1182*6236dae4SAndroid Build Coastguard Worker    }
1183*6236dae4SAndroid Build Coastguard Worker
1184*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
1185*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1186*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
1187*6236dae4SAndroid Build Coastguard Worker    }
1188*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
1189*6236dae4SAndroid Build Coastguard Worker
1190*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1191*6236dae4SAndroid Build Coastguard Worker    my $portfile = $serverportfile{$server};
1192*6236dae4SAndroid Build Coastguard Worker
1193*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
1194*6236dae4SAndroid Build Coastguard Worker
1195*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
1196*6236dae4SAndroid Build Coastguard Worker    $flags .= "--gopher " if($proto eq "gopher");
1197*6236dae4SAndroid Build Coastguard Worker    $flags .= "--connect $HOSTIP " if($alt eq "proxy");
1198*6236dae4SAndroid Build Coastguard Worker    $flags .= "--keepalive $keepalive_secs ";
1199*6236dae4SAndroid Build Coastguard Worker    $flags .= $verbose_flag if($debugprotocol);
1200*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
1201*6236dae4SAndroid Build Coastguard Worker    $flags .= "--logdir \"$LOGDIR\" ";
1202*6236dae4SAndroid Build Coastguard Worker    $flags .= "--portfile $portfile ";
1203*6236dae4SAndroid Build Coastguard Worker    $flags .= "--config $LOGDIR/$SERVERCMD ";
1204*6236dae4SAndroid Build Coastguard Worker    $flags .= "--id $idnum " if($idnum > 1);
1205*6236dae4SAndroid Build Coastguard Worker    if($ipvnum eq "unix") {
1206*6236dae4SAndroid Build Coastguard Worker        $flags .= "--unix-socket '$port_or_path' ";
1207*6236dae4SAndroid Build Coastguard Worker    } else {
1208*6236dae4SAndroid Build Coastguard Worker        $flags .= "--ipv$ipvnum --port 0 ";
1209*6236dae4SAndroid Build Coastguard Worker    }
1210*6236dae4SAndroid Build Coastguard Worker    $flags .= "--srcdir \"$srcdir\"";
1211*6236dae4SAndroid Build Coastguard Worker
1212*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$exe $flags";
1213*6236dae4SAndroid Build Coastguard Worker    my ($httppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
1214*6236dae4SAndroid Build Coastguard Worker
1215*6236dae4SAndroid Build Coastguard Worker    if($httppid <= 0 || !pidexists($httppid)) {
1216*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
1217*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
1218*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
1219*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1220*6236dae4SAndroid Build Coastguard Worker        return (1, 0, 0, 0);
1221*6236dae4SAndroid Build Coastguard Worker    }
1222*6236dae4SAndroid Build Coastguard Worker
1223*6236dae4SAndroid Build Coastguard Worker    # where is it?
1224*6236dae4SAndroid Build Coastguard Worker    my $port = 0;
1225*6236dae4SAndroid Build Coastguard Worker    if(!$port_or_path) {
1226*6236dae4SAndroid Build Coastguard Worker        $port = $port_or_path = pidfromfile($portfile);
1227*6236dae4SAndroid Build Coastguard Worker    }
1228*6236dae4SAndroid Build Coastguard Worker
1229*6236dae4SAndroid Build Coastguard Worker    # Server is up. Verify that we can speak to it.
1230*6236dae4SAndroid Build Coastguard Worker    my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port_or_path);
1231*6236dae4SAndroid Build Coastguard Worker    if(!$pid3) {
1232*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server failed verification\n";
1233*6236dae4SAndroid Build Coastguard Worker        # failed to talk to it properly. Kill the server and return failure
1234*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$httppid $pid2");
1235*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1236*6236dae4SAndroid Build Coastguard Worker        return (1, 0, 0, 0);
1237*6236dae4SAndroid Build Coastguard Worker    }
1238*6236dae4SAndroid Build Coastguard Worker    $pid2 = $pid3;
1239*6236dae4SAndroid Build Coastguard Worker
1240*6236dae4SAndroid Build Coastguard Worker    if($verb) {
1241*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server is on PID $httppid port $port_or_path\n";
1242*6236dae4SAndroid Build Coastguard Worker    }
1243*6236dae4SAndroid Build Coastguard Worker
1244*6236dae4SAndroid Build Coastguard Worker    return (0, $httppid, $pid2, $port);
1245*6236dae4SAndroid Build Coastguard Worker}
1246*6236dae4SAndroid Build Coastguard Worker
1247*6236dae4SAndroid Build Coastguard Worker
1248*6236dae4SAndroid Build Coastguard Worker#######################################################################
1249*6236dae4SAndroid Build Coastguard Worker# start the http2 server
1250*6236dae4SAndroid Build Coastguard Worker#
1251*6236dae4SAndroid Build Coastguard Workersub runhttp2server {
1252*6236dae4SAndroid Build Coastguard Worker    my ($verb) = @_;
1253*6236dae4SAndroid Build Coastguard Worker    my $proto="http/2";
1254*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
1255*6236dae4SAndroid Build Coastguard Worker    my $idnum = 0;
1256*6236dae4SAndroid Build Coastguard Worker    my $exe = "$perl $srcdir/http2-server.pl";
1257*6236dae4SAndroid Build Coastguard Worker    my $verbose_flag = "--verbose ";
1258*6236dae4SAndroid Build Coastguard Worker
1259*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1260*6236dae4SAndroid Build Coastguard Worker
1261*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
1262*6236dae4SAndroid Build Coastguard Worker
1263*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
1264*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
1265*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0, 0);
1266*6236dae4SAndroid Build Coastguard Worker    }
1267*6236dae4SAndroid Build Coastguard Worker
1268*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
1269*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1270*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
1271*6236dae4SAndroid Build Coastguard Worker    }
1272*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
1273*6236dae4SAndroid Build Coastguard Worker
1274*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1275*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
1276*6236dae4SAndroid Build Coastguard Worker
1277*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
1278*6236dae4SAndroid Build Coastguard Worker    $flags .= "--nghttpx \"$ENV{'NGHTTPX'}\" ";
1279*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
1280*6236dae4SAndroid Build Coastguard Worker    $flags .= "--logdir \"$LOGDIR\" ";
1281*6236dae4SAndroid Build Coastguard Worker    $flags .= "--connect $HOSTIP:" . protoport("http") . " ";
1282*6236dae4SAndroid Build Coastguard Worker    $flags .= $verbose_flag if($debugprotocol);
1283*6236dae4SAndroid Build Coastguard Worker
1284*6236dae4SAndroid Build Coastguard Worker    my $port = getfreeport($ipvnum);
1285*6236dae4SAndroid Build Coastguard Worker    my $port2 = getfreeport($ipvnum);
1286*6236dae4SAndroid Build Coastguard Worker    my $aflags = "--port $port --port2 $port2 $flags";
1287*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$exe $aflags";
1288*6236dae4SAndroid Build Coastguard Worker    my ($http2pid, $pid2) = startnew($cmd, $pidfile, 15, 0);
1289*6236dae4SAndroid Build Coastguard Worker
1290*6236dae4SAndroid Build Coastguard Worker    if($http2pid <= 0 || !pidexists($http2pid)) {
1291*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
1292*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
1293*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1294*6236dae4SAndroid Build Coastguard Worker        $http2pid = $pid2 = 0;
1295*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
1296*6236dae4SAndroid Build Coastguard Worker        return (3, 0, 0, 0, 0);
1297*6236dae4SAndroid Build Coastguard Worker    }
1298*6236dae4SAndroid Build Coastguard Worker    $doesntrun{$pidfile} = 0;
1299*6236dae4SAndroid Build Coastguard Worker
1300*6236dae4SAndroid Build Coastguard Worker    if($verb) {
1301*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server PID $http2pid ".
1302*6236dae4SAndroid Build Coastguard Worker            "http-port $port https-port $port2 ".
1303*6236dae4SAndroid Build Coastguard Worker            "backend $HOSTIP:" . protoport("http") . "\n";
1304*6236dae4SAndroid Build Coastguard Worker    }
1305*6236dae4SAndroid Build Coastguard Worker
1306*6236dae4SAndroid Build Coastguard Worker    return (0+!$http2pid, $http2pid, $pid2, $port, $port2);
1307*6236dae4SAndroid Build Coastguard Worker}
1308*6236dae4SAndroid Build Coastguard Worker
1309*6236dae4SAndroid Build Coastguard Worker#######################################################################
1310*6236dae4SAndroid Build Coastguard Worker# start the http3 server
1311*6236dae4SAndroid Build Coastguard Worker#
1312*6236dae4SAndroid Build Coastguard Workersub runhttp3server {
1313*6236dae4SAndroid Build Coastguard Worker    my ($verb, $cert) = @_;
1314*6236dae4SAndroid Build Coastguard Worker    my $proto="http/3";
1315*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
1316*6236dae4SAndroid Build Coastguard Worker    my $idnum = 0;
1317*6236dae4SAndroid Build Coastguard Worker    my $exe = "$perl $srcdir/http3-server.pl";
1318*6236dae4SAndroid Build Coastguard Worker    my $verbose_flag = "--verbose ";
1319*6236dae4SAndroid Build Coastguard Worker
1320*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1321*6236dae4SAndroid Build Coastguard Worker
1322*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
1323*6236dae4SAndroid Build Coastguard Worker
1324*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
1325*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
1326*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
1327*6236dae4SAndroid Build Coastguard Worker    }
1328*6236dae4SAndroid Build Coastguard Worker
1329*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
1330*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1331*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
1332*6236dae4SAndroid Build Coastguard Worker    }
1333*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
1334*6236dae4SAndroid Build Coastguard Worker
1335*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1336*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
1337*6236dae4SAndroid Build Coastguard Worker
1338*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
1339*6236dae4SAndroid Build Coastguard Worker    $flags .= "--nghttpx \"$ENV{'NGHTTPX'}\" ";
1340*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
1341*6236dae4SAndroid Build Coastguard Worker    $flags .= "--logdir \"$LOGDIR\" ";
1342*6236dae4SAndroid Build Coastguard Worker    $flags .= "--connect $HOSTIP:" . protoport("http") . " ";
1343*6236dae4SAndroid Build Coastguard Worker    $flags .= "--cert \"$cert\" " if($cert);
1344*6236dae4SAndroid Build Coastguard Worker    $flags .= $verbose_flag if($debugprotocol);
1345*6236dae4SAndroid Build Coastguard Worker
1346*6236dae4SAndroid Build Coastguard Worker    my $port = getfreeport($ipvnum);
1347*6236dae4SAndroid Build Coastguard Worker    my $aflags = "--port $port $flags";
1348*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$exe $aflags";
1349*6236dae4SAndroid Build Coastguard Worker    my ($http3pid, $pid3) = startnew($cmd, $pidfile, 15, 0);
1350*6236dae4SAndroid Build Coastguard Worker
1351*6236dae4SAndroid Build Coastguard Worker    if($http3pid <= 0 || !pidexists($http3pid)) {
1352*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
1353*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid3");
1354*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1355*6236dae4SAndroid Build Coastguard Worker        $http3pid = $pid3 = 0;
1356*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
1357*6236dae4SAndroid Build Coastguard Worker        return (3, 0, 0, 0);
1358*6236dae4SAndroid Build Coastguard Worker    }
1359*6236dae4SAndroid Build Coastguard Worker    $doesntrun{$pidfile} = 0;
1360*6236dae4SAndroid Build Coastguard Worker
1361*6236dae4SAndroid Build Coastguard Worker    if($verb) {
1362*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server PID $http3pid port $port\n";
1363*6236dae4SAndroid Build Coastguard Worker    }
1364*6236dae4SAndroid Build Coastguard Worker
1365*6236dae4SAndroid Build Coastguard Worker    return (0+!$http3pid, $http3pid, $pid3, $port);
1366*6236dae4SAndroid Build Coastguard Worker}
1367*6236dae4SAndroid Build Coastguard Worker
1368*6236dae4SAndroid Build Coastguard Worker#######################################################################
1369*6236dae4SAndroid Build Coastguard Worker# start the https stunnel based server
1370*6236dae4SAndroid Build Coastguard Worker#
1371*6236dae4SAndroid Build Coastguard Workersub runhttpsserver {
1372*6236dae4SAndroid Build Coastguard Worker    my ($verb, $proto, $proxy, $certfile) = @_;
1373*6236dae4SAndroid Build Coastguard Worker    my $ip = $HOSTIP;
1374*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
1375*6236dae4SAndroid Build Coastguard Worker    my $idnum = 1;
1376*6236dae4SAndroid Build Coastguard Worker
1377*6236dae4SAndroid Build Coastguard Worker    if($proxy eq "proxy") {
1378*6236dae4SAndroid Build Coastguard Worker        # the https-proxy runs as https2
1379*6236dae4SAndroid Build Coastguard Worker        $idnum = 2;
1380*6236dae4SAndroid Build Coastguard Worker    }
1381*6236dae4SAndroid Build Coastguard Worker
1382*6236dae4SAndroid Build Coastguard Worker    if(!$stunnel) {
1383*6236dae4SAndroid Build Coastguard Worker        return (4, 0, 0, 0);
1384*6236dae4SAndroid Build Coastguard Worker    }
1385*6236dae4SAndroid Build Coastguard Worker
1386*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1387*6236dae4SAndroid Build Coastguard Worker
1388*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
1389*6236dae4SAndroid Build Coastguard Worker
1390*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
1391*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
1392*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
1393*6236dae4SAndroid Build Coastguard Worker    }
1394*6236dae4SAndroid Build Coastguard Worker
1395*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
1396*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1397*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
1398*6236dae4SAndroid Build Coastguard Worker    }
1399*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
1400*6236dae4SAndroid Build Coastguard Worker
1401*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1402*6236dae4SAndroid Build Coastguard Worker    $certfile = 'stunnel.pem' unless($certfile);
1403*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
1404*6236dae4SAndroid Build Coastguard Worker
1405*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
1406*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose " if($debugprotocol);
1407*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
1408*6236dae4SAndroid Build Coastguard Worker    $flags .= "--logdir \"$LOGDIR\" ";
1409*6236dae4SAndroid Build Coastguard Worker    $flags .= "--id $idnum " if($idnum > 1);
1410*6236dae4SAndroid Build Coastguard Worker    $flags .= "--ipv$ipvnum --proto $proto ";
1411*6236dae4SAndroid Build Coastguard Worker    $flags .= "--certfile \"$certfile\" " if($certfile ne 'stunnel.pem');
1412*6236dae4SAndroid Build Coastguard Worker    $flags .= "--stunnel \"$stunnel\" --srcdir \"$srcdir\" ";
1413*6236dae4SAndroid Build Coastguard Worker    if($proto eq "gophers") {
1414*6236dae4SAndroid Build Coastguard Worker        $flags .= "--connect " . protoport("gopher");
1415*6236dae4SAndroid Build Coastguard Worker    }
1416*6236dae4SAndroid Build Coastguard Worker    elsif(!$proxy) {
1417*6236dae4SAndroid Build Coastguard Worker        $flags .= "--connect " . protoport("http");
1418*6236dae4SAndroid Build Coastguard Worker    }
1419*6236dae4SAndroid Build Coastguard Worker    else {
1420*6236dae4SAndroid Build Coastguard Worker        # for HTTPS-proxy we connect to the HTTP proxy
1421*6236dae4SAndroid Build Coastguard Worker        $flags .= "--connect " . protoport("httpproxy");
1422*6236dae4SAndroid Build Coastguard Worker    }
1423*6236dae4SAndroid Build Coastguard Worker
1424*6236dae4SAndroid Build Coastguard Worker    my $port = getfreeport($ipvnum);
1425*6236dae4SAndroid Build Coastguard Worker    my $options = "$flags --accept $port";
1426*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$perl $srcdir/secureserver.pl $options";
1427*6236dae4SAndroid Build Coastguard Worker    my ($httpspid, $pid2) = startnew($cmd, $pidfile, 15, 0);
1428*6236dae4SAndroid Build Coastguard Worker
1429*6236dae4SAndroid Build Coastguard Worker    if($httpspid <= 0 || !pidexists($httpspid)) {
1430*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
1431*6236dae4SAndroid Build Coastguard Worker        # don't call stopserver since that will also kill the dependent
1432*6236dae4SAndroid Build Coastguard Worker        # server that has already been started properly
1433*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1434*6236dae4SAndroid Build Coastguard Worker        $httpspid = $pid2 = 0;
1435*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
1436*6236dae4SAndroid Build Coastguard Worker        return (3, 0, 0, 0);
1437*6236dae4SAndroid Build Coastguard Worker    }
1438*6236dae4SAndroid Build Coastguard Worker
1439*6236dae4SAndroid Build Coastguard Worker    $doesntrun{$pidfile} = 0;
1440*6236dae4SAndroid Build Coastguard Worker    # we have a server!
1441*6236dae4SAndroid Build Coastguard Worker    if($verb) {
1442*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server is PID $httpspid port $port\n";
1443*6236dae4SAndroid Build Coastguard Worker    }
1444*6236dae4SAndroid Build Coastguard Worker
1445*6236dae4SAndroid Build Coastguard Worker    $runcert{$server} = $certfile;
1446*6236dae4SAndroid Build Coastguard Worker
1447*6236dae4SAndroid Build Coastguard Worker    return (0+!$httpspid, $httpspid, $pid2, $port);
1448*6236dae4SAndroid Build Coastguard Worker}
1449*6236dae4SAndroid Build Coastguard Worker
1450*6236dae4SAndroid Build Coastguard Worker#######################################################################
1451*6236dae4SAndroid Build Coastguard Worker# start the non-stunnel HTTP TLS extensions capable server
1452*6236dae4SAndroid Build Coastguard Worker#
1453*6236dae4SAndroid Build Coastguard Workersub runhttptlsserver {
1454*6236dae4SAndroid Build Coastguard Worker    my ($verb, $ipv6) = @_;
1455*6236dae4SAndroid Build Coastguard Worker    my $proto = "httptls";
1456*6236dae4SAndroid Build Coastguard Worker    my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
1457*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
1458*6236dae4SAndroid Build Coastguard Worker    my $idnum = 1;
1459*6236dae4SAndroid Build Coastguard Worker
1460*6236dae4SAndroid Build Coastguard Worker    if(!$httptlssrv) {
1461*6236dae4SAndroid Build Coastguard Worker        return (4, 0, 0);
1462*6236dae4SAndroid Build Coastguard Worker    }
1463*6236dae4SAndroid Build Coastguard Worker
1464*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1465*6236dae4SAndroid Build Coastguard Worker
1466*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
1467*6236dae4SAndroid Build Coastguard Worker
1468*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
1469*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
1470*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
1471*6236dae4SAndroid Build Coastguard Worker    }
1472*6236dae4SAndroid Build Coastguard Worker
1473*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
1474*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1475*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
1476*6236dae4SAndroid Build Coastguard Worker    }
1477*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
1478*6236dae4SAndroid Build Coastguard Worker
1479*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1480*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
1481*6236dae4SAndroid Build Coastguard Worker
1482*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
1483*6236dae4SAndroid Build Coastguard Worker    $flags .= "--http ";
1484*6236dae4SAndroid Build Coastguard Worker    $flags .= "--debug 1 " if($debugprotocol);
1485*6236dae4SAndroid Build Coastguard Worker    $flags .= "--priority NORMAL:+SRP ";
1486*6236dae4SAndroid Build Coastguard Worker    $flags .= "--srppasswd $srcdir/certs/srp-verifier-db ";
1487*6236dae4SAndroid Build Coastguard Worker    $flags .= "--srppasswdconf $srcdir/certs/srp-verifier-conf";
1488*6236dae4SAndroid Build Coastguard Worker
1489*6236dae4SAndroid Build Coastguard Worker    my $port = getfreeport($ipvnum);
1490*6236dae4SAndroid Build Coastguard Worker    my $allflags = "--port $port $flags";
1491*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$httptlssrv $allflags > $logfile 2>&1";
1492*6236dae4SAndroid Build Coastguard Worker    my ($httptlspid, $pid2) = startnew($cmd, $pidfile, 10, 1);
1493*6236dae4SAndroid Build Coastguard Worker
1494*6236dae4SAndroid Build Coastguard Worker    if($httptlspid <= 0 || !pidexists($httptlspid)) {
1495*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
1496*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
1497*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1498*6236dae4SAndroid Build Coastguard Worker        $httptlspid = $pid2 = 0;
1499*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
1500*6236dae4SAndroid Build Coastguard Worker        return (3, 0, 0, 0);
1501*6236dae4SAndroid Build Coastguard Worker    }
1502*6236dae4SAndroid Build Coastguard Worker    $doesntrun{$pidfile} = 0;
1503*6236dae4SAndroid Build Coastguard Worker
1504*6236dae4SAndroid Build Coastguard Worker    if($verb) {
1505*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server PID $httptlspid port $port\n";
1506*6236dae4SAndroid Build Coastguard Worker    }
1507*6236dae4SAndroid Build Coastguard Worker    return (0+!$httptlspid, $httptlspid, $pid2, $port);
1508*6236dae4SAndroid Build Coastguard Worker}
1509*6236dae4SAndroid Build Coastguard Worker
1510*6236dae4SAndroid Build Coastguard Worker#######################################################################
1511*6236dae4SAndroid Build Coastguard Worker# start the pingpong server (FTP, POP3, IMAP, SMTP)
1512*6236dae4SAndroid Build Coastguard Worker#
1513*6236dae4SAndroid Build Coastguard Workersub runpingpongserver {
1514*6236dae4SAndroid Build Coastguard Worker    my ($proto, $id, $verb, $ipv6) = @_;
1515*6236dae4SAndroid Build Coastguard Worker
1516*6236dae4SAndroid Build Coastguard Worker    # Check the requested server
1517*6236dae4SAndroid Build Coastguard Worker    if($proto !~ /^(?:ftp|imap|pop3|smtp)$/) {
1518*6236dae4SAndroid Build Coastguard Worker        logmsg "Unsupported protocol $proto!!\n";
1519*6236dae4SAndroid Build Coastguard Worker        return (4, 0, 0);
1520*6236dae4SAndroid Build Coastguard Worker    }
1521*6236dae4SAndroid Build Coastguard Worker
1522*6236dae4SAndroid Build Coastguard Worker    my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
1523*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
1524*6236dae4SAndroid Build Coastguard Worker    my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
1525*6236dae4SAndroid Build Coastguard Worker
1526*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1527*6236dae4SAndroid Build Coastguard Worker
1528*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
1529*6236dae4SAndroid Build Coastguard Worker    my $portfile = $serverportfile{$server};
1530*6236dae4SAndroid Build Coastguard Worker
1531*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
1532*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
1533*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0);
1534*6236dae4SAndroid Build Coastguard Worker    }
1535*6236dae4SAndroid Build Coastguard Worker
1536*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
1537*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1538*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
1539*6236dae4SAndroid Build Coastguard Worker    }
1540*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
1541*6236dae4SAndroid Build Coastguard Worker
1542*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1543*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
1544*6236dae4SAndroid Build Coastguard Worker
1545*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
1546*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose " if($debugprotocol);
1547*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
1548*6236dae4SAndroid Build Coastguard Worker    $flags .= "--logdir \"$LOGDIR\" ";
1549*6236dae4SAndroid Build Coastguard Worker    $flags .= "--portfile \"$portfile\" ";
1550*6236dae4SAndroid Build Coastguard Worker    $flags .= "--srcdir \"$srcdir\" --proto $proto ";
1551*6236dae4SAndroid Build Coastguard Worker    $flags .= "--id $idnum " if($idnum > 1);
1552*6236dae4SAndroid Build Coastguard Worker    $flags .= "--ipv$ipvnum --port 0 --addr \"$ip\"";
1553*6236dae4SAndroid Build Coastguard Worker
1554*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$perl $srcdir/ftpserver.pl $flags";
1555*6236dae4SAndroid Build Coastguard Worker    my ($ftppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
1556*6236dae4SAndroid Build Coastguard Worker
1557*6236dae4SAndroid Build Coastguard Worker    if($ftppid <= 0 || !pidexists($ftppid)) {
1558*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
1559*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
1560*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
1561*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1562*6236dae4SAndroid Build Coastguard Worker        return (1, 0, 0);
1563*6236dae4SAndroid Build Coastguard Worker    }
1564*6236dae4SAndroid Build Coastguard Worker
1565*6236dae4SAndroid Build Coastguard Worker    # where is it?
1566*6236dae4SAndroid Build Coastguard Worker    my $port = pidfromfile($portfile);
1567*6236dae4SAndroid Build Coastguard Worker
1568*6236dae4SAndroid Build Coastguard Worker    logmsg "PINGPONG runs on port $port ($portfile)\n" if($verb);
1569*6236dae4SAndroid Build Coastguard Worker
1570*6236dae4SAndroid Build Coastguard Worker    # Server is up. Verify that we can speak to it.
1571*6236dae4SAndroid Build Coastguard Worker    my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
1572*6236dae4SAndroid Build Coastguard Worker    if(!$pid3) {
1573*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server failed verification\n";
1574*6236dae4SAndroid Build Coastguard Worker        # failed to talk to it properly. Kill the server and return failure
1575*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$ftppid $pid2");
1576*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1577*6236dae4SAndroid Build Coastguard Worker        return (1, 0, 0);
1578*6236dae4SAndroid Build Coastguard Worker    }
1579*6236dae4SAndroid Build Coastguard Worker    $pid2 = $pid3;
1580*6236dae4SAndroid Build Coastguard Worker
1581*6236dae4SAndroid Build Coastguard Worker    logmsg "RUN: $srvrname server is PID $ftppid port $port\n" if($verb);
1582*6236dae4SAndroid Build Coastguard Worker
1583*6236dae4SAndroid Build Coastguard Worker    # Assign the correct port variable!
1584*6236dae4SAndroid Build Coastguard Worker    $PORT{$proto . ($ipvnum == 6? '6': '')} = $port;
1585*6236dae4SAndroid Build Coastguard Worker
1586*6236dae4SAndroid Build Coastguard Worker    return (0, $pid2, $ftppid);
1587*6236dae4SAndroid Build Coastguard Worker}
1588*6236dae4SAndroid Build Coastguard Worker
1589*6236dae4SAndroid Build Coastguard Worker#######################################################################
1590*6236dae4SAndroid Build Coastguard Worker# start the ftps/imaps/pop3s/smtps server (or rather, tunnel)
1591*6236dae4SAndroid Build Coastguard Worker#
1592*6236dae4SAndroid Build Coastguard Workersub runsecureserver {
1593*6236dae4SAndroid Build Coastguard Worker    my ($verb, $ipv6, $certfile, $proto, $clearport) = @_;
1594*6236dae4SAndroid Build Coastguard Worker    my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
1595*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
1596*6236dae4SAndroid Build Coastguard Worker    my $idnum = 1;
1597*6236dae4SAndroid Build Coastguard Worker
1598*6236dae4SAndroid Build Coastguard Worker    if(!$stunnel) {
1599*6236dae4SAndroid Build Coastguard Worker        return (4, 0, 0, 0);
1600*6236dae4SAndroid Build Coastguard Worker    }
1601*6236dae4SAndroid Build Coastguard Worker
1602*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1603*6236dae4SAndroid Build Coastguard Worker
1604*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
1605*6236dae4SAndroid Build Coastguard Worker
1606*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
1607*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
1608*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
1609*6236dae4SAndroid Build Coastguard Worker    }
1610*6236dae4SAndroid Build Coastguard Worker
1611*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
1612*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1613*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
1614*6236dae4SAndroid Build Coastguard Worker    }
1615*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
1616*6236dae4SAndroid Build Coastguard Worker
1617*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1618*6236dae4SAndroid Build Coastguard Worker    $certfile = 'stunnel.pem' unless($certfile);
1619*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
1620*6236dae4SAndroid Build Coastguard Worker
1621*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
1622*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose " if($debugprotocol);
1623*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
1624*6236dae4SAndroid Build Coastguard Worker    $flags .= "--logdir \"$LOGDIR\" ";
1625*6236dae4SAndroid Build Coastguard Worker    $flags .= "--id $idnum " if($idnum > 1);
1626*6236dae4SAndroid Build Coastguard Worker    $flags .= "--ipv$ipvnum --proto $proto ";
1627*6236dae4SAndroid Build Coastguard Worker    $flags .= "--certfile \"$certfile\" " if($certfile ne 'stunnel.pem');
1628*6236dae4SAndroid Build Coastguard Worker    $flags .= "--stunnel \"$stunnel\" --srcdir \"$srcdir\" ";
1629*6236dae4SAndroid Build Coastguard Worker    $flags .= "--connect $clearport";
1630*6236dae4SAndroid Build Coastguard Worker
1631*6236dae4SAndroid Build Coastguard Worker    my $port = getfreeport($ipvnum);
1632*6236dae4SAndroid Build Coastguard Worker    my $options = "$flags --accept $port";
1633*6236dae4SAndroid Build Coastguard Worker
1634*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$perl $srcdir/secureserver.pl $options";
1635*6236dae4SAndroid Build Coastguard Worker    my ($protospid, $pid2) = startnew($cmd, $pidfile, 15, 0);
1636*6236dae4SAndroid Build Coastguard Worker
1637*6236dae4SAndroid Build Coastguard Worker    if($protospid <= 0 || !pidexists($protospid)) {
1638*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
1639*6236dae4SAndroid Build Coastguard Worker        # don't call stopserver since that will also kill the dependent
1640*6236dae4SAndroid Build Coastguard Worker        # server that has already been started properly
1641*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1642*6236dae4SAndroid Build Coastguard Worker        $protospid = $pid2 = 0;
1643*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
1644*6236dae4SAndroid Build Coastguard Worker        return (3, 0, 0, 0);
1645*6236dae4SAndroid Build Coastguard Worker    }
1646*6236dae4SAndroid Build Coastguard Worker
1647*6236dae4SAndroid Build Coastguard Worker    $doesntrun{$pidfile} = 0;
1648*6236dae4SAndroid Build Coastguard Worker    $runcert{$server} = $certfile;
1649*6236dae4SAndroid Build Coastguard Worker
1650*6236dae4SAndroid Build Coastguard Worker    if($verb) {
1651*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server is PID $protospid port $port\n";
1652*6236dae4SAndroid Build Coastguard Worker    }
1653*6236dae4SAndroid Build Coastguard Worker
1654*6236dae4SAndroid Build Coastguard Worker    return (0+!$protospid, $protospid, $pid2, $port);
1655*6236dae4SAndroid Build Coastguard Worker}
1656*6236dae4SAndroid Build Coastguard Worker
1657*6236dae4SAndroid Build Coastguard Worker#######################################################################
1658*6236dae4SAndroid Build Coastguard Worker# start the tftp server
1659*6236dae4SAndroid Build Coastguard Worker#
1660*6236dae4SAndroid Build Coastguard Workersub runtftpserver {
1661*6236dae4SAndroid Build Coastguard Worker    my ($id, $verb, $ipv6) = @_;
1662*6236dae4SAndroid Build Coastguard Worker    my $ip = $HOSTIP;
1663*6236dae4SAndroid Build Coastguard Worker    my $proto = 'tftp';
1664*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
1665*6236dae4SAndroid Build Coastguard Worker    my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
1666*6236dae4SAndroid Build Coastguard Worker
1667*6236dae4SAndroid Build Coastguard Worker    if($ipv6) {
1668*6236dae4SAndroid Build Coastguard Worker        # if IPv6, use a different setup
1669*6236dae4SAndroid Build Coastguard Worker        $ipvnum = 6;
1670*6236dae4SAndroid Build Coastguard Worker        $ip = $HOST6IP;
1671*6236dae4SAndroid Build Coastguard Worker    }
1672*6236dae4SAndroid Build Coastguard Worker
1673*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1674*6236dae4SAndroid Build Coastguard Worker
1675*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
1676*6236dae4SAndroid Build Coastguard Worker
1677*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
1678*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
1679*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
1680*6236dae4SAndroid Build Coastguard Worker    }
1681*6236dae4SAndroid Build Coastguard Worker
1682*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
1683*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1684*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
1685*6236dae4SAndroid Build Coastguard Worker    }
1686*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
1687*6236dae4SAndroid Build Coastguard Worker
1688*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1689*6236dae4SAndroid Build Coastguard Worker    my $portfile = $serverportfile{$server};
1690*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
1691*6236dae4SAndroid Build Coastguard Worker
1692*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
1693*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose " if($debugprotocol);
1694*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" ";
1695*6236dae4SAndroid Build Coastguard Worker    $flags .= "--portfile \"$portfile\" ";
1696*6236dae4SAndroid Build Coastguard Worker    $flags .= "--logfile \"$logfile\" ";
1697*6236dae4SAndroid Build Coastguard Worker    $flags .= "--logdir \"$LOGDIR\" ";
1698*6236dae4SAndroid Build Coastguard Worker    $flags .= "--id $idnum " if($idnum > 1);
1699*6236dae4SAndroid Build Coastguard Worker    $flags .= "--ipv$ipvnum --port 0 --srcdir \"$srcdir\"";
1700*6236dae4SAndroid Build Coastguard Worker
1701*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$perl $srcdir/tftpserver.pl $flags";
1702*6236dae4SAndroid Build Coastguard Worker    my ($tftppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
1703*6236dae4SAndroid Build Coastguard Worker
1704*6236dae4SAndroid Build Coastguard Worker    if($tftppid <= 0 || !pidexists($tftppid)) {
1705*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
1706*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
1707*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
1708*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1709*6236dae4SAndroid Build Coastguard Worker        return (1, 0, 0, 0);
1710*6236dae4SAndroid Build Coastguard Worker    }
1711*6236dae4SAndroid Build Coastguard Worker
1712*6236dae4SAndroid Build Coastguard Worker    my $port = pidfromfile($portfile);
1713*6236dae4SAndroid Build Coastguard Worker
1714*6236dae4SAndroid Build Coastguard Worker    # Server is up. Verify that we can speak to it.
1715*6236dae4SAndroid Build Coastguard Worker    my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
1716*6236dae4SAndroid Build Coastguard Worker    if(!$pid3) {
1717*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server failed verification\n";
1718*6236dae4SAndroid Build Coastguard Worker        # failed to talk to it properly. Kill the server and return failure
1719*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$tftppid $pid2");
1720*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1721*6236dae4SAndroid Build Coastguard Worker        return (1, 0, 0, 0);
1722*6236dae4SAndroid Build Coastguard Worker    }
1723*6236dae4SAndroid Build Coastguard Worker    $pid2 = $pid3;
1724*6236dae4SAndroid Build Coastguard Worker
1725*6236dae4SAndroid Build Coastguard Worker    if($verb) {
1726*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server on PID $tftppid port $port\n";
1727*6236dae4SAndroid Build Coastguard Worker    }
1728*6236dae4SAndroid Build Coastguard Worker
1729*6236dae4SAndroid Build Coastguard Worker    return (0, $pid2, $tftppid, $port);
1730*6236dae4SAndroid Build Coastguard Worker}
1731*6236dae4SAndroid Build Coastguard Worker
1732*6236dae4SAndroid Build Coastguard Worker
1733*6236dae4SAndroid Build Coastguard Worker#######################################################################
1734*6236dae4SAndroid Build Coastguard Worker# start the rtsp server
1735*6236dae4SAndroid Build Coastguard Worker#
1736*6236dae4SAndroid Build Coastguard Workersub runrtspserver {
1737*6236dae4SAndroid Build Coastguard Worker    my ($verb, $ipv6) = @_;
1738*6236dae4SAndroid Build Coastguard Worker    my $ip = $HOSTIP;
1739*6236dae4SAndroid Build Coastguard Worker    my $proto = 'rtsp';
1740*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
1741*6236dae4SAndroid Build Coastguard Worker    my $idnum = 1;
1742*6236dae4SAndroid Build Coastguard Worker
1743*6236dae4SAndroid Build Coastguard Worker    if($ipv6) {
1744*6236dae4SAndroid Build Coastguard Worker        # if IPv6, use a different setup
1745*6236dae4SAndroid Build Coastguard Worker        $ipvnum = 6;
1746*6236dae4SAndroid Build Coastguard Worker        $ip = $HOST6IP;
1747*6236dae4SAndroid Build Coastguard Worker    }
1748*6236dae4SAndroid Build Coastguard Worker
1749*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1750*6236dae4SAndroid Build Coastguard Worker
1751*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
1752*6236dae4SAndroid Build Coastguard Worker    my $portfile = $serverportfile{$server};
1753*6236dae4SAndroid Build Coastguard Worker
1754*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
1755*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
1756*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
1757*6236dae4SAndroid Build Coastguard Worker    }
1758*6236dae4SAndroid Build Coastguard Worker
1759*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
1760*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1761*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
1762*6236dae4SAndroid Build Coastguard Worker    }
1763*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
1764*6236dae4SAndroid Build Coastguard Worker
1765*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1766*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
1767*6236dae4SAndroid Build Coastguard Worker
1768*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
1769*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose " if($debugprotocol);
1770*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" ";
1771*6236dae4SAndroid Build Coastguard Worker    $flags .= "--portfile \"$portfile\" ";
1772*6236dae4SAndroid Build Coastguard Worker    $flags .= "--logfile \"$logfile\" ";
1773*6236dae4SAndroid Build Coastguard Worker    $flags .= "--logdir \"$LOGDIR\" ";
1774*6236dae4SAndroid Build Coastguard Worker    $flags .= "--id $idnum " if($idnum > 1);
1775*6236dae4SAndroid Build Coastguard Worker    $flags .= "--ipv$ipvnum --port 0 --srcdir \"$srcdir\"";
1776*6236dae4SAndroid Build Coastguard Worker
1777*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$perl $srcdir/rtspserver.pl $flags";
1778*6236dae4SAndroid Build Coastguard Worker    my ($rtsppid, $pid2) = startnew($cmd, $pidfile, 15, 0);
1779*6236dae4SAndroid Build Coastguard Worker
1780*6236dae4SAndroid Build Coastguard Worker    if($rtsppid <= 0 || !pidexists($rtsppid)) {
1781*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
1782*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
1783*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
1784*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1785*6236dae4SAndroid Build Coastguard Worker        return (1, 0, 0, 0);
1786*6236dae4SAndroid Build Coastguard Worker    }
1787*6236dae4SAndroid Build Coastguard Worker
1788*6236dae4SAndroid Build Coastguard Worker    my $port = pidfromfile($portfile);
1789*6236dae4SAndroid Build Coastguard Worker
1790*6236dae4SAndroid Build Coastguard Worker    # Server is up. Verify that we can speak to it.
1791*6236dae4SAndroid Build Coastguard Worker    my $pid3 = verifyserver($proto, $ipvnum, $idnum, $ip, $port);
1792*6236dae4SAndroid Build Coastguard Worker    if(!$pid3) {
1793*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server failed verification\n";
1794*6236dae4SAndroid Build Coastguard Worker        # failed to talk to it properly. Kill the server and return failure
1795*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$rtsppid $pid2");
1796*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1797*6236dae4SAndroid Build Coastguard Worker        return (1, 0, 0, 0);
1798*6236dae4SAndroid Build Coastguard Worker    }
1799*6236dae4SAndroid Build Coastguard Worker    $pid2 = $pid3;
1800*6236dae4SAndroid Build Coastguard Worker
1801*6236dae4SAndroid Build Coastguard Worker    if($verb) {
1802*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server PID $rtsppid port $port\n";
1803*6236dae4SAndroid Build Coastguard Worker    }
1804*6236dae4SAndroid Build Coastguard Worker
1805*6236dae4SAndroid Build Coastguard Worker    return (0, $rtsppid, $pid2, $port);
1806*6236dae4SAndroid Build Coastguard Worker}
1807*6236dae4SAndroid Build Coastguard Worker
1808*6236dae4SAndroid Build Coastguard Worker
1809*6236dae4SAndroid Build Coastguard Worker#######################################################################
1810*6236dae4SAndroid Build Coastguard Worker# Start the ssh (scp/sftp) server
1811*6236dae4SAndroid Build Coastguard Worker#
1812*6236dae4SAndroid Build Coastguard Workersub runsshserver {
1813*6236dae4SAndroid Build Coastguard Worker    my ($id, $verb, $ipv6) = @_;
1814*6236dae4SAndroid Build Coastguard Worker    my $ip=$HOSTIP;
1815*6236dae4SAndroid Build Coastguard Worker    my $proto = 'ssh';
1816*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
1817*6236dae4SAndroid Build Coastguard Worker    my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
1818*6236dae4SAndroid Build Coastguard Worker
1819*6236dae4SAndroid Build Coastguard Worker    if(!$USER) {
1820*6236dae4SAndroid Build Coastguard Worker        logmsg "Can't start ssh server due to lack of USER name\n";
1821*6236dae4SAndroid Build Coastguard Worker        return (4, 0, 0, 0);
1822*6236dae4SAndroid Build Coastguard Worker    }
1823*6236dae4SAndroid Build Coastguard Worker
1824*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1825*6236dae4SAndroid Build Coastguard Worker
1826*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
1827*6236dae4SAndroid Build Coastguard Worker
1828*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
1829*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
1830*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
1831*6236dae4SAndroid Build Coastguard Worker    }
1832*6236dae4SAndroid Build Coastguard Worker
1833*6236dae4SAndroid Build Coastguard Worker    my $sshd = find_sshd();
1834*6236dae4SAndroid Build Coastguard Worker    if($sshd) {
1835*6236dae4SAndroid Build Coastguard Worker        ($sshdid,$sshdvernum,$sshdverstr,$sshderror) = sshversioninfo($sshd);
1836*6236dae4SAndroid Build Coastguard Worker        logmsg $sshderror if($sshderror);
1837*6236dae4SAndroid Build Coastguard Worker    }
1838*6236dae4SAndroid Build Coastguard Worker
1839*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
1840*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1841*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
1842*6236dae4SAndroid Build Coastguard Worker    }
1843*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
1844*6236dae4SAndroid Build Coastguard Worker
1845*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1846*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
1847*6236dae4SAndroid Build Coastguard Worker
1848*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
1849*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose " if($verb);
1850*6236dae4SAndroid Build Coastguard Worker    $flags .= "--debugprotocol " if($debugprotocol);
1851*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" ";
1852*6236dae4SAndroid Build Coastguard Worker    $flags .= "--logdir \"$LOGDIR\" ";
1853*6236dae4SAndroid Build Coastguard Worker    $flags .= "--id $idnum " if($idnum > 1);
1854*6236dae4SAndroid Build Coastguard Worker    $flags .= "--ipv$ipvnum --addr \"$ip\" ";
1855*6236dae4SAndroid Build Coastguard Worker    $flags .= "--user \"$USER\"";
1856*6236dae4SAndroid Build Coastguard Worker
1857*6236dae4SAndroid Build Coastguard Worker    my @tports;
1858*6236dae4SAndroid Build Coastguard Worker    my $port = getfreeport($ipvnum);
1859*6236dae4SAndroid Build Coastguard Worker
1860*6236dae4SAndroid Build Coastguard Worker    push @tports, $port;
1861*6236dae4SAndroid Build Coastguard Worker
1862*6236dae4SAndroid Build Coastguard Worker    my $options = "$flags --sshport $port";
1863*6236dae4SAndroid Build Coastguard Worker
1864*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$perl $srcdir/sshserver.pl $options";
1865*6236dae4SAndroid Build Coastguard Worker    my ($sshpid, $pid2) = startnew($cmd, $pidfile, 60, 0);
1866*6236dae4SAndroid Build Coastguard Worker
1867*6236dae4SAndroid Build Coastguard Worker    # on loaded systems sshserver start up can take longer than the
1868*6236dae4SAndroid Build Coastguard Worker    # timeout passed to startnew, when this happens startnew completes
1869*6236dae4SAndroid Build Coastguard Worker    # without being able to read the pidfile and consequently returns a
1870*6236dae4SAndroid Build Coastguard Worker    # zero pid2 above.
1871*6236dae4SAndroid Build Coastguard Worker    if($sshpid <= 0 || !pidexists($sshpid)) {
1872*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
1873*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
1874*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1875*6236dae4SAndroid Build Coastguard Worker        $sshpid = $pid2 = 0;
1876*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server on $port\n";
1877*6236dae4SAndroid Build Coastguard Worker        return (3, 0, 0, 0);
1878*6236dae4SAndroid Build Coastguard Worker    }
1879*6236dae4SAndroid Build Coastguard Worker
1880*6236dae4SAndroid Build Coastguard Worker    # once it is known that the ssh server is alive, sftp server
1881*6236dae4SAndroid Build Coastguard Worker    # verification is performed actually connecting to it, authenticating
1882*6236dae4SAndroid Build Coastguard Worker    # and performing a very simple remote command.  This verification is
1883*6236dae4SAndroid Build Coastguard Worker    # tried only one time.
1884*6236dae4SAndroid Build Coastguard Worker
1885*6236dae4SAndroid Build Coastguard Worker    $sshdlog = server_logfilename($LOGDIR, 'ssh', $ipvnum, $idnum);
1886*6236dae4SAndroid Build Coastguard Worker    $sftplog = server_logfilename($LOGDIR, 'sftp', $ipvnum, $idnum);
1887*6236dae4SAndroid Build Coastguard Worker
1888*6236dae4SAndroid Build Coastguard Worker    if(verifysftp('sftp', $ipvnum, $idnum, $ip, $port) < 1) {
1889*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: SFTP server failed verification\n";
1890*6236dae4SAndroid Build Coastguard Worker        # failed to talk to it properly. Kill the server and return failure
1891*6236dae4SAndroid Build Coastguard Worker        display_sftplog();
1892*6236dae4SAndroid Build Coastguard Worker        display_sftpconfig();
1893*6236dae4SAndroid Build Coastguard Worker        display_sshdlog();
1894*6236dae4SAndroid Build Coastguard Worker        display_sshdconfig();
1895*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$sshpid $pid2");
1896*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1897*6236dae4SAndroid Build Coastguard Worker        $sshpid = $pid2 = 0;
1898*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to verify the $srvrname server on $port\n";
1899*6236dae4SAndroid Build Coastguard Worker        return (5, 0, 0, 0);
1900*6236dae4SAndroid Build Coastguard Worker    }
1901*6236dae4SAndroid Build Coastguard Worker    # we're happy, no need to loop anymore!
1902*6236dae4SAndroid Build Coastguard Worker    $doesntrun{$pidfile} = 0;
1903*6236dae4SAndroid Build Coastguard Worker
1904*6236dae4SAndroid Build Coastguard Worker    my $hostfile;
1905*6236dae4SAndroid Build Coastguard Worker    if(!open($hostfile, "<", "$LOGDIR/$PIDDIR/$hstpubmd5f") ||
1906*6236dae4SAndroid Build Coastguard Worker       (read($hostfile, $SSHSRVMD5, 32) != 32) ||
1907*6236dae4SAndroid Build Coastguard Worker       !close($hostfile) ||
1908*6236dae4SAndroid Build Coastguard Worker       ($SSHSRVMD5 !~ /^[a-f0-9]{32}$/i))
1909*6236dae4SAndroid Build Coastguard Worker    {
1910*6236dae4SAndroid Build Coastguard Worker        my $msg = "Fatal: $srvrname pubkey md5 missing : \"$hstpubmd5f\" : $!";
1911*6236dae4SAndroid Build Coastguard Worker        logmsg "$msg\n";
1912*6236dae4SAndroid Build Coastguard Worker        stopservers($verb);
1913*6236dae4SAndroid Build Coastguard Worker        die $msg;
1914*6236dae4SAndroid Build Coastguard Worker    }
1915*6236dae4SAndroid Build Coastguard Worker
1916*6236dae4SAndroid Build Coastguard Worker    if(!open($hostfile, "<", "$LOGDIR/$PIDDIR/$hstpubsha256f") ||
1917*6236dae4SAndroid Build Coastguard Worker       (read($hostfile, $SSHSRVSHA256, 48) == 0) ||
1918*6236dae4SAndroid Build Coastguard Worker       !close($hostfile))
1919*6236dae4SAndroid Build Coastguard Worker    {
1920*6236dae4SAndroid Build Coastguard Worker        my $msg = "Fatal: $srvrname pubkey sha256 missing : \"$hstpubsha256f\" : $!";
1921*6236dae4SAndroid Build Coastguard Worker        logmsg "$msg\n";
1922*6236dae4SAndroid Build Coastguard Worker        stopservers($verb);
1923*6236dae4SAndroid Build Coastguard Worker        die $msg;
1924*6236dae4SAndroid Build Coastguard Worker    }
1925*6236dae4SAndroid Build Coastguard Worker
1926*6236dae4SAndroid Build Coastguard Worker    logmsg "RUN: $srvrname on PID $pid2 port $port\n" if($verb);
1927*6236dae4SAndroid Build Coastguard Worker
1928*6236dae4SAndroid Build Coastguard Worker    return (0, $pid2, $sshpid, $port);
1929*6236dae4SAndroid Build Coastguard Worker}
1930*6236dae4SAndroid Build Coastguard Worker
1931*6236dae4SAndroid Build Coastguard Worker#######################################################################
1932*6236dae4SAndroid Build Coastguard Worker# Start the MQTT server
1933*6236dae4SAndroid Build Coastguard Worker#
1934*6236dae4SAndroid Build Coastguard Workersub runmqttserver {
1935*6236dae4SAndroid Build Coastguard Worker    my ($id, $verb, $ipv6) = @_;
1936*6236dae4SAndroid Build Coastguard Worker    my $ip=$HOSTIP;
1937*6236dae4SAndroid Build Coastguard Worker    my $proto = 'mqtt';
1938*6236dae4SAndroid Build Coastguard Worker    my $port = protoport($proto);
1939*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
1940*6236dae4SAndroid Build Coastguard Worker    my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
1941*6236dae4SAndroid Build Coastguard Worker
1942*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1943*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
1944*6236dae4SAndroid Build Coastguard Worker    my $portfile = $serverportfile{$server};
1945*6236dae4SAndroid Build Coastguard Worker
1946*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
1947*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
1948*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0);
1949*6236dae4SAndroid Build Coastguard Worker    }
1950*6236dae4SAndroid Build Coastguard Worker
1951*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
1952*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
1953*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
1954*6236dae4SAndroid Build Coastguard Worker    }
1955*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
1956*6236dae4SAndroid Build Coastguard Worker
1957*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
1958*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
1959*6236dae4SAndroid Build Coastguard Worker
1960*6236dae4SAndroid Build Coastguard Worker    # start our MQTT server - on a random port!
1961*6236dae4SAndroid Build Coastguard Worker    my $cmd="server/mqttd".exe_ext('SRV').
1962*6236dae4SAndroid Build Coastguard Worker        " --port 0 ".
1963*6236dae4SAndroid Build Coastguard Worker        " --pidfile $pidfile".
1964*6236dae4SAndroid Build Coastguard Worker        " --portfile $portfile".
1965*6236dae4SAndroid Build Coastguard Worker        " --config $LOGDIR/$SERVERCMD".
1966*6236dae4SAndroid Build Coastguard Worker        " --logfile $logfile".
1967*6236dae4SAndroid Build Coastguard Worker        " --logdir $LOGDIR";
1968*6236dae4SAndroid Build Coastguard Worker    my ($sockspid, $pid2) = startnew($cmd, $pidfile, 30, 0);
1969*6236dae4SAndroid Build Coastguard Worker
1970*6236dae4SAndroid Build Coastguard Worker    if($sockspid <= 0 || !pidexists($sockspid)) {
1971*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
1972*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
1973*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
1974*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
1975*6236dae4SAndroid Build Coastguard Worker        return (1, 0, 0);
1976*6236dae4SAndroid Build Coastguard Worker    }
1977*6236dae4SAndroid Build Coastguard Worker
1978*6236dae4SAndroid Build Coastguard Worker    my $mqttport = pidfromfile($portfile);
1979*6236dae4SAndroid Build Coastguard Worker
1980*6236dae4SAndroid Build Coastguard Worker    if($verb) {
1981*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server is now running PID $pid2 on PORT $mqttport\n";
1982*6236dae4SAndroid Build Coastguard Worker    }
1983*6236dae4SAndroid Build Coastguard Worker
1984*6236dae4SAndroid Build Coastguard Worker    return (0, $pid2, $sockspid, $mqttport);
1985*6236dae4SAndroid Build Coastguard Worker}
1986*6236dae4SAndroid Build Coastguard Worker
1987*6236dae4SAndroid Build Coastguard Worker#######################################################################
1988*6236dae4SAndroid Build Coastguard Worker# Start the socks server
1989*6236dae4SAndroid Build Coastguard Worker#
1990*6236dae4SAndroid Build Coastguard Workersub runsocksserver {
1991*6236dae4SAndroid Build Coastguard Worker    my ($id, $verb, $ipv6, $is_unix) = @_;
1992*6236dae4SAndroid Build Coastguard Worker    my $ip=$HOSTIP;
1993*6236dae4SAndroid Build Coastguard Worker    my $proto = 'socks';
1994*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
1995*6236dae4SAndroid Build Coastguard Worker    my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
1996*6236dae4SAndroid Build Coastguard Worker
1997*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
1998*6236dae4SAndroid Build Coastguard Worker
1999*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
2000*6236dae4SAndroid Build Coastguard Worker
2001*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
2002*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
2003*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
2004*6236dae4SAndroid Build Coastguard Worker    }
2005*6236dae4SAndroid Build Coastguard Worker
2006*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
2007*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
2008*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
2009*6236dae4SAndroid Build Coastguard Worker    }
2010*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
2011*6236dae4SAndroid Build Coastguard Worker
2012*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
2013*6236dae4SAndroid Build Coastguard Worker    my $portfile = $serverportfile{$server};
2014*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
2015*6236dae4SAndroid Build Coastguard Worker
2016*6236dae4SAndroid Build Coastguard Worker    # start our socks server, get commands from the FTP cmd file
2017*6236dae4SAndroid Build Coastguard Worker    my $cmd="";
2018*6236dae4SAndroid Build Coastguard Worker    if($is_unix) {
2019*6236dae4SAndroid Build Coastguard Worker        $cmd="server/socksd".exe_ext('SRV').
2020*6236dae4SAndroid Build Coastguard Worker            " --pidfile $pidfile".
2021*6236dae4SAndroid Build Coastguard Worker            " --reqfile $LOGDIR/$SOCKSIN".
2022*6236dae4SAndroid Build Coastguard Worker            " --logfile $logfile".
2023*6236dae4SAndroid Build Coastguard Worker            " --unix-socket $SOCKSUNIXPATH".
2024*6236dae4SAndroid Build Coastguard Worker            " --backend $HOSTIP".
2025*6236dae4SAndroid Build Coastguard Worker            " --config $LOGDIR/$SERVERCMD";
2026*6236dae4SAndroid Build Coastguard Worker    } else {
2027*6236dae4SAndroid Build Coastguard Worker        $cmd="server/socksd".exe_ext('SRV').
2028*6236dae4SAndroid Build Coastguard Worker            " --port 0 ".
2029*6236dae4SAndroid Build Coastguard Worker            " --pidfile $pidfile".
2030*6236dae4SAndroid Build Coastguard Worker            " --portfile $portfile".
2031*6236dae4SAndroid Build Coastguard Worker            " --reqfile $LOGDIR/$SOCKSIN".
2032*6236dae4SAndroid Build Coastguard Worker            " --logfile $logfile".
2033*6236dae4SAndroid Build Coastguard Worker            " --backend $HOSTIP".
2034*6236dae4SAndroid Build Coastguard Worker            " --config $LOGDIR/$SERVERCMD";
2035*6236dae4SAndroid Build Coastguard Worker    }
2036*6236dae4SAndroid Build Coastguard Worker    my ($sockspid, $pid2) = startnew($cmd, $pidfile, 30, 0);
2037*6236dae4SAndroid Build Coastguard Worker
2038*6236dae4SAndroid Build Coastguard Worker    if($sockspid <= 0 || !pidexists($sockspid)) {
2039*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
2040*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
2041*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
2042*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
2043*6236dae4SAndroid Build Coastguard Worker        return (1, 0, 0, 0);
2044*6236dae4SAndroid Build Coastguard Worker    }
2045*6236dae4SAndroid Build Coastguard Worker
2046*6236dae4SAndroid Build Coastguard Worker    my $port = pidfromfile($portfile);
2047*6236dae4SAndroid Build Coastguard Worker
2048*6236dae4SAndroid Build Coastguard Worker    if($verb) {
2049*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server is now running PID $pid2\n";
2050*6236dae4SAndroid Build Coastguard Worker    }
2051*6236dae4SAndroid Build Coastguard Worker
2052*6236dae4SAndroid Build Coastguard Worker    return (0, $pid2, $sockspid, $port);
2053*6236dae4SAndroid Build Coastguard Worker}
2054*6236dae4SAndroid Build Coastguard Worker
2055*6236dae4SAndroid Build Coastguard Worker#######################################################################
2056*6236dae4SAndroid Build Coastguard Worker# start the dict server
2057*6236dae4SAndroid Build Coastguard Worker#
2058*6236dae4SAndroid Build Coastguard Workersub rundictserver {
2059*6236dae4SAndroid Build Coastguard Worker    my ($verb, $alt) = @_;
2060*6236dae4SAndroid Build Coastguard Worker    my $proto = "dict";
2061*6236dae4SAndroid Build Coastguard Worker    my $ip = $HOSTIP;
2062*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
2063*6236dae4SAndroid Build Coastguard Worker    my $idnum = 1;
2064*6236dae4SAndroid Build Coastguard Worker
2065*6236dae4SAndroid Build Coastguard Worker    if($alt eq "ipv6") {
2066*6236dae4SAndroid Build Coastguard Worker        # No IPv6
2067*6236dae4SAndroid Build Coastguard Worker    }
2068*6236dae4SAndroid Build Coastguard Worker
2069*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
2070*6236dae4SAndroid Build Coastguard Worker
2071*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
2072*6236dae4SAndroid Build Coastguard Worker
2073*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
2074*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
2075*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
2076*6236dae4SAndroid Build Coastguard Worker    }
2077*6236dae4SAndroid Build Coastguard Worker
2078*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
2079*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
2080*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
2081*6236dae4SAndroid Build Coastguard Worker    }
2082*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
2083*6236dae4SAndroid Build Coastguard Worker
2084*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
2085*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
2086*6236dae4SAndroid Build Coastguard Worker
2087*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
2088*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose 1 " if($debugprotocol);
2089*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
2090*6236dae4SAndroid Build Coastguard Worker    $flags .= "--id $idnum " if($idnum > 1);
2091*6236dae4SAndroid Build Coastguard Worker    $flags .= "--srcdir \"$srcdir\" ";
2092*6236dae4SAndroid Build Coastguard Worker    $flags .= "--host $HOSTIP";
2093*6236dae4SAndroid Build Coastguard Worker
2094*6236dae4SAndroid Build Coastguard Worker    my $port = getfreeport($ipvnum);
2095*6236dae4SAndroid Build Coastguard Worker    my $aflags = "--port $port $flags";
2096*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$srcdir/dictserver.py $aflags";
2097*6236dae4SAndroid Build Coastguard Worker    my ($dictpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
2098*6236dae4SAndroid Build Coastguard Worker
2099*6236dae4SAndroid Build Coastguard Worker    if($dictpid <= 0 || !pidexists($dictpid)) {
2100*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
2101*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
2102*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
2103*6236dae4SAndroid Build Coastguard Worker        $dictpid = $pid2 = 0;
2104*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
2105*6236dae4SAndroid Build Coastguard Worker        return (3, 0, 0, 0);
2106*6236dae4SAndroid Build Coastguard Worker    }
2107*6236dae4SAndroid Build Coastguard Worker    $doesntrun{$pidfile} = 0;
2108*6236dae4SAndroid Build Coastguard Worker
2109*6236dae4SAndroid Build Coastguard Worker    if($verb) {
2110*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server PID $dictpid port $port\n";
2111*6236dae4SAndroid Build Coastguard Worker    }
2112*6236dae4SAndroid Build Coastguard Worker
2113*6236dae4SAndroid Build Coastguard Worker    return (0+!$dictpid, $dictpid, $pid2, $port);
2114*6236dae4SAndroid Build Coastguard Worker}
2115*6236dae4SAndroid Build Coastguard Worker
2116*6236dae4SAndroid Build Coastguard Worker#######################################################################
2117*6236dae4SAndroid Build Coastguard Worker# start the SMB server
2118*6236dae4SAndroid Build Coastguard Worker#
2119*6236dae4SAndroid Build Coastguard Workersub runsmbserver {
2120*6236dae4SAndroid Build Coastguard Worker    my ($verb, $alt) = @_;
2121*6236dae4SAndroid Build Coastguard Worker    my $proto = "smb";
2122*6236dae4SAndroid Build Coastguard Worker    my $ip = $HOSTIP;
2123*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
2124*6236dae4SAndroid Build Coastguard Worker    my $idnum = 1;
2125*6236dae4SAndroid Build Coastguard Worker
2126*6236dae4SAndroid Build Coastguard Worker    if($alt eq "ipv6") {
2127*6236dae4SAndroid Build Coastguard Worker        # No IPv6
2128*6236dae4SAndroid Build Coastguard Worker    }
2129*6236dae4SAndroid Build Coastguard Worker
2130*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
2131*6236dae4SAndroid Build Coastguard Worker
2132*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
2133*6236dae4SAndroid Build Coastguard Worker
2134*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
2135*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
2136*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
2137*6236dae4SAndroid Build Coastguard Worker    }
2138*6236dae4SAndroid Build Coastguard Worker
2139*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
2140*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
2141*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
2142*6236dae4SAndroid Build Coastguard Worker    }
2143*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
2144*6236dae4SAndroid Build Coastguard Worker
2145*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
2146*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
2147*6236dae4SAndroid Build Coastguard Worker
2148*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
2149*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose 1 " if($debugprotocol);
2150*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
2151*6236dae4SAndroid Build Coastguard Worker    $flags .= "--id $idnum " if($idnum > 1);
2152*6236dae4SAndroid Build Coastguard Worker    $flags .= "--srcdir \"$srcdir\" ";
2153*6236dae4SAndroid Build Coastguard Worker    $flags .= "--host $HOSTIP";
2154*6236dae4SAndroid Build Coastguard Worker
2155*6236dae4SAndroid Build Coastguard Worker    my $port = getfreeport($ipvnum);
2156*6236dae4SAndroid Build Coastguard Worker    my $aflags = "--port $port $flags";
2157*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$srcdir/smbserver.py $aflags";
2158*6236dae4SAndroid Build Coastguard Worker    my ($smbpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
2159*6236dae4SAndroid Build Coastguard Worker
2160*6236dae4SAndroid Build Coastguard Worker    if($smbpid <= 0 || !pidexists($smbpid)) {
2161*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
2162*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
2163*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
2164*6236dae4SAndroid Build Coastguard Worker        $smbpid = $pid2 = 0;
2165*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
2166*6236dae4SAndroid Build Coastguard Worker        return (3, 0, 0, 0);
2167*6236dae4SAndroid Build Coastguard Worker    }
2168*6236dae4SAndroid Build Coastguard Worker    $doesntrun{$pidfile} = 0;
2169*6236dae4SAndroid Build Coastguard Worker
2170*6236dae4SAndroid Build Coastguard Worker    if($verb) {
2171*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server PID $smbpid port $port\n";
2172*6236dae4SAndroid Build Coastguard Worker    }
2173*6236dae4SAndroid Build Coastguard Worker
2174*6236dae4SAndroid Build Coastguard Worker    return (0+!$smbpid, $smbpid, $pid2, $port);
2175*6236dae4SAndroid Build Coastguard Worker}
2176*6236dae4SAndroid Build Coastguard Worker
2177*6236dae4SAndroid Build Coastguard Worker#######################################################################
2178*6236dae4SAndroid Build Coastguard Worker# start the telnet server
2179*6236dae4SAndroid Build Coastguard Worker#
2180*6236dae4SAndroid Build Coastguard Workersub runnegtelnetserver {
2181*6236dae4SAndroid Build Coastguard Worker    my ($verb, $alt) = @_;
2182*6236dae4SAndroid Build Coastguard Worker    my $proto = "telnet";
2183*6236dae4SAndroid Build Coastguard Worker    my $ip = $HOSTIP;
2184*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
2185*6236dae4SAndroid Build Coastguard Worker    my $idnum = 1;
2186*6236dae4SAndroid Build Coastguard Worker
2187*6236dae4SAndroid Build Coastguard Worker    if($alt eq "ipv6") {
2188*6236dae4SAndroid Build Coastguard Worker        # No IPv6
2189*6236dae4SAndroid Build Coastguard Worker    }
2190*6236dae4SAndroid Build Coastguard Worker
2191*6236dae4SAndroid Build Coastguard Worker    my $server = servername_id($proto, $ipvnum, $idnum);
2192*6236dae4SAndroid Build Coastguard Worker
2193*6236dae4SAndroid Build Coastguard Worker    my $pidfile = $serverpidfile{$server};
2194*6236dae4SAndroid Build Coastguard Worker
2195*6236dae4SAndroid Build Coastguard Worker    # don't retry if the server doesn't work
2196*6236dae4SAndroid Build Coastguard Worker    if ($doesntrun{$pidfile}) {
2197*6236dae4SAndroid Build Coastguard Worker        return (2, 0, 0, 0);
2198*6236dae4SAndroid Build Coastguard Worker    }
2199*6236dae4SAndroid Build Coastguard Worker
2200*6236dae4SAndroid Build Coastguard Worker    my $pid = processexists($pidfile);
2201*6236dae4SAndroid Build Coastguard Worker    if($pid > 0) {
2202*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid");
2203*6236dae4SAndroid Build Coastguard Worker    }
2204*6236dae4SAndroid Build Coastguard Worker    unlink($pidfile) if(-f $pidfile);
2205*6236dae4SAndroid Build Coastguard Worker
2206*6236dae4SAndroid Build Coastguard Worker    my $srvrname = servername_str($proto, $ipvnum, $idnum);
2207*6236dae4SAndroid Build Coastguard Worker    my $logfile = server_logfilename($LOGDIR, $proto, $ipvnum, $idnum);
2208*6236dae4SAndroid Build Coastguard Worker
2209*6236dae4SAndroid Build Coastguard Worker    my $flags = "";
2210*6236dae4SAndroid Build Coastguard Worker    $flags .= "--verbose 1 " if($debugprotocol);
2211*6236dae4SAndroid Build Coastguard Worker    $flags .= "--pidfile \"$pidfile\" --logfile \"$logfile\" ";
2212*6236dae4SAndroid Build Coastguard Worker    $flags .= "--id $idnum " if($idnum > 1);
2213*6236dae4SAndroid Build Coastguard Worker    $flags .= "--srcdir \"$srcdir\"";
2214*6236dae4SAndroid Build Coastguard Worker
2215*6236dae4SAndroid Build Coastguard Worker    my $port = getfreeport($ipvnum);
2216*6236dae4SAndroid Build Coastguard Worker    my $aflags = "--port $port $flags";
2217*6236dae4SAndroid Build Coastguard Worker    my $cmd = "$srcdir/negtelnetserver.py $aflags";
2218*6236dae4SAndroid Build Coastguard Worker    my ($ntelpid, $pid2) = startnew($cmd, $pidfile, 15, 0);
2219*6236dae4SAndroid Build Coastguard Worker
2220*6236dae4SAndroid Build Coastguard Worker    if($ntelpid <= 0 || !pidexists($ntelpid)) {
2221*6236dae4SAndroid Build Coastguard Worker        # it is NOT alive
2222*6236dae4SAndroid Build Coastguard Worker        stopserver($server, "$pid2");
2223*6236dae4SAndroid Build Coastguard Worker        $doesntrun{$pidfile} = 1;
2224*6236dae4SAndroid Build Coastguard Worker        $ntelpid = $pid2 = 0;
2225*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: failed to start the $srvrname server\n";
2226*6236dae4SAndroid Build Coastguard Worker        return (3, 0, 0, 0);
2227*6236dae4SAndroid Build Coastguard Worker    }
2228*6236dae4SAndroid Build Coastguard Worker    $doesntrun{$pidfile} = 0;
2229*6236dae4SAndroid Build Coastguard Worker
2230*6236dae4SAndroid Build Coastguard Worker    if($verb) {
2231*6236dae4SAndroid Build Coastguard Worker        logmsg "RUN: $srvrname server PID $ntelpid port $port\n";
2232*6236dae4SAndroid Build Coastguard Worker    }
2233*6236dae4SAndroid Build Coastguard Worker
2234*6236dae4SAndroid Build Coastguard Worker    return (0+!$ntelpid, $ntelpid, $pid2, $port);
2235*6236dae4SAndroid Build Coastguard Worker}
2236*6236dae4SAndroid Build Coastguard Worker
2237*6236dae4SAndroid Build Coastguard Worker
2238*6236dae4SAndroid Build Coastguard Worker
2239*6236dae4SAndroid Build Coastguard Worker
2240*6236dae4SAndroid Build Coastguard Worker#######################################################################
2241*6236dae4SAndroid Build Coastguard Worker# Single shot http and gopher server responsiveness test. This should only
2242*6236dae4SAndroid Build Coastguard Worker# be used to verify that a server present in %run hash is still functional
2243*6236dae4SAndroid Build Coastguard Worker#
2244*6236dae4SAndroid Build Coastguard Workersub responsive_http_server {
2245*6236dae4SAndroid Build Coastguard Worker    my ($proto, $verb, $alt, $port_or_path, $do_http3) = @_;
2246*6236dae4SAndroid Build Coastguard Worker    my $ip = $HOSTIP;
2247*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
2248*6236dae4SAndroid Build Coastguard Worker    my $idnum = 1;
2249*6236dae4SAndroid Build Coastguard Worker
2250*6236dae4SAndroid Build Coastguard Worker    if($alt eq "ipv6") {
2251*6236dae4SAndroid Build Coastguard Worker        # if IPv6, use a different setup
2252*6236dae4SAndroid Build Coastguard Worker        $ipvnum = 6;
2253*6236dae4SAndroid Build Coastguard Worker        $ip = $HOST6IP;
2254*6236dae4SAndroid Build Coastguard Worker    }
2255*6236dae4SAndroid Build Coastguard Worker    elsif($alt eq "proxy") {
2256*6236dae4SAndroid Build Coastguard Worker        $idnum = 2;
2257*6236dae4SAndroid Build Coastguard Worker    }
2258*6236dae4SAndroid Build Coastguard Worker    elsif($alt eq "unix") {
2259*6236dae4SAndroid Build Coastguard Worker        # IP (protocol) is mutually exclusive with Unix sockets
2260*6236dae4SAndroid Build Coastguard Worker        $ipvnum = "unix";
2261*6236dae4SAndroid Build Coastguard Worker    }
2262*6236dae4SAndroid Build Coastguard Worker
2263*6236dae4SAndroid Build Coastguard Worker    return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port_or_path, $do_http3);
2264*6236dae4SAndroid Build Coastguard Worker}
2265*6236dae4SAndroid Build Coastguard Worker
2266*6236dae4SAndroid Build Coastguard Worker#######################################################################
2267*6236dae4SAndroid Build Coastguard Worker# Single shot mqtt server responsiveness test. This should only
2268*6236dae4SAndroid Build Coastguard Worker# be used to verify that a server present in %run hash is still functional
2269*6236dae4SAndroid Build Coastguard Worker#
2270*6236dae4SAndroid Build Coastguard Workersub responsive_mqtt_server {
2271*6236dae4SAndroid Build Coastguard Worker    my ($proto, $id, $verb, $ipv6) = @_;
2272*6236dae4SAndroid Build Coastguard Worker    my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
2273*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
2274*6236dae4SAndroid Build Coastguard Worker    my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
2275*6236dae4SAndroid Build Coastguard Worker
2276*6236dae4SAndroid Build Coastguard Worker    return &responsiveserver($proto, $ipvnum, $idnum, $ip);
2277*6236dae4SAndroid Build Coastguard Worker}
2278*6236dae4SAndroid Build Coastguard Worker
2279*6236dae4SAndroid Build Coastguard Worker#######################################################################
2280*6236dae4SAndroid Build Coastguard Worker# Single shot pingpong server responsiveness test. This should only be
2281*6236dae4SAndroid Build Coastguard Worker# used to verify that a server present in %run hash is still functional
2282*6236dae4SAndroid Build Coastguard Worker#
2283*6236dae4SAndroid Build Coastguard Workersub responsive_pingpong_server {
2284*6236dae4SAndroid Build Coastguard Worker    my ($proto, $id, $verb, $ipv6) = @_;
2285*6236dae4SAndroid Build Coastguard Worker    my $port;
2286*6236dae4SAndroid Build Coastguard Worker    my $ip = ($ipv6 && ($ipv6 =~ /6$/)) ? "$HOST6IP" : "$HOSTIP";
2287*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
2288*6236dae4SAndroid Build Coastguard Worker    my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
2289*6236dae4SAndroid Build Coastguard Worker    my $protoip = $proto . ($ipvnum == 6? '6': '');
2290*6236dae4SAndroid Build Coastguard Worker
2291*6236dae4SAndroid Build Coastguard Worker    if($proto =~ /^(?:ftp|imap|pop3|smtp)$/) {
2292*6236dae4SAndroid Build Coastguard Worker        $port = protoport($protoip);
2293*6236dae4SAndroid Build Coastguard Worker    }
2294*6236dae4SAndroid Build Coastguard Worker    else {
2295*6236dae4SAndroid Build Coastguard Worker        logmsg "Unsupported protocol $proto!!\n";
2296*6236dae4SAndroid Build Coastguard Worker        return 0;
2297*6236dae4SAndroid Build Coastguard Worker    }
2298*6236dae4SAndroid Build Coastguard Worker
2299*6236dae4SAndroid Build Coastguard Worker    return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port);
2300*6236dae4SAndroid Build Coastguard Worker}
2301*6236dae4SAndroid Build Coastguard Worker
2302*6236dae4SAndroid Build Coastguard Worker#######################################################################
2303*6236dae4SAndroid Build Coastguard Worker# Single shot rtsp server responsiveness test. This should only be
2304*6236dae4SAndroid Build Coastguard Worker# used to verify that a server present in %run hash is still functional
2305*6236dae4SAndroid Build Coastguard Worker#
2306*6236dae4SAndroid Build Coastguard Workersub responsive_rtsp_server {
2307*6236dae4SAndroid Build Coastguard Worker    my ($verb, $ipv6) = @_;
2308*6236dae4SAndroid Build Coastguard Worker    my $proto = 'rtsp';
2309*6236dae4SAndroid Build Coastguard Worker    my $port = protoport($proto);
2310*6236dae4SAndroid Build Coastguard Worker    my $ip = $HOSTIP;
2311*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
2312*6236dae4SAndroid Build Coastguard Worker    my $idnum = 1;
2313*6236dae4SAndroid Build Coastguard Worker
2314*6236dae4SAndroid Build Coastguard Worker    if($ipv6) {
2315*6236dae4SAndroid Build Coastguard Worker        # if IPv6, use a different setup
2316*6236dae4SAndroid Build Coastguard Worker        $ipvnum = 6;
2317*6236dae4SAndroid Build Coastguard Worker        $port = protoport('rtsp6');
2318*6236dae4SAndroid Build Coastguard Worker        $ip = $HOST6IP;
2319*6236dae4SAndroid Build Coastguard Worker    }
2320*6236dae4SAndroid Build Coastguard Worker
2321*6236dae4SAndroid Build Coastguard Worker    return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port);
2322*6236dae4SAndroid Build Coastguard Worker}
2323*6236dae4SAndroid Build Coastguard Worker
2324*6236dae4SAndroid Build Coastguard Worker#######################################################################
2325*6236dae4SAndroid Build Coastguard Worker# Single shot tftp server responsiveness test. This should only be
2326*6236dae4SAndroid Build Coastguard Worker# used to verify that a server present in %run hash is still functional
2327*6236dae4SAndroid Build Coastguard Worker#
2328*6236dae4SAndroid Build Coastguard Workersub responsive_tftp_server {
2329*6236dae4SAndroid Build Coastguard Worker    my ($id, $verb, $ipv6) = @_;
2330*6236dae4SAndroid Build Coastguard Worker    my $proto = 'tftp';
2331*6236dae4SAndroid Build Coastguard Worker    my $port = protoport($proto);
2332*6236dae4SAndroid Build Coastguard Worker    my $ip = $HOSTIP;
2333*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = 4;
2334*6236dae4SAndroid Build Coastguard Worker    my $idnum = ($id && ($id =~ /^(\d+)$/) && ($id > 1)) ? $id : 1;
2335*6236dae4SAndroid Build Coastguard Worker
2336*6236dae4SAndroid Build Coastguard Worker    if($ipv6) {
2337*6236dae4SAndroid Build Coastguard Worker        # if IPv6, use a different setup
2338*6236dae4SAndroid Build Coastguard Worker        $ipvnum = 6;
2339*6236dae4SAndroid Build Coastguard Worker        $port = protoport('tftp6');
2340*6236dae4SAndroid Build Coastguard Worker        $ip = $HOST6IP;
2341*6236dae4SAndroid Build Coastguard Worker    }
2342*6236dae4SAndroid Build Coastguard Worker
2343*6236dae4SAndroid Build Coastguard Worker    return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port);
2344*6236dae4SAndroid Build Coastguard Worker}
2345*6236dae4SAndroid Build Coastguard Worker
2346*6236dae4SAndroid Build Coastguard Worker#######################################################################
2347*6236dae4SAndroid Build Coastguard Worker# Single shot non-stunnel HTTP TLS extensions capable server
2348*6236dae4SAndroid Build Coastguard Worker# responsiveness test. This should only be used to verify that a
2349*6236dae4SAndroid Build Coastguard Worker# server present in %run hash is still functional
2350*6236dae4SAndroid Build Coastguard Worker#
2351*6236dae4SAndroid Build Coastguard Workersub responsive_httptls_server {
2352*6236dae4SAndroid Build Coastguard Worker    my ($verb, $ipv6) = @_;
2353*6236dae4SAndroid Build Coastguard Worker    my $ipvnum = ($ipv6 && ($ipv6 =~ /6$/)) ? 6 : 4;
2354*6236dae4SAndroid Build Coastguard Worker    my $proto = "httptls";
2355*6236dae4SAndroid Build Coastguard Worker    my $port = protoport($proto);
2356*6236dae4SAndroid Build Coastguard Worker    my $ip = "$HOSTIP";
2357*6236dae4SAndroid Build Coastguard Worker    my $idnum = 1;
2358*6236dae4SAndroid Build Coastguard Worker
2359*6236dae4SAndroid Build Coastguard Worker    if ($ipvnum == 6) {
2360*6236dae4SAndroid Build Coastguard Worker        $port = protoport("httptls6");
2361*6236dae4SAndroid Build Coastguard Worker        $ip = "$HOST6IP";
2362*6236dae4SAndroid Build Coastguard Worker    }
2363*6236dae4SAndroid Build Coastguard Worker
2364*6236dae4SAndroid Build Coastguard Worker    return &responsiveserver($proto, $ipvnum, $idnum, $ip, $port);
2365*6236dae4SAndroid Build Coastguard Worker}
2366*6236dae4SAndroid Build Coastguard Worker
2367*6236dae4SAndroid Build Coastguard Worker#######################################################################
2368*6236dae4SAndroid Build Coastguard Worker# startservers() starts all the named servers
2369*6236dae4SAndroid Build Coastguard Worker#
2370*6236dae4SAndroid Build Coastguard Worker# Returns: string with error reason or blank for success, and an integer:
2371*6236dae4SAndroid Build Coastguard Worker#          0 for success
2372*6236dae4SAndroid Build Coastguard Worker#          1 for an error starting the server
2373*6236dae4SAndroid Build Coastguard Worker#          2 for not the first time getting an error starting the server
2374*6236dae4SAndroid Build Coastguard Worker#          3 for a failure to stop a server in order to restart it
2375*6236dae4SAndroid Build Coastguard Worker#          4 for an unsupported server type
2376*6236dae4SAndroid Build Coastguard Worker#
2377*6236dae4SAndroid Build Coastguard Workersub startservers {
2378*6236dae4SAndroid Build Coastguard Worker    my @what = @_;
2379*6236dae4SAndroid Build Coastguard Worker    my ($pid, $pid2);
2380*6236dae4SAndroid Build Coastguard Worker    my $serr;  # error while starting a server (as of the return enumerations)
2381*6236dae4SAndroid Build Coastguard Worker    for(@what) {
2382*6236dae4SAndroid Build Coastguard Worker        my (@whatlist) = split(/\s+/,$_);
2383*6236dae4SAndroid Build Coastguard Worker        my $what = lc($whatlist[0]);
2384*6236dae4SAndroid Build Coastguard Worker        $what =~ s/[^a-z0-9\/-]//g;
2385*6236dae4SAndroid Build Coastguard Worker
2386*6236dae4SAndroid Build Coastguard Worker        my $certfile;
2387*6236dae4SAndroid Build Coastguard Worker        if($what =~ /^(ftp|gopher|http|imap|pop3|smtp)s((\d*)(-ipv6|-unix|))$/) {
2388*6236dae4SAndroid Build Coastguard Worker            $certfile = ($whatlist[1]) ? $whatlist[1] : 'stunnel.pem';
2389*6236dae4SAndroid Build Coastguard Worker        }
2390*6236dae4SAndroid Build Coastguard Worker
2391*6236dae4SAndroid Build Coastguard Worker        if(($what eq "pop3") ||
2392*6236dae4SAndroid Build Coastguard Worker           ($what eq "ftp") ||
2393*6236dae4SAndroid Build Coastguard Worker           ($what eq "imap") ||
2394*6236dae4SAndroid Build Coastguard Worker           ($what eq "smtp")) {
2395*6236dae4SAndroid Build Coastguard Worker            if($run{$what} &&
2396*6236dae4SAndroid Build Coastguard Worker               !responsive_pingpong_server($what, "", $verbose)) {
2397*6236dae4SAndroid Build Coastguard Worker                if(stopserver($what)) {
2398*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive ".uc($what)." server", 3);
2399*6236dae4SAndroid Build Coastguard Worker                }
2400*6236dae4SAndroid Build Coastguard Worker            }
2401*6236dae4SAndroid Build Coastguard Worker            if(!$run{$what}) {
2402*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2) = runpingpongserver($what, "", $verbose);
2403*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2404*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting ". uc($what) ." server", $serr);
2405*6236dae4SAndroid Build Coastguard Worker                }
2406*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid $what => %d %d\n", $pid, $pid2) if($verbose);
2407*6236dae4SAndroid Build Coastguard Worker                $run{$what}="$pid $pid2";
2408*6236dae4SAndroid Build Coastguard Worker            }
2409*6236dae4SAndroid Build Coastguard Worker        }
2410*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "ftp-ipv6") {
2411*6236dae4SAndroid Build Coastguard Worker            if($run{'ftp-ipv6'} &&
2412*6236dae4SAndroid Build Coastguard Worker               !responsive_pingpong_server("ftp", "", $verbose, "ipv6")) {
2413*6236dae4SAndroid Build Coastguard Worker                if(stopserver('ftp-ipv6')) {
2414*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive FTP-IPv6 server", 3);
2415*6236dae4SAndroid Build Coastguard Worker                }
2416*6236dae4SAndroid Build Coastguard Worker            }
2417*6236dae4SAndroid Build Coastguard Worker            if(!$run{'ftp-ipv6'}) {
2418*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2) = runpingpongserver("ftp", "", $verbose, "ipv6");
2419*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2420*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting FTP-IPv6 server", $serr);
2421*6236dae4SAndroid Build Coastguard Worker                }
2422*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid ftp-ipv6 => %d %d\n", $pid,
2423*6236dae4SAndroid Build Coastguard Worker                       $pid2) if($verbose);
2424*6236dae4SAndroid Build Coastguard Worker                $run{'ftp-ipv6'}="$pid $pid2";
2425*6236dae4SAndroid Build Coastguard Worker            }
2426*6236dae4SAndroid Build Coastguard Worker        }
2427*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "gopher") {
2428*6236dae4SAndroid Build Coastguard Worker            if($run{'gopher'} &&
2429*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("gopher", $verbose, 0,
2430*6236dae4SAndroid Build Coastguard Worker                                       protoport("gopher"))) {
2431*6236dae4SAndroid Build Coastguard Worker                if(stopserver('gopher')) {
2432*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive GOPHER server", 3);
2433*6236dae4SAndroid Build Coastguard Worker                }
2434*6236dae4SAndroid Build Coastguard Worker            }
2435*6236dae4SAndroid Build Coastguard Worker            if(!$run{'gopher'}) {
2436*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'gopher'}) =
2437*6236dae4SAndroid Build Coastguard Worker                    runhttpserver("gopher", $verbose, 0);
2438*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2439*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting GOPHER server", $serr);
2440*6236dae4SAndroid Build Coastguard Worker                }
2441*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf ("* pid gopher => %d %d\n", $pid, $pid2)
2442*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2443*6236dae4SAndroid Build Coastguard Worker                $run{'gopher'}="$pid $pid2";
2444*6236dae4SAndroid Build Coastguard Worker            }
2445*6236dae4SAndroid Build Coastguard Worker        }
2446*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "gopher-ipv6") {
2447*6236dae4SAndroid Build Coastguard Worker            if($run{'gopher-ipv6'} &&
2448*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("gopher", $verbose, "ipv6",
2449*6236dae4SAndroid Build Coastguard Worker                                       protoport("gopher"))) {
2450*6236dae4SAndroid Build Coastguard Worker                if(stopserver('gopher-ipv6')) {
2451*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive GOPHER-IPv6 server", 3);
2452*6236dae4SAndroid Build Coastguard Worker                }
2453*6236dae4SAndroid Build Coastguard Worker            }
2454*6236dae4SAndroid Build Coastguard Worker            if(!$run{'gopher-ipv6'}) {
2455*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"gopher6"}) =
2456*6236dae4SAndroid Build Coastguard Worker                    runhttpserver("gopher", $verbose, "ipv6");
2457*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2458*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting GOPHER-IPv6 server", $serr);
2459*6236dae4SAndroid Build Coastguard Worker                }
2460*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid gopher-ipv6 => %d %d\n", $pid,
2461*6236dae4SAndroid Build Coastguard Worker                               $pid2) if($verbose);
2462*6236dae4SAndroid Build Coastguard Worker                $run{'gopher-ipv6'}="$pid $pid2";
2463*6236dae4SAndroid Build Coastguard Worker            }
2464*6236dae4SAndroid Build Coastguard Worker        }
2465*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "http") {
2466*6236dae4SAndroid Build Coastguard Worker            if($run{'http'} &&
2467*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("http", $verbose, 0, protoport('http'))) {
2468*6236dae4SAndroid Build Coastguard Worker                logmsg "* restarting unresponsive HTTP server\n";
2469*6236dae4SAndroid Build Coastguard Worker                if(stopserver('http')) {
2470*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTP server", 3);
2471*6236dae4SAndroid Build Coastguard Worker                }
2472*6236dae4SAndroid Build Coastguard Worker            }
2473*6236dae4SAndroid Build Coastguard Worker            if(!$run{'http'}) {
2474*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'http'}) =
2475*6236dae4SAndroid Build Coastguard Worker                    runhttpserver("http", $verbose, 0);
2476*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2477*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTP server", $serr);
2478*6236dae4SAndroid Build Coastguard Worker                }
2479*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf ("* pid http => %d %d\n", $pid, $pid2)
2480*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2481*6236dae4SAndroid Build Coastguard Worker                $run{'http'}="$pid $pid2";
2482*6236dae4SAndroid Build Coastguard Worker            }
2483*6236dae4SAndroid Build Coastguard Worker        }
2484*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "http-proxy") {
2485*6236dae4SAndroid Build Coastguard Worker            if($run{'http-proxy'} &&
2486*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("http", $verbose, "proxy",
2487*6236dae4SAndroid Build Coastguard Worker                                       protoport("httpproxy"))) {
2488*6236dae4SAndroid Build Coastguard Worker                if(stopserver('http-proxy')) {
2489*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTP-proxy server", 3);
2490*6236dae4SAndroid Build Coastguard Worker                }
2491*6236dae4SAndroid Build Coastguard Worker            }
2492*6236dae4SAndroid Build Coastguard Worker            if(!$run{'http-proxy'}) {
2493*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"httpproxy"}) =
2494*6236dae4SAndroid Build Coastguard Worker                    runhttpserver("http", $verbose, "proxy");
2495*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2496*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTP-proxy server", $serr);
2497*6236dae4SAndroid Build Coastguard Worker                }
2498*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf ("* pid http-proxy => %d %d\n", $pid, $pid2)
2499*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2500*6236dae4SAndroid Build Coastguard Worker                $run{'http-proxy'}="$pid $pid2";
2501*6236dae4SAndroid Build Coastguard Worker            }
2502*6236dae4SAndroid Build Coastguard Worker        }
2503*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "http-ipv6") {
2504*6236dae4SAndroid Build Coastguard Worker            if($run{'http-ipv6'} &&
2505*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("http", $verbose, "ipv6",
2506*6236dae4SAndroid Build Coastguard Worker                                       protoport("http6"))) {
2507*6236dae4SAndroid Build Coastguard Worker                if(stopserver('http-ipv6')) {
2508*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTP-IPv6 server", 3);
2509*6236dae4SAndroid Build Coastguard Worker                }
2510*6236dae4SAndroid Build Coastguard Worker            }
2511*6236dae4SAndroid Build Coastguard Worker            if(!$run{'http-ipv6'}) {
2512*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"http6"}) =
2513*6236dae4SAndroid Build Coastguard Worker                    runhttpserver("http", $verbose, "ipv6");
2514*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2515*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTP-IPv6 server", $serr);
2516*6236dae4SAndroid Build Coastguard Worker                }
2517*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid http-ipv6 => %d %d\n", $pid, $pid2)
2518*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2519*6236dae4SAndroid Build Coastguard Worker                $run{'http-ipv6'}="$pid $pid2";
2520*6236dae4SAndroid Build Coastguard Worker            }
2521*6236dae4SAndroid Build Coastguard Worker        }
2522*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "rtsp") {
2523*6236dae4SAndroid Build Coastguard Worker            if($run{'rtsp'} &&
2524*6236dae4SAndroid Build Coastguard Worker               !responsive_rtsp_server($verbose)) {
2525*6236dae4SAndroid Build Coastguard Worker                if(stopserver('rtsp')) {
2526*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive RTSP server", 3);
2527*6236dae4SAndroid Build Coastguard Worker                }
2528*6236dae4SAndroid Build Coastguard Worker            }
2529*6236dae4SAndroid Build Coastguard Worker            if(!$run{'rtsp'}) {
2530*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'rtsp'}) = runrtspserver($verbose);
2531*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2532*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting RTSP server", $serr);
2533*6236dae4SAndroid Build Coastguard Worker                }
2534*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid rtsp => %d %d\n", $pid, $pid2) if($verbose);
2535*6236dae4SAndroid Build Coastguard Worker                $run{'rtsp'}="$pid $pid2";
2536*6236dae4SAndroid Build Coastguard Worker            }
2537*6236dae4SAndroid Build Coastguard Worker        }
2538*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "rtsp-ipv6") {
2539*6236dae4SAndroid Build Coastguard Worker            if($run{'rtsp-ipv6'} &&
2540*6236dae4SAndroid Build Coastguard Worker               !responsive_rtsp_server($verbose, "ipv6")) {
2541*6236dae4SAndroid Build Coastguard Worker                if(stopserver('rtsp-ipv6')) {
2542*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive RTSP-IPv6 server", 3);
2543*6236dae4SAndroid Build Coastguard Worker                }
2544*6236dae4SAndroid Build Coastguard Worker            }
2545*6236dae4SAndroid Build Coastguard Worker            if(!$run{'rtsp-ipv6'}) {
2546*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'rtsp6'}) = runrtspserver($verbose, "ipv6");
2547*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2548*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting RTSP-IPv6 server", $serr);
2549*6236dae4SAndroid Build Coastguard Worker                }
2550*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid rtsp-ipv6 => %d %d\n", $pid, $pid2)
2551*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2552*6236dae4SAndroid Build Coastguard Worker                $run{'rtsp-ipv6'}="$pid $pid2";
2553*6236dae4SAndroid Build Coastguard Worker            }
2554*6236dae4SAndroid Build Coastguard Worker        }
2555*6236dae4SAndroid Build Coastguard Worker        elsif($what =~ /^(ftp|imap|pop3|smtp)s$/) {
2556*6236dae4SAndroid Build Coastguard Worker            my $cproto = $1;
2557*6236dae4SAndroid Build Coastguard Worker            if(!$stunnel) {
2558*6236dae4SAndroid Build Coastguard Worker                # we can't run ftps tests without stunnel
2559*6236dae4SAndroid Build Coastguard Worker                return ("no stunnel", 4);
2560*6236dae4SAndroid Build Coastguard Worker            }
2561*6236dae4SAndroid Build Coastguard Worker            if($runcert{$what} && ($runcert{$what} ne $certfile)) {
2562*6236dae4SAndroid Build Coastguard Worker                # stop server when running and using a different cert
2563*6236dae4SAndroid Build Coastguard Worker                if(stopserver($what)) {
2564*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping $what server with different cert", 3);
2565*6236dae4SAndroid Build Coastguard Worker                }
2566*6236dae4SAndroid Build Coastguard Worker            }
2567*6236dae4SAndroid Build Coastguard Worker            if($run{$cproto} &&
2568*6236dae4SAndroid Build Coastguard Worker               !responsive_pingpong_server($cproto, "", $verbose)) {
2569*6236dae4SAndroid Build Coastguard Worker                if(stopserver($cproto)) {
2570*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive $cproto server", 3);
2571*6236dae4SAndroid Build Coastguard Worker                }
2572*6236dae4SAndroid Build Coastguard Worker            }
2573*6236dae4SAndroid Build Coastguard Worker            if(!$run{$cproto}) {
2574*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2) = runpingpongserver($cproto, "", $verbose);
2575*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2576*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting $cproto server", $serr);
2577*6236dae4SAndroid Build Coastguard Worker                }
2578*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid $cproto => %d %d\n", $pid, $pid2) if($verbose);
2579*6236dae4SAndroid Build Coastguard Worker                $run{$cproto}="$pid $pid2";
2580*6236dae4SAndroid Build Coastguard Worker            }
2581*6236dae4SAndroid Build Coastguard Worker            if(!$run{$what}) {
2582*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{$what}) =
2583*6236dae4SAndroid Build Coastguard Worker                    runsecureserver($verbose, "", $certfile, $what,
2584*6236dae4SAndroid Build Coastguard Worker                                    protoport($cproto));
2585*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2586*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting $what server (stunnel)", $serr);
2587*6236dae4SAndroid Build Coastguard Worker                }
2588*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid $what => %d %d\n", $pid, $pid2)
2589*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2590*6236dae4SAndroid Build Coastguard Worker                $run{$what}="$pid $pid2";
2591*6236dae4SAndroid Build Coastguard Worker            }
2592*6236dae4SAndroid Build Coastguard Worker        }
2593*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "file") {
2594*6236dae4SAndroid Build Coastguard Worker            # we support it but have no server!
2595*6236dae4SAndroid Build Coastguard Worker        }
2596*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "https") {
2597*6236dae4SAndroid Build Coastguard Worker            if(!$stunnel) {
2598*6236dae4SAndroid Build Coastguard Worker                # we can't run https tests without stunnel
2599*6236dae4SAndroid Build Coastguard Worker                return ("no stunnel", 4);
2600*6236dae4SAndroid Build Coastguard Worker            }
2601*6236dae4SAndroid Build Coastguard Worker            if($runcert{'https'} && ($runcert{'https'} ne $certfile)) {
2602*6236dae4SAndroid Build Coastguard Worker                # stop server when running and using a different cert
2603*6236dae4SAndroid Build Coastguard Worker                if(stopserver('https')) {
2604*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping HTTPS server with different cert", 3);
2605*6236dae4SAndroid Build Coastguard Worker                }
2606*6236dae4SAndroid Build Coastguard Worker                # also stop http server, we do not know which state it is in
2607*6236dae4SAndroid Build Coastguard Worker                if($run{'http'} && stopserver('http')) {
2608*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping HTTP server", 3);
2609*6236dae4SAndroid Build Coastguard Worker                }
2610*6236dae4SAndroid Build Coastguard Worker            }
2611*6236dae4SAndroid Build Coastguard Worker            if($run{'https'} &&
2612*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("https", $verbose, 0,
2613*6236dae4SAndroid Build Coastguard Worker                                       protoport('https'))) {
2614*6236dae4SAndroid Build Coastguard Worker                if(stopserver('https')) {
2615*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTPS server", 3);
2616*6236dae4SAndroid Build Coastguard Worker                }
2617*6236dae4SAndroid Build Coastguard Worker                # also stop http server, we do not know which state it is in
2618*6236dae4SAndroid Build Coastguard Worker                if($run{'http'} && stopserver('http')) {
2619*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTP server", 3);
2620*6236dae4SAndroid Build Coastguard Worker                }
2621*6236dae4SAndroid Build Coastguard Worker            }
2622*6236dae4SAndroid Build Coastguard Worker            # check a running http server if we not already checked https
2623*6236dae4SAndroid Build Coastguard Worker            if($run{'http'} && !$run{'https'} &&
2624*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("http", $verbose, 0,
2625*6236dae4SAndroid Build Coastguard Worker                                       protoport('http'))) {
2626*6236dae4SAndroid Build Coastguard Worker                if(stopserver('http')) {
2627*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTP server", 3);
2628*6236dae4SAndroid Build Coastguard Worker                }
2629*6236dae4SAndroid Build Coastguard Worker            }
2630*6236dae4SAndroid Build Coastguard Worker            if(!$run{'http'}) {
2631*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'http'}) =
2632*6236dae4SAndroid Build Coastguard Worker                    runhttpserver("http", $verbose, 0);
2633*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2634*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTP server", $serr);
2635*6236dae4SAndroid Build Coastguard Worker                }
2636*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid http => %d %d\n", $pid, $pid2) if($verbose);
2637*6236dae4SAndroid Build Coastguard Worker                $run{'http'}="$pid $pid2";
2638*6236dae4SAndroid Build Coastguard Worker            }
2639*6236dae4SAndroid Build Coastguard Worker            if(!$run{'https'}) {
2640*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'https'}) =
2641*6236dae4SAndroid Build Coastguard Worker                    runhttpsserver($verbose, "https", "", $certfile);
2642*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2643*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTPS server (stunnel)", $serr);
2644*6236dae4SAndroid Build Coastguard Worker                }
2645*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid https => %d %d\n", $pid, $pid2)
2646*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2647*6236dae4SAndroid Build Coastguard Worker                $run{'https'}="$pid $pid2";
2648*6236dae4SAndroid Build Coastguard Worker            }
2649*6236dae4SAndroid Build Coastguard Worker        }
2650*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "http/2") {
2651*6236dae4SAndroid Build Coastguard Worker            # http/2 server proxies to a http server
2652*6236dae4SAndroid Build Coastguard Worker            if($run{'http/2'} &&
2653*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("https", $verbose, 0, protoport('http2tls'))) {
2654*6236dae4SAndroid Build Coastguard Worker                logmsg "* restarting unresponsive HTTP/2 server\n";
2655*6236dae4SAndroid Build Coastguard Worker                if(stopserver('http/2')) {
2656*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTP/2 server", 3);
2657*6236dae4SAndroid Build Coastguard Worker                }
2658*6236dae4SAndroid Build Coastguard Worker                # also stop http server, we do not know which state it is in
2659*6236dae4SAndroid Build Coastguard Worker                if($run{'http'} && stopserver('http')) {
2660*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping HTTP server", 3);
2661*6236dae4SAndroid Build Coastguard Worker                }
2662*6236dae4SAndroid Build Coastguard Worker            }
2663*6236dae4SAndroid Build Coastguard Worker            # check a running http server if we not already checked http/2
2664*6236dae4SAndroid Build Coastguard Worker            if($run{'http'} && !$run{'http/2'} &&
2665*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("http", $verbose, 0,
2666*6236dae4SAndroid Build Coastguard Worker                                       protoport('http'))) {
2667*6236dae4SAndroid Build Coastguard Worker                if(stopserver('http')) {
2668*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTP server", 3);
2669*6236dae4SAndroid Build Coastguard Worker                }
2670*6236dae4SAndroid Build Coastguard Worker            }
2671*6236dae4SAndroid Build Coastguard Worker            if(!$run{'http'}) {
2672*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'http'}) =
2673*6236dae4SAndroid Build Coastguard Worker                    runhttpserver("http", $verbose, 0);
2674*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2675*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTP server", $serr);
2676*6236dae4SAndroid Build Coastguard Worker                }
2677*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid http => %d %d\n", $pid, $pid2) if($verbose);
2678*6236dae4SAndroid Build Coastguard Worker                $run{'http'}="$pid $pid2";
2679*6236dae4SAndroid Build Coastguard Worker            }
2680*6236dae4SAndroid Build Coastguard Worker            if(!$run{'http/2'}) {
2681*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"http2"}, $PORT{"http2tls"}) =
2682*6236dae4SAndroid Build Coastguard Worker                    runhttp2server($verbose);
2683*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2684*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTP/2 server", $serr);
2685*6236dae4SAndroid Build Coastguard Worker                }
2686*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf ("* pid http/2 => %d %d\n", $pid, $pid2)
2687*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2688*6236dae4SAndroid Build Coastguard Worker                $run{'http/2'}="$pid $pid2";
2689*6236dae4SAndroid Build Coastguard Worker            }
2690*6236dae4SAndroid Build Coastguard Worker        }
2691*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "http/3") {
2692*6236dae4SAndroid Build Coastguard Worker            # http/3 server proxies to a http server
2693*6236dae4SAndroid Build Coastguard Worker            if($run{'http/3'} &&
2694*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("https", $verbose, 0, protoport('http3'), 1)) {
2695*6236dae4SAndroid Build Coastguard Worker                logmsg "* restarting unresponsive HTTP/3 server\n";
2696*6236dae4SAndroid Build Coastguard Worker                if(stopserver('http/3')) {
2697*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTP/3 server", 3);
2698*6236dae4SAndroid Build Coastguard Worker                }
2699*6236dae4SAndroid Build Coastguard Worker                # also stop http server, we do not know which state it is in
2700*6236dae4SAndroid Build Coastguard Worker                if($run{'http'} && stopserver('http')) {
2701*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping HTTP server", 3);
2702*6236dae4SAndroid Build Coastguard Worker                }
2703*6236dae4SAndroid Build Coastguard Worker            }
2704*6236dae4SAndroid Build Coastguard Worker            # check a running http server if we not already checked http/3
2705*6236dae4SAndroid Build Coastguard Worker            if($run{'http'} && !$run{'http/3'} &&
2706*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("http", $verbose, 0,
2707*6236dae4SAndroid Build Coastguard Worker                                       protoport('http'))) {
2708*6236dae4SAndroid Build Coastguard Worker                if(stopserver('http')) {
2709*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTP server", 3);
2710*6236dae4SAndroid Build Coastguard Worker                }
2711*6236dae4SAndroid Build Coastguard Worker            }
2712*6236dae4SAndroid Build Coastguard Worker            if(!$run{'http'}) {
2713*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'http'}) =
2714*6236dae4SAndroid Build Coastguard Worker                    runhttpserver("http", $verbose, 0);
2715*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2716*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTP server", $serr);
2717*6236dae4SAndroid Build Coastguard Worker                }
2718*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid http => %d %d\n", $pid, $pid2) if($verbose);
2719*6236dae4SAndroid Build Coastguard Worker                $run{'http'}="$pid $pid2";
2720*6236dae4SAndroid Build Coastguard Worker            }
2721*6236dae4SAndroid Build Coastguard Worker            if(!$run{'http/3'}) {
2722*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"http3"}) = runhttp3server($verbose);
2723*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2724*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTP/3 server", $serr);
2725*6236dae4SAndroid Build Coastguard Worker                }
2726*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf ("* pid http/3 => %d %d\n", $pid, $pid2)
2727*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2728*6236dae4SAndroid Build Coastguard Worker                $run{'http/3'}="$pid $pid2";
2729*6236dae4SAndroid Build Coastguard Worker            }
2730*6236dae4SAndroid Build Coastguard Worker        }
2731*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "gophers") {
2732*6236dae4SAndroid Build Coastguard Worker            if(!$stunnel) {
2733*6236dae4SAndroid Build Coastguard Worker                # we can't run TLS tests without stunnel
2734*6236dae4SAndroid Build Coastguard Worker                return ("no stunnel", 4);
2735*6236dae4SAndroid Build Coastguard Worker            }
2736*6236dae4SAndroid Build Coastguard Worker            if($runcert{'gophers'} && ($runcert{'gophers'} ne $certfile)) {
2737*6236dae4SAndroid Build Coastguard Worker                # stop server when running and using a different cert
2738*6236dae4SAndroid Build Coastguard Worker                if(stopserver('gophers')) {
2739*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping GOPHERS server with different cert", 3);
2740*6236dae4SAndroid Build Coastguard Worker                }
2741*6236dae4SAndroid Build Coastguard Worker            }
2742*6236dae4SAndroid Build Coastguard Worker            if($run{'gopher'} &&
2743*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("gopher", $verbose, 0,
2744*6236dae4SAndroid Build Coastguard Worker                                       protoport('gopher'))) {
2745*6236dae4SAndroid Build Coastguard Worker                if(stopserver('gopher')) {
2746*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive GOPHER server", 3);
2747*6236dae4SAndroid Build Coastguard Worker                }
2748*6236dae4SAndroid Build Coastguard Worker            }
2749*6236dae4SAndroid Build Coastguard Worker            if(!$run{'gopher'}) {
2750*6236dae4SAndroid Build Coastguard Worker                my $port;
2751*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $port) =
2752*6236dae4SAndroid Build Coastguard Worker                    runhttpserver("gopher", $verbose, 0);
2753*6236dae4SAndroid Build Coastguard Worker                $PORT{'gopher'} = $port;
2754*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2755*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting GOPHER server", $serr);
2756*6236dae4SAndroid Build Coastguard Worker                }
2757*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid gopher => %d %d\n", $pid, $pid2) if($verbose);
2758*6236dae4SAndroid Build Coastguard Worker                logmsg "GOPHERPORT => $port\n" if($verbose);
2759*6236dae4SAndroid Build Coastguard Worker                $run{'gopher'}="$pid $pid2";
2760*6236dae4SAndroid Build Coastguard Worker            }
2761*6236dae4SAndroid Build Coastguard Worker            if(!$run{'gophers'}) {
2762*6236dae4SAndroid Build Coastguard Worker                my $port;
2763*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $port) =
2764*6236dae4SAndroid Build Coastguard Worker                    runhttpsserver($verbose, "gophers", "", $certfile);
2765*6236dae4SAndroid Build Coastguard Worker                $PORT{'gophers'} = $port;
2766*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2767*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting GOPHERS server (stunnel)", $serr);
2768*6236dae4SAndroid Build Coastguard Worker                }
2769*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid gophers => %d %d\n", $pid, $pid2)
2770*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2771*6236dae4SAndroid Build Coastguard Worker                logmsg "GOPHERSPORT => $port\n" if($verbose);
2772*6236dae4SAndroid Build Coastguard Worker                $run{'gophers'}="$pid $pid2";
2773*6236dae4SAndroid Build Coastguard Worker            }
2774*6236dae4SAndroid Build Coastguard Worker        }
2775*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "https-proxy") {
2776*6236dae4SAndroid Build Coastguard Worker            if(!$stunnel) {
2777*6236dae4SAndroid Build Coastguard Worker                # we can't run https-proxy tests without stunnel
2778*6236dae4SAndroid Build Coastguard Worker                return ("no stunnel", 4);
2779*6236dae4SAndroid Build Coastguard Worker            }
2780*6236dae4SAndroid Build Coastguard Worker            if($runcert{'https-proxy'} &&
2781*6236dae4SAndroid Build Coastguard Worker               ($runcert{'https-proxy'} ne $certfile)) {
2782*6236dae4SAndroid Build Coastguard Worker                # stop server when running and using a different cert
2783*6236dae4SAndroid Build Coastguard Worker                if(stopserver('https-proxy')) {
2784*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping HTTPS-proxy with different cert", 3);
2785*6236dae4SAndroid Build Coastguard Worker                }
2786*6236dae4SAndroid Build Coastguard Worker            }
2787*6236dae4SAndroid Build Coastguard Worker
2788*6236dae4SAndroid Build Coastguard Worker            # we front the http-proxy with stunnel so we need to make sure the
2789*6236dae4SAndroid Build Coastguard Worker            # proxy runs as well
2790*6236dae4SAndroid Build Coastguard Worker            my ($f, $e) = startservers("http-proxy");
2791*6236dae4SAndroid Build Coastguard Worker            if($f) {
2792*6236dae4SAndroid Build Coastguard Worker                return ($f, $e);
2793*6236dae4SAndroid Build Coastguard Worker            }
2794*6236dae4SAndroid Build Coastguard Worker
2795*6236dae4SAndroid Build Coastguard Worker            if(!$run{'https-proxy'}) {
2796*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"httpsproxy"}) =
2797*6236dae4SAndroid Build Coastguard Worker                    runhttpsserver($verbose, "https", "proxy", $certfile);
2798*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2799*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTPS-proxy (stunnel)", $serr);
2800*6236dae4SAndroid Build Coastguard Worker                }
2801*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid https-proxy => %d %d\n", $pid, $pid2)
2802*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2803*6236dae4SAndroid Build Coastguard Worker                $run{'https-proxy'}="$pid $pid2";
2804*6236dae4SAndroid Build Coastguard Worker            }
2805*6236dae4SAndroid Build Coastguard Worker        }
2806*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "httptls") {
2807*6236dae4SAndroid Build Coastguard Worker            if(!$httptlssrv) {
2808*6236dae4SAndroid Build Coastguard Worker                # for now, we can't run http TLS-EXT tests without gnutls-serv
2809*6236dae4SAndroid Build Coastguard Worker                return ("no gnutls-serv (with SRP support)", 4);
2810*6236dae4SAndroid Build Coastguard Worker            }
2811*6236dae4SAndroid Build Coastguard Worker            if($run{'httptls'} &&
2812*6236dae4SAndroid Build Coastguard Worker               !responsive_httptls_server($verbose, "IPv4")) {
2813*6236dae4SAndroid Build Coastguard Worker                if(stopserver('httptls')) {
2814*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTPTLS server", 3);
2815*6236dae4SAndroid Build Coastguard Worker                }
2816*6236dae4SAndroid Build Coastguard Worker            }
2817*6236dae4SAndroid Build Coastguard Worker            if(!$run{'httptls'}) {
2818*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'httptls'}) =
2819*6236dae4SAndroid Build Coastguard Worker                    runhttptlsserver($verbose, "IPv4");
2820*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2821*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTPTLS server (gnutls-serv)", $serr);
2822*6236dae4SAndroid Build Coastguard Worker                }
2823*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid httptls => %d %d\n", $pid, $pid2)
2824*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2825*6236dae4SAndroid Build Coastguard Worker                $run{'httptls'}="$pid $pid2";
2826*6236dae4SAndroid Build Coastguard Worker            }
2827*6236dae4SAndroid Build Coastguard Worker        }
2828*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "httptls-ipv6") {
2829*6236dae4SAndroid Build Coastguard Worker            if(!$httptlssrv) {
2830*6236dae4SAndroid Build Coastguard Worker                # for now, we can't run http TLS-EXT tests without gnutls-serv
2831*6236dae4SAndroid Build Coastguard Worker                return ("no gnutls-serv", 4);
2832*6236dae4SAndroid Build Coastguard Worker            }
2833*6236dae4SAndroid Build Coastguard Worker            if($run{'httptls-ipv6'} &&
2834*6236dae4SAndroid Build Coastguard Worker               !responsive_httptls_server($verbose, "ipv6")) {
2835*6236dae4SAndroid Build Coastguard Worker                if(stopserver('httptls-ipv6')) {
2836*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTPTLS-IPv6 server", 3);
2837*6236dae4SAndroid Build Coastguard Worker                }
2838*6236dae4SAndroid Build Coastguard Worker            }
2839*6236dae4SAndroid Build Coastguard Worker            if(!$run{'httptls-ipv6'}) {
2840*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"httptls6"}) =
2841*6236dae4SAndroid Build Coastguard Worker                    runhttptlsserver($verbose, "ipv6");
2842*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2843*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTPTLS-IPv6 server (gnutls-serv)", $serr);
2844*6236dae4SAndroid Build Coastguard Worker                }
2845*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid httptls-ipv6 => %d %d\n", $pid, $pid2)
2846*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2847*6236dae4SAndroid Build Coastguard Worker                $run{'httptls-ipv6'}="$pid $pid2";
2848*6236dae4SAndroid Build Coastguard Worker            }
2849*6236dae4SAndroid Build Coastguard Worker        }
2850*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "tftp") {
2851*6236dae4SAndroid Build Coastguard Worker            if($run{'tftp'} &&
2852*6236dae4SAndroid Build Coastguard Worker               !responsive_tftp_server("", $verbose)) {
2853*6236dae4SAndroid Build Coastguard Worker                if(stopserver('tftp')) {
2854*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive TFTP server", 3);
2855*6236dae4SAndroid Build Coastguard Worker                }
2856*6236dae4SAndroid Build Coastguard Worker            }
2857*6236dae4SAndroid Build Coastguard Worker            if(!$run{'tftp'}) {
2858*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'tftp'}) =
2859*6236dae4SAndroid Build Coastguard Worker                    runtftpserver("", $verbose);
2860*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2861*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting TFTP server", $serr);
2862*6236dae4SAndroid Build Coastguard Worker                }
2863*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid tftp => %d %d\n", $pid, $pid2) if($verbose);
2864*6236dae4SAndroid Build Coastguard Worker                $run{'tftp'}="$pid $pid2";
2865*6236dae4SAndroid Build Coastguard Worker            }
2866*6236dae4SAndroid Build Coastguard Worker        }
2867*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "tftp-ipv6") {
2868*6236dae4SAndroid Build Coastguard Worker            if($run{'tftp-ipv6'} &&
2869*6236dae4SAndroid Build Coastguard Worker               !responsive_tftp_server("", $verbose, "ipv6")) {
2870*6236dae4SAndroid Build Coastguard Worker                if(stopserver('tftp-ipv6')) {
2871*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive TFTP-IPv6 server", 3);
2872*6236dae4SAndroid Build Coastguard Worker                }
2873*6236dae4SAndroid Build Coastguard Worker            }
2874*6236dae4SAndroid Build Coastguard Worker            if(!$run{'tftp-ipv6'}) {
2875*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'tftp6'}) =
2876*6236dae4SAndroid Build Coastguard Worker                    runtftpserver("", $verbose, "ipv6");
2877*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2878*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting TFTP-IPv6 server", $serr);
2879*6236dae4SAndroid Build Coastguard Worker                }
2880*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid tftp-ipv6 => %d %d\n", $pid, $pid2) if($verbose);
2881*6236dae4SAndroid Build Coastguard Worker                $run{'tftp-ipv6'}="$pid $pid2";
2882*6236dae4SAndroid Build Coastguard Worker            }
2883*6236dae4SAndroid Build Coastguard Worker        }
2884*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "sftp" || $what eq "scp") {
2885*6236dae4SAndroid Build Coastguard Worker            if(!$run{'ssh'}) {
2886*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{'ssh'}) = runsshserver("", $verbose);
2887*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2888*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting SSH server", $serr);
2889*6236dae4SAndroid Build Coastguard Worker                }
2890*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid ssh => %d %d\n", $pid, $pid2) if($verbose);
2891*6236dae4SAndroid Build Coastguard Worker                $run{'ssh'}="$pid $pid2";
2892*6236dae4SAndroid Build Coastguard Worker            }
2893*6236dae4SAndroid Build Coastguard Worker        }
2894*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "socks4" || $what eq "socks5" ) {
2895*6236dae4SAndroid Build Coastguard Worker            if(!$run{'socks'}) {
2896*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"socks"}) = runsocksserver("", $verbose);
2897*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2898*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting socks server", $serr);
2899*6236dae4SAndroid Build Coastguard Worker                }
2900*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid socks => %d %d\n", $pid, $pid2) if($verbose);
2901*6236dae4SAndroid Build Coastguard Worker                $run{'socks'}="$pid $pid2";
2902*6236dae4SAndroid Build Coastguard Worker            }
2903*6236dae4SAndroid Build Coastguard Worker        }
2904*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "socks5unix") {
2905*6236dae4SAndroid Build Coastguard Worker            if(!$run{'socks5unix'}) {
2906*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2) = runsocksserver("2", $verbose, "", "unix");
2907*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2908*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting socks5unix server", $serr);
2909*6236dae4SAndroid Build Coastguard Worker                }
2910*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid socks5unix => %d %d\n", $pid, $pid2) if($verbose);
2911*6236dae4SAndroid Build Coastguard Worker                $run{'socks5unix'}="$pid $pid2";
2912*6236dae4SAndroid Build Coastguard Worker            }
2913*6236dae4SAndroid Build Coastguard Worker        }
2914*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "mqtt" ) {
2915*6236dae4SAndroid Build Coastguard Worker            if($run{'mqtt'} &&
2916*6236dae4SAndroid Build Coastguard Worker               !responsive_mqtt_server("mqtt", "", $verbose)) {
2917*6236dae4SAndroid Build Coastguard Worker                if(stopserver('mqtt')) {
2918*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive MQTT server", 3);
2919*6236dae4SAndroid Build Coastguard Worker                }
2920*6236dae4SAndroid Build Coastguard Worker            }
2921*6236dae4SAndroid Build Coastguard Worker            if(!$run{'mqtt'}) {
2922*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"mqtt"}) = runmqttserver("", $verbose);
2923*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2924*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting mqtt server", $serr);
2925*6236dae4SAndroid Build Coastguard Worker                }
2926*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid mqtt => %d %d\n", $pid, $pid2) if($verbose);
2927*6236dae4SAndroid Build Coastguard Worker                $run{'mqtt'}="$pid $pid2";
2928*6236dae4SAndroid Build Coastguard Worker            }
2929*6236dae4SAndroid Build Coastguard Worker        }
2930*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "http-unix") {
2931*6236dae4SAndroid Build Coastguard Worker            if($run{'http-unix'} &&
2932*6236dae4SAndroid Build Coastguard Worker               !responsive_http_server("http", $verbose, "unix", $HTTPUNIXPATH)) {
2933*6236dae4SAndroid Build Coastguard Worker                if(stopserver('http-unix')) {
2934*6236dae4SAndroid Build Coastguard Worker                    return ("failed stopping unresponsive HTTP-unix server", 3);
2935*6236dae4SAndroid Build Coastguard Worker                }
2936*6236dae4SAndroid Build Coastguard Worker            }
2937*6236dae4SAndroid Build Coastguard Worker            if(!$run{'http-unix'}) {
2938*6236dae4SAndroid Build Coastguard Worker                my $unused;
2939*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $unused) =
2940*6236dae4SAndroid Build Coastguard Worker                    runhttpserver("http", $verbose, "unix", $HTTPUNIXPATH);
2941*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2942*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting HTTP-unix server", $serr);
2943*6236dae4SAndroid Build Coastguard Worker                }
2944*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf("* pid http-unix => %d %d\n", $pid, $pid2)
2945*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2946*6236dae4SAndroid Build Coastguard Worker                $run{'http-unix'}="$pid $pid2";
2947*6236dae4SAndroid Build Coastguard Worker            }
2948*6236dae4SAndroid Build Coastguard Worker        }
2949*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "dict") {
2950*6236dae4SAndroid Build Coastguard Worker            if(!$run{'dict'}) {
2951*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"dict"}) = rundictserver($verbose, "");
2952*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2953*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting DICT server", $serr);
2954*6236dae4SAndroid Build Coastguard Worker                }
2955*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf ("* pid DICT => %d %d\n", $pid, $pid2)
2956*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2957*6236dae4SAndroid Build Coastguard Worker                $run{'dict'}="$pid $pid2";
2958*6236dae4SAndroid Build Coastguard Worker            }
2959*6236dae4SAndroid Build Coastguard Worker        }
2960*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "smb") {
2961*6236dae4SAndroid Build Coastguard Worker            if(!$run{'smb'}) {
2962*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"smb"}) = runsmbserver($verbose, "");
2963*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2964*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting SMB server", $serr);
2965*6236dae4SAndroid Build Coastguard Worker                }
2966*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf ("* pid SMB => %d %d\n", $pid, $pid2)
2967*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2968*6236dae4SAndroid Build Coastguard Worker                $run{'smb'}="$pid $pid2";
2969*6236dae4SAndroid Build Coastguard Worker            }
2970*6236dae4SAndroid Build Coastguard Worker        }
2971*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "telnet") {
2972*6236dae4SAndroid Build Coastguard Worker            if(!$run{'telnet'}) {
2973*6236dae4SAndroid Build Coastguard Worker                ($serr, $pid, $pid2, $PORT{"telnet"}) =
2974*6236dae4SAndroid Build Coastguard Worker                    runnegtelnetserver($verbose, "");
2975*6236dae4SAndroid Build Coastguard Worker                if($pid <= 0) {
2976*6236dae4SAndroid Build Coastguard Worker                    return ("failed starting neg TELNET server", $serr);
2977*6236dae4SAndroid Build Coastguard Worker                }
2978*6236dae4SAndroid Build Coastguard Worker                logmsg sprintf ("* pid neg TELNET => %d %d\n", $pid, $pid2)
2979*6236dae4SAndroid Build Coastguard Worker                    if($verbose);
2980*6236dae4SAndroid Build Coastguard Worker                $run{'telnet'}="$pid $pid2";
2981*6236dae4SAndroid Build Coastguard Worker            }
2982*6236dae4SAndroid Build Coastguard Worker        }
2983*6236dae4SAndroid Build Coastguard Worker        elsif($what eq "none") {
2984*6236dae4SAndroid Build Coastguard Worker            logmsg "* starts no server\n" if ($verbose);
2985*6236dae4SAndroid Build Coastguard Worker        }
2986*6236dae4SAndroid Build Coastguard Worker        else {
2987*6236dae4SAndroid Build Coastguard Worker            warn "we don't support a server for $what";
2988*6236dae4SAndroid Build Coastguard Worker            return ("no server for $what", 4);
2989*6236dae4SAndroid Build Coastguard Worker        }
2990*6236dae4SAndroid Build Coastguard Worker    }
2991*6236dae4SAndroid Build Coastguard Worker    return ("", 0);
2992*6236dae4SAndroid Build Coastguard Worker}
2993*6236dae4SAndroid Build Coastguard Worker
2994*6236dae4SAndroid Build Coastguard Worker#######################################################################
2995*6236dae4SAndroid Build Coastguard Worker# Stop all running test servers
2996*6236dae4SAndroid Build Coastguard Worker#
2997*6236dae4SAndroid Build Coastguard Workersub stopservers {
2998*6236dae4SAndroid Build Coastguard Worker    my $verb = $_[0];
2999*6236dae4SAndroid Build Coastguard Worker    #
3000*6236dae4SAndroid Build Coastguard Worker    # kill sockfilter processes for all pingpong servers
3001*6236dae4SAndroid Build Coastguard Worker    #
3002*6236dae4SAndroid Build Coastguard Worker    killallsockfilters("$LOGDIR/$PIDDIR", $verb);
3003*6236dae4SAndroid Build Coastguard Worker    #
3004*6236dae4SAndroid Build Coastguard Worker    # kill all server pids from %run hash clearing them
3005*6236dae4SAndroid Build Coastguard Worker    #
3006*6236dae4SAndroid Build Coastguard Worker    my $pidlist;
3007*6236dae4SAndroid Build Coastguard Worker    foreach my $server (keys %run) {
3008*6236dae4SAndroid Build Coastguard Worker        if($run{$server}) {
3009*6236dae4SAndroid Build Coastguard Worker            if($verb) {
3010*6236dae4SAndroid Build Coastguard Worker                my $prev = 0;
3011*6236dae4SAndroid Build Coastguard Worker                my $pids = $run{$server};
3012*6236dae4SAndroid Build Coastguard Worker                foreach my $pid (split(' ', $pids)) {
3013*6236dae4SAndroid Build Coastguard Worker                    if($pid != $prev) {
3014*6236dae4SAndroid Build Coastguard Worker                        logmsg sprintf("* kill pid for %s => %d\n",
3015*6236dae4SAndroid Build Coastguard Worker                            $server, $pid);
3016*6236dae4SAndroid Build Coastguard Worker                        $prev = $pid;
3017*6236dae4SAndroid Build Coastguard Worker                    }
3018*6236dae4SAndroid Build Coastguard Worker                }
3019*6236dae4SAndroid Build Coastguard Worker            }
3020*6236dae4SAndroid Build Coastguard Worker            $pidlist .= "$run{$server} ";
3021*6236dae4SAndroid Build Coastguard Worker            $run{$server} = 0;
3022*6236dae4SAndroid Build Coastguard Worker        }
3023*6236dae4SAndroid Build Coastguard Worker        $runcert{$server} = 0 if($runcert{$server});
3024*6236dae4SAndroid Build Coastguard Worker    }
3025*6236dae4SAndroid Build Coastguard Worker    killpid($verb, $pidlist);
3026*6236dae4SAndroid Build Coastguard Worker    #
3027*6236dae4SAndroid Build Coastguard Worker    # cleanup all server pid files
3028*6236dae4SAndroid Build Coastguard Worker    #
3029*6236dae4SAndroid Build Coastguard Worker    my $result = 0;
3030*6236dae4SAndroid Build Coastguard Worker    foreach my $server (keys %serverpidfile) {
3031*6236dae4SAndroid Build Coastguard Worker        my $pidfile = $serverpidfile{$server};
3032*6236dae4SAndroid Build Coastguard Worker        my $pid = processexists($pidfile);
3033*6236dae4SAndroid Build Coastguard Worker        if($pid > 0) {
3034*6236dae4SAndroid Build Coastguard Worker            if($err_unexpected) {
3035*6236dae4SAndroid Build Coastguard Worker                logmsg "ERROR: ";
3036*6236dae4SAndroid Build Coastguard Worker                $result = -1;
3037*6236dae4SAndroid Build Coastguard Worker            }
3038*6236dae4SAndroid Build Coastguard Worker            else {
3039*6236dae4SAndroid Build Coastguard Worker                logmsg "Warning: ";
3040*6236dae4SAndroid Build Coastguard Worker            }
3041*6236dae4SAndroid Build Coastguard Worker            logmsg "$server server unexpectedly alive\n";
3042*6236dae4SAndroid Build Coastguard Worker            killpid($verb, $pid);
3043*6236dae4SAndroid Build Coastguard Worker        }
3044*6236dae4SAndroid Build Coastguard Worker        unlink($pidfile) if(-f $pidfile);
3045*6236dae4SAndroid Build Coastguard Worker    }
3046*6236dae4SAndroid Build Coastguard Worker
3047*6236dae4SAndroid Build Coastguard Worker    return $result;
3048*6236dae4SAndroid Build Coastguard Worker}
3049*6236dae4SAndroid Build Coastguard Worker
3050*6236dae4SAndroid Build Coastguard Worker
3051*6236dae4SAndroid Build Coastguard Worker#######################################################################
3052*6236dae4SAndroid Build Coastguard Worker# substitute the variable stuff into either a joined up file or
3053*6236dae4SAndroid Build Coastguard Worker# a command, in either case passed by reference
3054*6236dae4SAndroid Build Coastguard Worker#
3055*6236dae4SAndroid Build Coastguard Workersub subvariables {
3056*6236dae4SAndroid Build Coastguard Worker    my ($thing, $testnum, $prefix) = @_;
3057*6236dae4SAndroid Build Coastguard Worker    my $port;
3058*6236dae4SAndroid Build Coastguard Worker
3059*6236dae4SAndroid Build Coastguard Worker    if(!$prefix) {
3060*6236dae4SAndroid Build Coastguard Worker        $prefix = "%";
3061*6236dae4SAndroid Build Coastguard Worker    }
3062*6236dae4SAndroid Build Coastguard Worker
3063*6236dae4SAndroid Build Coastguard Worker    # test server ports
3064*6236dae4SAndroid Build Coastguard Worker    # Substitutes variables like %HTTPPORT and %SMTP6PORT with the server ports
3065*6236dae4SAndroid Build Coastguard Worker    foreach my $proto ('DICT',
3066*6236dae4SAndroid Build Coastguard Worker                       'FTP', 'FTP6', 'FTPS',
3067*6236dae4SAndroid Build Coastguard Worker                       'GOPHER', 'GOPHER6', 'GOPHERS',
3068*6236dae4SAndroid Build Coastguard Worker                       'HTTP', 'HTTP6', 'HTTPS',
3069*6236dae4SAndroid Build Coastguard Worker                       'HTTPSPROXY', 'HTTPTLS', 'HTTPTLS6',
3070*6236dae4SAndroid Build Coastguard Worker                       'HTTP2', 'HTTP2TLS',
3071*6236dae4SAndroid Build Coastguard Worker                       'HTTP3',
3072*6236dae4SAndroid Build Coastguard Worker                       'IMAP', 'IMAP6', 'IMAPS',
3073*6236dae4SAndroid Build Coastguard Worker                       'MQTT',
3074*6236dae4SAndroid Build Coastguard Worker                       'NOLISTEN',
3075*6236dae4SAndroid Build Coastguard Worker                       'POP3', 'POP36', 'POP3S',
3076*6236dae4SAndroid Build Coastguard Worker                       'RTSP', 'RTSP6',
3077*6236dae4SAndroid Build Coastguard Worker                       'SMB', 'SMBS',
3078*6236dae4SAndroid Build Coastguard Worker                       'SMTP', 'SMTP6', 'SMTPS',
3079*6236dae4SAndroid Build Coastguard Worker                       'SOCKS',
3080*6236dae4SAndroid Build Coastguard Worker                       'SSH',
3081*6236dae4SAndroid Build Coastguard Worker                       'TELNET',
3082*6236dae4SAndroid Build Coastguard Worker                       'TFTP', 'TFTP6') {
3083*6236dae4SAndroid Build Coastguard Worker        $port = protoport(lc $proto);
3084*6236dae4SAndroid Build Coastguard Worker        $$thing =~ s/${prefix}(?:$proto)PORT/$port/g;
3085*6236dae4SAndroid Build Coastguard Worker    }
3086*6236dae4SAndroid Build Coastguard Worker    # Special case: for PROXYPORT substitution, use httpproxy.
3087*6236dae4SAndroid Build Coastguard Worker    $port = protoport('httpproxy');
3088*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}PROXYPORT/$port/g;
3089*6236dae4SAndroid Build Coastguard Worker
3090*6236dae4SAndroid Build Coastguard Worker    # server Unix domain socket paths
3091*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}HTTPUNIXPATH/$HTTPUNIXPATH/g;
3092*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}SOCKSUNIXPATH/$SOCKSUNIXPATH/g;
3093*6236dae4SAndroid Build Coastguard Worker
3094*6236dae4SAndroid Build Coastguard Worker    # client IP addresses
3095*6236dae4SAndroid Build Coastguard Worker    my $nb = $CLIENT6IP;
3096*6236dae4SAndroid Build Coastguard Worker    $nb =~ s/^\[(.*)\]/$1/; # trim off the brackets
3097*6236dae4SAndroid Build Coastguard Worker
3098*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}CLIENT6IP-NB/$nb/g;
3099*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}CLIENT6IP/$CLIENT6IP/g;
3100*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}CLIENTIP/$CLIENTIP/g;
3101*6236dae4SAndroid Build Coastguard Worker
3102*6236dae4SAndroid Build Coastguard Worker    # server IP addresses
3103*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}HOST6IP/$HOST6IP/g;
3104*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}HOSTIP/$HOSTIP/g;
3105*6236dae4SAndroid Build Coastguard Worker
3106*6236dae4SAndroid Build Coastguard Worker    # misc
3107*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}PERL/$perlcmd/g;
3108*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}CURL/$CURL/g;
3109*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}LOGDIR/$LOGDIR/g;
3110*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}PWD/$pwd/g;
3111*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}POSIX_PWD/$posix_pwd/g;
3112*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}VERSION/$CURLVERSION/g;
3113*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}VERNUM/$CURLVERNUM/g;
3114*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}DATE/$DATE/g;
3115*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}TESTNUMBER/$testnum/g;
3116*6236dae4SAndroid Build Coastguard Worker
3117*6236dae4SAndroid Build Coastguard Worker    # POSIX/MSYS/Cygwin curl needs: file://localhost/d/path/to
3118*6236dae4SAndroid Build Coastguard Worker    # Windows native    curl needs: file://localhost/D:/path/to
3119*6236dae4SAndroid Build Coastguard Worker    my $file_pwd = $pwd;
3120*6236dae4SAndroid Build Coastguard Worker    if($file_pwd !~ /^\//) {
3121*6236dae4SAndroid Build Coastguard Worker        $file_pwd = "/$file_pwd";
3122*6236dae4SAndroid Build Coastguard Worker    }
3123*6236dae4SAndroid Build Coastguard Worker    my $ssh_pwd = $posix_pwd;
3124*6236dae4SAndroid Build Coastguard Worker    # this only works after the SSH server has been started
3125*6236dae4SAndroid Build Coastguard Worker    # TODO: call sshversioninfo early and store $sshdid so this substitution
3126*6236dae4SAndroid Build Coastguard Worker    # always works
3127*6236dae4SAndroid Build Coastguard Worker    if ($sshdid && $sshdid =~ /OpenSSH-Windows/) {
3128*6236dae4SAndroid Build Coastguard Worker        $ssh_pwd = $file_pwd;
3129*6236dae4SAndroid Build Coastguard Worker    }
3130*6236dae4SAndroid Build Coastguard Worker
3131*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}FILE_PWD/$file_pwd/g;
3132*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}SSH_PWD/$ssh_pwd/g;
3133*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}SRCDIR/$srcdir/g;
3134*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}USER/$USER/g;
3135*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}DEV_NULL/$dev_null/g;
3136*6236dae4SAndroid Build Coastguard Worker
3137*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}SSHSRVMD5/$SSHSRVMD5/g;
3138*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}SSHSRVSHA256/$SSHSRVSHA256/g;
3139*6236dae4SAndroid Build Coastguard Worker
3140*6236dae4SAndroid Build Coastguard Worker    # The purpose of FTPTIME2 is to provide times that can be
3141*6236dae4SAndroid Build Coastguard Worker    # used for time-out tests and that would work on most hosts as these
3142*6236dae4SAndroid Build Coastguard Worker    # adjust for the startup/check time for this particular host. We needed to
3143*6236dae4SAndroid Build Coastguard Worker    # do this to make the test suite run better on very slow hosts.
3144*6236dae4SAndroid Build Coastguard Worker    my $ftp2 = $ftpchecktime * 8;
3145*6236dae4SAndroid Build Coastguard Worker
3146*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}FTPTIME2/$ftp2/g;
3147*6236dae4SAndroid Build Coastguard Worker
3148*6236dae4SAndroid Build Coastguard Worker    # HTTP2
3149*6236dae4SAndroid Build Coastguard Worker    $$thing =~ s/${prefix}H2CVER/$h2cver/g;
3150*6236dae4SAndroid Build Coastguard Worker}
3151*6236dae4SAndroid Build Coastguard Worker
3152*6236dae4SAndroid Build Coastguard Workersub localhttp {
3153*6236dae4SAndroid Build Coastguard Worker    return $HOSTIP eq "127.0.0.1";
3154*6236dae4SAndroid Build Coastguard Worker}
3155*6236dae4SAndroid Build Coastguard Worker
3156*6236dae4SAndroid Build Coastguard Worker1;
3157