VMware-Photon-OS/SPECS/cve-check-tool/0003-New-option-r-to-select...

179 lines
7.2 KiB
Diff

From da5e5d68da2c08aab7245c51117c48ed008470b7 Mon Sep 17 00:00:00 2001
From: Alexey Makhalov <amakhalov@vmware.com>
Date: Wed, 31 Aug 2016 11:11:31 +0000
Subject: [PATCH 3/9] New option '-r' to select a report plugin
Deprecate --csv and --no-html command line option, and
use single parameter to select output plugin -r
Available options: -r csv, -r cli, -r html. List of available
output plugins -r list.
---
src/main.c | 69 +++++++++++++++++++++++++++++++++++++-------------------------
1 file changed, 41 insertions(+), 28 deletions(-)
diff --git a/src/main.c b/src/main.c
index 8593c17..5bb16c9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -283,8 +283,7 @@ static bool _show_version = false;
static bool skip_update = false;
static gchar *nvds = NULL;
static gchar *forced_type = NULL;
-static bool no_html = false;
-static bool csv_mode = false;
+static gchar *report_type = NULL;
static char *modified_stamp = NULL;
static gchar *mapping_file = NULL;
static gchar *output_file = NULL;
@@ -297,10 +296,9 @@ static GOptionEntry _entries[] = {
{ "nvd-dir", 'd', 0, G_OPTION_ARG_STRING, &nvds, "NVD directory in filesystem", NULL },
{ "version", 'v', 0, G_OPTION_ARG_NONE, &_show_version, "Show version", NULL },
{ "type", 't', 0, G_OPTION_ARG_STRING, &forced_type, "Set package type to T", "T" },
- { "no-html", 'N', 0, G_OPTION_ARG_NONE, &no_html, "Disable HTML report", NULL },
+ { "report", 'r', 0, G_OPTION_ARG_STRING, &report_type, "Set report type to R", "R" },
{ "modified", 'm', 0, G_OPTION_ARG_STRING, &modified_stamp, "Ignore reports after modification date", "D" },
{ "srpm-dir", 's', 0, G_OPTION_ARG_STRING, &srpm_dir, "Source RPM directory", "S" },
- { "csv", 'c', 0, G_OPTION_ARG_NONE, &csv_mode, "Output CSV formatted data only", NULL },
{ "mapping", 'M', 0, G_OPTION_ARG_STRING, &mapping_file, "Path to a mapping file", NULL},
{ "output-file", 'o', 0, G_OPTION_ARG_STRING, &output_file, "Path to the output file (output plugin specific)", NULL},
{ "use-fractional-compare", 'f', 0, G_OPTION_ARG_NONE, &use_frac_compare, "CVE version string fractional compare", NULL },
@@ -387,7 +385,7 @@ end:
return ret;
}
-static gchar *supported_packages(GList *plugins)
+static gchar *supported_plugins(GList *plugins)
{
uint len;
CvePlugin *plugin = NULL;
@@ -400,7 +398,7 @@ static gchar *supported_packages(GList *plugins)
plugin = g_list_nth_data(plugins, 0);
if (!asprintf(&r, "%s", plugin->name)) {
- fprintf(stderr, "supported_packages(): Out of memory\n");
+ fprintf(stderr, "supported_plugins(): Out of memory\n");
abort();
}
@@ -409,7 +407,7 @@ static gchar *supported_packages(GList *plugins)
plugin = g_list_nth_data(plugins, i);
if (!asprintf(&t, "%s, %s", r, plugin->name)) {
- fprintf(stderr, "supported_packages(): Out of memory\n");
+ fprintf(stderr, "supported_plugins(): Out of memory\n");
abort();
}
free(r);
@@ -479,6 +477,7 @@ int main(int argc, char **argv)
autofree(cve_string) *db_path = NULL;
autofree(CveDB) *cve_db = NULL;
GList *pkg_plugins = NULL;
+ GList *report_plugins = NULL;
int ret = EXIT_FAILURE;
CveToolInstance instance = { .pkg_plugin = NULL };
time_t ti;
@@ -501,13 +500,10 @@ int main(int argc, char **argv)
goto cleanup_no_lock;
}
- quiet = csv_mode || !no_html;
self->output_file = output_file;
self->cacert_file = cacert_file;
- if (!csv_mode && self->output_file) {
- quiet = false;
- }
+ quiet = !self->output_file;
if (_show_version) {
show_version();
@@ -569,6 +565,12 @@ int main(int argc, char **argv)
goto cleanup;
}
+ report_plugins = cve_plugin_get_by_cap(PLUGIN_TYPE_REPORT);
+ if (!report_plugins || g_list_length(report_plugins) < 1) {
+ fprintf(stderr, "Cannot find any reporting plugins on this system.\n");
+ goto cleanup;
+ }
+
if (srpm_dir) {
if (!cve_is_dir(srpm_dir)) {
fprintf(stderr, "srpm directory does not exist or is not a directory\n");
@@ -581,7 +583,7 @@ int main(int argc, char **argv)
if (forced_type) {
if (g_str_equal(forced_type, "list")) {
/* Print a list of 'em */
- autofree(gchar) *list = supported_packages(pkg_plugins);
+ autofree(gchar) *list = supported_plugins(pkg_plugins);
printf("Currently supported package types: %s\n", list);
goto cleanup;
} else {
@@ -599,6 +601,30 @@ int main(int argc, char **argv)
}
}
+ if (!report_type) {
+ report_type = "html";
+ }
+ if (g_str_equal(report_type, "list")) {
+ /* Print a list of 'em */
+ autofree(gchar) *list = supported_plugins(report_plugins);
+ printf("Currently supported report types: %s\n", list);
+ goto cleanup;
+ } else {
+ report = cve_plugin_get_by_name(report_type);
+ if (!report) {
+ fprintf(stderr, "Plugin \'%s\' not found.\n", report_type);
+ goto cleanup;
+ }
+ if (!(report->flags & PLUGIN_TYPE_REPORT)) {
+ fprintf(stderr, "Plugin \'%s\' is not a PLUGIN_TYPE_REPORT.\n", report_type);
+ goto cleanup;
+ }
+ if (!report->report) {
+ fprintf(stderr, "No usable output module\n");
+ goto cleanup;
+ }
+ }
+
if (argc != 2) {
fprintf(stderr, "Usage: %s [path-to-source-spec|path-to-source-list-file]\n", argv[0]);
goto cleanup;
@@ -787,22 +813,6 @@ clean:
fprintf(stderr, "Scanned %d source file%s\n", size, size > 1 ? "s" : "");
}
- /* TODO: Switch to single output mode, with a report type set in
- * config and/or flags, i.e. -r html (preserve csv option though)
- */
- if (csv_mode) {
- report = cve_plugin_get_by_name("csv");
- } else if (!no_html) {
- report = cve_plugin_get_by_name("html");
- } else {
- report = cve_plugin_get_by_name("cli");
- }
-
- if (!report || !report->report) {
- fprintf(stderr, "No usable output module\n");
- goto cleanup;
- }
-
if (!report->report(self)) {
fprintf(stderr, "Report generation failed\n");
goto cleanup;
@@ -817,6 +827,9 @@ cleanup_no_lock:
if (pkg_plugins) {
g_list_free(pkg_plugins);
}
+ if (report_plugins) {
+ g_list_free(report_plugins);
+ }
if (self->db) {
g_hash_table_unref(self->db);
}
--
2.11.0