diff --git a/gsmartcontrol/Makefile.am b/gsmartcontrol/Makefile.am index d4248cb..dc90bf6 100644 --- a/gsmartcontrol/Makefile.am +++ b/gsmartcontrol/Makefile.am @@ -68,7 +68,7 @@ src-rpm: dist # NSIS installer support. -# Requires wine, installed NSIS, gtkmm dlls, pcre dlls, smartctl.exe, smartctl_console.exe. +# Requires wine, installed NSIS, gtkmm dlls, pcre dlls, smartctl-nc.exe, smartctl.exe. # dos2unix on build machine. # Execute only with win32 build present. @@ -103,8 +103,8 @@ win-dist-prepare: all win-dist-clean cp "@WINDOWS_DLLS_LOCATION@"/libsigc-*.dll nsis-dist/ cp "@WINDOWS_DLLS_LOCATION@"/pcre3.dll nsis-dist/ cp "@WINDOWS_DLLS_LOCATION@"/mingwm10.dll nsis-dist/ + cp "@WINDOWS_DLLS_LOCATION@"/smartctl-nc.exe nsis-dist/ cp "@WINDOWS_DLLS_LOCATION@"/smartctl.exe nsis-dist/ - cp "@WINDOWS_DLLS_LOCATION@"/smartctl_console.exe nsis-dist/ cp src/gsmartcontrol.exe nsis-dist/ diff --git a/gsmartcontrol/NEWS b/gsmartcontrol/NEWS index 8518115..136f20d 100644 --- a/gsmartcontrol/NEWS +++ b/gsmartcontrol/NEWS @@ -1,4 +1,8 @@ +Version 0.8.4, released on --------- + Blacklist Linux Software RAID devices (backported from Debian). + Win32: Use smartmontools-supplied smartctl-nc.exe by default (if found). + Version 0.8.3, released on 2008-12-27 A random "Smartctl returned an empty output" error on Windows was fixed. Thanks to Zurab Khetsuriani for testing. diff --git a/gsmartcontrol/README.txt b/gsmartcontrol/README.txt index d13539c..fa9b139 100644 --- a/gsmartcontrol/README.txt +++ b/gsmartcontrol/README.txt @@ -109,7 +109,7 @@ Most of these packages are probably already provided by your distribution. Here are the packages you need to have to build GSmartControl on some Linux distributions: -OpenSUSE, SLES, SLED: +openSUSE, SLES, SLED: gcc-c++, pcre-devel, gtkmm2-devel, (possibly) libglademm-devel. Fedora, CentOS, RHEL: @@ -171,9 +171,9 @@ Long answer: read below. First, check if you can find a pre-built package for your distribution or operating system - they usually provide the best integration and the easiest -installation procedure. For Linux, one option is to try the OpenSUSE Build +installation procedure. For Linux, one option is to try the openSUSE Build Service - it provides ready-to-install packages for various popular Linux -distributions (OpenSUSE, Fedora, etc...). See +distributions (openSUSE, Fedora, etc...). See http://download.opensuse.org/repositories/home:/alex_sh/ . If you want to compile from source, check that you have all the required @@ -335,10 +335,10 @@ If you still think it's a GSmartControl issue, please collect the following information about your system. Without it, it may be very hard or impossible to fix the bug. -* Which operating system you use (for example, OpenSUSE Linux 11.0). +* Which operating system you use (for example, openSUSE Linux 11.0). * Which version of GTK and Gtkmm you have installed. Finding this out is very -distribution-specific. For example, on OpenSUSE it would be +distribution-specific. For example, on openSUSE it would be "rpm -q gtk2 gtkmm2". Some distributions have gtkmm24 instead. You may also search them in your distribution's graphical package manager, if there is one. diff --git a/gsmartcontrol/TODO b/gsmartcontrol/TODO index 346ef5c..ee5f860 100644 --- a/gsmartcontrol/TODO +++ b/gsmartcontrol/TODO @@ -48,7 +48,11 @@ libdebug: bug: if -q is passed, Execution log doesn't contain libdebug log. (requires per-channel status control). +Move attributes as a second tab +INCLUDE SMARTMONTOOLS LICENSE!! + +Update copyright years. ----------- Feature List ---------- diff --git a/gsmartcontrol/configure.ac b/gsmartcontrol/configure.ac index 3f7e73b..2c58836 100644 --- a/gsmartcontrol/configure.ac +++ b/gsmartcontrol/configure.ac @@ -1,5 +1,5 @@ -AC_INIT([GSmartControl], 0.8.3, [], [gsmartcontrol]) +AC_INIT([GSmartControl], 0.8.4, [], [gsmartcontrol]) AC_CONFIG_SRCDIR([configure.ac]) AC_CONFIG_HEADERS([config.h]) diff --git a/gsmartcontrol/data/nsis/distribution.txt.in b/gsmartcontrol/data/nsis/distribution.txt.in index bda424d..15b92ea 100644 --- a/gsmartcontrol/data/nsis/distribution.txt.in +++ b/gsmartcontrol/data/nsis/distribution.txt.in @@ -23,6 +23,6 @@ binary was compiled for 32-bit Windows, and should work on both 32-bit and * PCRE (http://www.pcre.org/) dll. -* Smartctl binaries - smartctl.exe (compiled without console output), -smartctl_console.exe (compiled with console output), version 5.38. +* Smartctl binaries - smartctl-nc.exe (compiled without console output), +smartctl.exe (compiled with console output), version 5.38. http://smartmontools.sf.net/ . diff --git a/gsmartcontrol/data/nsis/gsmartcontrol.nsi.in b/gsmartcontrol/data/nsis/gsmartcontrol.nsi.in index 4c38f60..97e557f 100644 --- a/gsmartcontrol/data/nsis/gsmartcontrol.nsi.in +++ b/gsmartcontrol/data/nsis/gsmartcontrol.nsi.in @@ -177,7 +177,7 @@ FunctionEnd -; ----------------- INSTALLATINO TYPES +; ----------------- INSTALLATION TYPES ; InstType "Recommended" InstType "Full" @@ -200,8 +200,8 @@ SectionIn 1 File gsmartcontrol.ico File icon_*.png File *.dll + File smartctl-nc.exe File smartctl.exe - File smartctl_console.exe File /r doc @@ -272,8 +272,8 @@ Section Uninstall Delete "$INSTDIR\gsmartcontrol.ico" Delete "$INSTDIR\icon_*.png" Delete "$INSTDIR\*.dll" + Delete "$INSTDIR\smartctl-nc.exe" Delete "$INSTDIR\smartctl.exe" - Delete "$INSTDIR\smartctl_console.exe" RMDir /r "$INSTDIR\doc" diff --git a/gsmartcontrol/src/applib/Makefile.am b/gsmartcontrol/src/applib/Makefile.am index 9a57782..bc8d19c 100644 --- a/gsmartcontrol/src/applib/Makefile.am +++ b/gsmartcontrol/src/applib/Makefile.am @@ -2,8 +2,9 @@ AM_CPPFLAGS = $(all_includes) METASOURCES = AUTO noinst_LIBRARIES = libapplib.a libapplib_a_SOURCES = app_gtkmm_utils.cpp app_pango_utils.cpp cmdex.cpp \ - cmdex_sync.cpp cmdex_sync_gui.cpp gui_utils.cpp selftest.cpp smartctl_parser.cpp \ - storage_detector.cpp storage_device.cpp storage_property.cpp storage_property_descr.cpp + cmdex_sync.cpp cmdex_sync_gui.cpp gui_utils.cpp selftest.cpp smartctl_executor.cpp \ + smartctl_parser.cpp storage_detector.cpp storage_device.cpp storage_property.cpp \ + storage_property_descr.cpp noinst_HEADERS = app_gtkmm_features.h app_gtkmm_utils.h app_pango_utils.h \ app_pcrecpp.h app_ui_res_utils.h cmdex.h cmdex_sync.h cmdex_sync_gui.h gui_utils.h \ selftest.h smartctl_executor.h smartctl_executor_gui.h smartctl_parser.h \ diff --git a/gsmartcontrol/src/applib/smartctl_executor.cpp b/gsmartcontrol/src/applib/smartctl_executor.cpp new file mode 100644 index 0000000..a4f773e --- /dev/null +++ b/gsmartcontrol/src/applib/smartctl_executor.cpp @@ -0,0 +1,64 @@ +/************************************************************************** + Copyright: + (C) 2008 Alexander Shaduri + License: See LICENSE_gsmartcontrol.txt +***************************************************************************/ + +#include "smartctl_executor.h" + +#include "hz/fs_path.h" +#include "hz/win32_tools.h" +#include "rconfig/rconfig_mini.h" + + + +// returns an empty string if not found. +std::string get_smartctl_binary() +{ + std::string smartctl_binary; + rconfig::get_data("system/smartctl_binary", smartctl_binary); + +#ifdef _WIN32 + // look in smartmontools installation directory. + do { + bool use_smt = false; + rconfig::get_data("system/win32_search_smartctl_in_smartmontools", use_smt); + if (!use_smt) + break; + + std::string smt_regpath, smt_regkey, smt_smartctl; + rconfig::get_data("system/win32_smartmontools_regpath", smt_regpath); + rconfig::get_data("system/win32_smartmontools_regkey", smt_regkey); + rconfig::get_data("system/win32_smartmontools_smartctl_binary", smt_smartctl); + + if (smt_regpath.empty() || smt_regkey.empty() || smt_smartctl.empty()) + break; + + std::string smt_inst_dir; + hz::win32_get_registry_value_string(smt_inst_dir, HKEY_LOCAL_MACHINE, smt_regpath, smt_regkey); + + if (smt_inst_dir.empty()) { + debug_out_info("app", DBG_FUNC_MSG << "Smartmontools installation not found in \"HKLM\\" + << smt_regpath << "\\" << smt_regkey << "\".\n"); + break; + } + debug_out_info("app", DBG_FUNC_MSG << "Smartmontools installation found at \"" << smt_inst_dir + << "\", using \"" << smt_smartctl << "\".\n"); + + hz::FsPath p(smt_inst_dir); + p.append(smt_smartctl); + + if (!p.exists() || !p.is_file()) + break; + + smartctl_binary = p.str(); + + } while (false); + +#endif + + return smartctl_binary; +} + + + diff --git a/gsmartcontrol/src/applib/smartctl_executor.h b/gsmartcontrol/src/applib/smartctl_executor.h index 51e2453..c6fbcbf 100644 --- a/gsmartcontrol/src/applib/smartctl_executor.h +++ b/gsmartcontrol/src/applib/smartctl_executor.h @@ -152,6 +152,9 @@ typedef SmartctlExecutorGeneric SmartctlExecutor; +// returns an empty string if not found. +std::string get_smartctl_binary(); + diff --git a/gsmartcontrol/src/applib/storage_detector.cpp b/gsmartcontrol/src/applib/storage_detector.cpp index ab78bc6..b5295fb 100644 --- a/gsmartcontrol/src/applib/storage_detector.cpp +++ b/gsmartcontrol/src/applib/storage_detector.cpp @@ -7,7 +7,6 @@ #include "hz/hz_config.h" // CONFIG_* #include // std::boolalpha -// #include // Dir #include // std::find #include // std::fgets() #include // ENXIO @@ -201,9 +200,9 @@ namespace { } hz::File file(parts_file); - // std::string contents; +// std::string contents; std::vector lines; - // if (!f.get_contents(contents)) { +// if (!f.get_contents(contents)) { if (!read_proc_partitions_file(file, lines)) { // this outputs to debug too std::string error_msg = file.get_error_utf8(); // save before calling other file functions if (!file.exists()) { @@ -214,9 +213,9 @@ namespace { return error_msg; } - // debug_out_dump("app", DBG_FUNC_MSG << "Dumping partitions file:\n" << contents << "\n"); +// debug_out_dump("app", DBG_FUNC_MSG << "Dumping partitions file:\n" << contents << "\n"); - // hz::string_split(contents, '\n', lines, true); +// hz::string_split(contents, '\n', lines, true); std::vector blacklist; // fixme: not sure about how partitions are visible with twa0. @@ -225,6 +224,7 @@ namespace { blacklist.push_back("/loop[0-9]*$/"); // not sure if loop devices go there, but anyway... blacklist.push_back("/part[0-9]+$/"); // devfs had them blacklist.push_back("/p[0-9]+$/"); // partitions are usually marked this way + blacklist.push_back("/md[0-9]*$/"); // linux software raid for (unsigned int i = 0; i < lines.size(); ++i) { @@ -249,7 +249,7 @@ namespace { if (blacked) continue; - std::string path = "/dev/" + dev; + std::string path = "/dev/" + dev; // let's just hope the it's /dev. if (std::find(devices.begin(), devices.end(), path) == devices.end()) // there may be duplicates devices.push_back(path); } @@ -263,7 +263,7 @@ namespace { // smartctl accepts various variants, the most straight being pdN, - // (or /dev/pdN, /dev being optional) where N comes from + // (or /dev/pdN, /dev/ being optional) where N comes from // "\\.\PhysicalDriveN" (winnt only). inline std::string detect_drives_win32(std::vector& devices) diff --git a/gsmartcontrol/src/applib/storage_device.cpp b/gsmartcontrol/src/applib/storage_device.cpp index a2ed47f..90284d8 100644 --- a/gsmartcontrol/src/applib/storage_device.cpp +++ b/gsmartcontrol/src/applib/storage_device.cpp @@ -16,6 +16,7 @@ #include "storage_device.h" #include "smartctl_parser.h" #include "storage_settings.h" +#include "smartctl_executor.h" @@ -438,16 +439,16 @@ std::string StorageDevice::execute_smartctl(const std::string& command_options, if (!smartctl_ex) // if it doesn't exist, create a default one smartctl_ex = new SmartctlExecutor(); // will be auto-deleted - - std::string smartctl_binary, smartctl_def_options; - rconfig::get_data("system/smartctl_binary", smartctl_binary); - rconfig::get_data("system/smartctl_options", smartctl_def_options); + std::string smartctl_binary = get_smartctl_binary(); if (smartctl_binary.empty()) { debug_out_error("app", DBG_FUNC_MSG << "Smartctl binary is not set in config.\n"); return "Smartctl binary is not specified in configuration."; } + std::string smartctl_def_options; + rconfig::get_data("system/smartctl_options", smartctl_def_options); + if (!smartctl_def_options.empty()) smartctl_def_options += " "; diff --git a/gsmartcontrol/src/gsc_main_window.cpp b/gsmartcontrol/src/gsc_main_window.cpp index aa6eb84..2320786 100644 --- a/gsmartcontrol/src/gsc_main_window.cpp +++ b/gsmartcontrol/src/gsc_main_window.cpp @@ -15,6 +15,7 @@ #include "applib/storage_detector.h" #include "applib/smartctl_parser.h" #include "applib/gui_utils.h" // gui_show_error_dialog +#include "applib/smartctl_executor.h" // get_smartctl_binary() #include "applib/smartctl_executor_gui.h" #include "applib/app_gtkmm_utils.h" // app_gtkmm_* #include "applib/storage_property_colors.h" // app_property_get_label_hilight_color @@ -61,11 +62,11 @@ GscMainWindow::GscMainWindow(BaseObjectType* gtkcobj, const app_ui_res_ref_t& re bool show_output_button = true; do { - std::string smartctl_binary, smartctl_def_options; - rconfig::get_data("system/smartctl_binary", smartctl_binary); + std::string smartctl_binary = get_smartctl_binary(); // Don't use default options here - they are used when invoked // with a device option. +// std::string smartctl_def_options; // rconfig::get_data("system/smartctl_options", smartctl_def_options); if (smartctl_binary.empty()) { diff --git a/gsmartcontrol/src/gsc_preferences_window.cpp b/gsmartcontrol/src/gsc_preferences_window.cpp index dd686e6..d84fdfc 100644 --- a/gsmartcontrol/src/gsc_preferences_window.cpp +++ b/gsmartcontrol/src/gsc_preferences_window.cpp @@ -229,6 +229,13 @@ GscPreferencesWindow::GscPreferencesWindow(BaseObjectType* gtkcobj, const app_ui // we can't do this in treeview's constructor, it doesn't know about this window yet. this->device_widget_set_remove_possible(false); // initial state + // hide win32-only options for non-win32. +#ifndef _WIN32 + Gtk::CheckButton* smartctl_search_check = this->lookup_widget("search_in_smartmontools_first_check"); + if (smartctl_search_check) + smartctl_search_check->hide(); +#endif + // --------------- @@ -318,6 +325,11 @@ void GscPreferencesWindow::import_config() && (check = this->lookup_widget("show_smart_capable_only_check")) ) check->set_active(show_smart_capable_only); + bool win32_search_smartctl_in_smartmontools; + if ( prefs_config_get("system/win32_search_smartctl_in_smartmontools", win32_search_smartctl_in_smartmontools) + && (check = this->lookup_widget("search_in_smartmontools_first_check")) ) + check->set_active(win32_search_smartctl_in_smartmontools); + std::string smartctl_binary; if ( prefs_config_get("system/smartctl_binary", smartctl_binary) && (entry = this->lookup_widget("smartctl_binary_entry")) ) @@ -363,6 +375,9 @@ void GscPreferencesWindow::export_config() if ((check = this->lookup_widget("show_smart_capable_only_check"))) prefs_config_set("gui/show_smart_capable_only", bool(check->get_active())); + if ((check = this->lookup_widget("search_in_smartmontools_first_check"))) + prefs_config_set("system/win32_search_smartctl_in_smartmontools", bool(check->get_active())); + if ((entry = this->lookup_widget("smartctl_binary_entry"))) prefs_config_set("system/smartctl_binary", std::string(entry->get_text())); diff --git a/gsmartcontrol/src/gsc_settings.h b/gsmartcontrol/src/gsc_settings.h index 827e91f..0a97d01 100644 --- a/gsmartcontrol/src/gsc_settings.h +++ b/gsmartcontrol/src/gsc_settings.h @@ -30,7 +30,18 @@ inline void init_default_settings() rconfig::set_default_data("system/config_autosave_timeout", uint32_t(3*60)); // 3 minutes. 0 to disable. rconfig::set_default_data("system/first_boot", true); // used to show the first-start warning. + +#ifndef _WIN32 rconfig::set_default_data("system/smartctl_binary", "smartctl"); // must be in PATH or use absolute path. +#else + rconfig::set_default_data("system/smartctl_binary", "smartctl-nc.exe"); // use no-console version by default. +#endif + // search for "smartctl-nc.exe" in smartmontools installation first. + rconfig::set_default_data("system/win32_search_smartctl_in_smartmontools", true); + rconfig::set_default_data("system/win32_smartmontools_regpath", "SOFTWARE\\smartmontools"); // in HKLM + rconfig::set_default_data("system/win32_smartmontools_regkey", "Install_Dir"); + rconfig::set_default_data("system/win32_smartmontools_smartctl_binary", "bin\\smartctl-nc.exe"); // relative to smt install path + rconfig::set_default_data("system/smartctl_options", ""); // default options on ALL commands rconfig::set_default_data("system/smartctl_device_options", ""); // dev1:val1;dev2:val2;... format, each bin2ascii-encoded. diff --git a/gsmartcontrol/src/gsc_winres.rc.in b/gsmartcontrol/src/gsc_winres.rc.in index 74d5ae4..de3692a 100644 --- a/gsmartcontrol/src/gsc_winres.rc.in +++ b/gsmartcontrol/src/gsc_winres.rc.in @@ -15,7 +15,7 @@ BEGIN VALUE "FileDescription", "GSmartControl - Hard disk drive health inspection tool" VALUE "FileVersion", "@VERSION@" VALUE "InternalName", "gsmartcontrol.exe" - VALUE "LegalCopyright", "Copyright (C) 2008 Alexander Shaduri" + VALUE "LegalCopyright", "Copyright (C) 2008 - 2009 Alexander Shaduri" VALUE "OriginalFilename", "gsmartcontrol.exe" VALUE "ProductName", "GSmartControl" VALUE "ProductVersion", "@VERSION@" diff --git a/gsmartcontrol/src/hz/fs_file.h b/gsmartcontrol/src/hz/fs_file.h index 884211a..af0b9a6 100644 --- a/gsmartcontrol/src/hz/fs_file.h +++ b/gsmartcontrol/src/hz/fs_file.h @@ -543,6 +543,7 @@ inline bool File::move(const std::string& to) // win32 rename() doesn't replace contents if newpath exists and says "file exists". #ifdef _WIN32 +/// FIXME: Try to rename first, unlink/rename again later. This way we have at least some atomicity. // try remove it if it's a file. no error checks here - rename() will report the needed messages. File dest_file(to); if (dest_file.is_file()) diff --git a/gsmartcontrol/src/hz/ptr_container.h b/gsmartcontrol/src/hz/ptr_container.h index ef1d2e8..90eacb8 100644 --- a/gsmartcontrol/src/hz/ptr_container.h +++ b/gsmartcontrol/src/hz/ptr_container.h @@ -167,7 +167,13 @@ class ptr_container : public Container { // for std::list: remove() and remove_if() void remove(const value_type& v) { - clean( std::find(begin(), end(), v) ); + for (iterator i = begin(); i != end(); ++i) { + if ((*i) == v) { + clean(i); + break; + } + } +// clean( std::find(begin(), end(), v) ); Container::remove(v); } diff --git a/gsmartcontrol/src/res/gsc_preferences_window.glade b/gsmartcontrol/src/res/gsc_preferences_window.glade index 30b6d30..8d177a5 100644 --- a/gsmartcontrol/src/res/gsc_preferences_window.glade +++ b/gsmartcontrol/src/res/gsc_preferences_window.glade @@ -1,6 +1,6 @@ - + @@ -102,95 +102,116 @@ True - + True - 2 - 3 - 7 + 7 - + True - 5 + True + Show SMART-capable drives only + Show SMART-capable drives only + Loo_k for smartctl in smartmontools installation directory first + True + 0 + True + + + + + True + 2 + 3 + 7 - + + True + 5 + + + True + True + True + _Browse... + True + 0 + + + + + 2 + 3 + GTK_FILL + + + + + True + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + True True - True - _Browse... - True - 0 + Global parameters for smartctl. These parameters will be used every time the progam invokes smartctl. Must be shell-escaped. + Global parameters for smartctl. These parameters will be used every time the progam invokes smartctl. Must be shell-escaped. + + 1 + 2 + 1 + 2 + + + + + True + Global parameters for smartctl. These parameters will be used every time the progam invokes smartctl. + Global parameters for smartctl. These parameters will be used every time the progam invokes smartctl. + Smartctl _parameters: + True + + + 1 + 2 + GTK_FILL + + + + + True + A path to smartctl binary. If the path is not absolute, the binary will be looked for in user's $PATH. + A path to smartctl binary. If the path is not absolute, the binary will be looked for in user's $PATH. + 1 + S_martctl binary: + True + + + GTK_FILL + + + + + True + True + A path to smartctl binary. If the path is not absolute, the binary will be looked for in user's PATH. + A path to smartctl binary. If the path is not absolute, the binary will be looked for in user's PATH. + + + 1 + 2 + - 2 - 3 - GTK_FILL - - - - - True - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - True - True - Global parameters for smartctl. These parameters will be used every time the progam invokes smartctl. Must be shell-escaped. - Global parameters for smartctl. These parameters will be used every time the progam invokes smartctl. Must be shell-escaped. - - - 1 - 2 - 1 - 2 - - - - - True - Global parameters for smartctl. These parameters will be used every time the progam invokes smartctl. - Global parameters for smartctl. These parameters will be used every time the progam invokes smartctl. - Smartctl _parameters: - True - - - 1 - 2 - GTK_FILL - - - - - True - A path to smartctl binary. If the path is not absolute, the binary will be looked for in user's $PATH. - A path to smartctl binary. If the path is not absolute, the binary will be looked for in user's $PATH. - 1 - S_martctl binary: - True - - - GTK_FILL - - - - - True - True - A path to smartctl binary. If the path is not absolute, the binary will be looked for in user's PATH. - A path to smartctl binary. If the path is not absolute, the binary will be looked for in user's PATH. - - - 1 - 2 + 1 @@ -255,18 +276,6 @@ 1 2 7 - - - True - True - Semicolon-separated blacklist PCRE patterns for device search. For example, to blacklist all "/dev/sd*" devices, use "sd.$". Simply listing them as "sda;sdb" or "sd[ab]" will also work. - Semicolon-separated blacklist PCRE patterns for device search. For example, to blacklist all "/dev/sd*" devices, use "sd.$". Simply listing them as "sda;sdb" or "sd[ab]" will also work. - - - 1 - 2 - - True @@ -280,6 +289,18 @@ GTK_FILL + + + True + True + Semicolon-separated blacklist PCRE patterns for device search. For example, to blacklist all "/dev/sd*" devices, use "sd.$". Simply listing them as "sda;sdb" or "sd[ab]" will also work. + Semicolon-separated blacklist PCRE patterns for device search. For example, to blacklist all "/dev/sd*" devices, use "sd.$". Simply listing them as "sda;sdb" or "sd[ab]" will also work. + + + 1 + 2 + + 10 @@ -392,40 +413,15 @@ 2 10 - + True - 0 - <b>Drive Properties:</b> - True + True + Smartctl parameters for this device. For example, to use older smartctl versions with libata devices, use "-d ata". Must be shell-escaped. + Smartctl parameters for this device. For example, to use older smartctl versions with libata devices, use "-d ata". Must be shell-escaped. + 1 2 - - - - - True - Device name (for example, "/dev/sda") - Device name (for example, "/dev/sda") - 1 - De_vice: - True - - - 1 - 2 - - - - - True - Smartctl parameters for this device. For example, to use older smartctl versions with libata devices, use "-d ata". - Smartctl parameters for this device. For example, to use older smartctl versions with libata devices, use "-d ata". - 1 - _Parameters: - True - - 2 3 @@ -445,19 +441,44 @@ - + True - True - Smartctl parameters for this device. For example, to use older smartctl versions with libata devices, use "-d ata". Must be shell-escaped. - Smartctl parameters for this device. For example, to use older smartctl versions with libata devices, use "-d ata". Must be shell-escaped. + Smartctl parameters for this device. For example, to use older smartctl versions with libata devices, use "-d ata". + Smartctl parameters for this device. For example, to use older smartctl versions with libata devices, use "-d ata". + 1 + _Parameters: + True - 1 - 2 2 3 + + + True + Device name (for example, "/dev/sda") + Device name (for example, "/dev/sda") + 1 + De_vice: + True + + + 1 + 2 + + + + + True + 0 + <b>Drive Properties:</b> + True + + + 2 + + False