File indexing completed on 2024-04-28 05:45:47

0001 /*
0002     SPDX-FileCopyrightText: 2010 Volker Lanz <vl@fidra.de>
0003     SPDX-FileCopyrightText: 2010 Yuri Chornoivan <yurchor@ukr.net>
0004     SPDX-FileCopyrightText: 2014-2020 Andrius Štikonas <andrius@stikonas.eu>
0005     SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac <teo@kde.org>
0006     SPDX-FileCopyrightText: 2018 Caio Jordão Carvalho <caiojcarvalho@gmail.com>
0007     SPDX-FileCopyrightText: 2019 Shubham Jangra <aryan100jangid@gmail.com>
0008 
0009     SPDX-License-Identifier: GPL-3.0-or-later
0010 */
0011 
0012 #include "core/smartstatus.h"
0013 
0014 #include "core/smartparser.h"
0015 #include "core/smartdiskinformation.h"
0016 #include "core/smartattributeparseddata.h"
0017 
0018 #include <KLocalizedString>
0019 
0020 #include <QDebug>
0021 #include <QString>
0022 #include <QStringList>
0023 
0024 #include <errno.h>
0025 #include <utility>
0026 
0027 SmartStatus::SmartStatus(const QString &device_path) :
0028     m_DevicePath(device_path),
0029     m_InitSuccess(false),
0030     m_Status(false),
0031     m_ModelName(),
0032     m_Serial(),
0033     m_Firmware(),
0034     m_Overall(Overall::Bad),
0035     m_SelfTestStatus(SelfTestStatus::Success),
0036     m_Temp(0),
0037     m_BadSectors(0),
0038     m_PowerCycles(0),
0039     m_PoweredOn(0)
0040 {
0041     update();
0042 }
0043 
0044 void SmartStatus::update()
0045 {
0046     SmartParser parser(devicePath());
0047 
0048     if (!parser.init()) {
0049         qDebug() << "error during smart output parsing for " << devicePath() << ": " << strerror(errno);
0050         return;
0051     }
0052 
0053     SmartDiskInformation *disk;
0054 
0055     disk = parser.diskInformation();
0056 
0057     if (!disk)
0058         return;
0059 
0060     setStatus(disk->smartStatus());
0061     setModelName(disk->model());
0062     setFirmware(disk->firmware());
0063     setSerial(disk->serial());
0064     setSelfTestStatus(disk->selfTestExecutionStatus());
0065     setOverall(disk->overall());
0066     setTemp(disk->temperature());
0067     setBadSectors(disk->badSectors());
0068     setPoweredOn(disk->poweredOn());
0069     setPowerCycles(disk->powerCycles());
0070     addAttributes(disk->attributes());
0071     setInitSuccess(true);
0072 }
0073 
0074 QString SmartStatus::tempToString(quint64 mkelvin)
0075 {
0076     const double celsius = (mkelvin - 273150.0) / 1000.0;
0077     const double fahrenheit = 9.0 * celsius / 5.0 + 32;
0078     return xi18nc("@item:intable degrees in Celsius and Fahrenheit", "%1° C / %2° F",
0079                   QLocale().toString(celsius, 'f', 0), QLocale().toString(fahrenheit, 'f', 0));
0080 }
0081 
0082 QString SmartStatus::selfTestStatusToString(SmartStatus::SelfTestStatus s)
0083 {
0084     switch (s) {
0085     case SelfTestStatus::Aborted:
0086         return xi18nc("@item", "Aborted");
0087 
0088     case SelfTestStatus::Interrupted:
0089         return xi18nc("@item", "Interrupted");
0090 
0091     case SelfTestStatus::Fatal:
0092         return xi18nc("@item", "Fatal error");
0093 
0094     case SelfTestStatus::ErrorUnknown:
0095         return xi18nc("@item", "Unknown error");
0096 
0097     case SelfTestStatus::ErrorEletrical:
0098         return xi18nc("@item", "Electrical error");
0099 
0100     case SelfTestStatus::ErrorServo:
0101         return xi18nc("@item", "Servo error");
0102 
0103     case SelfTestStatus::ErrorRead:
0104         return xi18nc("@item", "Read error");
0105 
0106     case SelfTestStatus::ErrorHandling:
0107         return xi18nc("@item", "Handling error");
0108 
0109     case SelfTestStatus::InProgress:
0110         return xi18nc("@item", "Self test in progress");
0111 
0112     case SelfTestStatus::Success:
0113     default:
0114         return xi18nc("@item", "Success");
0115     }
0116 
0117 }
0118 
0119 QString SmartStatus::overallAssessmentToString(Overall o)
0120 {
0121     switch (o) {
0122     case Overall::Good:
0123         return xi18nc("@item", "Healthy");
0124 
0125     case Overall::BadPast:
0126         return xi18nc("@item", "Has been used outside of its design parameters in the past.");
0127 
0128     case Overall::BadSectors:
0129         return xi18nc("@item", "Has some bad sectors.");
0130 
0131     case Overall::BadNow:
0132         return xi18nc("@item", "Is being used outside of its design parameters right now.");
0133 
0134     case Overall::BadSectorsMany:
0135         return xi18nc("@item", "Has many bad sectors.");
0136 
0137     case Overall::Bad:
0138     default:
0139         return xi18nc("@item", "Disk failure is imminent. Backup all data!");
0140     }
0141 
0142 }
0143 
0144 void SmartStatus::addAttributes(QList<SmartAttributeParsedData> attr)
0145 {
0146     m_Attributes.clear();
0147 
0148     for (const SmartAttributeParsedData &at : std::as_const(attr)) {
0149         SmartAttribute sm(at);
0150         m_Attributes.append(sm);
0151     }
0152 }
0153