Added the ability to configure default smartctl info save filename through

config file.
Use model-serial-date.txt for default save filename.
This commit is contained in:
Alexander Shaduri
2011-03-06 17:15:56 +00:00
parent ba7ffafa7f
commit 4000fa1a2e
5 changed files with 42 additions and 67 deletions
+12 -62
View File
@@ -36,8 +36,6 @@ Bugs / patches:
TODO:
+Clear the test message area when starting a new test.
Add debian/ubuntu's su-to-root support to gsmartcontrol-root.
Testing:
@@ -50,14 +48,8 @@ Testing:
Add ability to configure default save filename (in config-file only?):
"{serial}-{model}-{date}.txt", with the default being "{model}-{date}.txt".
Add string_replace_linear(), where multiple strings are replaced into the
original string (as opposed to previous result).
+Re-check long double printing - win32 libc doesn't support it, a cast
to double is needed.
The underlying problem is that in msvc, long double is the same size
as double, so printf() has mingw-incompatible presentation of long double.
Add string_replace_linear(), where multiple strings are replaced into the
original string (as opposed to previous result).
Add support for launching with consolehelper (from usermode package).
Fedora uses this by default.
@@ -273,60 +265,18 @@ Add detection for Interix (i586-pc-interix3), maybe with debian?
----------- Feature List ----------
+Autodetect available devices
+Select current device (from autodetected list; manually whitelist devices).
+Smartctl binary (text entries in Options - binary, default command line options).
+ Global command-line options for smartctl.
+ Command-line options per-device in settings (e.g. -d ata).
+ Search smartctl binary on startup (try to execute it with --version). If it's not there, alert the user.
+Indicate which of the devices has SMART supported / enabled.
+ Enable / disable smart on devices.
+ Indicate that this is until shutdown (but may be preserved on reboot).
+ Direct them to smartd / smartctl documentation for permanent enabling.
+ NOTE: SMART is sometimes preserved across power cycles.
+Enable / disable Automatic Offline Data Collection for devices. (-o on)
+ Show its status in the main window.
+Show identity information for device (aka short info), --info.
+Show all SMART information for device (--all), includes:
+ * Short info (--info)
+ * SMART DATA
+ * overall-health (-H, --health) - may check this automatically as well.
+ * General SMART Values, aka Capabilities (-c, --capabilities)
+ * Attributes (-A, --attributes). These need decoding.
+ * Error Log (-l error)
+ * Self-test log (-l selftest)
+ * Selective self-test log and settings
* SCT status and other stuff
Display temperature somewhere (use SCT or Attr 194 for this).
+ * Ability to save this information to a file.
+ * On info window show: Ask to turn SMART on if it's disabled
+Program error reporting:
+ invalid smartmontools version.
+ cannot parse output - show log.
+ smartctl exited with error - look it up in error map.
----------- SMART stuff ----------
+Tests:
Run one-time Immediate Offline test (-t offline).
Offline tests only update Attributes, and if errors are found they will
appear in SMART error log. Self-test logs are unaffected.
Abort (-X). Abort works with Offline only if there's
"Abort Offline collection upon new command" capability.
If the drive has "Suspend Offline collection upon new command" capability,
immediate offline test may be tracked through --capabilities (not on mine!).
If it's "Abort Offline collection upon new command", then the test
will abort on --capabilities or --abort.
Run one-time Immediate Offline test (-t offline).
Offline tests only update Attributes, and if errors are found they will
appear in SMART error log. Self-test logs are unaffected.
Abort (-X). Abort works with Offline only if there's
"Abort Offline collection upon new command" capability.
If the drive has "Suspend Offline collection upon new command" capability,
immediate offline test may be tracked through --capabilities (not on mine!).
If it's "Abort Offline collection upon new command", then the test
will abort on --capabilities or --abort.
Polling time
+16 -5
View File
@@ -122,6 +122,11 @@ std::string StorageDevice::parse_basic_data(bool do_set_properties, bool emit_si
family_name_ = hz::string_remove_adjacent_duplicates_copy(hz::string_trim_copy(family), ' ');
}
std::string serial;
if (app_pcre_match("/^Serial Number:[ \\t]*(.*)$/mi", info_output_, &serial)) {
serial_number_ = hz::string_remove_adjacent_duplicates_copy(hz::string_trim_copy(serial), ' ');
}
// Note: this property is present since 5.33.
std::string size;
@@ -422,11 +427,17 @@ StorageProperty StorageDevice::get_health_property() const
std::string StorageDevice::get_save_filename() const
{
std::string filename = this->get_model_name(); // may be empty
filename += hz::format_date("-%Y-%m-%d", false);
if (!filename.empty())
filename = hz::filename_make_safe(filename) + ".txt";
return filename;
std::string model = this->get_model_name(); // may be empty
std::string serial = this->get_serial_number();
std::string date = hz::format_date("%Y-%m-%d", false);
std::string filename_format;
rconfig::get_data("gui/smartctl_output_filename_format", filename_format);
hz::string_replace(filename_format, "{serial}", serial);
hz::string_replace(filename_format, "{model}", model);
hz::string_replace(filename_format, "{date}", date);
return hz::filename_make_safe(filename_format);
}
@@ -304,6 +304,13 @@ class StorageDevice : public hz::intrusive_ptr_referenced {
}
// returns an empty string if unknown
std::string get_serial_number() const
{
return (serial_number_.defined() ? serial_number_.value() : "");
}
void set_info_output(const std::string& s)
{
info_output_ = s;
@@ -398,6 +405,7 @@ class StorageDevice : public hz::intrusive_ptr_referenced {
mutable hz::OptionalValue<status_t> aodc_status_; // cached aodc status.
hz::OptionalValue<std::string> model_name_;
hz::OptionalValue<std::string> family_name_;
hz::OptionalValue<std::string> serial_number_;
hz::OptionalValue<std::string> size_; // formatted size
mutable hz::OptionalValue<StorageProperty> health_property_; // cached health property.
+2
View File
@@ -54,6 +54,8 @@ inline void init_default_settings()
rconfig::set_default_data("gui/show_smart_capable_only", false); // show smart-capable drives only
rconfig::set_default_data("gui/scan_on_startup", true); // scan drives on startup
rconfig::set_default_data("gui/smartctl_output_filename_format", "{model}_{serial}_{date}.txt"); // when suggesting filename
// Populate /runtime too, just in case. The values don't really matter.
+4
View File
@@ -355,6 +355,10 @@ inline std::string string_remove_adjacent_duplicates_copy(const std::string& s,
// --------------------------------------------- Replace
// TODO: Add string_replace_linear(), where multiple strings are replaced into the
// original string (as opposed to previous result).
// Replace from with to inside s (modifying s). Return number of replacements made.
inline std::string::size_type string_replace(std::string& s,
const std::string& from, const std::string& to, int max_replacements = -1)