superkaramba
disk.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "disk.h"
00011
00012 #include <K3ProcIO>
00013
00014 DiskSensor::DiskSensor(int msec) : Sensor(msec)
00015 {
00016 connect(&ksp, SIGNAL(receivedStdout(K3Process *, char *, int)),
00017 this, SLOT(receivedStdout(K3Process *, char *, int)));
00018 connect(&ksp, SIGNAL(processExited(K3Process *)),
00019 this, SLOT(processExited(K3Process *)));
00020
00021
00022 ksp.clearArguments();
00023 ksp << "df";
00024 ksp.start(K3ProcIO::Block, K3ProcIO::Stdout);
00025
00026 init = 1;
00027 }
00028 DiskSensor::~DiskSensor()
00029 {}
00030
00031 int DiskSensor::getFreeSpace(const QString &mntPt) const
00032 {
00033 QRegExp rx("^\\S*\\s*\\d+\\s+\\d+\\s+(\\d+)");
00034 rx.indexIn(mntMap[mntPt]);
00035 return rx.cap(1).toInt();
00036 }
00037
00038 int DiskSensor::getUsedSpace(const QString &mntPt) const
00039 {
00040 QRegExp rx("^\\S*\\s*\\d+\\s+(\\d+)\\s+\\d+");
00041 rx.indexIn(mntMap[mntPt]);
00042 return rx.cap(1).toInt();
00043 }
00044
00045 int DiskSensor::getTotalSpace(const QString &mntPt) const
00046 {
00047
00048 QRegExp rx("^\\S*\\s*(\\d+)\\s+\\d+\\s+\\d+");
00049 rx.indexIn(mntMap[mntPt]);
00050
00051 return rx.cap(1).toInt();
00052
00053 }
00054
00055 int DiskSensor::getPercentUsed(const QString &mntPt) const
00056 {
00057 QRegExp rx("\\s+(\\d+)%\\s+");
00058 rx.indexIn(mntMap[mntPt]);
00059 return rx.cap(1).toInt();
00060 }
00061
00062 int DiskSensor::getPercentFree(const QString &mntPt) const
00063 {
00064 return (100 - getPercentUsed(mntPt));
00065 }
00066
00067 void DiskSensor::receivedStdout(K3Process *, char *buffer, int len)
00068 {
00069
00070 buffer[len] = 0;
00071 sensorResult += QString(buffer);
00072
00073 }
00074
00075 void DiskSensor::processExited(K3Process *)
00076 {
00077 QStringList stringList = sensorResult.split('\n');
00078 sensorResult = "";
00079 QStringList::Iterator it = stringList.begin();
00080
00081 QRegExp rx(".*\\s+(/\\S*)$");
00082
00083 while (it != stringList.end()) {
00084 rx.indexIn(*it);
00085 if (!rx.cap(0).isEmpty()) {
00086 mntMap[rx.cap(1)] = *it;
00087 }
00088 it++;
00089 }
00090 stringList.clear();
00091
00092 QString format;
00093 QString mntPt;
00094 SensorParams *sp;
00095 Meter *meter;
00096
00097 QObject *lit;
00098 foreach(lit, *objList) {
00099 sp = qobject_cast<SensorParams*>(lit);
00100 meter = sp->getMeter();
00101 format = sp->getParam("FORMAT");
00102 mntPt = sp->getParam("MOUNTPOINT");
00103 if (mntPt.length() == 0)
00104 mntPt = "/";
00105
00106 if (format.length() == 0) {
00107 format = "%u";
00108 }
00109 format.replace(QRegExp("%fp", Qt::CaseInsensitive), QString::number(getPercentFree(mntPt)));
00110 format.replace(QRegExp("%fg", Qt::CaseInsensitive),
00111 QString::number(getFreeSpace(mntPt) / (1024*1024)));
00112 format.replace(QRegExp("%fkb", Qt::CaseInsensitive),
00113 QString::number(getFreeSpace(mntPt)*8));
00114 format.replace(QRegExp("%fk", Qt::CaseInsensitive),
00115 QString::number(getFreeSpace(mntPt)));
00116 format.replace(QRegExp("%f", Qt::CaseInsensitive), QString::number(getFreeSpace(mntPt) / 1024));
00117
00118 format.replace(QRegExp("%up", Qt::CaseInsensitive), QString::number(getPercentUsed(mntPt)));
00119 format.replace(QRegExp("%ug", Qt::CaseInsensitive),
00120 QString::number(getUsedSpace(mntPt) / (1024*1024)));
00121 format.replace(QRegExp("%ukb", Qt::CaseInsensitive),
00122 QString::number(getUsedSpace(mntPt)*8));
00123 format.replace(QRegExp("%uk", Qt::CaseInsensitive),
00124 QString::number(getUsedSpace(mntPt)));
00125 format.replace(QRegExp("%u", Qt::CaseInsensitive), QString::number(getUsedSpace(mntPt) / 1024));
00126
00127 format.replace(QRegExp("%tg", Qt::CaseInsensitive),
00128 QString::number(getTotalSpace(mntPt) / (1024*1024)));
00129 format.replace(QRegExp("%tkb", Qt::CaseInsensitive),
00130 QString::number(getTotalSpace(mntPt)*8));
00131 format.replace(QRegExp("%tk", Qt::CaseInsensitive),
00132 QString::number(getTotalSpace(mntPt)));
00133 format.replace(QRegExp("%t", Qt::CaseInsensitive), QString::number(getTotalSpace(mntPt) / 1024));
00134
00135 meter->setValue(format);
00136 }
00137
00138 if (init == 1) {
00139 emit initComplete();
00140 init = 0;
00141 }
00142 }
00143
00144 void DiskSensor::update()
00145 {
00146 if (ksp.isRunning())
00147 return;
00148
00149 ksp.clearArguments();
00150 ksp << "df";
00151 ksp.start(K3ProcIO::NotifyOnExit, K3ProcIO::Stdout);
00152 }
00153
00154 void DiskSensor::setMaxValue(SensorParams *sp)
00155 {
00156 Meter *meter;
00157 meter = sp->getMeter();
00158 const QString mntPt = sp->getParam("MOUNTPOINT");
00159
00160 QString f;
00161 f = sp->getParam("FORMAT");
00162 if (f == "%fp" || f == "%up")
00163 meter->setMax(100);
00164 else
00165 meter->setMax(getTotalSpace(mntPt) / 1024);
00166 }
00167
00168
00169
00170 #include "disk.moc"