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