Annotation of embedaddon/curl/tests/sshhelp.pm, revision 1.1
1.1 ! misho 1: #***************************************************************************
! 2: # _ _ ____ _
! 3: # Project ___| | | | _ \| |
! 4: # / __| | | | |_) | |
! 5: # | (__| |_| | _ <| |___
! 6: # \___|\___/|_| \_\_____|
! 7: #
! 8: # Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
! 9: #
! 10: # This software is licensed as described in the file COPYING, which
! 11: # you should have received as part of this distribution. The terms
! 12: # are also available at https://curl.haxx.se/docs/copyright.html.
! 13: #
! 14: # You may opt to use, copy, modify, merge, publish, distribute and/or sell
! 15: # copies of the Software, and permit persons to whom the Software is
! 16: # furnished to do so, under the terms of the COPYING file.
! 17: #
! 18: # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
! 19: # KIND, either express or implied.
! 20: #
! 21: #***************************************************************************
! 22:
! 23: package sshhelp;
! 24:
! 25: use strict;
! 26: use warnings;
! 27: use Exporter;
! 28: use File::Spec;
! 29:
! 30:
! 31: #***************************************************************************
! 32: # Global symbols allowed without explicit package name
! 33: #
! 34: use vars qw(
! 35: @ISA
! 36: @EXPORT_OK
! 37: $sshdexe
! 38: $sshexe
! 39: $sftpsrvexe
! 40: $sftpexe
! 41: $sshkeygenexe
! 42: $httptlssrvexe
! 43: $sshdconfig
! 44: $sshconfig
! 45: $sftpconfig
! 46: $knownhosts
! 47: $sshdlog
! 48: $sshlog
! 49: $sftplog
! 50: $sftpcmds
! 51: $hstprvkeyf
! 52: $hstpubkeyf
! 53: $hstpubmd5f
! 54: $cliprvkeyf
! 55: $clipubkeyf
! 56: @sftppath
! 57: @httptlssrvpath
! 58: );
! 59:
! 60:
! 61: #***************************************************************************
! 62: # Inherit Exporter's capabilities
! 63: #
! 64: @ISA = qw(Exporter);
! 65:
! 66:
! 67: #***************************************************************************
! 68: # Global symbols this module will export upon request
! 69: #
! 70: @EXPORT_OK = qw(
! 71: $sshdexe
! 72: $sshexe
! 73: $sftpsrvexe
! 74: $sftpexe
! 75: $sshkeygenexe
! 76: $sshdconfig
! 77: $sshconfig
! 78: $sftpconfig
! 79: $knownhosts
! 80: $sshdlog
! 81: $sshlog
! 82: $sftplog
! 83: $sftpcmds
! 84: $hstprvkeyf
! 85: $hstpubkeyf
! 86: $hstpubmd5f
! 87: $cliprvkeyf
! 88: $clipubkeyf
! 89: display_sshdconfig
! 90: display_sshconfig
! 91: display_sftpconfig
! 92: display_sshdlog
! 93: display_sshlog
! 94: display_sftplog
! 95: dump_array
! 96: exe_ext
! 97: find_sshd
! 98: find_ssh
! 99: find_sftpsrv
! 100: find_sftp
! 101: find_sshkeygen
! 102: find_httptlssrv
! 103: logmsg
! 104: sshversioninfo
! 105: );
! 106:
! 107:
! 108: #***************************************************************************
! 109: # Global variables initialization
! 110: #
! 111: $sshdexe = 'sshd' .exe_ext('SSH'); # base name and ext of ssh daemon
! 112: $sshexe = 'ssh' .exe_ext('SSH'); # base name and ext of ssh client
! 113: $sftpsrvexe = 'sftp-server' .exe_ext('SSH'); # base name and ext of sftp-server
! 114: $sftpexe = 'sftp' .exe_ext('SSH'); # base name and ext of sftp client
! 115: $sshkeygenexe = 'ssh-keygen' .exe_ext('SSH'); # base name and ext of ssh-keygen
! 116: $httptlssrvexe = 'gnutls-serv' .exe_ext('SSH'); # base name and ext of gnutls-serv
! 117: $sshdconfig = 'curl_sshd_config'; # ssh daemon config file
! 118: $sshconfig = 'curl_ssh_config'; # ssh client config file
! 119: $sftpconfig = 'curl_sftp_config'; # sftp client config file
! 120: $sshdlog = undef; # ssh daemon log file
! 121: $sshlog = undef; # ssh client log file
! 122: $sftplog = undef; # sftp client log file
! 123: $sftpcmds = 'curl_sftp_cmds'; # sftp client commands batch file
! 124: $knownhosts = 'curl_client_knownhosts'; # ssh knownhosts file
! 125: $hstprvkeyf = 'curl_host_rsa_key'; # host private key file
! 126: $hstpubkeyf = 'curl_host_rsa_key.pub'; # host public key file
! 127: $hstpubmd5f = 'curl_host_rsa_key.pub_md5'; # md5 hash of host public key
! 128: $cliprvkeyf = 'curl_client_key'; # client private key file
! 129: $clipubkeyf = 'curl_client_key.pub'; # client public key file
! 130:
! 131:
! 132: #***************************************************************************
! 133: # Absolute paths where to look for sftp-server plugin, when not in PATH
! 134: #
! 135: @sftppath = qw(
! 136: /usr/lib/openssh
! 137: /usr/libexec/openssh
! 138: /usr/libexec
! 139: /usr/local/libexec
! 140: /opt/local/libexec
! 141: /usr/lib/ssh
! 142: /usr/libexec/ssh
! 143: /usr/sbin
! 144: /usr/lib
! 145: /usr/lib/ssh/openssh
! 146: /usr/lib64/ssh
! 147: /usr/lib64/misc
! 148: /usr/lib/misc
! 149: /usr/local/sbin
! 150: /usr/freeware/bin
! 151: /usr/freeware/sbin
! 152: /usr/freeware/libexec
! 153: /opt/ssh/sbin
! 154: /opt/ssh/libexec
! 155: );
! 156:
! 157:
! 158: #***************************************************************************
! 159: # Absolute paths where to look for httptlssrv (gnutls-serv), when not in PATH
! 160: #
! 161: @httptlssrvpath = qw(
! 162: /usr/sbin
! 163: /usr/libexec
! 164: /usr/lib
! 165: /usr/lib/misc
! 166: /usr/lib64/misc
! 167: /usr/local/bin
! 168: /usr/local/sbin
! 169: /usr/local/libexec
! 170: /opt/local/bin
! 171: /opt/local/sbin
! 172: /opt/local/libexec
! 173: /usr/freeware/bin
! 174: /usr/freeware/sbin
! 175: /usr/freeware/libexec
! 176: /opt/gnutls/bin
! 177: /opt/gnutls/sbin
! 178: /opt/gnutls/libexec
! 179: );
! 180:
! 181:
! 182: #***************************************************************************
! 183: # Return file extension for executable files on this operating system
! 184: #
! 185: sub exe_ext {
! 186: my ($component, @arr) = @_;
! 187: if ($ENV{'CURL_TEST_EXE_EXT'}) {
! 188: return $ENV{'CURL_TEST_EXE_EXT'};
! 189: }
! 190: if ($ENV{'CURL_TEST_EXE_EXT_'.$component}) {
! 191: return $ENV{'CURL_TEST_EXE_EXT_'.$component};
! 192: }
! 193: if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys' ||
! 194: $^O eq 'dos' || $^O eq 'os2') {
! 195: return '.exe';
! 196: }
! 197: }
! 198:
! 199:
! 200: #***************************************************************************
! 201: # Create or overwrite the given file with lines from an array of strings
! 202: #
! 203: sub dump_array {
! 204: my ($filename, @arr) = @_;
! 205: my $error;
! 206:
! 207: if(!$filename) {
! 208: $error = 'Error: Missing argument 1 for dump_array()';
! 209: }
! 210: elsif(open(TEXTFH, ">$filename")) {
! 211: foreach my $line (@arr) {
! 212: $line .= "\n" unless($line =~ /\n$/);
! 213: print TEXTFH $line;
! 214: }
! 215: if(!close(TEXTFH)) {
! 216: $error = "Error: cannot close file $filename";
! 217: }
! 218: }
! 219: else {
! 220: $error = "Error: cannot write file $filename";
! 221: }
! 222: return $error;
! 223: }
! 224:
! 225:
! 226: #***************************************************************************
! 227: # Display a message
! 228: #
! 229: sub logmsg {
! 230: my ($line) = @_;
! 231: chomp $line if($line);
! 232: $line .= "\n";
! 233: print "$line";
! 234: }
! 235:
! 236:
! 237: #***************************************************************************
! 238: # Display contents of the given file
! 239: #
! 240: sub display_file {
! 241: my $filename = $_[0];
! 242: print "=== Start of file $filename\n";
! 243: if(open(DISPLAYFH, "<$filename")) {
! 244: while(my $line = <DISPLAYFH>) {
! 245: print "$line";
! 246: }
! 247: close DISPLAYFH;
! 248: }
! 249: print "=== End of file $filename\n";
! 250: }
! 251:
! 252:
! 253: #***************************************************************************
! 254: # Display contents of the ssh daemon config file
! 255: #
! 256: sub display_sshdconfig {
! 257: display_file($sshdconfig);
! 258: }
! 259:
! 260:
! 261: #***************************************************************************
! 262: # Display contents of the ssh client config file
! 263: #
! 264: sub display_sshconfig {
! 265: display_file($sshconfig);
! 266: }
! 267:
! 268:
! 269: #***************************************************************************
! 270: # Display contents of the sftp client config file
! 271: #
! 272: sub display_sftpconfig {
! 273: display_file($sftpconfig);
! 274: }
! 275:
! 276:
! 277: #***************************************************************************
! 278: # Display contents of the ssh daemon log file
! 279: #
! 280: sub display_sshdlog {
! 281: die "error: \$sshdlog uninitialized" if(not defined $sshdlog);
! 282: display_file($sshdlog);
! 283: }
! 284:
! 285:
! 286: #***************************************************************************
! 287: # Display contents of the ssh client log file
! 288: #
! 289: sub display_sshlog {
! 290: die "error: \$sshlog uninitialized" if(not defined $sshlog);
! 291: display_file($sshlog);
! 292: }
! 293:
! 294:
! 295: #***************************************************************************
! 296: # Display contents of the sftp client log file
! 297: #
! 298: sub display_sftplog {
! 299: die "error: \$sftplog uninitialized" if(not defined $sftplog);
! 300: display_file($sftplog);
! 301: }
! 302:
! 303:
! 304: #***************************************************************************
! 305: # Find a file somewhere in the given path
! 306: #
! 307: sub find_file {
! 308: my $fn = $_[0];
! 309: shift;
! 310: my @path = @_;
! 311: foreach (@path) {
! 312: my $file = File::Spec->catfile($_, $fn);
! 313: if(-e $file && ! -d $file) {
! 314: return $file;
! 315: }
! 316: }
! 317: }
! 318:
! 319:
! 320: #***************************************************************************
! 321: # Find an executable file somewhere in the given path
! 322: #
! 323: sub find_exe_file {
! 324: my $fn = $_[0];
! 325: shift;
! 326: my @path = @_;
! 327: my $xext = exe_ext('SSH');
! 328: foreach (@path) {
! 329: my $file = File::Spec->catfile($_, $fn);
! 330: if(-e $file && ! -d $file) {
! 331: return $file if(-x $file);
! 332: return $file if(($xext) && (lc($file) =~ /\Q$xext\E$/));
! 333: }
! 334: }
! 335: }
! 336:
! 337:
! 338: #***************************************************************************
! 339: # Find a file in environment path or in our sftppath
! 340: #
! 341: sub find_file_spath {
! 342: my $filename = $_[0];
! 343: my @spath;
! 344: push(@spath, File::Spec->path());
! 345: push(@spath, @sftppath);
! 346: return find_file($filename, @spath);
! 347: }
! 348:
! 349:
! 350: #***************************************************************************
! 351: # Find an executable file in environment path or in our httptlssrvpath
! 352: #
! 353: sub find_exe_file_hpath {
! 354: my $filename = $_[0];
! 355: my @hpath;
! 356: push(@hpath, File::Spec->path());
! 357: push(@hpath, @httptlssrvpath);
! 358: return find_exe_file($filename, @hpath);
! 359: }
! 360:
! 361:
! 362: #***************************************************************************
! 363: # Find ssh daemon and return canonical filename
! 364: #
! 365: sub find_sshd {
! 366: return find_file_spath($sshdexe);
! 367: }
! 368:
! 369:
! 370: #***************************************************************************
! 371: # Find ssh client and return canonical filename
! 372: #
! 373: sub find_ssh {
! 374: return find_file_spath($sshexe);
! 375: }
! 376:
! 377:
! 378: #***************************************************************************
! 379: # Find sftp-server plugin and return canonical filename
! 380: #
! 381: sub find_sftpsrv {
! 382: return find_file_spath($sftpsrvexe);
! 383: }
! 384:
! 385:
! 386: #***************************************************************************
! 387: # Find sftp client and return canonical filename
! 388: #
! 389: sub find_sftp {
! 390: return find_file_spath($sftpexe);
! 391: }
! 392:
! 393:
! 394: #***************************************************************************
! 395: # Find ssh-keygen and return canonical filename
! 396: #
! 397: sub find_sshkeygen {
! 398: return find_file_spath($sshkeygenexe);
! 399: }
! 400:
! 401:
! 402: #***************************************************************************
! 403: # Find httptlssrv (gnutls-serv) and return canonical filename
! 404: #
! 405: sub find_httptlssrv {
! 406: return find_exe_file_hpath($httptlssrvexe);
! 407: }
! 408:
! 409:
! 410: #***************************************************************************
! 411: # Return version info for the given ssh client or server binaries
! 412: #
! 413: sub sshversioninfo {
! 414: my $sshbin = $_[0]; # canonical filename
! 415: my $major;
! 416: my $minor;
! 417: my $patch;
! 418: my $sshid;
! 419: my $versnum;
! 420: my $versstr;
! 421: my $error;
! 422:
! 423: if(!$sshbin) {
! 424: $error = 'Error: Missing argument 1 for sshversioninfo()';
! 425: }
! 426: elsif(! -x $sshbin) {
! 427: $error = "Error: cannot read or execute $sshbin";
! 428: }
! 429: else {
! 430: my $cmd = ($sshbin =~ /$sshdexe$/) ? "\"$sshbin\" -?" : "\"$sshbin\" -V";
! 431: $error = "$cmd\n";
! 432: foreach my $tmpstr (qx($cmd 2>&1)) {
! 433: if($tmpstr =~ /OpenSSH[_-](\d+)\.(\d+)(\.(\d+))*/i) {
! 434: $major = $1;
! 435: $minor = $2;
! 436: $patch = $4?$4:0;
! 437: $sshid = 'OpenSSH';
! 438: $versnum = (100*$major) + (10*$minor) + $patch;
! 439: $versstr = "$sshid $major.$minor.$patch";
! 440: $error = undef;
! 441: last;
! 442: }
! 443: if($tmpstr =~ /OpenSSH[_-]for[_-]Windows[_-](\d+)\.(\d+)(\.(\d+))*/i) {
! 444: $major = $1;
! 445: $minor = $2;
! 446: $patch = $4?$4:0;
! 447: $sshid = 'OpenSSH-Windows';
! 448: $versnum = (100*$major) + (10*$minor) + $patch;
! 449: $versstr = "$sshid $major.$minor.$patch";
! 450: $error = undef;
! 451: last;
! 452: }
! 453: if($tmpstr =~ /Sun[_-]SSH[_-](\d+)\.(\d+)(\.(\d+))*/i) {
! 454: $major = $1;
! 455: $minor = $2;
! 456: $patch = $4?$4:0;
! 457: $sshid = 'SunSSH';
! 458: $versnum = (100*$major) + (10*$minor) + $patch;
! 459: $versstr = "$sshid $major.$minor.$patch";
! 460: $error = undef;
! 461: last;
! 462: }
! 463: $error .= $tmpstr;
! 464: }
! 465: chomp $error if($error);
! 466: }
! 467: return ($sshid, $versnum, $versstr, $error);
! 468: }
! 469:
! 470:
! 471: #***************************************************************************
! 472: # End of library
! 473: 1;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>