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