kpmcore/src/core/smartstatus.cpp

154 lines
4.0 KiB
C++
Raw Normal View History

/*
SPDX-FileCopyrightText: 2010 Volker Lanz <vl@fidra.de>
SPDX-FileCopyrightText: 2010 Yuri Chornoivan <yurchor@ukr.net>
2020-10-24 22:01:45 +01:00
SPDX-FileCopyrightText: 2014-2020 Andrius Štikonas <andrius@stikonas.eu>
SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac <teo@kde.org>
SPDX-FileCopyrightText: 2018 Caio Jordão Carvalho <caiojcarvalho@gmail.com>
SPDX-FileCopyrightText: 2019 Shubham Jangra <aryan100jangid@gmail.com>
SPDX-License-Identifier: GPL-3.0-or-later
*/
#include "core/smartstatus.h"
2018-01-08 20:59:48 +00:00
#include "core/smartparser.h"
#include "core/smartdiskinformation.h"
#include "core/smartattributeparseddata.h"
#include <KLocalizedString>
#include <QDebug>
#include <QString>
#include <QStringList>
#include <errno.h>
2020-10-24 22:01:45 +01:00
#include <utility>
2018-01-08 20:59:48 +00:00
SmartStatus::SmartStatus(const QString &device_path) :
2015-07-13 15:16:36 +01:00
m_DevicePath(device_path),
m_InitSuccess(false),
m_Status(false),
m_ModelName(),
m_Serial(),
m_Firmware(),
2018-04-09 15:14:34 +01:00
m_Overall(Overall::Bad),
m_SelfTestStatus(SelfTestStatus::Success),
m_Temp(0),
m_BadSectors(0),
m_PowerCycles(0),
m_PoweredOn(0)
{
2015-07-13 15:16:36 +01:00
update();
}
void SmartStatus::update()
{
2018-01-08 20:59:48 +00:00
SmartParser parser(devicePath());
2015-07-13 15:16:36 +01:00
2018-01-08 20:59:48 +00:00
if (!parser.init()) {
qDebug() << "error during smart output parsing for " << devicePath() << ": " << strerror(errno);
2015-07-13 15:16:36 +01:00
return;
}
2018-01-08 20:59:48 +00:00
SmartDiskInformation *disk;
disk = parser.diskInformation();
2015-07-13 15:16:36 +01:00
2018-01-08 20:59:48 +00:00
if (!disk)
2015-07-13 15:16:36 +01:00
return;
2018-01-08 20:59:48 +00:00
setStatus(disk->smartStatus());
setModelName(disk->model());
setFirmware(disk->firmware());
setSerial(disk->serial());
setSelfTestStatus(disk->selfTestExecutionStatus());
setOverall(disk->overall());
2018-01-08 20:59:48 +00:00
setTemp(disk->temperature());
setBadSectors(disk->badSectors());
setPoweredOn(disk->poweredOn());
setPowerCycles(disk->powerCycles());
addAttributes(disk->attributes());
2015-07-13 15:16:36 +01:00
setInitSuccess(true);
}
QString SmartStatus::tempToString(quint64 mkelvin)
{
2015-07-13 15:16:36 +01:00
const double celsius = (mkelvin - 273150.0) / 1000.0;
const double fahrenheit = 9.0 * celsius / 5.0 + 32;
2018-01-08 20:59:48 +00:00
return xi18nc("@item:intable degrees in Celsius and Fahrenheit", "%1° C / %2° F",
QLocale().toString(celsius, 'f', 0), QLocale().toString(fahrenheit, 'f', 0));
}
QString SmartStatus::selfTestStatusToString(SmartStatus::SelfTestStatus s)
{
2015-07-13 15:16:36 +01:00
switch (s) {
2018-04-09 15:14:34 +01:00
case SelfTestStatus::Aborted:
return xi18nc("@item", "Aborted");
2018-04-09 15:14:34 +01:00
case SelfTestStatus::Interrupted:
return xi18nc("@item", "Interrupted");
2018-04-09 15:14:34 +01:00
case SelfTestStatus::Fatal:
return xi18nc("@item", "Fatal error");
2018-04-09 15:14:34 +01:00
case SelfTestStatus::ErrorUnknown:
return xi18nc("@item", "Unknown error");
2018-04-09 15:14:34 +01:00
case SelfTestStatus::ErrorEletrical:
return xi18nc("@item", "Electrical error");
2018-04-09 15:14:34 +01:00
case SelfTestStatus::ErrorServo:
return xi18nc("@item", "Servo error");
2018-04-09 15:14:34 +01:00
case SelfTestStatus::ErrorRead:
return xi18nc("@item", "Read error");
2018-04-09 15:14:34 +01:00
case SelfTestStatus::ErrorHandling:
return xi18nc("@item", "Handling error");
2018-04-09 15:14:34 +01:00
case SelfTestStatus::InProgress:
return xi18nc("@item", "Self test in progress");
2018-04-09 15:14:34 +01:00
case SelfTestStatus::Success:
2015-07-13 15:16:36 +01:00
default:
return xi18nc("@item", "Success");
2015-07-13 15:16:36 +01:00
}
}
QString SmartStatus::overallAssessmentToString(Overall o)
{
2015-07-13 15:16:36 +01:00
switch (o) {
2018-04-09 15:14:34 +01:00
case Overall::Good:
return xi18nc("@item", "Healthy");
2018-04-09 15:14:34 +01:00
case Overall::BadPast:
return xi18nc("@item", "Has been used outside of its design parameters in the past.");
2018-04-09 15:14:34 +01:00
case Overall::BadSectors:
return xi18nc("@item", "Has some bad sectors.");
2018-04-09 15:14:34 +01:00
case Overall::BadNow:
return xi18nc("@item", "Is being used outside of its design parameters right now.");
2018-04-09 15:14:34 +01:00
case Overall::BadSectorsMany:
return xi18nc("@item", "Has many bad sectors.");
2018-04-09 15:14:34 +01:00
case Overall::Bad:
2015-07-13 15:16:36 +01:00
default:
return xi18nc("@item", "Disk failure is imminent. Backup all data!");
2015-07-13 15:16:36 +01:00
}
}
2018-01-08 20:59:48 +00:00
void SmartStatus::addAttributes(QList<SmartAttributeParsedData> attr)
{
2018-01-08 20:59:48 +00:00
m_Attributes.clear();
2020-10-24 22:01:45 +01:00
for (const SmartAttributeParsedData &at : std::as_const(attr)) {
2018-01-08 20:59:48 +00:00
SmartAttribute sm(at);
m_Attributes.append(sm);
}
}