Beispiel #1
0
/*
 *  fwts_log_printf_json()
 *	print to a log
 */
static int fwts_log_print_json(
	fwts_log_file *log_file,
	const fwts_log_field field,
	const fwts_log_level level,
	const char *status,
	const char *label,
	const char *prefix,
	const char *buffer)
{
	char tmpbuf[4096];
	struct tm tm;
	time_t now;
	json_object *header;
	json_object *json_log = (json_object*)json_stack[json_stack_index-1].log;
	json_object *obj;
	char *str;

	FWTS_UNUSED(prefix);

	if (!((field & LOG_FIELD_MASK) & fwts_log_filter))
		return 0;

	if (field & (LOG_NEWLINE | LOG_SEPARATOR | LOG_DEBUG))
		return 0;

	time(&now);
	localtime_r(&now, &tm);

	if ((header = json_object_new_object()) == NULL)
		fwts_log_out_of_memory_json();

	if ((obj = json_object_new_int(log_file->line_number)) == NULL)
		fwts_log_out_of_memory_json();
	json_object_object_add(header, "line_num", obj);

	snprintf(tmpbuf, sizeof(tmpbuf), "%2.2d/%2.2d/%-2.2d",
		tm.tm_mday, tm.tm_mon + 1, (tm.tm_year+1900) % 100);
	if ((obj = json_object_new_string(tmpbuf)) == NULL)
		fwts_log_out_of_memory_json();
	json_object_object_add(header, "date", obj);

	snprintf(tmpbuf, sizeof(tmpbuf), "%2.2d:%2.2d:%2.2d",
		tm.tm_hour, tm.tm_min, tm.tm_sec);
	if ((obj = json_object_new_string(tmpbuf)) == NULL)
		fwts_log_out_of_memory_json();
	json_object_object_add(header, "time", obj);

	if ((obj = json_object_new_string(fwts_log_field_to_str_full(field))) == NULL)
		fwts_log_out_of_memory_json();
	json_object_object_add(header, "field_type", obj);

	str = fwts_log_level_to_str(level);
	if (!strcmp(str, " "))
		str = "None";
	if ((obj = json_object_new_string(str)) == NULL)
		fwts_log_out_of_memory_json();
	json_object_object_add(header, "level", obj);

	if ((obj = json_object_new_string(*status ? status : "None")) == NULL)
		fwts_log_out_of_memory_json();
	json_object_object_add(header, "status", obj);

	if ((obj = json_object_new_string(label && *label ? label : "None")) == NULL)
		fwts_log_out_of_memory_json();
	json_object_object_add(header, "failure_label", obj);

	/* Redundant really
	if ((obj = json_object_new_string(log->owner)) == NULL)
		fwts_log_out_of_memory_json();
	json_object_object_add(header, "owner", obj);
	*/

	if ((obj = json_object_new_string(buffer)) == NULL)
		fwts_log_out_of_memory_json();
	json_object_object_add(header, "log_text", obj);

	json_object_array_add(json_log, header);
	log_file->line_number++;	/* This is academic really */

	return 0;
}
Beispiel #2
0
/*
 *  fwts_log_print_xml()
 *	print to a log
 */
static int fwts_log_print_xml(
	fwts_log_file *log_file,
	const fwts_log_field field,
	const fwts_log_level level,
	const char *status,
	const char *label,
	const char *prefix,
	const char *buffer)
{
	struct tm tm;
	time_t now;
	char *str;

	FWTS_UNUSED(prefix);

	if (!((field & LOG_FIELD_MASK) & fwts_log_filter))
		return 0;

	if (field & (LOG_NEWLINE | LOG_SEPARATOR | LOG_DEBUG))
		return 0;

	time(&now);
	localtime_r(&now, &tm);

	fprintf(log_file->fp, "%*s<logentry>\n", xml_stack_index * XML_INDENT, "");

	fprintf(log_file->fp, "%*s<line_num>%" PRIu32 "</line_num>\n",
		(xml_stack_index + 1) * XML_INDENT,
		"", log_file->line_number);

	fprintf(log_file->fp, "%*s<date>%2.2d/%2.2d/%-2.2d</date>\n",
		(xml_stack_index + 1) * XML_INDENT,
		"", tm.tm_mday, tm.tm_mon + 1, (tm.tm_year+1900) % 100);

	fprintf(log_file->fp, "%*s<time>%2.2d:%2.2d:%2.2d</time>\n",
		(xml_stack_index + 1) * XML_INDENT,
		"", tm.tm_hour, tm.tm_min, tm.tm_sec);

	fprintf(log_file->fp, "%*s<field_type>%s</field_type>\n",
		(xml_stack_index + 1) * XML_INDENT,
		"", fwts_log_field_to_str_full(field));

	str = fwts_log_level_to_str(level);
	if (!strcmp(str, " "))
		str = "None";

	fprintf(log_file->fp, "%*s<level>%s</level>\n",
		(xml_stack_index + 1) * XML_INDENT, "", str);

	fprintf(log_file->fp, "%*s<status>%s</status>\n",
		(xml_stack_index + 1) * XML_INDENT,
		"", *status ? status : "None");

	fprintf(log_file->fp, "%*s<failure_label>%s</failure_label>\n",
		(xml_stack_index + 1) * XML_INDENT,
		"", label && *label ? label : "None");

	fprintf(log_file->fp, "%*s<log_text>%s</log_text>\n",
		(xml_stack_index + 1) * XML_INDENT,
		"", buffer);

	fprintf(log_file->fp, "%*s</logentry>\n", xml_stack_index * XML_INDENT, "");
	fflush(log_file->fp);
	log_file->line_number++;

	return 0;
}
Beispiel #3
0
/*
 *  fwts_log_print_html()
 *	print to a log
 */
static int fwts_log_print_html(
    fwts_log_file *log_file,
    const fwts_log_field field,
    const fwts_log_level level,
    const char *status,
    const char *label,
    const char *prefix,
    const char *buffer)
{
    char *str;
    char *style;
    char *code_start;
    char *code_end;
    char *html_converted;

    FWTS_UNUSED(label);
    FWTS_UNUSED(prefix);

    if (!((field & LOG_FIELD_MASK) & fwts_log_filter))
        return 0;

    if (field & (LOG_NEWLINE | LOG_SEPARATOR | LOG_DEBUG))
        return 0;

    if ((html_converted = fwts_log_html_convert_ascii_str(buffer)) == NULL) {
        /* We can't report an error via the logging mechanism in case we loop */
        fprintf(stderr, "Out of memory converting html.\n");
        exit(EXIT_FAILURE);
    }

    fwts_log_html(log_file, "<TR>\n");

    if (field & LOG_VERBATUM) {
        code_start = "<PRE class=style_code>";
        code_end   = "</PRE>";
    } else {
        code_start = "";
        code_end   = "";
    }

    switch (field & LOG_FIELD_MASK) {
    case LOG_ERROR:
        fwts_log_html(log_file, "  <TD class=style_error>Error</TD>"
                      "<TD COLSPAN=2>%s</TD>\n", html_converted);
        break;
    case LOG_WARNING:
        fwts_log_html(log_file, "  <TD class=style_error>Warning</TD>"
                      "<TD COLSPAN=2 class=style_advice_info>%s%s%s</TD>\n",
                      code_start, html_converted, code_end);
        break;
    case LOG_HEADING:
        fwts_log_html(log_file, "<TD COLSPAN=2 class=style_heading>%s%s%s</TD>\n",
                      code_start, html_converted, code_end);
        break;
    case LOG_INFO:
        fwts_log_html(log_file, "  <TD></TD><TD COLSPAN=2 class=style_infos>%s%s%s</TD>\n",
                      code_start, html_converted, code_end);
        break;
    case LOG_PASSED:
        fwts_log_html(log_file, "<TD class=style_passed>PASSED</TD><TD>%s</TD>\n",
                      html_converted);
        break;
    case LOG_FAILED:
        switch (level) {
        case LOG_LEVEL_CRITICAL:
            style = " class=style_critical";
            break;
        case LOG_LEVEL_HIGH:
            style = " class=style_high";
            break;
        case LOG_LEVEL_MEDIUM:
            style = " class=style_medium";
            break;
        case LOG_LEVEL_LOW:
            style = " class=style_low";
            break;
        case LOG_LEVEL_INFO:
        case LOG_LEVEL_NONE:
        default:
            style = "";
            break;
        }
        str = fwts_log_level_to_str(level);

        fwts_log_html(log_file, "  <TD%s>%s [%s]</TD>\n", style, *status ? status : "", str);
        fwts_log_html(log_file, "  <TD>%s</TD>\n", html_converted);
        break;

    case LOG_SKIPPED:
        fwts_log_html(log_file, "<TD class=style_skipped>Skipped</TD>"
                      "<TD>%s%s%s</TD>\n", code_start, html_converted, code_end);
        break;

    case LOG_SUMMARY:
        fwts_log_html(log_file, "  <TD></TD>"
                      "<TD COLSPAN=2 class=style_summary>%s%s%s</TD>\n",
                      code_start, html_converted, code_end);
        break;

    case LOG_ADVICE:
        fwts_log_html(log_file, "  <TD class=style_advice>Advice</TD>"
                      "<TD COLSPAN=2 class=style_advice_info>%s%s%s</TD>\n",
                      code_start, html_converted, code_end);
        break;

    default:
        break;
    }

    free(html_converted);

    fwts_log_html(log_file, "</TR>\n");
    fflush(log_file->fp);
    log_file->line_number++;	/* not used, but bump it anyway */

    return 0;
}