File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / tests / sshhelp.pm
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 10:01:16 2020 UTC (5 years, 6 months ago) by misho
Branches: curl, MAIN
CVS tags: v7_70_0p4, HEAD
curl

    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>