Skip to content

Commit

Permalink
Add some sane defaults, some enviromental variable overrides, fix aut…
Browse files Browse the repository at this point in the history
…oconf, and add more error trapping
  • Loading branch information
jtsage authored and sumpfralle committed Nov 28, 2020
1 parent 36c2911 commit eb7a1e7
Showing 1 changed file with 63 additions and 26 deletions.
89 changes: 63 additions & 26 deletions plugins/ssl/certbot_expiry
Expand Up @@ -17,6 +17,8 @@ This script requires root permissions to run, in your munin-node configuration:
[certbot_expiry]
user root
env.openssl_bin Path to openssl, default: /usr/bin/openssl
env.certs_path Path to certificate renewal files, default: /etc/letsencrypt/renewal
=head1 CAPABILITIES
Expand Down Expand Up @@ -52,19 +54,42 @@ use Munin::Plugin;
use Date::Parse;
use POSIX;

my $openSSL = $ENV{'OPENSSL_BIN'} || "/usr/bin/openssl";
my $certPATH = $ENV{'CERTS_PATH'} || "/etc/letsencrypt/renewal";
my $DEBUG = $ENV{'MUNIN_DEBUG'} || 0;

if ( defined($ARGV[0]) && $ARGV[0] eq "autoconf" ) {
if ( -e "/usr/bin/openssl" ) {
print "no (Root User Required)\n";
my $keyPATH = $certPATH;
$keyPATH =~ s/renewal/live/;
if ( ! ( -e $openSSL) ) {
print "no (OpenSSL not found)\n";
} else {
print "no (OpenSSL Not Found)\n";
if ( ! (-e -r -d $certPATH) ) {
print "no (Certificates folder not found or not readable)\n";
} else {
if ( !( -e -r -d $keyPATH ) ) {
print "no (Key folder not found or not readable - requires elevated permissions [root])\n";
} else {
print "yes\n";
}
}
}
exit;
}

# Sanity Check enviroment.
if ( ! -e $openSSL ) {
die "FATAL: OpenSSL not found.";
}
if ( ! (-e -r -d $certPATH) ) {
die "FATAL: Certificate folder not found or not readable";
}

my %thecerts = get_data();




if ( defined($ARGV[0]) && $ARGV[0] eq "config" ) {
# Do the config step for each set of graphs
do_config(%thecerts);
Expand Down Expand Up @@ -107,46 +132,58 @@ sub get_data {
my $runtime = time();
my %cert_files;
# Get Renewal Files
opendir(DIR, "/etc/letsencrypt/renewal");
opendir(DIR, $certPATH);
my @renew_files = grep(/\.conf$/,readdir(DIR));
closedir(DIR);

# Each renewal file
foreach my $file (@renew_files) {
my @this_renew = `cat /etc/letsencrypt/renewal/$file`;
my @this_renew = `cat $certPATH/$file`;

my $cert_name = $file;
$cert_name =~ s/\.conf//;

my $safe_name = $cert_name;
$safe_name =~ s/\./_/g;


$cert_files{$cert_name}{"name"} = $cert_name;
$cert_files{$cert_name}{"safename"} = $safe_name;

# cert is listed
foreach my $line ( @this_renew ) {
if ( $line =~ /cert = (.+?)$/ ) {
# define some sane defaults should something go wrong.
$cert_files{$cert_name} = {
"name" => $cert_name,
"safename" => $safe_name,
"cert" => "",
"expdays" => 0,
"info" => ""
};

# key file is listed in renewal file, get it.
foreach ( @this_renew ) {
if ( $_ =~ /cert = (.+?)$/ ) {
$cert_files{$cert_name}{"cert"} = $1;
}
}

# use openssl for the info
my @ssl_info = `openssl x509 -noout -in $cert_files{$cert_name}{"cert"} -text -certopt no_subject,no_header,no_version,no_serial,no_signame,no_validity,no_issuer,no_pubkey,no_sigdump,no_aux -enddate`;

# parse for SAN and expiry
foreach my $line ( @ssl_info ) {
if ( $line =~ /notAfter=(.+?)$/ ) {
$cert_files{$cert_name}{"expdate"} = $1;
$cert_files{$cert_name}{"expdays"} = floor((str2time($1) - $runtime)/(60*60*24));
}
if ( $line =~ /(DNS:.+?)$/ ) {
my $san_line = $1;
$san_line =~ s/DNS://g;
$cert_files{$cert_name}{"info"} = $san_line;
if ( $cert_files{$cert_name}{"cert"} ne "" ) {
if ( ! -f -r $cert_files{$cert_name}{"cert"}) {
# warn, only on debuging, that a file couldn't be opened. sane defaults will show zero days remaining for this certificate
if ( $DEBUG ) { print "# WARNING: {$cert_name} certificate not found or not readable" }
} else {
# use openssl for the info
my @ssl_info = `$openSSL x509 -noout -in $cert_files{$cert_name}{"cert"} -text -certopt no_subject,no_header,no_version,no_serial,no_signame,no_validity,no_issuer,no_pubkey,no_sigdump,no_aux -enddate`;

foreach my $line ( @ssl_info ) {
if ( $line =~ /notAfter=(.+?)$/ ) {
# Grab the expiration date, convert it to days, rounding down.
$cert_files{$cert_name}{"expdays"} = floor((str2time($1) - $runtime)/(60*60*24));
}
if ( $line =~ /(DNS:.+?)$/ ) {
# Grab the list of SubjectAlternativeNames, set the info line to that.
my $san_line = $1;
$san_line =~ s/DNS://g;
$cert_files{$cert_name}{"info"} = $san_line;
}
}
}
}
}
}

return %cert_files;
Expand Down

0 comments on commit eb7a1e7

Please sign in to comment.