Annotation of embedaddon/curl/tests/sshhelp.pm, revision 1.1.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>