aboutsummaryrefslogtreecommitdiff
path: root/rcynic
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2010-05-05 20:41:16 +0000
committerRob Austein <sra@hactrn.net>2010-05-05 20:41:16 +0000
commitc8c8537101ded5a924e41252121201c8c42a88b0 (patch)
treeb25a0a7c4b5a88cb04d34ff5df60b4259e1fb915 /rcynic
parent6225d178bce94f18861a9f06977e3a275f6feee8 (diff)
Add classification of the ten zillion codes to XML output, use that to
do a bit more color coding. svn path=/rcynic/rcynic.c; revision=3238
Diffstat (limited to 'rcynic')
-rw-r--r--rcynic/rcynic.c140
-rw-r--r--rcynic/rcynic.xsl41
2 files changed, 109 insertions, 72 deletions
diff --git a/rcynic/rcynic.c b/rcynic/rcynic.c
index a8d59dab..ec934e86 100644
--- a/rcynic/rcynic.c
+++ b/rcynic/rcynic.c
@@ -186,68 +186,85 @@ static const struct {
*/
#define MIB_COUNTERS \
- QQ(validation_ok, "OK") \
- QQ(backup_cert_accepted, "Backup certificates accepted") \
- QQ(backup_cert_rejected, "Backup certificates rejected") \
- QQ(backup_crl_accepted, "Backup CRLs accepted") \
- QQ(backup_crl_rejected, "Backup CRLs rejected") \
- QQ(current_cert_accepted, "Current certificates accepted") \
- QQ(current_cert_rejected, "Current certificates rejected") \
- QQ(current_crl_accepted, "Current CRLs accepted") \
- QQ(current_crl_rejected, "Current CRLs rejected") \
- QQ(current_manifest_accepted, "Current Manifests accepted") \
- QQ(current_manifest_rejected, "Current Manifests rejected") \
- QQ(backup_manifest_accepted, "Backup Manifests accepted") \
- QQ(backup_manifest_rejected, "Backup Manifests rejected") \
- QQ(rsync_failed, "rsync transfers failed") \
- QQ(rsync_succeeded, "rsync transfers succeeded") \
- QQ(rsync_timed_out, "rsync transfers timed out") \
- QQ(stale_crl, "Stale CRLs") \
- QQ(malformed_sia, "Malformed SIA extensions") \
- QQ(sia_missing, "SIA extensions missing") \
- QQ(aia_missing, "AIA extensions missing") \
- QQ(crldp_missing, "CRLDP extensions missing") \
- QQ(aia_mismatch, "Mismatched AIA extensions") \
- QQ(unknown_verify_error, "Unknown OpenSSL verify error") \
- QQ(current_cert_recheck, "Certificates rechecked") \
- QQ(manifest_invalid_ee, "Invalid manifest certificates") \
- QQ(manifest_invalid_cms, "Manifest validation failures") \
- QQ(manifest_decode_error, "Manifest decode errors") \
- QQ(stale_manifest, "Stale manifests") \
- QQ(manifest_not_yet_valid, "Manifests not yet valid") \
- QQ(manifest_bad_econtenttype, "Bad manifest eContentType") \
- QQ(manifest_missing_signer, "Missing manifest signers") \
- QQ(manifest_missing_crldp, "Missing manifest CRLDP") \
- QQ(manifest_malformed_crldp, "Malformed manifest CRLDP") \
- QQ(certificate_digest_mismatch, "Certificate digest mismatches") \
- QQ(crl_digest_mismatch, "CRL digest mismatches") \
- QQ(crl_not_in_manifest, "CRL not listed in manifest") \
- QQ(roa_invalid_ee, "Invalid ROA certificates") \
- QQ(roa_invalid_cms, "ROA validation failures") \
- QQ(roa_decode_error, "ROA decode errors") \
- QQ(roa_bad_econtenttype, "Bad ROA eContentType") \
- QQ(roa_missing_signer, "Missing ROA signers") \
- QQ(roa_digest_mismatch, "ROA digest mismatches") \
- QQ(current_roa_accepted, "Current ROAs accepted") \
- QQ(current_roa_rejected, "Current ROAs rejected") \
- QQ(backup_roa_accepted, "Backup ROAs accepted") \
- QQ(backup_roa_rejected, "Backup ROAs rejected") \
- QQ(malformed_roa_addressfamily, "Malformed ROA addressFamilys") \
- QQ(manifest_wrong_version, "Wrong manifest versions") \
- QQ(roa_wrong_version, "Wrong ROA versions") \
- QQ(trust_anchor_not_self_signed, "Trust anchor not self-signed") \
- QQ(uri_too_long, "URI too long") \
- QQ(malformed_crldp, "Malformed CRDLP extension") \
- QQ(certificate_bad_signature, "Bad certificate signature") \
- QQ(certificate_bad_crl, "Bad certificate CRL") \
- QQ(manifest_bad_crl, "Manifest has bad CRL") \
- QQ(roa_resources_malformed, "ROA resources malformed") \
- QQ(roa_bad_afi, "ROA contains bad AFI value") \
- QQ(roa_not_nested, "ROA resources not in EE") \
- QQ(roa_bad_crl, "ROA EE has bad CRL") \
+ QG(validation_ok, "OK") \
+ QG(backup_cert_accepted, "Backup certificates accepted") \
+ QB(backup_cert_rejected, "Backup certificates rejected") \
+ QG(backup_crl_accepted, "Backup CRLs accepted") \
+ QB(backup_crl_rejected, "Backup CRLs rejected") \
+ QG(current_cert_accepted, "Current certificates accepted") \
+ QB(current_cert_rejected, "Current certificates rejected") \
+ QG(current_crl_accepted, "Current CRLs accepted") \
+ QB(current_crl_rejected, "Current CRLs rejected") \
+ QG(current_manifest_accepted, "Current Manifests accepted") \
+ QB(current_manifest_rejected, "Current Manifests rejected") \
+ QG(backup_manifest_accepted, "Backup Manifests accepted") \
+ QB(backup_manifest_rejected, "Backup Manifests rejected") \
+ QB(rsync_failed, "rsync transfers failed") \
+ QG(rsync_succeeded, "rsync transfers succeeded") \
+ QB(rsync_timed_out, "rsync transfers timed out") \
+ QW(stale_crl, "Stale CRLs") \
+ QB(malformed_sia, "Malformed SIA extensions") \
+ QB(sia_missing, "SIA extensions missing") \
+ QB(aia_missing, "AIA extensions missing") \
+ QB(crldp_missing, "CRLDP extensions missing") \
+ QB(aia_mismatch, "Mismatched AIA extensions") \
+ QB(unknown_verify_error, "Unknown OpenSSL verify error") \
+ QG(current_cert_recheck, "Certificates rechecked") \
+ QB(manifest_invalid_ee, "Invalid manifest certificates") \
+ QB(manifest_invalid_cms, "Manifest validation failures") \
+ QB(manifest_decode_error, "Manifest decode errors") \
+ QW(stale_manifest, "Stale manifests") \
+ QB(manifest_not_yet_valid, "Manifests not yet valid") \
+ QB(manifest_bad_econtenttype, "Bad manifest eContentType") \
+ QB(manifest_missing_signer, "Missing manifest signers") \
+ QB(manifest_missing_crldp, "Missing manifest CRLDP") \
+ QB(manifest_malformed_crldp, "Malformed manifest CRLDP") \
+ QB(certificate_digest_mismatch, "Certificate digest mismatches") \
+ QB(crl_digest_mismatch, "CRL digest mismatches") \
+ QB(crl_not_in_manifest, "CRL not listed in manifest") \
+ QB(roa_invalid_ee, "Invalid ROA certificates") \
+ QB(roa_invalid_cms, "ROA validation failures") \
+ QB(roa_decode_error, "ROA decode errors") \
+ QB(roa_bad_econtenttype, "Bad ROA eContentType") \
+ QB(roa_missing_signer, "Missing ROA signers") \
+ QB(roa_digest_mismatch, "ROA digest mismatches") \
+ QG(current_roa_accepted, "Current ROAs accepted") \
+ QB(current_roa_rejected, "Current ROAs rejected") \
+ QG(backup_roa_accepted, "Backup ROAs accepted") \
+ QB(backup_roa_rejected, "Backup ROAs rejected") \
+ QB(malformed_roa_addressfamily, "Malformed ROA addressFamilys") \
+ QB(manifest_wrong_version, "Wrong manifest versions") \
+ QB(roa_wrong_version, "Wrong ROA versions") \
+ QW(trust_anchor_not_self_signed, "Trust anchor not self-signed") \
+ QB(uri_too_long, "URI too long") \
+ QB(malformed_crldp, "Malformed CRDLP extension") \
+ QB(certificate_bad_signature, "Bad certificate signature") \
+ QB(certificate_bad_crl, "Bad certificate CRL") \
+ QB(manifest_bad_crl, "Manifest has bad CRL") \
+ QB(roa_resources_malformed, "ROA resources malformed") \
+ QB(roa_bad_afi, "ROA contains bad AFI value") \
+ QB(roa_not_nested, "ROA resources not in EE") \
+ QB(roa_bad_crl, "ROA EE has bad CRL") \
MIB_COUNTERS_FROM_OPENSSL
-#define QV(x) QQ(mib_openssl_##x, 0)
+#define QV(x) QB(mib_openssl_##x, 0)
+
+static const char
+ mib_counter_kind_good[] = "good",
+ mib_counter_kind_warn[] = "warn",
+ mib_counter_kind_bad[] = "bad";
+
+#define QG(x,y) mib_counter_kind_good ,
+#define QW(x,y) mib_counter_kind_warn ,
+#define QB(x,y) mib_counter_kind_bad ,
+static const char * const mib_counter_kind[] = { MIB_COUNTERS NULL };
+#undef QB
+#undef QW
+#undef QG
+
+#define QG(x,y) QQ(x,y)
+#define QW(x,y) QQ(x,y)
+#define QB(x,y) QQ(x,y)
#define QQ(x,y) x ,
typedef enum mib_counter { MIB_COUNTERS MIB_COUNTER_T_MAX } mib_counter_t;
@@ -3216,7 +3233,8 @@ int main(int argc, char *argv[])
tad, svn_id, XML_SUMMARY_VERSION, hostname) != EOF;
for (j = 0; ok && j < MIB_COUNTER_T_MAX; ++j)
- ok &= fprintf(f, " <%s>%s</%s>\n", mib_counter_label[j],
+ ok &= fprintf(f, " <%s kind=\"%s\">%s</%s>\n",
+ mib_counter_label[j], mib_counter_kind[j],
(mib_counter_desc[j]
? mib_counter_desc[j]
: X509_verify_cert_error_string(mib_counter_openssl[j])),
diff --git a/rcynic/rcynic.xsl b/rcynic/rcynic.xsl
index 1e349834..1fb0eb86 100644
--- a/rcynic/rcynic.xsl
+++ b/rcynic/rcynic.xsl
@@ -62,6 +62,19 @@
</xsl:for-each>
</xsl:variable>
+ <xsl:variable name="moods">
+ <xsl:for-each select="rcynic-summary/host">
+ <xsl:variable name="hostname" select="hostname"/>
+ <xsl:for-each select="*[not(self::hostname)]">
+ <xsl:variable name="label" select="name()"/>
+ <xsl:variable name="mood" select="/rcynic-summary/labels/*[name() = $label]/@kind"/>
+ <x hostname="{$hostname}" mood="{$mood}">
+ <xsl:value-of select="."/>
+ </x>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:variable>
+
<xsl:template match="/">
<xsl:comment>Generators</xsl:comment>
<xsl:comment><xsl:value-of select="rcynic-summary/@rcynic-version"/></xsl:comment>
@@ -81,9 +94,9 @@
<style type="text/css">
td { text-align: center; padding: 4px }
td.uri { text-align: left }
- tr.happy { background-color: #77ff77 }
- tr.warning { background-color: yellow }
- tr.danger { background-color: #ff5500 }
+ tr.good { background-color: #77ff77 }
+ tr.warn { background-color: yellow }
+ tr.bad { background-color: #ff5500 }
</style>
</head>
<body>
@@ -105,7 +118,18 @@
<xsl:for-each select="rcynic-summary/host">
<xsl:sort order="descending" data-type="number" select="sum(*[not(self::hostname)])"/>
<xsl:sort order="ascending" data-type="text" select="hostname"/>
- <tr>
+ <xsl:variable name="hostname" select="hostname"/>
+ <xsl:variable name="goodness" select="sum(exslt:node-set($moods)/x[@hostname = $hostname and @mood = 'good'])"/>
+ <xsl:variable name="badness" select="sum(exslt:node-set($moods)/x[@hostname = $hostname and @mood = 'bad'])"/>
+ <xsl:variable name="warnings" select="sum(exslt:node-set($moods)/x[@hostname = $hostname and @mood = 'warn'])"/>
+ <xsl:variable name="mood">
+ <xsl:choose>
+ <xsl:when test="$goodness != 0 and $warnings = 0 and $badness = 0">good</xsl:when>
+ <xsl:when test="$goodness + $warnings != 0">warn</xsl:when>
+ <xsl:otherwise>bad</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <tr class="{$mood}">
<xsl:for-each select="*">
<xsl:variable name="p" select="position()"/>
<xsl:if test="$suppress-zero-columns = 0 or position() = 1 or exslt:node-set($sums)/x[$p]/@sum &gt; 0">
@@ -139,14 +163,9 @@
<tbody>
<xsl:for-each select="rcynic-summary/validation_status">
<xsl:variable name="status" select="@status"/>
- <xsl:variable name="mood">
- <xsl:choose>
- <xsl:when test="$status = 'validation_ok'">happy</xsl:when>
- <xsl:otherwise>danger</xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
+ <xsl:variable name="mood" select="/rcynic-summary/labels/*[name() = $status]/@kind"/>
<tr class="{$mood}">
- <td class="timestamp"><xsl:value-of select="@timestamp"/></td>
+ <td class="timestamp"><xsl:value-of select="@timestamp"/></td>
<td class="status"><xsl:value-of select="/rcynic-summary/labels/*[name() = $status] "/></td>
<td class="uri"><xsl:value-of select="."/></td>
</tr>