blob: c018bb1461dacf9c8ba5ad9d5ec8b98c5b7dfe40 [file] [log] [blame]
/*
* Copyright 2011, Intel Corporation
*
* This file is part of PowerTOP
*
* This program file is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program in a file named COPYING; if not, write to the
* Free Software Foundation, Inc,
* 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
* or just google for it.
*
* Authors:
* Arjan van de Ven <arjan@linux.intel.com>
* Chris Ferron <chris.e.ferron@linux.intel.com>
*/
#include "lib.h"
#include "report.h"
#include "report-maker.h"
#include <errno.h>
#include <string.h>
#include <utility>
#include <iostream>
#include <fstream>
#include <string.h>
#include <malloc.h>
#include <unistd.h>
using namespace std;
struct reportstream reportout;
report_type reporttype = REPORT_OFF;
report_maker report(REPORT_OFF);
string cpu_model(void)
{
ifstream file;
file.open("/proc/cpuinfo", ios::in);
if (!file)
return "";
while (file) {
char line[4096];
file.getline(line, 4096);
if (strstr(line, "model name")) {
char *c;
c = strchr(line, ':');
if (c) {
file.close();
c++;
return c;
}
}
}
file.close();
return "";
}
static string read_os_release(const string &filename)
{
ifstream file;
char content[4096];
char *c;
const char *pname = "PRETTY_NAME=";
string os("");
file.open(filename.c_str(), ios::in);
if (!file)
return "";
while (file.getline(content, 4096)) {
if (strncasecmp(pname, content, strlen(pname)) == 0) {
c = strchr(content, '=');
if (!c)
break;
c += 1;
if (*c == '"' || *c == '\'')
c += 1;
*strchrnul(c, '"') = 0;
*strchrnul(c, '\'') = 0;
os = c;
break;
}
}
file.close();
return os;
}
static void system_info(void)
{
string str, str2, str3;
report.begin_section(SECTION_SYSINFO);
report.add_header("System Information");
report.begin_table();
report.begin_row(ROW_SYSINFO);
report.begin_cell(CELL_SYSINFO);
report.add("PowerTOP Version");
report.begin_cell();
report.add(POWERTOP_VERSION);
str = read_sysfs_string("/proc/version");
report.begin_row(ROW_SYSINFO);
report.begin_cell();
report.add("Kernel Version");
report.begin_cell();
report.add(str.c_str());
str = read_sysfs_string("/sys/devices/virtual/dmi/id/board_vendor");
str2 = read_sysfs_string("/sys/devices/virtual/dmi/id/board_name");
str3 = read_sysfs_string("/sys/devices/virtual/dmi/id/product_version");
report.begin_row(ROW_SYSINFO);
report.begin_cell();
report.add("System Name");
report.begin_cell();
report.addf("%s %s %s", str.c_str(), str2.c_str(), str3.c_str());
str = cpu_model();
report.begin_row(ROW_SYSINFO);
report.begin_cell();
report.add("CPU Information");
report.begin_cell();
report.addf("%lix %s", sysconf(_SC_NPROCESSORS_ONLN), str.c_str());
str = read_sysfs_string("/etc/system-release");
if (str.length() < 1)
str = read_sysfs_string("/etc/redhat-release");
if (str.length() < 1)
str = read_os_release("/etc/os-release");
report.begin_row(ROW_SYSINFO);
report.begin_cell();
report.add("OS Information");
report.begin_cell();
report.add(str.c_str());
}
void init_report_output(char *filename_str, int iterations)
{
size_t period;
char file_prefix[4096];
char file_postfix[8];
time_t stamp;
char datestr[200];
string mystring = string(filename_str);
sprintf(file_postfix, "%s",
(reporttype == REPORT_HTML ? "html" : "csv"));
period=mystring.find_last_of(".");
sprintf(file_prefix, "%s",mystring.substr(0,period).c_str());
memset(&datestr, 0, 200);
memset(&stamp, 0, sizeof(time_t));
stamp=time(NULL);
strftime(datestr, sizeof(datestr), "%Y%m%d-%H%M%S", localtime(&stamp));
if (iterations != 1)
sprintf(reportout.filename, "%s-%s.%s",
file_prefix, datestr,file_postfix);
else
sprintf(reportout.filename, "%s.%s",
file_prefix, file_postfix);
reportout.report_file = fopen(reportout.filename, "wm");
if (!reportout.report_file) {
fprintf(stderr, _("Cannot open output file %s (%s)\n"),
reportout.filename, strerror(errno));
}
report.set_type(reporttype);
system_info();
}
void finish_report_output(void)
{
if (reporttype == REPORT_OFF)
return;
report.finish_report();
if (reportout.report_file)
{
fprintf(stderr, _("PowerTOP outputing using base filename %s\n"), reportout.filename);
fputs(report.get_result(), reportout.report_file);
fdatasync(fileno(reportout.report_file));
fclose(reportout.report_file);
}
report.clear_result();
}