Message ID | 20180620121446.31470-11-info@marcellobauer.com |
---|---|
State | Accepted |
Headers | show |
Series | coreboot test intergration | expand |
On 20/06/18 13:14, Marcello Sylvester Bauer wrote: > Signed-off-by: Marcello Sylvester Bauer <info@marcellobauer.com> > --- > src/lib/include/fwts_log_scan.h | 1 + > src/lib/src/fwts_klog.c | 108 +----------------------------------- > src/lib/src/fwts_log_scan.c | 119 ++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 121 insertions(+), 107 deletions(-) > > diff --git a/src/lib/include/fwts_log_scan.h b/src/lib/include/fwts_log_scan.h > index 849a9d1b..b2364791 100644 > --- a/src/lib/include/fwts_log_scan.h > +++ b/src/lib/include/fwts_log_scan.h > @@ -51,5 +51,6 @@ char *fwts_log_unique_label(const char *str, const char *label); > void fwts_log_scan_patterns(fwts_framework *fw, char *line, int repeated, char *prevline, void *private, int *errors, const char *name, const char *advice); > fwts_compare_mode fwts_log_compare_mode_str_to_val(const char *str); > const char *fwts_json_str(fwts_framework *fw, const char *table, int index, json_object *obj, const char *key, bool log_error); > +int fwts_log_check(fwts_framework *fw, const char *table, fwts_log_scan_func fwts_log_scan_patterns, fwts_log_progress_func progress, fwts_list *log, int *errors, const char *json_data_path, const char *label, bool remove_timestamp); > > #endif > diff --git a/src/lib/src/fwts_klog.c b/src/lib/src/fwts_klog.c > index a0d3b561..ea8d4ed7 100644 > --- a/src/lib/src/fwts_klog.c > +++ b/src/lib/src/fwts_klog.c > @@ -135,13 +135,6 @@ static int fwts_klog_check(fwts_framework *fw, > fwts_list *klog, > int *errors) > { > - int ret = FWTS_ERROR; > - int n; > - int i; > - int fd; > - json_object *klog_objs; > - json_object *klog_table; > - fwts_log_pattern *patterns; > char json_data_path[PATH_MAX]; > > if (fw->json_data_file) { > @@ -150,106 +143,7 @@ static int fwts_klog_check(fwts_framework *fw, > else { /* use the hard coded KLOG JSON as default */ > snprintf(json_data_path, sizeof(json_data_path), "%s/%s", fw->json_data_path, KLOG_DATA_JSON_FILE); > } > - > - /* > - * json_object_from_file() can fail when files aren't readable > - * so check if we can open for read before calling json_object_from_file() > - */ > - if ((fd = open(json_data_path, O_RDONLY)) < 0) { > - fwts_log_error(fw, "Cannot read file %s, check the path and check that the file exists, you may need to specify -j or -J.", json_data_path); > - return FWTS_ERROR; > - } > - (void)close(fd); > - > - klog_objs = json_object_from_file(json_data_path); > - if (FWTS_JSON_ERROR(klog_objs)) { > - fwts_log_error(fw, "Cannot load klog data from %s.", json_data_path); > - return FWTS_ERROR; > - } > - > -#if JSON_HAS_GET_EX > - if (!json_object_object_get_ex(klog_objs, table, &klog_table)) { > - fwts_log_error(fw, "Cannot fetch klog table object '%s' from %s.", table, json_data_path); > - goto fail_put; > - } > -#else > - klog_table = json_object_object_get(klog_objs, table); > - if (FWTS_JSON_ERROR(klog_table)) { > - fwts_log_error(fw, "Cannot fetch klog table object '%s' from %s.", table, json_data_path); > - goto fail_put; > - } > -#endif > - > - n = json_object_array_length(klog_table); > - > - /* Last entry is null to indicate end, so alloc n+1 items */ > - if ((patterns = calloc(n+1, sizeof(fwts_log_pattern))) == NULL) { > - fwts_log_error(fw, "Cannot allocate pattern table."); > - goto fail_put; > - } > - > - /* Now fetch json objects and compile regex */ > - for (i = 0; i < n; i++) { > - const char *str; > - json_object *obj; > - > - obj = json_object_array_get_idx(klog_table, i); > - if (FWTS_JSON_ERROR(obj)) { > - fwts_log_error(fw, "Cannot fetch %d item from table %s.", i, table); > - goto fail; > - } > - if ((str = fwts_json_str(fw, table, i, obj, "compare_mode", true)) == NULL) > - goto fail; > - patterns[i].compare_mode = fwts_klog_compare_mode_str_to_val(str); > - > - if ((str = fwts_json_str(fw, table, i, obj, "log_level", true)) == NULL) > - goto fail; > - patterns[i].level = fwts_log_str_to_level(str); > - > - if ((patterns[i].pattern = fwts_json_str(fw, table, i, obj, "pattern", true)) == NULL) > - goto fail; > - > - if ((patterns[i].advice = fwts_json_str(fw, table, i, obj, "advice", true)) == NULL) > - goto fail; > - > - /* Labels appear in fwts 0.26.0, so are optional with older versions */ > - str = fwts_json_str(fw, table, i, obj, "label", false); > - if (str) { > - patterns[i].label = strdup(str); > - } else { > - /* if not specified, auto-magically generate */ > - patterns[i].label = strdup(fwts_klog_unique_label(patterns[i].pattern)); > - } > - if (patterns[i].label == NULL) > - goto fail; > - > - if (patterns[i].compare_mode == FWTS_COMPARE_REGEX) { > - int rc; > - > - rc = regcomp(&patterns[i].compiled, patterns[i].pattern, REG_EXTENDED); > - if (rc) { > - fwts_log_error(fw, "Regex %s failed to compile: %d.", patterns[i].pattern, rc); > - patterns[i].compiled_ok = false; > - } else { > - patterns[i].compiled_ok = true; > - } > - } > - } > - /* We've now collected up the scan patterns, lets scan the log for errors */ > - ret = fwts_klog_scan(fw, klog, fwts_klog_scan_patterns, progress, patterns, errors); > - > -fail: > - for (i = 0; i < n; i++) { > - if (patterns[i].compiled_ok) > - regfree(&patterns[i].compiled); > - if (patterns[i].label) > - free(patterns[i].label); > - } > - free(patterns); > -fail_put: > - json_object_put(klog_objs); > - > - return ret; > + return fwts_log_check(fw, table, fwts_klog_scan_patterns, progress, klog, errors, json_data_path, UNIQUE_KLOG_LABEL, true); > } > > int fwts_klog_firmware_check(fwts_framework *fw, fwts_klog_progress_func progress, > diff --git a/src/lib/src/fwts_log_scan.c b/src/lib/src/fwts_log_scan.c > index f9ed7b35..79979ff1 100644 > --- a/src/lib/src/fwts_log_scan.c > +++ b/src/lib/src/fwts_log_scan.c > @@ -345,3 +345,122 @@ nullobj: > key, index, table); > return NULL; > } > + > +int fwts_log_check(fwts_framework *fw, > + const char *table, > + fwts_log_scan_func fwts_log_scan_patterns, > + fwts_log_progress_func progress, > + fwts_list *log, > + int *errors, > + const char *json_data_path, > + const char *label, > + bool remove_timestamp) > +{ > + int ret = FWTS_ERROR; > + int n; > + int i; > + int fd; > + json_object *log_objs; > + json_object *log_table; > + fwts_log_pattern *patterns; > + > + /* > + * json_object_from_file() can fail when files aren't readable > + * so check if we can open for read before calling json_object_from_file() > + */ > + if ((fd = open(json_data_path, O_RDONLY)) < 0) { > + fwts_log_error(fw, "Cannot read file %s, check the path and check that the file exists, you may need to specify -j or -J.", json_data_path); > + return FWTS_ERROR; > + } > + (void)close(fd); > + > + log_objs = json_object_from_file(json_data_path); > + if (FWTS_JSON_ERROR(log_objs)) { > + fwts_log_error(fw, "Cannot load log data from %s.", json_data_path); > + return FWTS_ERROR; > + } > + > +#if JSON_HAS_GET_EX > + if (!json_object_object_get_ex(log_objs, table, &log_table)) { > + fwts_log_error(fw, "Cannot fetch log table object '%s' from %s.", table, json_data_path); > + goto fail_put; > + } > +#else > + log_table = json_object_object_get(log_objs, table); > + if (FWTS_JSON_ERROR(log_table)) { > + fwts_log_error(fw, "Cannot fetch log table object '%s' from %s.", table, json_data_path); > + goto fail_put; > + } > +#endif > + > + n = json_object_array_length(log_table); > + > + /* Last entry is null to indicate end, so alloc n+1 items */ > + if ((patterns = calloc(n+1, sizeof(fwts_log_pattern))) == NULL) { > + fwts_log_error(fw, "Cannot allocate pattern table."); > + goto fail_put; > + } > + > + /* Now fetch json objects and compile regex */ > + for (i = 0; i < n; i++) { > + const char *str; > + json_object *obj; > + > + obj = json_object_array_get_idx(log_table, i); > + if (FWTS_JSON_ERROR(obj)) { > + fwts_log_error(fw, "Cannot fetch %d item from table %s.", i, table); > + goto fail; > + } > + if ((str = fwts_json_str(fw, table, i, obj, "compare_mode", true)) == NULL) > + goto fail; > + patterns[i].compare_mode = fwts_log_compare_mode_str_to_val(str); > + > + if ((str = fwts_json_str(fw, table, i, obj, "log_level", true)) == NULL) > + goto fail; > + patterns[i].level = fwts_log_str_to_level(str); > + > + if ((patterns[i].pattern = fwts_json_str(fw, table, i, obj, "pattern", true)) == NULL) > + goto fail; > + > + if ((patterns[i].advice = fwts_json_str(fw, table, i, obj, "advice", true)) == NULL) > + goto fail; > + > + /* Labels appear in fwts 0.26.0, so are optional with older versions */ > + str = fwts_json_str(fw, table, i, obj, "label", false); > + if (str) { > + patterns[i].label = strdup(str); > + } else { > + /* if not specified, auto-magically generate */ > + patterns[i].label = strdup(fwts_log_unique_label(patterns[i].pattern, label)); > + } > + if (patterns[i].label == NULL) > + goto fail; > + > + if (patterns[i].compare_mode == FWTS_COMPARE_REGEX) { > + int rc; > + > + rc = regcomp(&patterns[i].compiled, patterns[i].pattern, REG_EXTENDED); > + if (rc) { > + fwts_log_error(fw, "Regex %s failed to compile: %d.", patterns[i].pattern, rc); > + patterns[i].compiled_ok = false; > + } else { > + patterns[i].compiled_ok = true; > + } > + } > + } > + /* We've now collected up the scan patterns, lets scan the log for errors */ > + ret = fwts_log_scan(fw, log, fwts_log_scan_patterns, progress, patterns, errors, remove_timestamp); > + > +fail: > + for (i = 0; i < n; i++) { > + if (patterns[i].compiled_ok) > + regfree(&patterns[i].compiled); > + if (patterns[i].label) > + free(patterns[i].label); > + } > + free(patterns); > +fail_put: > + json_object_put(log_objs); > + > + return ret; > +} > Acked-by: Colin Ian King <colin.king@canonical.com>
On 2018-06-20 05:14 AM, Marcello Sylvester Bauer wrote: > Signed-off-by: Marcello Sylvester Bauer <info@marcellobauer.com> > --- > src/lib/include/fwts_log_scan.h | 1 + > src/lib/src/fwts_klog.c | 108 +----------------------------------- > src/lib/src/fwts_log_scan.c | 119 ++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 121 insertions(+), 107 deletions(-) > > diff --git a/src/lib/include/fwts_log_scan.h b/src/lib/include/fwts_log_scan.h > index 849a9d1b..b2364791 100644 > --- a/src/lib/include/fwts_log_scan.h > +++ b/src/lib/include/fwts_log_scan.h > @@ -51,5 +51,6 @@ char *fwts_log_unique_label(const char *str, const char *label); > void fwts_log_scan_patterns(fwts_framework *fw, char *line, int repeated, char *prevline, void *private, int *errors, const char *name, const char *advice); > fwts_compare_mode fwts_log_compare_mode_str_to_val(const char *str); > const char *fwts_json_str(fwts_framework *fw, const char *table, int index, json_object *obj, const char *key, bool log_error); > +int fwts_log_check(fwts_framework *fw, const char *table, fwts_log_scan_func fwts_log_scan_patterns, fwts_log_progress_func progress, fwts_list *log, int *errors, const char *json_data_path, const char *label, bool remove_timestamp); > > #endif > diff --git a/src/lib/src/fwts_klog.c b/src/lib/src/fwts_klog.c > index a0d3b561..ea8d4ed7 100644 > --- a/src/lib/src/fwts_klog.c > +++ b/src/lib/src/fwts_klog.c > @@ -135,13 +135,6 @@ static int fwts_klog_check(fwts_framework *fw, > fwts_list *klog, > int *errors) > { > - int ret = FWTS_ERROR; > - int n; > - int i; > - int fd; > - json_object *klog_objs; > - json_object *klog_table; > - fwts_log_pattern *patterns; > char json_data_path[PATH_MAX]; > > if (fw->json_data_file) { > @@ -150,106 +143,7 @@ static int fwts_klog_check(fwts_framework *fw, > else { /* use the hard coded KLOG JSON as default */ > snprintf(json_data_path, sizeof(json_data_path), "%s/%s", fw->json_data_path, KLOG_DATA_JSON_FILE); > } > - > - /* > - * json_object_from_file() can fail when files aren't readable > - * so check if we can open for read before calling json_object_from_file() > - */ > - if ((fd = open(json_data_path, O_RDONLY)) < 0) { > - fwts_log_error(fw, "Cannot read file %s, check the path and check that the file exists, you may need to specify -j or -J.", json_data_path); > - return FWTS_ERROR; > - } > - (void)close(fd); > - > - klog_objs = json_object_from_file(json_data_path); > - if (FWTS_JSON_ERROR(klog_objs)) { > - fwts_log_error(fw, "Cannot load klog data from %s.", json_data_path); > - return FWTS_ERROR; > - } > - > -#if JSON_HAS_GET_EX > - if (!json_object_object_get_ex(klog_objs, table, &klog_table)) { > - fwts_log_error(fw, "Cannot fetch klog table object '%s' from %s.", table, json_data_path); > - goto fail_put; > - } > -#else > - klog_table = json_object_object_get(klog_objs, table); > - if (FWTS_JSON_ERROR(klog_table)) { > - fwts_log_error(fw, "Cannot fetch klog table object '%s' from %s.", table, json_data_path); > - goto fail_put; > - } > -#endif > - > - n = json_object_array_length(klog_table); > - > - /* Last entry is null to indicate end, so alloc n+1 items */ > - if ((patterns = calloc(n+1, sizeof(fwts_log_pattern))) == NULL) { > - fwts_log_error(fw, "Cannot allocate pattern table."); > - goto fail_put; > - } > - > - /* Now fetch json objects and compile regex */ > - for (i = 0; i < n; i++) { > - const char *str; > - json_object *obj; > - > - obj = json_object_array_get_idx(klog_table, i); > - if (FWTS_JSON_ERROR(obj)) { > - fwts_log_error(fw, "Cannot fetch %d item from table %s.", i, table); > - goto fail; > - } > - if ((str = fwts_json_str(fw, table, i, obj, "compare_mode", true)) == NULL) > - goto fail; > - patterns[i].compare_mode = fwts_klog_compare_mode_str_to_val(str); > - > - if ((str = fwts_json_str(fw, table, i, obj, "log_level", true)) == NULL) > - goto fail; > - patterns[i].level = fwts_log_str_to_level(str); > - > - if ((patterns[i].pattern = fwts_json_str(fw, table, i, obj, "pattern", true)) == NULL) > - goto fail; > - > - if ((patterns[i].advice = fwts_json_str(fw, table, i, obj, "advice", true)) == NULL) > - goto fail; > - > - /* Labels appear in fwts 0.26.0, so are optional with older versions */ > - str = fwts_json_str(fw, table, i, obj, "label", false); > - if (str) { > - patterns[i].label = strdup(str); > - } else { > - /* if not specified, auto-magically generate */ > - patterns[i].label = strdup(fwts_klog_unique_label(patterns[i].pattern)); > - } > - if (patterns[i].label == NULL) > - goto fail; > - > - if (patterns[i].compare_mode == FWTS_COMPARE_REGEX) { > - int rc; > - > - rc = regcomp(&patterns[i].compiled, patterns[i].pattern, REG_EXTENDED); > - if (rc) { > - fwts_log_error(fw, "Regex %s failed to compile: %d.", patterns[i].pattern, rc); > - patterns[i].compiled_ok = false; > - } else { > - patterns[i].compiled_ok = true; > - } > - } > - } > - /* We've now collected up the scan patterns, lets scan the log for errors */ > - ret = fwts_klog_scan(fw, klog, fwts_klog_scan_patterns, progress, patterns, errors); > - > -fail: > - for (i = 0; i < n; i++) { > - if (patterns[i].compiled_ok) > - regfree(&patterns[i].compiled); > - if (patterns[i].label) > - free(patterns[i].label); > - } > - free(patterns); > -fail_put: > - json_object_put(klog_objs); > - > - return ret; > + return fwts_log_check(fw, table, fwts_klog_scan_patterns, progress, klog, errors, json_data_path, UNIQUE_KLOG_LABEL, true); > } > > int fwts_klog_firmware_check(fwts_framework *fw, fwts_klog_progress_func progress, > diff --git a/src/lib/src/fwts_log_scan.c b/src/lib/src/fwts_log_scan.c > index f9ed7b35..79979ff1 100644 > --- a/src/lib/src/fwts_log_scan.c > +++ b/src/lib/src/fwts_log_scan.c > @@ -345,3 +345,122 @@ nullobj: > key, index, table); > return NULL; > } > + > +int fwts_log_check(fwts_framework *fw, > + const char *table, > + fwts_log_scan_func fwts_log_scan_patterns, > + fwts_log_progress_func progress, > + fwts_list *log, > + int *errors, > + const char *json_data_path, > + const char *label, > + bool remove_timestamp) > +{ > + int ret = FWTS_ERROR; > + int n; > + int i; > + int fd; > + json_object *log_objs; > + json_object *log_table; > + fwts_log_pattern *patterns; > + > + /* > + * json_object_from_file() can fail when files aren't readable > + * so check if we can open for read before calling json_object_from_file() > + */ > + if ((fd = open(json_data_path, O_RDONLY)) < 0) { > + fwts_log_error(fw, "Cannot read file %s, check the path and check that the file exists, you may need to specify -j or -J.", json_data_path); > + return FWTS_ERROR; > + } > + (void)close(fd); > + > + log_objs = json_object_from_file(json_data_path); > + if (FWTS_JSON_ERROR(log_objs)) { > + fwts_log_error(fw, "Cannot load log data from %s.", json_data_path); > + return FWTS_ERROR; > + } > + > +#if JSON_HAS_GET_EX > + if (!json_object_object_get_ex(log_objs, table, &log_table)) { > + fwts_log_error(fw, "Cannot fetch log table object '%s' from %s.", table, json_data_path); > + goto fail_put; > + } > +#else > + log_table = json_object_object_get(log_objs, table); > + if (FWTS_JSON_ERROR(log_table)) { > + fwts_log_error(fw, "Cannot fetch log table object '%s' from %s.", table, json_data_path); > + goto fail_put; > + } > +#endif > + > + n = json_object_array_length(log_table); > + > + /* Last entry is null to indicate end, so alloc n+1 items */ > + if ((patterns = calloc(n+1, sizeof(fwts_log_pattern))) == NULL) { > + fwts_log_error(fw, "Cannot allocate pattern table."); > + goto fail_put; > + } > + > + /* Now fetch json objects and compile regex */ > + for (i = 0; i < n; i++) { > + const char *str; > + json_object *obj; > + > + obj = json_object_array_get_idx(log_table, i); > + if (FWTS_JSON_ERROR(obj)) { > + fwts_log_error(fw, "Cannot fetch %d item from table %s.", i, table); > + goto fail; > + } > + if ((str = fwts_json_str(fw, table, i, obj, "compare_mode", true)) == NULL) > + goto fail; > + patterns[i].compare_mode = fwts_log_compare_mode_str_to_val(str); > + > + if ((str = fwts_json_str(fw, table, i, obj, "log_level", true)) == NULL) > + goto fail; > + patterns[i].level = fwts_log_str_to_level(str); > + > + if ((patterns[i].pattern = fwts_json_str(fw, table, i, obj, "pattern", true)) == NULL) > + goto fail; > + > + if ((patterns[i].advice = fwts_json_str(fw, table, i, obj, "advice", true)) == NULL) > + goto fail; > + > + /* Labels appear in fwts 0.26.0, so are optional with older versions */ > + str = fwts_json_str(fw, table, i, obj, "label", false); > + if (str) { > + patterns[i].label = strdup(str); > + } else { > + /* if not specified, auto-magically generate */ > + patterns[i].label = strdup(fwts_log_unique_label(patterns[i].pattern, label)); > + } > + if (patterns[i].label == NULL) > + goto fail; > + > + if (patterns[i].compare_mode == FWTS_COMPARE_REGEX) { > + int rc; > + > + rc = regcomp(&patterns[i].compiled, patterns[i].pattern, REG_EXTENDED); > + if (rc) { > + fwts_log_error(fw, "Regex %s failed to compile: %d.", patterns[i].pattern, rc); > + patterns[i].compiled_ok = false; > + } else { > + patterns[i].compiled_ok = true; > + } > + } > + } > + /* We've now collected up the scan patterns, lets scan the log for errors */ > + ret = fwts_log_scan(fw, log, fwts_log_scan_patterns, progress, patterns, errors, remove_timestamp); > + > +fail: > + for (i = 0; i < n; i++) { > + if (patterns[i].compiled_ok) > + regfree(&patterns[i].compiled); > + if (patterns[i].label) > + free(patterns[i].label); > + } > + free(patterns); > +fail_put: > + json_object_put(log_objs); > + > + return ret; > +} > Acked-by: Alex Hung <alex.hung@canonical.com>
diff --git a/src/lib/include/fwts_log_scan.h b/src/lib/include/fwts_log_scan.h index 849a9d1b..b2364791 100644 --- a/src/lib/include/fwts_log_scan.h +++ b/src/lib/include/fwts_log_scan.h @@ -51,5 +51,6 @@ char *fwts_log_unique_label(const char *str, const char *label); void fwts_log_scan_patterns(fwts_framework *fw, char *line, int repeated, char *prevline, void *private, int *errors, const char *name, const char *advice); fwts_compare_mode fwts_log_compare_mode_str_to_val(const char *str); const char *fwts_json_str(fwts_framework *fw, const char *table, int index, json_object *obj, const char *key, bool log_error); +int fwts_log_check(fwts_framework *fw, const char *table, fwts_log_scan_func fwts_log_scan_patterns, fwts_log_progress_func progress, fwts_list *log, int *errors, const char *json_data_path, const char *label, bool remove_timestamp); #endif diff --git a/src/lib/src/fwts_klog.c b/src/lib/src/fwts_klog.c index a0d3b561..ea8d4ed7 100644 --- a/src/lib/src/fwts_klog.c +++ b/src/lib/src/fwts_klog.c @@ -135,13 +135,6 @@ static int fwts_klog_check(fwts_framework *fw, fwts_list *klog, int *errors) { - int ret = FWTS_ERROR; - int n; - int i; - int fd; - json_object *klog_objs; - json_object *klog_table; - fwts_log_pattern *patterns; char json_data_path[PATH_MAX]; if (fw->json_data_file) { @@ -150,106 +143,7 @@ static int fwts_klog_check(fwts_framework *fw, else { /* use the hard coded KLOG JSON as default */ snprintf(json_data_path, sizeof(json_data_path), "%s/%s", fw->json_data_path, KLOG_DATA_JSON_FILE); } - - /* - * json_object_from_file() can fail when files aren't readable - * so check if we can open for read before calling json_object_from_file() - */ - if ((fd = open(json_data_path, O_RDONLY)) < 0) { - fwts_log_error(fw, "Cannot read file %s, check the path and check that the file exists, you may need to specify -j or -J.", json_data_path); - return FWTS_ERROR; - } - (void)close(fd); - - klog_objs = json_object_from_file(json_data_path); - if (FWTS_JSON_ERROR(klog_objs)) { - fwts_log_error(fw, "Cannot load klog data from %s.", json_data_path); - return FWTS_ERROR; - } - -#if JSON_HAS_GET_EX - if (!json_object_object_get_ex(klog_objs, table, &klog_table)) { - fwts_log_error(fw, "Cannot fetch klog table object '%s' from %s.", table, json_data_path); - goto fail_put; - } -#else - klog_table = json_object_object_get(klog_objs, table); - if (FWTS_JSON_ERROR(klog_table)) { - fwts_log_error(fw, "Cannot fetch klog table object '%s' from %s.", table, json_data_path); - goto fail_put; - } -#endif - - n = json_object_array_length(klog_table); - - /* Last entry is null to indicate end, so alloc n+1 items */ - if ((patterns = calloc(n+1, sizeof(fwts_log_pattern))) == NULL) { - fwts_log_error(fw, "Cannot allocate pattern table."); - goto fail_put; - } - - /* Now fetch json objects and compile regex */ - for (i = 0; i < n; i++) { - const char *str; - json_object *obj; - - obj = json_object_array_get_idx(klog_table, i); - if (FWTS_JSON_ERROR(obj)) { - fwts_log_error(fw, "Cannot fetch %d item from table %s.", i, table); - goto fail; - } - if ((str = fwts_json_str(fw, table, i, obj, "compare_mode", true)) == NULL) - goto fail; - patterns[i].compare_mode = fwts_klog_compare_mode_str_to_val(str); - - if ((str = fwts_json_str(fw, table, i, obj, "log_level", true)) == NULL) - goto fail; - patterns[i].level = fwts_log_str_to_level(str); - - if ((patterns[i].pattern = fwts_json_str(fw, table, i, obj, "pattern", true)) == NULL) - goto fail; - - if ((patterns[i].advice = fwts_json_str(fw, table, i, obj, "advice", true)) == NULL) - goto fail; - - /* Labels appear in fwts 0.26.0, so are optional with older versions */ - str = fwts_json_str(fw, table, i, obj, "label", false); - if (str) { - patterns[i].label = strdup(str); - } else { - /* if not specified, auto-magically generate */ - patterns[i].label = strdup(fwts_klog_unique_label(patterns[i].pattern)); - } - if (patterns[i].label == NULL) - goto fail; - - if (patterns[i].compare_mode == FWTS_COMPARE_REGEX) { - int rc; - - rc = regcomp(&patterns[i].compiled, patterns[i].pattern, REG_EXTENDED); - if (rc) { - fwts_log_error(fw, "Regex %s failed to compile: %d.", patterns[i].pattern, rc); - patterns[i].compiled_ok = false; - } else { - patterns[i].compiled_ok = true; - } - } - } - /* We've now collected up the scan patterns, lets scan the log for errors */ - ret = fwts_klog_scan(fw, klog, fwts_klog_scan_patterns, progress, patterns, errors); - -fail: - for (i = 0; i < n; i++) { - if (patterns[i].compiled_ok) - regfree(&patterns[i].compiled); - if (patterns[i].label) - free(patterns[i].label); - } - free(patterns); -fail_put: - json_object_put(klog_objs); - - return ret; + return fwts_log_check(fw, table, fwts_klog_scan_patterns, progress, klog, errors, json_data_path, UNIQUE_KLOG_LABEL, true); } int fwts_klog_firmware_check(fwts_framework *fw, fwts_klog_progress_func progress, diff --git a/src/lib/src/fwts_log_scan.c b/src/lib/src/fwts_log_scan.c index f9ed7b35..79979ff1 100644 --- a/src/lib/src/fwts_log_scan.c +++ b/src/lib/src/fwts_log_scan.c @@ -345,3 +345,122 @@ nullobj: key, index, table); return NULL; } + +int fwts_log_check(fwts_framework *fw, + const char *table, + fwts_log_scan_func fwts_log_scan_patterns, + fwts_log_progress_func progress, + fwts_list *log, + int *errors, + const char *json_data_path, + const char *label, + bool remove_timestamp) +{ + int ret = FWTS_ERROR; + int n; + int i; + int fd; + json_object *log_objs; + json_object *log_table; + fwts_log_pattern *patterns; + + /* + * json_object_from_file() can fail when files aren't readable + * so check if we can open for read before calling json_object_from_file() + */ + if ((fd = open(json_data_path, O_RDONLY)) < 0) { + fwts_log_error(fw, "Cannot read file %s, check the path and check that the file exists, you may need to specify -j or -J.", json_data_path); + return FWTS_ERROR; + } + (void)close(fd); + + log_objs = json_object_from_file(json_data_path); + if (FWTS_JSON_ERROR(log_objs)) { + fwts_log_error(fw, "Cannot load log data from %s.", json_data_path); + return FWTS_ERROR; + } + +#if JSON_HAS_GET_EX + if (!json_object_object_get_ex(log_objs, table, &log_table)) { + fwts_log_error(fw, "Cannot fetch log table object '%s' from %s.", table, json_data_path); + goto fail_put; + } +#else + log_table = json_object_object_get(log_objs, table); + if (FWTS_JSON_ERROR(log_table)) { + fwts_log_error(fw, "Cannot fetch log table object '%s' from %s.", table, json_data_path); + goto fail_put; + } +#endif + + n = json_object_array_length(log_table); + + /* Last entry is null to indicate end, so alloc n+1 items */ + if ((patterns = calloc(n+1, sizeof(fwts_log_pattern))) == NULL) { + fwts_log_error(fw, "Cannot allocate pattern table."); + goto fail_put; + } + + /* Now fetch json objects and compile regex */ + for (i = 0; i < n; i++) { + const char *str; + json_object *obj; + + obj = json_object_array_get_idx(log_table, i); + if (FWTS_JSON_ERROR(obj)) { + fwts_log_error(fw, "Cannot fetch %d item from table %s.", i, table); + goto fail; + } + if ((str = fwts_json_str(fw, table, i, obj, "compare_mode", true)) == NULL) + goto fail; + patterns[i].compare_mode = fwts_log_compare_mode_str_to_val(str); + + if ((str = fwts_json_str(fw, table, i, obj, "log_level", true)) == NULL) + goto fail; + patterns[i].level = fwts_log_str_to_level(str); + + if ((patterns[i].pattern = fwts_json_str(fw, table, i, obj, "pattern", true)) == NULL) + goto fail; + + if ((patterns[i].advice = fwts_json_str(fw, table, i, obj, "advice", true)) == NULL) + goto fail; + + /* Labels appear in fwts 0.26.0, so are optional with older versions */ + str = fwts_json_str(fw, table, i, obj, "label", false); + if (str) { + patterns[i].label = strdup(str); + } else { + /* if not specified, auto-magically generate */ + patterns[i].label = strdup(fwts_log_unique_label(patterns[i].pattern, label)); + } + if (patterns[i].label == NULL) + goto fail; + + if (patterns[i].compare_mode == FWTS_COMPARE_REGEX) { + int rc; + + rc = regcomp(&patterns[i].compiled, patterns[i].pattern, REG_EXTENDED); + if (rc) { + fwts_log_error(fw, "Regex %s failed to compile: %d.", patterns[i].pattern, rc); + patterns[i].compiled_ok = false; + } else { + patterns[i].compiled_ok = true; + } + } + } + /* We've now collected up the scan patterns, lets scan the log for errors */ + ret = fwts_log_scan(fw, log, fwts_log_scan_patterns, progress, patterns, errors, remove_timestamp); + +fail: + for (i = 0; i < n; i++) { + if (patterns[i].compiled_ok) + regfree(&patterns[i].compiled); + if (patterns[i].label) + free(patterns[i].label); + } + free(patterns); +fail_put: + json_object_put(log_objs); + + return ret; +}
Signed-off-by: Marcello Sylvester Bauer <info@marcellobauer.com> --- src/lib/include/fwts_log_scan.h | 1 + src/lib/src/fwts_klog.c | 108 +----------------------------------- src/lib/src/fwts_log_scan.c | 119 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 107 deletions(-)