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