#!/usr/bin/env perl #****************************************************************************** # @(#) convert_pubkey.pl #****************************************************************************** # @(#) Copyright (C) 2014 by KUDOS BVBA . All rights reserved. # # This program is a free software; you can redistribute it and/or modify # it under the same terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details #****************************************************************************** #****************************************************************************** # PRAGMAs/LIBs #****************************************************************************** use strict; use Getopt::Long; use Pod::Usage; #****************************************************************************** # DATA structures #****************************************************************************** # ------------------------- CONFIGURATION starts here ------------------------- # define the V.R.F (version/release/fix) my $MY_VRF = "1.0.0"; # always assume RSA keys! my $key_algo = 'ssh-rsa'; # ------------------------- CONFIGURATION ends here --------------------------- # initialize variables my (%options, @key_file); my ($key_file, $key_label, $key_line, $key_type); $|++; #****************************************************************************** # MAIN routine #****************************************************************************** # ----------------------------------------------------------------------------- # process script arguments & options # ----------------------------------------------------------------------------- unless (@ARGV > 0) { pod2usage(-verbose => 0) }; Getopt::Long::Configure ('prefix_pattern=(--|-|\/)', 'bundling', 'no_ignore_case'); GetOptions (\%options, qw( file|f=s help|h|? label|l=s version|V )); pod2usage(-verbose => 0) unless (%options); # check version parameter if ($options{'version'}) { print "INFO: $0: version $MY_VRF"; exit (0); } # check help parameter if ($options{'help'}) { pod2usage(-verbose => 3); exit (0); }; # check file parameter if ($options{'file'}) { $key_file = $options{'file'}; unless (-f $key_file) { die "ERROR: input file $key_file not found [$!]"; } } else { die "ERROR: missing value for --file parameter"; } # check label parameter if ($options{'label'}) { $key_label = $options{'label'}; if (not (defined ($key_label) or $key_label eq "")) { die "ERROR: key label not defined"; } } else { die "ERROR: missing value for --label parameter"; } # ----------------------------------------------------------------------------- # read key file contents & process key # ----------------------------------------------------------------------------- open (KEY_FILE, $key_file) or die "ERROR: unable to read file"; chomp (@key_file = ); close (KEY_FILE); # determine type of key if (grep { /$key_algo/ } @key_file) { $key_type = 1; } else { $key_type = 2; } # process key SWITCH: { $key_type == 1 && do { # 1 line only!! foreach (@key_file) { chomp; ($key_algo, $key_line) = split (/ /); }; last SWITCH; }; $key_type == 2 && do { foreach (@key_file) { chomp; # skip BEGIN/END lines next if (/^----/); # skip Comment field next if (/^Comment/); $key_line .= $_; } last SWITCH; }; } # mangle space in label $key_label =~ tr/ /_/s; # print result print "$key_label,$key_algo,$key_line\n"; exit (0); #****************************************************************************** # End of SCRIPT #****************************************************************************** #****************************************************************************** # POD #****************************************************************************** # ----------------------------------------------------------------------------- =head1 NAME convert_pubkey.pl - converts public keys for SSH controls format (SSH-RSA) =head1 SYNOPSIS convert_pubkey.pl -f|--file= -l|--label= [-h|--help] [-V|--version] =head1 DESCRIPTION B converts public keys generated by PuTTYgen or ssh-keygen into the correct format for the SSH controls key store. =head1 OPTIONS =over 2 =item -h | --help S< >Show the help page. =item -f | --file S< >File containing the public key to be converted. =item -l | --label S< >Name for the public key in SSH control. This name will be used as identifier of the key in the different SSH controls configuration files. =item -V | --version S< >Show version of the script. =back =head1 NOTES =over 2 =item * Options may be preceded by a - (dash), -- (double dash) or a / (slash). =back =head1 AUTHOR (c) KUDOS BVBA, Patrick Van der Veken =head1 HISTORY @(#) 2014-12-20: VRF 1.0.0: first version [Patrick Van der Veken]