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 Workerpackage sshhelp; 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard Workeruse strict; 28*6236dae4SAndroid Build Coastguard Workeruse warnings; 29*6236dae4SAndroid Build Coastguard Worker 30*6236dae4SAndroid Build Coastguard WorkerBEGIN { 31*6236dae4SAndroid Build Coastguard Worker use base qw(Exporter); 32*6236dae4SAndroid Build Coastguard Worker 33*6236dae4SAndroid Build Coastguard Worker our @EXPORT_OK = qw( 34*6236dae4SAndroid Build Coastguard Worker $sshdexe 35*6236dae4SAndroid Build Coastguard Worker $sshexe 36*6236dae4SAndroid Build Coastguard Worker $sftpsrvexe 37*6236dae4SAndroid Build Coastguard Worker $sftpexe 38*6236dae4SAndroid Build Coastguard Worker $sshkeygenexe 39*6236dae4SAndroid Build Coastguard Worker $sshdconfig 40*6236dae4SAndroid Build Coastguard Worker $sshconfig 41*6236dae4SAndroid Build Coastguard Worker $sftpconfig 42*6236dae4SAndroid Build Coastguard Worker $knownhosts 43*6236dae4SAndroid Build Coastguard Worker $sshdlog 44*6236dae4SAndroid Build Coastguard Worker $sshlog 45*6236dae4SAndroid Build Coastguard Worker $sftplog 46*6236dae4SAndroid Build Coastguard Worker $sftpcmds 47*6236dae4SAndroid Build Coastguard Worker $hstprvkeyf 48*6236dae4SAndroid Build Coastguard Worker $hstpubkeyf 49*6236dae4SAndroid Build Coastguard Worker $hstpubmd5f 50*6236dae4SAndroid Build Coastguard Worker $hstpubsha256f 51*6236dae4SAndroid Build Coastguard Worker $cliprvkeyf 52*6236dae4SAndroid Build Coastguard Worker $clipubkeyf 53*6236dae4SAndroid Build Coastguard Worker display_sshdconfig 54*6236dae4SAndroid Build Coastguard Worker display_sshconfig 55*6236dae4SAndroid Build Coastguard Worker display_sftpconfig 56*6236dae4SAndroid Build Coastguard Worker display_sshdlog 57*6236dae4SAndroid Build Coastguard Worker display_sshlog 58*6236dae4SAndroid Build Coastguard Worker display_sftplog 59*6236dae4SAndroid Build Coastguard Worker dump_array 60*6236dae4SAndroid Build Coastguard Worker find_sshd 61*6236dae4SAndroid Build Coastguard Worker find_ssh 62*6236dae4SAndroid Build Coastguard Worker find_sftpsrv 63*6236dae4SAndroid Build Coastguard Worker find_sftp 64*6236dae4SAndroid Build Coastguard Worker find_sshkeygen 65*6236dae4SAndroid Build Coastguard Worker find_httptlssrv 66*6236dae4SAndroid Build Coastguard Worker sshversioninfo 67*6236dae4SAndroid Build Coastguard Worker ); 68*6236dae4SAndroid Build Coastguard Worker} 69*6236dae4SAndroid Build Coastguard Worker 70*6236dae4SAndroid Build Coastguard Workeruse File::Spec; 71*6236dae4SAndroid Build Coastguard Worker 72*6236dae4SAndroid Build Coastguard Workeruse pathhelp qw( 73*6236dae4SAndroid Build Coastguard Worker exe_ext 74*6236dae4SAndroid Build Coastguard Worker ); 75*6236dae4SAndroid Build Coastguard Worker 76*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 77*6236dae4SAndroid Build Coastguard Worker# Global variables initialization 78*6236dae4SAndroid Build Coastguard Worker# 79*6236dae4SAndroid Build Coastguard Workerour $sshdexe = 'sshd' .exe_ext('SSH'); # base name and ext of ssh daemon 80*6236dae4SAndroid Build Coastguard Workerour $sshexe = 'ssh' .exe_ext('SSH'); # base name and ext of ssh client 81*6236dae4SAndroid Build Coastguard Workerour $sftpsrvexe = 'sftp-server' .exe_ext('SSH'); # base name and ext of sftp-server 82*6236dae4SAndroid Build Coastguard Workerour $sftpexe = 'sftp' .exe_ext('SSH'); # base name and ext of sftp client 83*6236dae4SAndroid Build Coastguard Workerour $sshkeygenexe = 'ssh-keygen' .exe_ext('SSH'); # base name and ext of ssh-keygen 84*6236dae4SAndroid Build Coastguard Workerour $httptlssrvexe = 'gnutls-serv' .exe_ext('SSH'); # base name and ext of gnutls-serv 85*6236dae4SAndroid Build Coastguard Workerour $sshdconfig = 'curl_sshd_config'; # ssh daemon config file 86*6236dae4SAndroid Build Coastguard Workerour $sshconfig = 'curl_ssh_config'; # ssh client config file 87*6236dae4SAndroid Build Coastguard Workerour $sftpconfig = 'curl_sftp_config'; # sftp client config file 88*6236dae4SAndroid Build Coastguard Workerour $sshdlog = undef; # ssh daemon log file 89*6236dae4SAndroid Build Coastguard Workerour $sshlog = undef; # ssh client log file 90*6236dae4SAndroid Build Coastguard Workerour $sftplog = undef; # sftp client log file 91*6236dae4SAndroid Build Coastguard Workerour $sftpcmds = 'curl_sftp_cmds'; # sftp client commands batch file 92*6236dae4SAndroid Build Coastguard Workerour $knownhosts = 'curl_client_knownhosts'; # ssh knownhosts file 93*6236dae4SAndroid Build Coastguard Workerour $hstprvkeyf = 'curl_host_rsa_key'; # host private key file 94*6236dae4SAndroid Build Coastguard Workerour $hstpubkeyf = 'curl_host_rsa_key.pub'; # host public key file 95*6236dae4SAndroid Build Coastguard Workerour $hstpubmd5f = 'curl_host_rsa_key.pub_md5'; # md5 hash of host public key 96*6236dae4SAndroid Build Coastguard Workerour $hstpubsha256f = 'curl_host_rsa_key.pub_sha256'; # sha256 hash of host public key 97*6236dae4SAndroid Build Coastguard Workerour $cliprvkeyf = 'curl_client_key'; # client private key file 98*6236dae4SAndroid Build Coastguard Workerour $clipubkeyf = 'curl_client_key.pub'; # client public key file 99*6236dae4SAndroid Build Coastguard Worker 100*6236dae4SAndroid Build Coastguard Worker 101*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 102*6236dae4SAndroid Build Coastguard Worker# Absolute paths where to look for sftp-server plugin, when not in PATH 103*6236dae4SAndroid Build Coastguard Worker# 104*6236dae4SAndroid Build Coastguard Workerour @sftppath = qw( 105*6236dae4SAndroid Build Coastguard Worker /usr/lib/openssh 106*6236dae4SAndroid Build Coastguard Worker /usr/libexec/openssh 107*6236dae4SAndroid Build Coastguard Worker /usr/libexec 108*6236dae4SAndroid Build Coastguard Worker /usr/local/libexec 109*6236dae4SAndroid Build Coastguard Worker /opt/local/libexec 110*6236dae4SAndroid Build Coastguard Worker /usr/lib/ssh 111*6236dae4SAndroid Build Coastguard Worker /usr/libexec/ssh 112*6236dae4SAndroid Build Coastguard Worker /usr/sbin 113*6236dae4SAndroid Build Coastguard Worker /usr/lib 114*6236dae4SAndroid Build Coastguard Worker /usr/lib/ssh/openssh 115*6236dae4SAndroid Build Coastguard Worker /usr/lib64/ssh 116*6236dae4SAndroid Build Coastguard Worker /usr/lib64/misc 117*6236dae4SAndroid Build Coastguard Worker /usr/lib/misc 118*6236dae4SAndroid Build Coastguard Worker /usr/local/sbin 119*6236dae4SAndroid Build Coastguard Worker /usr/freeware/bin 120*6236dae4SAndroid Build Coastguard Worker /usr/freeware/sbin 121*6236dae4SAndroid Build Coastguard Worker /usr/freeware/libexec 122*6236dae4SAndroid Build Coastguard Worker /opt/ssh/sbin 123*6236dae4SAndroid Build Coastguard Worker /opt/ssh/libexec 124*6236dae4SAndroid Build Coastguard Worker ); 125*6236dae4SAndroid Build Coastguard Worker 126*6236dae4SAndroid Build Coastguard Worker 127*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 128*6236dae4SAndroid Build Coastguard Worker# Absolute paths where to look for httptlssrv (gnutls-serv), when not in PATH 129*6236dae4SAndroid Build Coastguard Worker# 130*6236dae4SAndroid Build Coastguard Workerour @httptlssrvpath = qw( 131*6236dae4SAndroid Build Coastguard Worker /usr/sbin 132*6236dae4SAndroid Build Coastguard Worker /usr/libexec 133*6236dae4SAndroid Build Coastguard Worker /usr/lib 134*6236dae4SAndroid Build Coastguard Worker /usr/lib/misc 135*6236dae4SAndroid Build Coastguard Worker /usr/lib64/misc 136*6236dae4SAndroid Build Coastguard Worker /usr/local/bin 137*6236dae4SAndroid Build Coastguard Worker /usr/local/sbin 138*6236dae4SAndroid Build Coastguard Worker /usr/local/libexec 139*6236dae4SAndroid Build Coastguard Worker /opt/local/bin 140*6236dae4SAndroid Build Coastguard Worker /opt/local/sbin 141*6236dae4SAndroid Build Coastguard Worker /opt/local/libexec 142*6236dae4SAndroid Build Coastguard Worker /usr/freeware/bin 143*6236dae4SAndroid Build Coastguard Worker /usr/freeware/sbin 144*6236dae4SAndroid Build Coastguard Worker /usr/freeware/libexec 145*6236dae4SAndroid Build Coastguard Worker /opt/gnutls/bin 146*6236dae4SAndroid Build Coastguard Worker /opt/gnutls/sbin 147*6236dae4SAndroid Build Coastguard Worker /opt/gnutls/libexec 148*6236dae4SAndroid Build Coastguard Worker ); 149*6236dae4SAndroid Build Coastguard Worker 150*6236dae4SAndroid Build Coastguard Worker 151*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 152*6236dae4SAndroid Build Coastguard Worker# Create or overwrite the given file with lines from an array of strings 153*6236dae4SAndroid Build Coastguard Worker# 154*6236dae4SAndroid Build Coastguard Workersub dump_array { 155*6236dae4SAndroid Build Coastguard Worker my ($filename, @arr) = @_; 156*6236dae4SAndroid Build Coastguard Worker my $error; 157*6236dae4SAndroid Build Coastguard Worker 158*6236dae4SAndroid Build Coastguard Worker if(!$filename) { 159*6236dae4SAndroid Build Coastguard Worker $error = 'Error: Missing argument 1 for dump_array()'; 160*6236dae4SAndroid Build Coastguard Worker } 161*6236dae4SAndroid Build Coastguard Worker elsif(open(my $textfh, ">", $filename)) { 162*6236dae4SAndroid Build Coastguard Worker foreach my $line (@arr) { 163*6236dae4SAndroid Build Coastguard Worker $line .= "\n" if($line !~ /\n$/); 164*6236dae4SAndroid Build Coastguard Worker print $textfh $line; 165*6236dae4SAndroid Build Coastguard Worker } 166*6236dae4SAndroid Build Coastguard Worker if(!close($textfh)) { 167*6236dae4SAndroid Build Coastguard Worker $error = "Error: cannot close file $filename"; 168*6236dae4SAndroid Build Coastguard Worker } 169*6236dae4SAndroid Build Coastguard Worker } 170*6236dae4SAndroid Build Coastguard Worker else { 171*6236dae4SAndroid Build Coastguard Worker $error = "Error: cannot write file $filename"; 172*6236dae4SAndroid Build Coastguard Worker } 173*6236dae4SAndroid Build Coastguard Worker return $error; 174*6236dae4SAndroid Build Coastguard Worker} 175*6236dae4SAndroid Build Coastguard Worker 176*6236dae4SAndroid Build Coastguard Worker 177*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 178*6236dae4SAndroid Build Coastguard Worker# Display contents of the given file 179*6236dae4SAndroid Build Coastguard Worker# 180*6236dae4SAndroid Build Coastguard Workersub display_file { 181*6236dae4SAndroid Build Coastguard Worker my $filename = $_[0]; 182*6236dae4SAndroid Build Coastguard Worker print "=== Start of file $filename\n"; 183*6236dae4SAndroid Build Coastguard Worker if(open(my $displayfh, "<", "$filename")) { 184*6236dae4SAndroid Build Coastguard Worker while(my $line = <$displayfh>) { 185*6236dae4SAndroid Build Coastguard Worker print "$line"; 186*6236dae4SAndroid Build Coastguard Worker } 187*6236dae4SAndroid Build Coastguard Worker close $displayfh; 188*6236dae4SAndroid Build Coastguard Worker } 189*6236dae4SAndroid Build Coastguard Worker print "=== End of file $filename\n"; 190*6236dae4SAndroid Build Coastguard Worker} 191*6236dae4SAndroid Build Coastguard Worker 192*6236dae4SAndroid Build Coastguard Worker 193*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 194*6236dae4SAndroid Build Coastguard Worker# Display contents of the ssh daemon config file 195*6236dae4SAndroid Build Coastguard Worker# 196*6236dae4SAndroid Build Coastguard Workersub display_sshdconfig { 197*6236dae4SAndroid Build Coastguard Worker display_file($sshdconfig); 198*6236dae4SAndroid Build Coastguard Worker} 199*6236dae4SAndroid Build Coastguard Worker 200*6236dae4SAndroid Build Coastguard Worker 201*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 202*6236dae4SAndroid Build Coastguard Worker# Display contents of the ssh client config file 203*6236dae4SAndroid Build Coastguard Worker# 204*6236dae4SAndroid Build Coastguard Workersub display_sshconfig { 205*6236dae4SAndroid Build Coastguard Worker display_file($sshconfig); 206*6236dae4SAndroid Build Coastguard Worker} 207*6236dae4SAndroid Build Coastguard Worker 208*6236dae4SAndroid Build Coastguard Worker 209*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 210*6236dae4SAndroid Build Coastguard Worker# Display contents of the sftp client config file 211*6236dae4SAndroid Build Coastguard Worker# 212*6236dae4SAndroid Build Coastguard Workersub display_sftpconfig { 213*6236dae4SAndroid Build Coastguard Worker display_file($sftpconfig); 214*6236dae4SAndroid Build Coastguard Worker} 215*6236dae4SAndroid Build Coastguard Worker 216*6236dae4SAndroid Build Coastguard Worker 217*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 218*6236dae4SAndroid Build Coastguard Worker# Display contents of the ssh daemon log file 219*6236dae4SAndroid Build Coastguard Worker# 220*6236dae4SAndroid Build Coastguard Workersub display_sshdlog { 221*6236dae4SAndroid Build Coastguard Worker die "error: \$sshdlog uninitialized" if(not defined $sshdlog); 222*6236dae4SAndroid Build Coastguard Worker display_file($sshdlog); 223*6236dae4SAndroid Build Coastguard Worker} 224*6236dae4SAndroid Build Coastguard Worker 225*6236dae4SAndroid Build Coastguard Worker 226*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 227*6236dae4SAndroid Build Coastguard Worker# Display contents of the ssh client log file 228*6236dae4SAndroid Build Coastguard Worker# 229*6236dae4SAndroid Build Coastguard Workersub display_sshlog { 230*6236dae4SAndroid Build Coastguard Worker die "error: \$sshlog uninitialized" if(not defined $sshlog); 231*6236dae4SAndroid Build Coastguard Worker display_file($sshlog); 232*6236dae4SAndroid Build Coastguard Worker} 233*6236dae4SAndroid Build Coastguard Worker 234*6236dae4SAndroid Build Coastguard Worker 235*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 236*6236dae4SAndroid Build Coastguard Worker# Display contents of the sftp client log file 237*6236dae4SAndroid Build Coastguard Worker# 238*6236dae4SAndroid Build Coastguard Workersub display_sftplog { 239*6236dae4SAndroid Build Coastguard Worker die "error: \$sftplog uninitialized" if(not defined $sftplog); 240*6236dae4SAndroid Build Coastguard Worker display_file($sftplog); 241*6236dae4SAndroid Build Coastguard Worker} 242*6236dae4SAndroid Build Coastguard Worker 243*6236dae4SAndroid Build Coastguard Worker 244*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 245*6236dae4SAndroid Build Coastguard Worker# Find a file somewhere in the given path 246*6236dae4SAndroid Build Coastguard Worker# 247*6236dae4SAndroid Build Coastguard Workersub find_file { 248*6236dae4SAndroid Build Coastguard Worker my $fn = $_[0]; 249*6236dae4SAndroid Build Coastguard Worker shift; 250*6236dae4SAndroid Build Coastguard Worker my @path = @_; 251*6236dae4SAndroid Build Coastguard Worker foreach (@path) { 252*6236dae4SAndroid Build Coastguard Worker my $file = File::Spec->catfile($_, $fn); 253*6236dae4SAndroid Build Coastguard Worker if(-e $file && ! -d $file) { 254*6236dae4SAndroid Build Coastguard Worker return $file; 255*6236dae4SAndroid Build Coastguard Worker } 256*6236dae4SAndroid Build Coastguard Worker } 257*6236dae4SAndroid Build Coastguard Worker return ""; 258*6236dae4SAndroid Build Coastguard Worker} 259*6236dae4SAndroid Build Coastguard Worker 260*6236dae4SAndroid Build Coastguard Worker 261*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 262*6236dae4SAndroid Build Coastguard Worker# Find an executable file somewhere in the given path 263*6236dae4SAndroid Build Coastguard Worker# 264*6236dae4SAndroid Build Coastguard Workersub find_exe_file { 265*6236dae4SAndroid Build Coastguard Worker my $fn = $_[0]; 266*6236dae4SAndroid Build Coastguard Worker shift; 267*6236dae4SAndroid Build Coastguard Worker my @path = @_; 268*6236dae4SAndroid Build Coastguard Worker my $xext = exe_ext('SSH'); 269*6236dae4SAndroid Build Coastguard Worker foreach (@path) { 270*6236dae4SAndroid Build Coastguard Worker my $file = File::Spec->catfile($_, $fn); 271*6236dae4SAndroid Build Coastguard Worker if(-e $file && ! -d $file) { 272*6236dae4SAndroid Build Coastguard Worker return $file if(-x $file); 273*6236dae4SAndroid Build Coastguard Worker return $file if(($xext) && (lc($file) =~ /\Q$xext\E$/)); 274*6236dae4SAndroid Build Coastguard Worker } 275*6236dae4SAndroid Build Coastguard Worker } 276*6236dae4SAndroid Build Coastguard Worker return ""; 277*6236dae4SAndroid Build Coastguard Worker} 278*6236dae4SAndroid Build Coastguard Worker 279*6236dae4SAndroid Build Coastguard Worker 280*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 281*6236dae4SAndroid Build Coastguard Worker# Find a file in environment path or in our sftppath 282*6236dae4SAndroid Build Coastguard Worker# 283*6236dae4SAndroid Build Coastguard Workersub find_file_spath { 284*6236dae4SAndroid Build Coastguard Worker my $filename = $_[0]; 285*6236dae4SAndroid Build Coastguard Worker my @spath; 286*6236dae4SAndroid Build Coastguard Worker push(@spath, File::Spec->path()); 287*6236dae4SAndroid Build Coastguard Worker push(@spath, @sftppath); 288*6236dae4SAndroid Build Coastguard Worker return find_file($filename, @spath); 289*6236dae4SAndroid Build Coastguard Worker} 290*6236dae4SAndroid Build Coastguard Worker 291*6236dae4SAndroid Build Coastguard Worker 292*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 293*6236dae4SAndroid Build Coastguard Worker# Find an executable file in environment path or in our httptlssrvpath 294*6236dae4SAndroid Build Coastguard Worker# 295*6236dae4SAndroid Build Coastguard Workersub find_exe_file_hpath { 296*6236dae4SAndroid Build Coastguard Worker my $filename = $_[0]; 297*6236dae4SAndroid Build Coastguard Worker my @hpath; 298*6236dae4SAndroid Build Coastguard Worker push(@hpath, File::Spec->path()); 299*6236dae4SAndroid Build Coastguard Worker push(@hpath, @httptlssrvpath); 300*6236dae4SAndroid Build Coastguard Worker return find_exe_file($filename, @hpath); 301*6236dae4SAndroid Build Coastguard Worker} 302*6236dae4SAndroid Build Coastguard Worker 303*6236dae4SAndroid Build Coastguard Worker 304*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 305*6236dae4SAndroid Build Coastguard Worker# Find ssh daemon and return canonical filename 306*6236dae4SAndroid Build Coastguard Worker# 307*6236dae4SAndroid Build Coastguard Workersub find_sshd { 308*6236dae4SAndroid Build Coastguard Worker return find_file_spath($sshdexe); 309*6236dae4SAndroid Build Coastguard Worker} 310*6236dae4SAndroid Build Coastguard Worker 311*6236dae4SAndroid Build Coastguard Worker 312*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 313*6236dae4SAndroid Build Coastguard Worker# Find ssh client and return canonical filename 314*6236dae4SAndroid Build Coastguard Worker# 315*6236dae4SAndroid Build Coastguard Workersub find_ssh { 316*6236dae4SAndroid Build Coastguard Worker return find_file_spath($sshexe); 317*6236dae4SAndroid Build Coastguard Worker} 318*6236dae4SAndroid Build Coastguard Worker 319*6236dae4SAndroid Build Coastguard Worker 320*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 321*6236dae4SAndroid Build Coastguard Worker# Find sftp-server plugin and return canonical filename 322*6236dae4SAndroid Build Coastguard Worker# 323*6236dae4SAndroid Build Coastguard Workersub find_sftpsrv { 324*6236dae4SAndroid Build Coastguard Worker return find_file_spath($sftpsrvexe); 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# Find sftp client and return canonical filename 330*6236dae4SAndroid Build Coastguard Worker# 331*6236dae4SAndroid Build Coastguard Workersub find_sftp { 332*6236dae4SAndroid Build Coastguard Worker return find_file_spath($sftpexe); 333*6236dae4SAndroid Build Coastguard Worker} 334*6236dae4SAndroid Build Coastguard Worker 335*6236dae4SAndroid Build Coastguard Worker 336*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 337*6236dae4SAndroid Build Coastguard Worker# Find ssh-keygen and return canonical filename 338*6236dae4SAndroid Build Coastguard Worker# 339*6236dae4SAndroid Build Coastguard Workersub find_sshkeygen { 340*6236dae4SAndroid Build Coastguard Worker return find_file_spath($sshkeygenexe); 341*6236dae4SAndroid Build Coastguard Worker} 342*6236dae4SAndroid Build Coastguard Worker 343*6236dae4SAndroid Build Coastguard Worker 344*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 345*6236dae4SAndroid Build Coastguard Worker# Find httptlssrv (gnutls-serv) and return canonical filename 346*6236dae4SAndroid Build Coastguard Worker# 347*6236dae4SAndroid Build Coastguard Workersub find_httptlssrv { 348*6236dae4SAndroid Build Coastguard Worker my $p = find_exe_file_hpath($httptlssrvexe); 349*6236dae4SAndroid Build Coastguard Worker if($p) { 350*6236dae4SAndroid Build Coastguard Worker my @o = `"$p" -l`; 351*6236dae4SAndroid Build Coastguard Worker my $found; 352*6236dae4SAndroid Build Coastguard Worker for(@o) { 353*6236dae4SAndroid Build Coastguard Worker if(/Key exchange: SRP/) { 354*6236dae4SAndroid Build Coastguard Worker $found = 1; 355*6236dae4SAndroid Build Coastguard Worker last; 356*6236dae4SAndroid Build Coastguard Worker } 357*6236dae4SAndroid Build Coastguard Worker } 358*6236dae4SAndroid Build Coastguard Worker return $p if($found); 359*6236dae4SAndroid Build Coastguard Worker } 360*6236dae4SAndroid Build Coastguard Worker return ""; 361*6236dae4SAndroid Build Coastguard Worker} 362*6236dae4SAndroid Build Coastguard Worker 363*6236dae4SAndroid Build Coastguard Worker 364*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 365*6236dae4SAndroid Build Coastguard Worker# Return version info for the given ssh client or server binaries 366*6236dae4SAndroid Build Coastguard Worker# 367*6236dae4SAndroid Build Coastguard Workersub sshversioninfo { 368*6236dae4SAndroid Build Coastguard Worker my $sshbin = $_[0]; # canonical filename 369*6236dae4SAndroid Build Coastguard Worker my $major; 370*6236dae4SAndroid Build Coastguard Worker my $minor; 371*6236dae4SAndroid Build Coastguard Worker my $patch; 372*6236dae4SAndroid Build Coastguard Worker my $sshid; 373*6236dae4SAndroid Build Coastguard Worker my $versnum; 374*6236dae4SAndroid Build Coastguard Worker my $versstr; 375*6236dae4SAndroid Build Coastguard Worker my $error; 376*6236dae4SAndroid Build Coastguard Worker 377*6236dae4SAndroid Build Coastguard Worker if(!$sshbin) { 378*6236dae4SAndroid Build Coastguard Worker $error = 'Error: Missing argument 1 for sshversioninfo()'; 379*6236dae4SAndroid Build Coastguard Worker } 380*6236dae4SAndroid Build Coastguard Worker elsif(! -x $sshbin) { 381*6236dae4SAndroid Build Coastguard Worker $error = "Error: cannot read or execute $sshbin"; 382*6236dae4SAndroid Build Coastguard Worker } 383*6236dae4SAndroid Build Coastguard Worker else { 384*6236dae4SAndroid Build Coastguard Worker my $cmd = ($sshbin =~ /$sshdexe$/) ? "\"$sshbin\" -?" : "\"$sshbin\" -V"; 385*6236dae4SAndroid Build Coastguard Worker $error = "$cmd\n"; 386*6236dae4SAndroid Build Coastguard Worker foreach my $tmpstr (qx($cmd 2>&1)) { 387*6236dae4SAndroid Build Coastguard Worker if($tmpstr =~ /OpenSSH[_-](\d+)\.(\d+)(\.(\d+))*/i) { 388*6236dae4SAndroid Build Coastguard Worker $major = $1; 389*6236dae4SAndroid Build Coastguard Worker $minor = $2; 390*6236dae4SAndroid Build Coastguard Worker $patch = $4?$4:0; 391*6236dae4SAndroid Build Coastguard Worker $sshid = 'OpenSSH'; 392*6236dae4SAndroid Build Coastguard Worker $versnum = (100*$major) + (10*$minor) + $patch; 393*6236dae4SAndroid Build Coastguard Worker $versstr = "$sshid $major.$minor.$patch"; 394*6236dae4SAndroid Build Coastguard Worker $error = undef; 395*6236dae4SAndroid Build Coastguard Worker last; 396*6236dae4SAndroid Build Coastguard Worker } 397*6236dae4SAndroid Build Coastguard Worker if($tmpstr =~ /OpenSSH[_-]for[_-]Windows[_-](\d+)\.(\d+)(\.(\d+))*/i) { 398*6236dae4SAndroid Build Coastguard Worker $major = $1; 399*6236dae4SAndroid Build Coastguard Worker $minor = $2; 400*6236dae4SAndroid Build Coastguard Worker $patch = $4?$4:0; 401*6236dae4SAndroid Build Coastguard Worker $sshid = 'OpenSSH-Windows'; 402*6236dae4SAndroid Build Coastguard Worker $versnum = (100*$major) + (10*$minor) + $patch; 403*6236dae4SAndroid Build Coastguard Worker $versstr = "$sshid $major.$minor.$patch"; 404*6236dae4SAndroid Build Coastguard Worker $error = undef; 405*6236dae4SAndroid Build Coastguard Worker last; 406*6236dae4SAndroid Build Coastguard Worker } 407*6236dae4SAndroid Build Coastguard Worker if($tmpstr =~ /Sun[_-]SSH[_-](\d+)\.(\d+)(\.(\d+))*/i) { 408*6236dae4SAndroid Build Coastguard Worker $major = $1; 409*6236dae4SAndroid Build Coastguard Worker $minor = $2; 410*6236dae4SAndroid Build Coastguard Worker $patch = $4?$4:0; 411*6236dae4SAndroid Build Coastguard Worker $sshid = 'SunSSH'; 412*6236dae4SAndroid Build Coastguard Worker $versnum = (100*$major) + (10*$minor) + $patch; 413*6236dae4SAndroid Build Coastguard Worker $versstr = "$sshid $major.$minor.$patch"; 414*6236dae4SAndroid Build Coastguard Worker $error = undef; 415*6236dae4SAndroid Build Coastguard Worker last; 416*6236dae4SAndroid Build Coastguard Worker } 417*6236dae4SAndroid Build Coastguard Worker $error .= $tmpstr; 418*6236dae4SAndroid Build Coastguard Worker } 419*6236dae4SAndroid Build Coastguard Worker chomp $error if($error); 420*6236dae4SAndroid Build Coastguard Worker } 421*6236dae4SAndroid Build Coastguard Worker return ($sshid, $versnum, $versstr, $error); 422*6236dae4SAndroid Build Coastguard Worker} 423*6236dae4SAndroid Build Coastguard Worker 424*6236dae4SAndroid Build Coastguard Worker 425*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 426*6236dae4SAndroid Build Coastguard Worker# End of library 427*6236dae4SAndroid Build Coastguard Worker1; 428