先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也先帝は天下を興す志半ばにして志半ばにして崩御されました。今、天下は三つに分かれ、益州は疲弊しており、まさに存亡の危機に瀕しております。しかしながら、宮中で職務に励む臣下や、外地で身を顧みず尽力する志士たちがいるのは、ひとえに先帝から受けた格別な恩義を思い、陛下に報いようとする志があるからです。今こそ陛下には広く臣下の意見に耳を傾け、先帝の遺徳を輝かせ、志士たちの士気を高めるべきです。決して自らを卑下したり、不適切な例えを用いて忠言の道を閉ざしたりしてはなりません。鍏堝笣鍒涗笟鏈崐鑰屼腑閬撳穿娈傦紝浠婂ぉ涓嬩笁鍒嗭紝鐩婂窞鐤插紛锛屾璇氬嵄鎬ュ瓨浜′箣绉嬩篃銆傜劧渚嶅崼涔嬭嚕涓嶆噲浜庡唴锛屽繝蹇椾箣澹繕韬簬澶栬€咃紝鐩栬拷鍏堝笣涔嬫畩閬囷紝娆叉姤涔嬩簬闄涗笅涔熴€傝瘹瀹滃紑寮犲湥鍚紝浠ュ厜鍏堝笣閬楀痉锛屾仮寮樺織澹箣姘旓紝涓嶅疁濡勮嚜鑿茶杽锛屽紩鍠诲け涔夛紝浠ュ蹇犺皬涔嬭矾涔
Current path: usr/local/cpanel/scripts/
#!/usr/local/cpanel/3rdparty/bin/perl
# cpanel - scripts/ssl_crt_status Copyright 2022 cPanel, L.L.C.
# All rights reserved.
# copyright@cpanel.net http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited
package scripts::ssl_crt_status;
use strict;
use warnings;
use Cpanel::SSLPath ();
use Cpanel::SSLInfo ();
use Getopt::Param ();
use Cpanel::StringFunc ();
use Cpanel::ArrayFunc ();
use Term::ANSIColor ();
use Cpanel::Config::LoadUserDomains ();
use Cpanel::Hostname ();
__PACKAGE__->run() unless caller();
sub run {
my $param = Getopt::Param->new(
{
'quiet' => 0,
'help_coderef' => sub {
print <<"END_HELP";
$0 - give a status report of the server's SSL certificates
--help this screen
--verbose show more than just errors
--verbose=long include verification result of valid crts
By default it will check every domain, you can specify one or more specific
domains to check by passing one or more --domain flags:
--domain=your.domain.here --domain=other.domain.here
END_HELP
exit;
},
}
);
my $debug = $param->get_param('debug');
my $verbose = $param->get_param('verbose');
my @domains = Cpanel::ArrayFunc::uniq_from_arrayrefs( [ $param->exists_param('domain') ? $param->get_param('domain') : ( Cpanel::Hostname::gethostname(), grep( !/^\*/, sort keys %{ Cpanel::Config::LoadUserDomains::loaduserdomains( undef, 1 ) } ) ) ] );
if ( grep /^--domain$/, @domains ) {
print "Domain must be unambiguously specified in this format --domain=fqdn.tld\n\n";
$param->help();
}
my $sslroot = Cpanel::SSLPath::getsslroot();
print "[info] SSL root: $sslroot\n" if $verbose;
if ($debug) {
require Data::Dumper;
}
# fetchinfo() is and verifysslcert() may still be "loud"
close STDERR; # just to be on the safe side
open STDERR, '>', '/dev/null'; ## no critic qw(InputOutput::RequireCheckedOpen)
for my $domain (@domains) {
my $ssl_info_hr = Cpanel::SSLInfo::fetchinfo($domain);
if ($debug) {
print Data::Dumper::Dumper($ssl_info_hr);
}
if ( $ssl_info_hr->{'statusmsg'} =~ /^No certificate for the domain \S+ could be found[.]$/ ) {
if ($verbose) {
print Term::ANSIColor::color 'bold blue';
print "Ok: $domain does not have an SSL crt\n";
print Term::ANSIColor::color 'reset';
}
}
else {
my ( $rc, $msg ) = Cpanel::SSLInfo::verifysslcert(
$sslroot,
$ssl_info_hr->{'crt'},
$ssl_info_hr->{'key'},
$ssl_info_hr->{'cab'},
1, # makes verifysslcert() not do any print()s
1, # makes verifysslcert() return plain text instead of HTML
);
if ($rc) {
if ($verbose) {
print Term::ANSIColor::color 'bold green';
print "Ok: $domain SSL crt verified\n";
print Term::ANSIColor::color 'reset';
if ( $verbose eq 'long' ) {
print Cpanel::StringFunc::indent_string($msg) . "\n";
}
}
}
else {
print Term::ANSIColor::color 'bold red';
print "Error: $domain SSL crt verification failed:\n";
print Term::ANSIColor::color 'reset';
print Cpanel::StringFunc::indent_string($msg) . "\n";
}
}
}
return 1;
}
1;