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 perl module contains functions useful in writing test servers. 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard Workerpackage serverhelp; 28*6236dae4SAndroid Build Coastguard Worker 29*6236dae4SAndroid Build Coastguard Workeruse strict; 30*6236dae4SAndroid Build Coastguard Workeruse warnings; 31*6236dae4SAndroid Build Coastguard Worker 32*6236dae4SAndroid Build Coastguard WorkerBEGIN { 33*6236dae4SAndroid Build Coastguard Worker use base qw(Exporter); 34*6236dae4SAndroid Build Coastguard Worker 35*6236dae4SAndroid Build Coastguard Worker our @EXPORT_OK = qw( 36*6236dae4SAndroid Build Coastguard Worker logmsg 37*6236dae4SAndroid Build Coastguard Worker $logfile 38*6236dae4SAndroid Build Coastguard Worker serverfactors 39*6236dae4SAndroid Build Coastguard Worker servername_id 40*6236dae4SAndroid Build Coastguard Worker servername_str 41*6236dae4SAndroid Build Coastguard Worker servername_canon 42*6236dae4SAndroid Build Coastguard Worker server_pidfilename 43*6236dae4SAndroid Build Coastguard Worker server_portfilename 44*6236dae4SAndroid Build Coastguard Worker server_logfilename 45*6236dae4SAndroid Build Coastguard Worker server_cmdfilename 46*6236dae4SAndroid Build Coastguard Worker server_inputfilename 47*6236dae4SAndroid Build Coastguard Worker server_outputfilename 48*6236dae4SAndroid Build Coastguard Worker mainsockf_pidfilename 49*6236dae4SAndroid Build Coastguard Worker mainsockf_logfilename 50*6236dae4SAndroid Build Coastguard Worker datasockf_pidfilename 51*6236dae4SAndroid Build Coastguard Worker datasockf_logfilename 52*6236dae4SAndroid Build Coastguard Worker ); 53*6236dae4SAndroid Build Coastguard Worker 54*6236dae4SAndroid Build Coastguard Worker # sub second timestamping needs Time::HiRes 55*6236dae4SAndroid Build Coastguard Worker eval { 56*6236dae4SAndroid Build Coastguard Worker no warnings "all"; 57*6236dae4SAndroid Build Coastguard Worker require Time::HiRes; 58*6236dae4SAndroid Build Coastguard Worker import Time::HiRes qw( gettimeofday ); 59*6236dae4SAndroid Build Coastguard Worker } 60*6236dae4SAndroid Build Coastguard Worker} 61*6236dae4SAndroid Build Coastguard Worker 62*6236dae4SAndroid Build Coastguard Worker 63*6236dae4SAndroid Build Coastguard Workerour $logfile; # server log file name, for logmsg 64*6236dae4SAndroid Build Coastguard Worker 65*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 66*6236dae4SAndroid Build Coastguard Worker# Just for convenience, test harness uses 'https' and 'httptls' literals as 67*6236dae4SAndroid Build Coastguard Worker# values for 'proto' variable in order to differentiate different servers. 68*6236dae4SAndroid Build Coastguard Worker# 'https' literal is used for stunnel based https test servers, and 'httptls' 69*6236dae4SAndroid Build Coastguard Worker# is used for non-stunnel https test servers. 70*6236dae4SAndroid Build Coastguard Worker 71*6236dae4SAndroid Build Coastguard Worker#********************************************************************** 72*6236dae4SAndroid Build Coastguard Worker# logmsg is general message logging subroutine for our test servers. 73*6236dae4SAndroid Build Coastguard Worker# 74*6236dae4SAndroid Build Coastguard Workersub logmsg { 75*6236dae4SAndroid Build Coastguard Worker my $now; 76*6236dae4SAndroid Build Coastguard Worker # sub second timestamping needs Time::HiRes 77*6236dae4SAndroid Build Coastguard Worker if($Time::HiRes::VERSION) { 78*6236dae4SAndroid Build Coastguard Worker my ($seconds, $usec) = gettimeofday(); 79*6236dae4SAndroid Build Coastguard Worker my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = 80*6236dae4SAndroid Build Coastguard Worker localtime($seconds); 81*6236dae4SAndroid Build Coastguard Worker $now = sprintf("%02d:%02d:%02d.%06d ", $hour, $min, $sec, $usec); 82*6236dae4SAndroid Build Coastguard Worker } 83*6236dae4SAndroid Build Coastguard Worker else { 84*6236dae4SAndroid Build Coastguard Worker my $seconds = time(); 85*6236dae4SAndroid Build Coastguard Worker my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = 86*6236dae4SAndroid Build Coastguard Worker localtime($seconds); 87*6236dae4SAndroid Build Coastguard Worker $now = sprintf("%02d:%02d:%02d ", $hour, $min, $sec); 88*6236dae4SAndroid Build Coastguard Worker } 89*6236dae4SAndroid Build Coastguard Worker # we see warnings on Windows run that $logfile is used uninitialized 90*6236dae4SAndroid Build Coastguard Worker # TODO: not found yet where this comes from 91*6236dae4SAndroid Build Coastguard Worker $logfile = "serverhelp_uninitialized.log" if(!$logfile); 92*6236dae4SAndroid Build Coastguard Worker if(open(my $logfilefh, ">>", "$logfile")) { 93*6236dae4SAndroid Build Coastguard Worker print $logfilefh $now; 94*6236dae4SAndroid Build Coastguard Worker print $logfilefh @_; 95*6236dae4SAndroid Build Coastguard Worker close($logfilefh); 96*6236dae4SAndroid Build Coastguard Worker } 97*6236dae4SAndroid Build Coastguard Worker} 98*6236dae4SAndroid Build Coastguard Worker 99*6236dae4SAndroid Build Coastguard Worker 100*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 101*6236dae4SAndroid Build Coastguard Worker# Return server characterization factors given a server id string. 102*6236dae4SAndroid Build Coastguard Worker# 103*6236dae4SAndroid Build Coastguard Workersub serverfactors { 104*6236dae4SAndroid Build Coastguard Worker my $server = $_[0]; 105*6236dae4SAndroid Build Coastguard Worker my $proto; 106*6236dae4SAndroid Build Coastguard Worker my $ipvnum; 107*6236dae4SAndroid Build Coastguard Worker my $idnum; 108*6236dae4SAndroid Build Coastguard Worker 109*6236dae4SAndroid Build Coastguard Worker if($server =~ 110*6236dae4SAndroid Build Coastguard Worker /^((ftp|http|imap|pop3|smtp|http-pipe)s?)(\d*)(-ipv6|)$/) { 111*6236dae4SAndroid Build Coastguard Worker $proto = $1; 112*6236dae4SAndroid Build Coastguard Worker $idnum = ($3 && ($3 > 1)) ? $3 : 1; 113*6236dae4SAndroid Build Coastguard Worker $ipvnum = ($4 && ($4 =~ /6$/)) ? 6 : 4; 114*6236dae4SAndroid Build Coastguard Worker } 115*6236dae4SAndroid Build Coastguard Worker elsif($server =~ 116*6236dae4SAndroid Build Coastguard Worker /^(tftp|sftp|socks|ssh|rtsp|gopher|httptls)(\d*)(-ipv6|)$/) { 117*6236dae4SAndroid Build Coastguard Worker $proto = $1; 118*6236dae4SAndroid Build Coastguard Worker $idnum = ($2 && ($2 > 1)) ? $2 : 1; 119*6236dae4SAndroid Build Coastguard Worker $ipvnum = ($3 && ($3 =~ /6$/)) ? 6 : 4; 120*6236dae4SAndroid Build Coastguard Worker } 121*6236dae4SAndroid Build Coastguard Worker else { 122*6236dae4SAndroid Build Coastguard Worker die "invalid server id: '$server'" 123*6236dae4SAndroid Build Coastguard Worker } 124*6236dae4SAndroid Build Coastguard Worker return($proto, $ipvnum, $idnum); 125*6236dae4SAndroid Build Coastguard Worker} 126*6236dae4SAndroid Build Coastguard Worker 127*6236dae4SAndroid Build Coastguard Worker 128*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 129*6236dae4SAndroid Build Coastguard Worker# Return server name string formatted for presentation purposes 130*6236dae4SAndroid Build Coastguard Worker# 131*6236dae4SAndroid Build Coastguard Workersub servername_str { 132*6236dae4SAndroid Build Coastguard Worker my ($proto, $ipver, $idnum) = @_; 133*6236dae4SAndroid Build Coastguard Worker 134*6236dae4SAndroid Build Coastguard Worker $proto = uc($proto) if($proto); 135*6236dae4SAndroid Build Coastguard Worker die "unsupported protocol: '$proto'" unless($proto && 136*6236dae4SAndroid Build Coastguard Worker ($proto =~ /^(((FTP|HTTP|HTTP\/2|HTTP\/3|IMAP|POP3|GOPHER|SMTP|HTTP-PIPE)S?)|(TFTP|SFTP|SOCKS|SSH|RTSP|HTTPTLS|DICT|SMB|SMBS|TELNET|MQTT))$/)); 137*6236dae4SAndroid Build Coastguard Worker 138*6236dae4SAndroid Build Coastguard Worker $ipver = (not $ipver) ? 'ipv4' : lc($ipver); 139*6236dae4SAndroid Build Coastguard Worker die "unsupported IP version: '$ipver'" unless($ipver && 140*6236dae4SAndroid Build Coastguard Worker ($ipver =~ /^(4|6|ipv4|ipv6|-ipv4|-ipv6|unix)$/)); 141*6236dae4SAndroid Build Coastguard Worker $ipver = ($ipver =~ /6$/) ? '-IPv6' : (($ipver =~ /unix$/) ? '-unix' : ''); 142*6236dae4SAndroid Build Coastguard Worker 143*6236dae4SAndroid Build Coastguard Worker $idnum = 1 if(not $idnum); 144*6236dae4SAndroid Build Coastguard Worker die "unsupported ID number: '$idnum'" unless($idnum && 145*6236dae4SAndroid Build Coastguard Worker ($idnum =~ /^(\d+)$/)); 146*6236dae4SAndroid Build Coastguard Worker $idnum = '' if($idnum <= 1); 147*6236dae4SAndroid Build Coastguard Worker 148*6236dae4SAndroid Build Coastguard Worker return "${proto}${idnum}${ipver}"; 149*6236dae4SAndroid Build Coastguard Worker} 150*6236dae4SAndroid Build Coastguard Worker 151*6236dae4SAndroid Build Coastguard Worker 152*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 153*6236dae4SAndroid Build Coastguard Worker# Return server name string formatted for identification purposes 154*6236dae4SAndroid Build Coastguard Worker# 155*6236dae4SAndroid Build Coastguard Workersub servername_id { 156*6236dae4SAndroid Build Coastguard Worker my ($proto, $ipver, $idnum) = @_; 157*6236dae4SAndroid Build Coastguard Worker return lc(servername_str($proto, $ipver, $idnum)); 158*6236dae4SAndroid Build Coastguard Worker} 159*6236dae4SAndroid Build Coastguard Worker 160*6236dae4SAndroid Build Coastguard Worker 161*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 162*6236dae4SAndroid Build Coastguard Worker# Return server name string formatted for file name purposes 163*6236dae4SAndroid Build Coastguard Worker# 164*6236dae4SAndroid Build Coastguard Workersub servername_canon { 165*6236dae4SAndroid Build Coastguard Worker my ($proto, $ipver, $idnum) = @_; 166*6236dae4SAndroid Build Coastguard Worker my $string = lc(servername_str($proto, $ipver, $idnum)); 167*6236dae4SAndroid Build Coastguard Worker $string =~ tr/-/_/; 168*6236dae4SAndroid Build Coastguard Worker $string =~ s/\//_v/; 169*6236dae4SAndroid Build Coastguard Worker return $string; 170*6236dae4SAndroid Build Coastguard Worker} 171*6236dae4SAndroid Build Coastguard Worker 172*6236dae4SAndroid Build Coastguard Worker 173*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 174*6236dae4SAndroid Build Coastguard Worker# Return file name for server pid file. 175*6236dae4SAndroid Build Coastguard Worker# 176*6236dae4SAndroid Build Coastguard Workersub server_pidfilename { 177*6236dae4SAndroid Build Coastguard Worker my ($piddir, $proto, $ipver, $idnum) = @_; 178*6236dae4SAndroid Build Coastguard Worker my $trailer = '_server.pid'; 179*6236dae4SAndroid Build Coastguard Worker return "${piddir}/". servername_canon($proto, $ipver, $idnum) ."$trailer"; 180*6236dae4SAndroid Build Coastguard Worker} 181*6236dae4SAndroid Build Coastguard Worker 182*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 183*6236dae4SAndroid Build Coastguard Worker# Return file name for server port file. 184*6236dae4SAndroid Build Coastguard Worker# 185*6236dae4SAndroid Build Coastguard Workersub server_portfilename { 186*6236dae4SAndroid Build Coastguard Worker my ($piddir, $proto, $ipver, $idnum) = @_; 187*6236dae4SAndroid Build Coastguard Worker my $trailer = '_server.port'; 188*6236dae4SAndroid Build Coastguard Worker return "${piddir}/". servername_canon($proto, $ipver, $idnum) ."$trailer"; 189*6236dae4SAndroid Build Coastguard Worker} 190*6236dae4SAndroid Build Coastguard Worker 191*6236dae4SAndroid Build Coastguard Worker 192*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 193*6236dae4SAndroid Build Coastguard Worker# Return file name for server log file. 194*6236dae4SAndroid Build Coastguard Worker# 195*6236dae4SAndroid Build Coastguard Workersub server_logfilename { 196*6236dae4SAndroid Build Coastguard Worker my ($logdir, $proto, $ipver, $idnum) = @_; 197*6236dae4SAndroid Build Coastguard Worker my $trailer = '_server.log'; 198*6236dae4SAndroid Build Coastguard Worker $trailer = '_stunnel.log' if(lc($proto) =~ /^(ftp|http|imap|pop3|smtp)s$/); 199*6236dae4SAndroid Build Coastguard Worker return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer"; 200*6236dae4SAndroid Build Coastguard Worker} 201*6236dae4SAndroid Build Coastguard Worker 202*6236dae4SAndroid Build Coastguard Worker 203*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 204*6236dae4SAndroid Build Coastguard Worker# Return file name for server commands file. 205*6236dae4SAndroid Build Coastguard Worker# 206*6236dae4SAndroid Build Coastguard Workersub server_cmdfilename { 207*6236dae4SAndroid Build Coastguard Worker my ($logdir, $proto, $ipver, $idnum) = @_; 208*6236dae4SAndroid Build Coastguard Worker my $trailer = '_server.cmd'; 209*6236dae4SAndroid Build Coastguard Worker return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer"; 210*6236dae4SAndroid Build Coastguard Worker} 211*6236dae4SAndroid Build Coastguard Worker 212*6236dae4SAndroid Build Coastguard Worker 213*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 214*6236dae4SAndroid Build Coastguard Worker# Return file name for server input file. 215*6236dae4SAndroid Build Coastguard Worker# 216*6236dae4SAndroid Build Coastguard Workersub server_inputfilename { 217*6236dae4SAndroid Build Coastguard Worker my ($logdir, $proto, $ipver, $idnum) = @_; 218*6236dae4SAndroid Build Coastguard Worker my $trailer = '_server.input'; 219*6236dae4SAndroid Build Coastguard Worker return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer"; 220*6236dae4SAndroid Build Coastguard Worker} 221*6236dae4SAndroid Build Coastguard Worker 222*6236dae4SAndroid Build Coastguard Worker 223*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 224*6236dae4SAndroid Build Coastguard Worker# Return file name for server output file. 225*6236dae4SAndroid Build Coastguard Worker# 226*6236dae4SAndroid Build Coastguard Workersub server_outputfilename { 227*6236dae4SAndroid Build Coastguard Worker my ($logdir, $proto, $ipver, $idnum) = @_; 228*6236dae4SAndroid Build Coastguard Worker my $trailer = '_server.output'; 229*6236dae4SAndroid Build Coastguard Worker return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer"; 230*6236dae4SAndroid Build Coastguard Worker} 231*6236dae4SAndroid Build Coastguard Worker 232*6236dae4SAndroid Build Coastguard Worker 233*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 234*6236dae4SAndroid Build Coastguard Worker# Return file name for main or primary sockfilter pid file. 235*6236dae4SAndroid Build Coastguard Worker# 236*6236dae4SAndroid Build Coastguard Workersub mainsockf_pidfilename { 237*6236dae4SAndroid Build Coastguard Worker my ($piddir, $proto, $ipver, $idnum) = @_; 238*6236dae4SAndroid Build Coastguard Worker die "unsupported protocol: '$proto'" unless($proto && 239*6236dae4SAndroid Build Coastguard Worker (lc($proto) =~ /^(ftp|imap|pop3|smtp)s?$/)); 240*6236dae4SAndroid Build Coastguard Worker my $trailer = (lc($proto) =~ /^ftps?$/) ? '_sockctrl.pid':'_sockfilt.pid'; 241*6236dae4SAndroid Build Coastguard Worker return "${piddir}/". servername_canon($proto, $ipver, $idnum) ."$trailer"; 242*6236dae4SAndroid Build Coastguard Worker} 243*6236dae4SAndroid Build Coastguard Worker 244*6236dae4SAndroid Build Coastguard Worker 245*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 246*6236dae4SAndroid Build Coastguard Worker# Return file name for main or primary sockfilter log file. 247*6236dae4SAndroid Build Coastguard Worker# 248*6236dae4SAndroid Build Coastguard Workersub mainsockf_logfilename { 249*6236dae4SAndroid Build Coastguard Worker my ($logdir, $proto, $ipver, $idnum) = @_; 250*6236dae4SAndroid Build Coastguard Worker die "unsupported protocol: '$proto'" unless($proto && 251*6236dae4SAndroid Build Coastguard Worker (lc($proto) =~ /^(ftp|imap|pop3|smtp)s?$/)); 252*6236dae4SAndroid Build Coastguard Worker my $trailer = (lc($proto) =~ /^ftps?$/) ? '_sockctrl.log':'_sockfilt.log'; 253*6236dae4SAndroid Build Coastguard Worker return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer"; 254*6236dae4SAndroid Build Coastguard Worker} 255*6236dae4SAndroid Build Coastguard Worker 256*6236dae4SAndroid Build Coastguard Worker 257*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 258*6236dae4SAndroid Build Coastguard Worker# Return file name for data or secondary sockfilter pid file. 259*6236dae4SAndroid Build Coastguard Worker# 260*6236dae4SAndroid Build Coastguard Workersub datasockf_pidfilename { 261*6236dae4SAndroid Build Coastguard Worker my ($piddir, $proto, $ipver, $idnum) = @_; 262*6236dae4SAndroid Build Coastguard Worker die "unsupported protocol: '$proto'" unless($proto && 263*6236dae4SAndroid Build Coastguard Worker (lc($proto) =~ /^ftps?$/)); 264*6236dae4SAndroid Build Coastguard Worker my $trailer = '_sockdata.pid'; 265*6236dae4SAndroid Build Coastguard Worker return "${piddir}/". servername_canon($proto, $ipver, $idnum) ."$trailer"; 266*6236dae4SAndroid Build Coastguard Worker} 267*6236dae4SAndroid Build Coastguard Worker 268*6236dae4SAndroid Build Coastguard Worker 269*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 270*6236dae4SAndroid Build Coastguard Worker# Return file name for data or secondary sockfilter log file. 271*6236dae4SAndroid Build Coastguard Worker# 272*6236dae4SAndroid Build Coastguard Workersub datasockf_logfilename { 273*6236dae4SAndroid Build Coastguard Worker my ($logdir, $proto, $ipver, $idnum) = @_; 274*6236dae4SAndroid Build Coastguard Worker die "unsupported protocol: '$proto'" unless($proto && 275*6236dae4SAndroid Build Coastguard Worker (lc($proto) =~ /^ftps?$/)); 276*6236dae4SAndroid Build Coastguard Worker my $trailer = '_sockdata.log'; 277*6236dae4SAndroid Build Coastguard Worker return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer"; 278*6236dae4SAndroid Build Coastguard Worker} 279*6236dae4SAndroid Build Coastguard Worker 280*6236dae4SAndroid Build Coastguard Worker 281*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 282*6236dae4SAndroid Build Coastguard Worker# End of library 283*6236dae4SAndroid Build Coastguard Worker1; 284