1 /*
2     SPDX-FileCopyrightText: 2010 Volker Lanz <vl@fidra.de>
3     SPDX-FileCopyrightText: 2010 Yuri Chornoivan <yurchor@ukr.net>
4     SPDX-FileCopyrightText: 2014-2020 Andrius Štikonas <andrius@stikonas.eu>
5     SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac <teo@kde.org>
6     SPDX-FileCopyrightText: 2018 Caio Jordão Carvalho <caiojcarvalho@gmail.com>
7     SPDX-FileCopyrightText: 2019 Shubham Jangra <aryan100jangid@gmail.com>
8 
9     SPDX-License-Identifier: GPL-3.0-or-later
10 */
11 
12 #include "core/smartstatus.h"
13 
14 #include "core/smartparser.h"
15 #include "core/smartdiskinformation.h"
16 #include "core/smartattributeparseddata.h"
17 
18 #include <KLocalizedString>
19 
20 #include <QDebug>
21 #include <QString>
22 #include <QStringList>
23 
24 #include <errno.h>
25 #include <utility>
26 
SmartStatus(const QString & device_path)27 SmartStatus::SmartStatus(const QString &device_path) :
28     m_DevicePath(device_path),
29     m_InitSuccess(false),
30     m_Status(false),
31     m_ModelName(),
32     m_Serial(),
33     m_Firmware(),
34     m_Overall(Overall::Bad),
35     m_SelfTestStatus(SelfTestStatus::Success),
36     m_Temp(0),
37     m_BadSectors(0),
38     m_PowerCycles(0),
39     m_PoweredOn(0)
40 {
41     update();
42 }
43 
update()44 void SmartStatus::update()
45 {
46     SmartParser parser(devicePath());
47 
48     if (!parser.init()) {
49         qDebug() << "error during smart output parsing for " << devicePath() << ": " << strerror(errno);
50         return;
51     }
52 
53     SmartDiskInformation *disk;
54 
55     disk = parser.diskInformation();
56 
57     if (!disk)
58         return;
59 
60     setStatus(disk->smartStatus());
61     setModelName(disk->model());
62     setFirmware(disk->firmware());
63     setSerial(disk->serial());
64     setSelfTestStatus(disk->selfTestExecutionStatus());
65     setOverall(disk->overall());
66     setTemp(disk->temperature());
67     setBadSectors(disk->badSectors());
68     setPoweredOn(disk->poweredOn());
69     setPowerCycles(disk->powerCycles());
70     addAttributes(disk->attributes());
71     setInitSuccess(true);
72 }
73 
tempToString(quint64 mkelvin)74 QString SmartStatus::tempToString(quint64 mkelvin)
75 {
76     const double celsius = (mkelvin - 273150.0) / 1000.0;
77     const double fahrenheit = 9.0 * celsius / 5.0 + 32;
78     return xi18nc("@item:intable degrees in Celsius and Fahrenheit", "%1° C / %2° F",
79                   QLocale().toString(celsius, 'f', 0), QLocale().toString(fahrenheit, 'f', 0));
80 }
81 
selfTestStatusToString(SmartStatus::SelfTestStatus s)82 QString SmartStatus::selfTestStatusToString(SmartStatus::SelfTestStatus s)
83 {
84     switch (s) {
85     case SelfTestStatus::Aborted:
86         return xi18nc("@item", "Aborted");
87 
88     case SelfTestStatus::Interrupted:
89         return xi18nc("@item", "Interrupted");
90 
91     case SelfTestStatus::Fatal:
92         return xi18nc("@item", "Fatal error");
93 
94     case SelfTestStatus::ErrorUnknown:
95         return xi18nc("@item", "Unknown error");
96 
97     case SelfTestStatus::ErrorEletrical:
98         return xi18nc("@item", "Electrical error");
99 
100     case SelfTestStatus::ErrorServo:
101         return xi18nc("@item", "Servo error");
102 
103     case SelfTestStatus::ErrorRead:
104         return xi18nc("@item", "Read error");
105 
106     case SelfTestStatus::ErrorHandling:
107         return xi18nc("@item", "Handling error");
108 
109     case SelfTestStatus::InProgress:
110         return xi18nc("@item", "Self test in progress");
111 
112     case SelfTestStatus::Success:
113     default:
114         return xi18nc("@item", "Success");
115     }
116 
117 }
118 
overallAssessmentToString(Overall o)119 QString SmartStatus::overallAssessmentToString(Overall o)
120 {
121     switch (o) {
122     case Overall::Good:
123         return xi18nc("@item", "Healthy");
124 
125     case Overall::BadPast:
126         return xi18nc("@item", "Has been used outside of its design parameters in the past.");
127 
128     case Overall::BadSectors:
129         return xi18nc("@item", "Has some bad sectors.");
130 
131     case Overall::BadNow:
132         return xi18nc("@item", "Is being used outside of its design parameters right now.");
133 
134     case Overall::BadSectorsMany:
135         return xi18nc("@item", "Has many bad sectors.");
136 
137     case Overall::Bad:
138     default:
139         return xi18nc("@item", "Disk failure is imminent. Backup all data!");
140     }
141 
142 }
143 
addAttributes(QList<SmartAttributeParsedData> attr)144 void SmartStatus::addAttributes(QList<SmartAttributeParsedData> attr)
145 {
146     m_Attributes.clear();
147 
148     for (const SmartAttributeParsedData &at : std::as_const(attr)) {
149         SmartAttribute sm(at);
150         m_Attributes.append(sm);
151     }
152 }
153 
154