You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
5.4 KiB
225 lines
5.4 KiB
/***************************************************************************
|
|
hdsensorslist.cpp - description
|
|
-------------------
|
|
begin : vie abr 26 2002
|
|
copyright : (C) 2002 by Miguel Novas
|
|
email : michaell@teleline.es
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program 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; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <dirent.h>
|
|
#include <sys/types.h>
|
|
#include <stdlib.h>
|
|
#include <qstringlist.h>
|
|
#include <klocale.h>
|
|
#include <regex.h>
|
|
|
|
#include "sensor.h"
|
|
#include "hdsensorslist.h"
|
|
|
|
|
|
HDSensorsList::HDSensorsList(QObject *parent, const char * name): SensorsList(parent,name)
|
|
{
|
|
process= 0;
|
|
|
|
setDescription( QString(i18n("Hard Disks")) );
|
|
|
|
setClass(Sensor::hdSensor);
|
|
|
|
readConfig();
|
|
|
|
if(!isHddTempInstalled()) return;
|
|
|
|
QStringList disks;
|
|
if(!getDisks(disks)) return;
|
|
|
|
ProcessExec proc;
|
|
proc << "hddtemp" << "-q";
|
|
for(QStringList::Iterator it = disks.begin(); it != disks.end(); ++it ) {
|
|
proc << *it;
|
|
}
|
|
|
|
if(proc.runAndWait()) {
|
|
double value;
|
|
QString str;
|
|
for(QStringList::Iterator it = disks.begin(); it != disks.end(); ++it ) {
|
|
if(getDiskInfo(proc.getStdoutData(),*it,str,value)) {
|
|
Sensor *sensor= new Sensor(this);
|
|
sensor->setType(Sensor::lmTemp);
|
|
sensor->setName(*it);
|
|
sensor->setDescription(str);
|
|
sensor->setValueMax (40 , Sensor::dgCelsius);
|
|
sensor->setValueMin ( 0 , Sensor::dgCelsius);
|
|
sensor->setValueIdeal(value, Sensor::dgCelsius);
|
|
sensor->setValue (value, Sensor::dgCelsius);
|
|
sensor->readConfig();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
HDSensorsList::~HDSensorsList()
|
|
{
|
|
delete process;
|
|
}
|
|
|
|
//*************
|
|
|
|
void HDSensorsList::updateSensors()
|
|
{
|
|
if(process) return;
|
|
|
|
QObjectList *list= (QObjectList *)children();
|
|
if(!list) return;
|
|
|
|
QStringList params;
|
|
for(Sensor *obj= (Sensor *)list->first(); obj!=0; obj= (Sensor *)list->next())
|
|
if(obj->monitorized())
|
|
params << obj->name();
|
|
|
|
if(params.count()>0) {
|
|
process= new ProcessExec;
|
|
#if ( KDE_VERSION_MAJOR >= 3 )
|
|
*process << "hddtemp" << "-q" << params;
|
|
#else
|
|
*process << "hddtemp" << "-q";
|
|
for (QStringList::Iterator it= params.begin(); it!=params.end(); ++it)
|
|
*process << *it;
|
|
#endif
|
|
connect( process, SIGNAL(processExited(KProcess *)), this, SLOT(slotProcessExited(KProcess *)) );
|
|
process->run();
|
|
}
|
|
}
|
|
|
|
|
|
void HDSensorsList::slotProcessExited(KProcess *)
|
|
{
|
|
QObjectList *list= (QObjectList *)children();
|
|
|
|
if(!list) return;
|
|
|
|
char *buf= process->getStdoutData();
|
|
|
|
if( process->outputErrors() ) {
|
|
qWarning("HddTemp Error:\n%s", buf);
|
|
}
|
|
|
|
char *ptr;
|
|
regex_t *preg;
|
|
regmatch_t pmatch[1];
|
|
preg = (regex_t*) malloc(sizeof(regex_t));
|
|
regcomp(preg, ": [0-9]\\+.*C$", REG_NEWLINE);
|
|
|
|
for(Sensor *obj= (Sensor *)list->first(); obj!=0; obj= (Sensor *)list->next()) {
|
|
buf= strstr(buf,obj->name());
|
|
if(!buf) break;
|
|
if (regexec(preg, buf, 1, pmatch, 0) == 0)
|
|
{
|
|
ptr = buf + pmatch[0].rm_so + 2;
|
|
buf += pmatch[0].rm_eo;
|
|
obj->setValue(atof(ptr), Sensor::dgCelsius);
|
|
}
|
|
}
|
|
regfree(preg);
|
|
free(preg);
|
|
|
|
delete process;
|
|
process= 0;
|
|
}
|
|
|
|
// *************** Static methods
|
|
|
|
|
|
bool HDSensorsList::getDiskInfo(const char *buf, QString disk, QString &name, double &value)
|
|
{
|
|
regex_t *preg;
|
|
regmatch_t pmatch[1];
|
|
preg = (regex_t*) malloc(sizeof(regex_t));
|
|
|
|
// Take disk model
|
|
char reg_string[30];
|
|
snprintf(reg_string, sizeof(reg_string), "%s: .*: [0-9]", disk.latin1());
|
|
regcomp(preg, reg_string, REG_NEWLINE);
|
|
if (regexec(preg, buf, 1, pmatch, 0) == 0)
|
|
{
|
|
name="";
|
|
pmatch[0].rm_eo -= 3;
|
|
pmatch[0].rm_so += 10;
|
|
buf += pmatch[0].rm_so;
|
|
while (pmatch[0].rm_so < pmatch[0].rm_eo)
|
|
{
|
|
name += *buf;
|
|
buf++;
|
|
pmatch[0].rm_so++;
|
|
}
|
|
regfree(preg);
|
|
name= name.stripWhiteSpace();
|
|
if( name.length()>40 ) name= disk;
|
|
}
|
|
else
|
|
{
|
|
regfree(preg);
|
|
free(preg);
|
|
return false;
|
|
}
|
|
|
|
// Take disk temperature
|
|
regcomp(preg, ": [0-9]\\+.*C$", REG_NEWLINE);
|
|
if (regexec(preg, buf, 1, pmatch, 0) == 0)
|
|
{
|
|
value= atof(buf + pmatch[0].rm_so + 2);
|
|
regfree(preg);
|
|
free(preg);
|
|
}
|
|
else
|
|
{
|
|
regfree(preg);
|
|
free(preg);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
bool HDSensorsList::isHddTempInstalled()
|
|
{
|
|
ProcessExec proc;
|
|
|
|
proc << "hddtemp" ;
|
|
if(proc.runAndWait()) {
|
|
if(strstr(proc.getStdoutData(),"ERROR")==0) return true;
|
|
qWarning("HddTemp Error:\n%s", proc.getStdoutData());
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool HDSensorsList::getDisks(QStringList &disks )
|
|
{
|
|
DIR *dir= opendir("/proc/ide");
|
|
if(!dir) return false;
|
|
QString str;
|
|
struct dirent *ptr;
|
|
while((ptr= readdir(dir))) {
|
|
if(ptr->d_name[0]=='h' && ptr->d_name[1]=='d') {
|
|
str.sprintf("/dev/hd%c",ptr->d_name[2]);
|
|
disks << str;
|
|
}
|
|
}
|
|
closedir(dir);
|
|
return true;
|
|
}
|
|
|
|
// ***************
|
|
|