/* *************************************************************************** * Display the header of the report (XML format). * * IN: * @parm Specific parameter. Here: number of tabulations. * @action Action expected from current function. * @dfile Name of system activity data file. * @file_magic System activity file magic header. * @file_hdr System activity file standard header. * @cpu_nr Number of processors for current daily data file. * @act Array of activities (unused here). * @id_seq Activity sequence (unused here). * * OUT: * @parm Number of tabulations. *************************************************************************** */ __printf_funct_t print_xml_header(void *parm, int action, char *dfile, struct file_magic *file_magic, struct file_header *file_hdr, __nr_t cpu_nr, struct activity *act[], unsigned int id_seq[]) { struct tm rectime, *loc_t; char cur_time[TIMESTAMP_LEN]; int *tab = (int *) parm; if (action & F_BEGIN) { printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); printf("<!DOCTYPE sysstat PUBLIC \"DTD v%s sysstat //EN\"\n", XML_DTD_VERSION); printf("\"http://pagesperso-orange.fr/sebastien.godard/sysstat-%s.dtd\">\n", XML_DTD_VERSION); xprintf(*tab, "<sysstat\n" "xmlns=\"http://pagesperso-orange.fr/sebastien.godard/sysstat\"\n" "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" "xsi:schemaLocation=\"http://pagesperso-orange.fr/sebastien.godard sysstat.xsd\">"); xprintf(++(*tab), "<sysdata-version>%s</sysdata-version>", XML_DTD_VERSION); xprintf(*tab, "<host nodename=\"%s\">", file_hdr->sa_nodename); xprintf(++(*tab), "<sysname>%s</sysname>", file_hdr->sa_sysname); xprintf(*tab, "<release>%s</release>", file_hdr->sa_release); xprintf(*tab, "<machine>%s</machine>", file_hdr->sa_machine); xprintf(*tab, "<number-of-cpus>%d</number-of-cpus>", cpu_nr > 1 ? cpu_nr - 1 : 1); /* Fill file timestmap structure (rectime) */ get_file_timestamp_struct(flags, &rectime, file_hdr); strftime(cur_time, sizeof(cur_time), "%Y-%m-%d", &rectime); xprintf(*tab, "<file-date>%s</file-date>", cur_time); if ((loc_t = gmtime((const time_t *) &file_hdr->sa_ust_time)) != NULL) { strftime(cur_time, sizeof(cur_time), "%T", loc_t); xprintf(*tab, "<file-utc-time>%s</file-utc-time>", cur_time); } } if (action & F_END) { xprintf(--(*tab), "</host>"); xprintf(--(*tab), "</sysstat>"); } }
/* *************************************************************************** * Display the header of the report (JSON format). * * IN: * @parm Specific parameter. Here: number of tabulations. * @action Action expected from current function. * @dfile Name of system activity data file. * @file_magic System activity file magic header. * @file_hdr System activity file standard header. * @cpu_nr Number of processors for current daily data file. * @act Array of activities (unused here). * @id_seq Activity sequence (unused here). * * OUT: * @tab Number of tabulations. *************************************************************************** */ __printf_funct_t print_json_header(void *parm, int action, char *dfile, struct file_magic *file_magic, struct file_header *file_hdr, __nr_t cpu_nr, struct activity *act[], unsigned int id_seq[]) { struct tm rectime, *loc_t; char cur_time[32]; int *tab = (int *) parm; if (action & F_BEGIN) { xprintf(*tab, "{\"sysstat\": {"); xprintf(++(*tab), "\"sysdata-version\": %s,", XML_DTD_VERSION); xprintf(*tab, "\"hosts\": ["); xprintf(++(*tab), "{"); xprintf(++(*tab), "\"nodename\": \"%s\",", file_hdr->sa_nodename); xprintf(*tab, "\"sysname\": \"%s\",", file_hdr->sa_sysname); xprintf(*tab, "\"release\": \"%s\",", file_hdr->sa_release); xprintf(*tab, "\"machine\": \"%s\",", file_hdr->sa_machine); xprintf(*tab, "\"number-of-cpus\": %d,", cpu_nr > 1 ? cpu_nr - 1 : 1); /* Fill file timestmap structure (rectime) */ get_file_timestamp_struct(flags, &rectime, file_hdr); strftime(cur_time, sizeof(cur_time), "%Y-%m-%d", &rectime); xprintf0(*tab, "\"file-date\": \"%s\"", cur_time); if ((loc_t = gmtime((const time_t *) &file_hdr->sa_ust_time)) != NULL) { strftime(cur_time, sizeof(cur_time), "%T", loc_t); printf(",\n"); xprintf0(*tab, "\"file-utc-time\": \"%s\"", cur_time); } } if (action & F_END) { printf("\n"); xprintf(--(*tab), "}"); xprintf(--(*tab), "]"); xprintf(--(*tab), "}}"); } }
/* *************************************************************************** * Display the header of the report (XML format). * * IN: * @tab Number of tabulations. * @action Action expected from current function. * @dfile Name of system activity data file. * @file_magic System activity file magic header. * @file_hdr System activity file standard header. * @cpu_nr Number of processors for current daily data file. * @act Array of activities (unused here). * @id_seq Activity sequence (unused here). * * OUT: * @tab Number of tabulations. *************************************************************************** */ __printf_funct_t print_xml_header(int *tab, int action, char *dfile, struct file_magic *file_magic, struct file_header *file_hdr, __nr_t cpu_nr, struct activity *act[], unsigned int id_seq[]) { struct tm rectime; char cur_time[32]; if (action & F_BEGIN) { printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); printf("<!DOCTYPE sysstat PUBLIC \"DTD v%s sysstat //EN\"\n", XML_DTD_VERSION); printf("\"http://pagesperso-orange.fr/sebastien.godard/sysstat-%s.dtd\">\n", XML_DTD_VERSION); xprintf(*tab, "<sysstat>"); xprintf(++(*tab), "<sysdata-version>%s</sysdata-version>", XML_DTD_VERSION); xprintf(*tab, "<host nodename=\"%s\">", file_hdr->sa_nodename); xprintf(++(*tab), "<sysname>%s</sysname>", file_hdr->sa_sysname); xprintf(*tab, "<release>%s</release>", file_hdr->sa_release); xprintf(*tab, "<machine>%s</machine>", file_hdr->sa_machine); xprintf(*tab, "<number-of-cpus>%d</number-of-cpus>", cpu_nr > 1 ? cpu_nr - 1 : 1); /* Fill file timestmap structure (rectime) */ get_file_timestamp_struct(flags, &rectime, file_hdr); strftime(cur_time, 32, "%Y-%m-%d", &rectime); xprintf(*tab, "<file-date>%s</file-date>", cur_time); } if (action & F_END) { xprintf(--(*tab), "</host>"); xprintf(--(*tab), "</sysstat>"); } }
/* *************************************************************************** * Display data file header. * * IN: * @parm Specific parameter (unused here). * @action Action expected from current function. * @dfile Name of system activity data file. * @file_magic System activity file magic header. * @file_hdr System activity file standard header. * @cpu_nr Number of processors for current daily data file. * @act Array of activities. * @id_seq Activity sequence. *************************************************************************** */ __printf_funct_t print_hdr_header(void *parm, int action, char *dfile, struct file_magic *file_magic, struct file_header *file_hdr, __nr_t cpu_nr, struct activity *act[], unsigned int id_seq[]) { int i, p; struct tm rectime, *loc_t; char cur_time[TIMESTAMP_LEN]; /* Actions F_MAIN and F_END ignored */ if (action & F_BEGIN) { printf(_("System activity data file: %s (%#x)\n"), dfile, file_magic->format_magic); display_sa_file_version(stdout, file_magic); if (file_magic->format_magic != FORMAT_MAGIC) { return; } printf(_("Genuine sa datafile: %s (%x)\n"), file_magic->upgraded ? _("no") : _("yes"), file_magic->upgraded); printf(_("Host: ")); print_gal_header(localtime((const time_t *) &(file_hdr->sa_ust_time)), file_hdr->sa_sysname, file_hdr->sa_release, file_hdr->sa_nodename, file_hdr->sa_machine, cpu_nr > 1 ? cpu_nr - 1 : 1, PLAIN_OUTPUT); printf(_("Number of CPU for last samples in file: %u\n"), file_hdr->sa_last_cpu_nr > 1 ? file_hdr->sa_last_cpu_nr - 1 : 1); /* Fill file timestmap structure (rectime) */ get_file_timestamp_struct(flags, &rectime, file_hdr); strftime(cur_time, sizeof(cur_time), "%Y-%m-%d", &rectime); printf(_("File date: %s\n"), cur_time); if ((loc_t = gmtime((const time_t *) &file_hdr->sa_ust_time)) != NULL) { printf(_("File time: ")); strftime(cur_time, sizeof(cur_time), "%T", loc_t); printf("%s UTC\n", cur_time); } printf(_("Size of a long int: %d\n"), file_hdr->sa_sizeof_long); /* Number of activities (number of volatile activities) in file */ printf("sa_act_nr (sa_vol_act_nr): %u (%u)\n", file_hdr->sa_act_nr, file_hdr->sa_vol_act_nr); printf(_("List of activities:\n")); for (i = 0; i < NR_ACT; i++) { if (!id_seq[i]) continue; p = get_activity_position(act, id_seq[i], EXIT_IF_NOT_FOUND); printf("%02d: %s\t(x%d)", act[p]->id, act[p]->name, act[p]->nr); if (act[p]->f_count2 || (act[p]->nr2 > 1)) { printf("\t(x%d)", act[p]->nr2); } if (act[p]->magic == ACTIVITY_MAGIC_UNKNOWN) { printf(_("\t[Unknown activity format]")); } printf("\n"); } } }