/* * 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 * Chris Ferron */ #include "css.h" #include "lib.h" #include "report.h" #include #include #include #include #include #include #include #include using namespace std; struct reportstream reportout; bool reporttype; static void css_header(void) { if (!reportout.http_report) return; #ifdef EXTERNAL_CSS_FILE if (reporttype) fprintf(reportout.http_report, "\n"); #else if (reporttype) { fprintf(reportout.http_report, "%s\n", css); } #endif } 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; if ((!reportout.csv_report)&&(!reportout.http_report)) return; if (reporttype) { fprintf(reportout.http_report, "
\n

 

\n
\n
\n"); fprintf(reportout.http_report, "\n", POWERTOP_VERSION); } else { fprintf(reportout.csv_report, "***PowerTOP Report***, \n"); fprintf(reportout.csv_report, "**System Information**, \n"); fprintf(reportout.csv_report, "\n"); fprintf(reportout.csv_report, "PowerTOP Version:, \"%s\", \n", POWERTOP_VERSION); } str = read_sysfs_string("/proc/version"); if (reporttype) fprintf(reportout.http_report,"\n", str.c_str()); else fprintf(reportout.csv_report, "Kernel Version:, \"%s\", \n", 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"); if (reporttype) fprintf(reportout.http_report, "\n", str.c_str(), str2.c_str(), str3.c_str()); else fprintf(reportout.csv_report,"System Name:,\"%s %s %s\", \n", str.c_str(), str2.c_str(), str3.c_str()); str = cpu_model(); if (reporttype) fprintf(reportout.http_report, "\n", sysconf(_SC_NPROCESSORS_ONLN), str.c_str()); else fprintf(reportout.csv_report,"CPU Information:, %lix \"%s\", \n", 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"); if (reporttype) { fprintf(reportout.http_report, "\n", str.c_str()); fprintf(reportout.http_report,"
PowerTOP Version%s
Kernel Version%s
System Name%s %s %s
CPU Information%lix %s
OS Information%s
\n"); } else { fprintf(reportout.csv_report,"OS Information:,\"%s\", \n", str.c_str()); fprintf(reportout.csv_report,"\n"); } } void init_report_output(char *filename_str, int iterations) { size_t period; char file_prefix[256]; char file_postfix[8]; time_t stamp; char datestr[200]; string mystring = string(filename_str); sprintf(file_postfix, "%s", reporttype ? "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); if (reporttype) { reportout.http_report = fopen(reportout.filename, "wm"); if (!reportout.http_report) { fprintf(stderr, _("Cannot open output file %s (%s)\n"), reportout.filename, strerror(errno)); } }else { reportout.csv_report = fopen(reportout.filename, "wm"); if (!reportout.csv_report) { fprintf(stderr, _("Cannot open output file %s (%s)\n"), reportout.filename, strerror(errno)); } } http_header_output(); system_info(); } void http_header_output(void) { if (!reportout.http_report) return; css_header(); } void finish_report_output(void) { fprintf(stderr, _("PowerTOP outputing using base filename %s\n"), reportout.filename); if (reportout.http_report){ fprintf(reportout.http_report, "\n\n \n"); fflush(reportout.http_report); fdatasync(fileno(reportout.http_report)); fclose(reportout.http_report); } if (reportout.csv_report) { fflush(reportout.csv_report); fdatasync(fileno(reportout.csv_report)); fclose(reportout.csv_report); } }