diff options
Diffstat (limited to 'tests/sshhelp.pm')
-rw-r--r-- | tests/sshhelp.pm | 344 |
1 files changed, 344 insertions, 0 deletions
diff --git a/tests/sshhelp.pm b/tests/sshhelp.pm new file mode 100644 index 000000000..efe7a7f32 --- /dev/null +++ b/tests/sshhelp.pm @@ -0,0 +1,344 @@ +#*************************************************************************** +# _ _ ____ _ +# Project ___| | | | _ \| | +# / __| | | | |_) | | +# | (__| |_| | _ <| |___ +# \___|\___/|_| \_\_____| +# +# Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://curl.haxx.se/docs/copyright.html. +# +# You may opt to use, copy, modify, merge, publish, distribute and/or sell +# copies of the Software, and permit persons to whom the Software is +# furnished to do so, under the terms of the COPYING file. +# +# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +# KIND, either express or implied. +# +# $Id: +#*************************************************************************** + +package sshhelp; + +use strict; +#use warnings; +use Exporter; +use File::Spec; + + +#*************************************************************************** +# Global symbols allowed without explicit package name +# +use vars qw( + @ISA + @EXPORT_OK + $sshdexe + $sshexe + $sftpexe + $sshkeygenexe + $sshdconfig + $sshconfig + $knownhosts + $sshdlog + $sshlog + $hstprvkeyf + $hstpubkeyf + $cliprvkeyf + $clipubkeyf + @sftppath + ); + + +#*************************************************************************** +# Inherit Exporter's capabilities +# +@ISA = qw(Exporter); + + +#*************************************************************************** +# Global symbols this module will export upon request +# +@EXPORT_OK = qw( + $sshdexe + $sshexe + $sftpexe + $sshkeygenexe + $sshdconfig + $sshconfig + $knownhosts + $sshdlog + $sshlog + $hstprvkeyf + $hstpubkeyf + $cliprvkeyf + $clipubkeyf + display_sshdconfig + display_sshconfig + display_sshdlog + display_sshlog + dump_array + find_sshd + find_ssh + find_sftp + find_sshkeygen + logmsg + sshversioninfo + ); + + +#*************************************************************************** +# Global variables initialization +# +$sshdexe = 'sshd' .exe_ext(); # base name and ext of ssh daemon +$sshexe = 'ssh' .exe_ext(); # base name and ext of ssh client +$sftpexe = 'sftp-server' .exe_ext(); # base name and ext of sftp-server +$sshkeygenexe = 'ssh-keygen' .exe_ext(); # base name and ext of ssh-keygen +$sshdconfig = 'curl_sshd_config'; # ssh daemon config file +$sshconfig = 'curl_ssh_config'; # ssh client config file +$sshdlog = 'log/sshd.log'; # ssh daemon log file +$sshlog = 'log/ssh.log'; # ssh client log file +$knownhosts = 'curl_client_knownhosts'; # ssh knownhosts file +$hstprvkeyf = 'curl_host_dsa_key'; # host private key file +$hstpubkeyf = 'curl_host_dsa_key.pub'; # host public key file +$cliprvkeyf = 'curl_client_key'; # client private key file +$clipubkeyf = 'curl_client_key.pub'; # client public key file + + +#*************************************************************************** +# Absolute paths where to look for sftp-server plugin +# +@sftppath = qw( + /usr/lib/openssh + /usr/libexec/openssh + /usr/libexec + /usr/local/libexec + /opt/local/libexec + /usr/lib/ssh + /usr/libexec/ssh + /usr/sbin + /usr/lib + /usr/lib/ssh/openssh + /usr/lib64/ssh + /usr/lib64/misc + /usr/lib/misc + /usr/local/sbin + /usr/freeware/bin + /opt/ssh/sbin + /opt/ssh/libexec + ); + + +#*************************************************************************** +# Return file extension for executable files on this operating system +# +sub exe_ext { + if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys' || + $^O eq 'dos' || $^O eq 'os2') { + return '.exe'; + } +} + + +#*************************************************************************** +# Create or overwrite the given file with lines from an array of strings +# +sub dump_array { + my ($filename, @arr) = @_; + my $error; + + if(!$filename) { + $error = 'Error: Missing argument 1 for dump_array()'; + } + elsif(open(TEXTFH, ">$filename")) { + foreach my $line (@arr) { + $line .= "\n" unless($line =~ /\n$/); + print TEXTFH $line; + } + if(!close(TEXTFH)) { + $error = "Error: cannot close file $filename"; + } + } + else { + $error = "Error: cannot write file $filename"; + } + return $error; +} + + +#*************************************************************************** +# Display a message +# +sub logmsg { + my ($line) = @_; + chomp $line if($line); + $line .= "\n"; + print "$line"; +} + + +#*************************************************************************** +# Display contents of the given file +# +sub display_file { + my $filename = $_[0]; + print "=== Start of file $filename\n"; + if(open(DISPLAYFH, "<$filename")) { + while(my $line = <DISPLAYFH>) { + print "$line"; + } + close DISPLAYFH; + } + print "=== End of file $filename\n"; +} + + +#*************************************************************************** +# Display contents of the ssh daemon config file +# +sub display_sshdconfig { + display_file($sshdconfig); +} + + +#*************************************************************************** +# Display contents of the ssh client config file +# +sub display_sshconfig { + display_file($sshconfig); +} + + +#*************************************************************************** +# Display contents of the ssh daemon log file +# +sub display_sshdlog { + display_file($sshdlog); +} + + +#*************************************************************************** +# Display contents of the ssh client log file +# +sub display_sshlog { + display_file($sshlog); +} + + +#*************************************************************************** +# Find a file somewhere in the given path +# +sub find_file { + my $fn = $_[0]; + shift; + my @path = @_; + foreach (@path) { + my $file = File::Spec->catfile($_, $fn); + if(-e $file) { + return $file; + } + } +} + + +#*************************************************************************** +# Find a file in environment path or in our sftppath +# +sub find_sfile { + my $filename = $_[0]; + my @spath; + push(@spath, File::Spec->path()); + push(@spath, @sftppath); + return find_file($filename, @spath); +} + + +#*************************************************************************** +# Find ssh daemon and return canonical filename +# +sub find_sshd { + return find_sfile($sshdexe); +} + + +#*************************************************************************** +# Find ssh client and return canonical filename +# +sub find_ssh { + return find_sfile($sshexe); +} + + +#*************************************************************************** +# Find sftp-server plugin and return canonical filename +# +sub find_sftp { + return find_sfile($sftpexe); +} + + +#*************************************************************************** +# Find ssh-keygen and return canonical filename +# +sub find_sshkeygen { + return find_sfile($sshkeygenexe); +} + + +#*************************************************************************** +# Return version info for the given ssh client or server binaries +# +sub sshversioninfo { + my $sshbin = $_[0]; # canonical filename + my $major; + my $minor; + my $patch; + my $sshid; + my $versnum; + my $versstr; + my $error; + + if(!$sshbin) { + $error = 'Error: Missing argument 1 for sshversioninfo()'; + } + elsif(! -x $sshbin) { + $error = "Error: cannot read or execute $sshbin"; + } + else { + my $cmd = ($sshbin =~ /$sshdexe$/) ? "$sshbin -?" : "$sshbin -V"; + $error = "$cmd\n"; + foreach my $tmpstr (qx($cmd 2>&1)) { + if($tmpstr =~ /OpenSSH[_-](\d+)\.(\d+)(\.(\d+))*/i) { + $major = $1; + $minor = $2; + $patch = $4?$4:0; + $sshid = 'OpenSSH'; + $versnum = (100*$major) + (10*$minor) + $patch; + $versstr = "$sshid $major.$minor.$patch"; + $error = undef; + last; + } + if($tmpstr =~ /Sun[_-]SSH[_-](\d+)\.(\d+)(\.(\d+))*/i) { + $major = $1; + $minor = $2; + $patch = $4?$4:0; + $sshid = 'SunSSH'; + $versnum = (100*$major) + (10*$minor) + $patch; + $versstr = "$sshid $major.$minor.$patch"; + $error = undef; + last; + } + $error .= $tmpstr; + } + chomp $error if($error); + } + return ($sshid, $versnum, $versstr, $error); +} + + +#*************************************************************************** +# End of library +1; + |