smartctl

package
v0.0.0-...-0b22ec9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 17, 2025 License: GPL-3.0 Imports: 6 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func IsUsableDisk

func IsUsableDisk(disk_path string) bool

func SmartctlQueryDiskCall

func SmartctlQueryDiskCall(smartctl_path string, disk_type string, disk_path string) []byte

Types

type LsblkBlockDevice

type LsblkBlockDevice struct {
	Name               string `json:"name"`
	Serial             string `json:"serial"`
	Type               string `json:"type"`
	Size               int    `json:"size"`
	PhysicalSectorSize int    `json:"phy-sec"`
	LogicalSectorSize  int    `json:"log-sec"`
	WWN                string `json:"wwn"`
	Path               string `json:"path"`
}

type LsblkOutput

type LsblkOutput struct {
	Blockdevices []LsblkBlockDevice `json:"blockdevices"`
}

func GetLsblkOutput

func GetLsblkOutput() (LsblkOutput, error)

func GetLsblkOutputForPath

func GetLsblkOutputForPath(disk_path string) (LsblkOutput, error)

func LoadLsblkFromJson

func LoadLsblkFromJson(jsonInput []byte) (LsblkOutput, error)

type SmartctlOutput

type SmartctlOutput struct {
	Device struct {
		Name     string `json:"name"`
		InfoName string `json:"info_name"`
		Type     string `json:"type"`
		Protocol string `json:"protocol"`
	} `json:"device"`

	DeviceType struct {
		ScsiTerminology string `json:"scsi_terminology"`
		Name            string `json:"name"`
		ScsiValue       int    `json:"scsi_value"`
	} `json:"device_type"`

	FormFactor struct {
		Name      string `json:"name"`
		AtaValue  int    `json:"ata_value"`
		ScsiValue int    `json:"scsi_value"`
	} `json:"form_factor"`

	ModelFamily     string `json:"model_family"`
	ModelName       string `json:"model_name"`
	SerialNumber    string `json:"serial_number"`
	FirmwareVersion string `json:"firmware_version"`

	LogicalUnitID string `json:"logical_unit_id"`

	ScsiVendor    string `json:"scsi_vendor"`
	ScsiProduct   string `json:"scsi_product"`
	ScsiModelName string `json:"scsi_model_name"`
	ScsiRevision  string `json:"scsi_revision"`
	ScsiVersion   string `json:"scsi_version"`

	ScsiErrorCounterLog struct {
		Read struct {
			GigabytesProcessed               string `json:"gigabytes_processed"`
			ErrorsCorrectedByEccfast         int    `json:"errors_corrected_by_eccfast"`
			ErrorsCorrectedByEccdelayed      int    `json:"errors_corrected_by_eccdelayed"`
			ErrorsCorrectedByRereadsRewrites int    `json:"errors_corrected_by_rereads_rewrites"`
			TotalErrorsCorrected             int    `json:"total_errors_corrected"`
			CorrectionAlgorithmInvocations   int    `json:"correction_algorithm_invocations"`
			TotalUncorrectedErrors           int    `json:"total_uncorrected_errors"`
		} `json:"read"`
		Write struct {
			GigabytesProcessed               string `json:"gigabytes_processed"`
			ErrorsCorrectedByEccfast         int    `json:"errors_corrected_by_eccfast"`
			ErrorsCorrectedByEccdelayed      int    `json:"errors_corrected_by_eccdelayed"`
			ErrorsCorrectedByRereadsRewrites int    `json:"errors_corrected_by_rereads_rewrites"`
			TotalErrorsCorrected             int    `json:"total_errors_corrected"`
			CorrectionAlgorithmInvocations   int    `json:"correction_algorithm_invocations"`
			TotalUncorrectedErrors           int    `json:"total_uncorrected_errors"`
		} `json:"write"`
		Verify struct {
			GigabytesProcessed               string `json:"gigabytes_processed"`
			ErrorsCorrectedByEccfast         int    `json:"errors_corrected_by_eccfast"`
			ErrorsCorrectedByEccdelayed      int    `json:"errors_corrected_by_eccdelayed"`
			ErrorsCorrectedByRereadsRewrites int    `json:"errors_corrected_by_rereads_rewrites"`
			TotalErrorsCorrected             int    `json:"total_errors_corrected"`
			CorrectionAlgorithmInvocations   int    `json:"correction_algorithm_invocations"`
			TotalUncorrectedErrors           int    `json:"total_uncorrected_errors"`
		} `json:"verify"`
	} `json:"scsi_error_counter_log"`

	Smartctl struct {
		SvnRevision  string `json:"svn_revision"`
		PlatformInfo string `json:"platform_info"`
		BuildInfo    string `json:"build_info"`

		DriveDatabaseVersion struct {
			String string `json:"string"`
		} `json:"drive_database_version"`

		Argv    []string `json:"argv"`
		Version []int    `json:"version"`

		Messages []struct {
			String   string `json:"string"`
			Severity string `json:"severity"`
		} `json:"messages"`
		ExitStatus int  `json:"exit_status"`
		PreRelease bool `json:"pre_release"`
	} `json:"smartctl"`

	ScsiLbProvisioning struct {
		Name              string `json:"name"`
		ManagementEnabled struct {
			Name  string `json:"name"`
			Value int    `json:"value"`
		} `json:"management_enabled"`
		ReadZeros struct {
			Name  string `json:"name"`
			Value int    `json:"value"`
		} `json:"read_zeros"`
		Value int `json:"value"`
	} `json:"scsi_lb_provisioning"`

	SmartStatus struct {
		Scsi struct {
			IeString string `json:"ie_string"`
			Asc      int    `json:"asc"`
			Ascq     int    `json:"ascq"`
		} `json:"scsi"`
		Nvme struct {
			Value int `json:"value"`
		} `json:"nvme"`
		Passed bool `json:"passed"`
	} `json:"smart_status"`

	NvmeSelfTestLog struct {
		CurrentSelfTestOperation struct {
			String string `json:"string"`
			Value  int    `json:"value"`
		} `json:"current_self_test_operation"`
		Table []struct {
			SelfTestCode struct {
				String string `json:"string"`
				Value  int    `json:"value"`
			} `json:"self_test_code"`
			SelfTestResult struct {
				String string `json:"string"`
				Value  int    `json:"value"`
			} `json:"self_test_result"`
			PowerOnHours int `json:"power_on_hours"`
		} `json:"table"`
	} `json:"nvme_self_test_log"`
	AtaSmartAttributes struct {
		Table []struct {
			Raw struct {
				String string `json:"string"`
				Value  int    `json:"value"`
			} `json:"raw"`
			Name       string `json:"name"`
			WhenFailed string `json:"when_failed"`
			Flags      struct {
				String        string `json:"string"`
				Value         int    `json:"value"`
				Prefailure    bool   `json:"prefailure"`
				UpdatedOnline bool   `json:"updated_online"`
				Performance   bool   `json:"performance"`
				ErrorRate     bool   `json:"error_rate"`
				EventCount    bool   `json:"event_count"`
				AutoKeep      bool   `json:"auto_keep"`
			} `json:"flags"`
			ID     int `json:"id"`
			Value  int `json:"value"`
			Worst  int `json:"worst"`
			Thresh int `json:"thresh"`
		} `json:"table"`
		Revision int `json:"revision"`
	} `json:"ata_smart_attributes"`

	JSONFormatVersion []int `json:"json_format_version"`

	LocalTime struct {
		Asctime string `json:"asctime"`
		TimeT   int    `json:"time_t"`
	} `json:"local_time"`

	SataVersion struct {
		String string `json:"string"`
		Value  int    `json:"value"`
	} `json:"sata_version"`

	ScsiTransportProtocol struct {
		Name  string `json:"name"`
		Value int    `json:"value"`
	} `json:"scsi_transport_protocol"`

	NvmeVersion struct {
		String string `json:"string"`
		Value  int    `json:"value"`
	} `json:"nvme_version"`

	NvmeNamespaces []struct {
		ID   int `json:"id"`
		Size struct {
			Blocks int   `json:"blocks"`
			Bytes  int64 `json:"bytes"`
		} `json:"size"`
		Capacity struct {
			Blocks int   `json:"blocks"`
			Bytes  int64 `json:"bytes"`
		} `json:"capacity"`
		Utilization struct {
			Blocks int   `json:"blocks"`
			Bytes  int64 `json:"bytes"`
		} `json:"utilization"`
		FormattedLbaSize int `json:"formatted_lba_size"`
		Eui64            struct {
			Oui   int   `json:"oui"`
			ExtID int64 `json:"ext_id"`
		} `json:"eui64"`
	} `json:"nvme_namespaces"`

	InterfaceSpeed struct {
		Max struct {
			String         string `json:"string"`
			SataValue      int    `json:"sata_value"`
			UnitsPerSecond int    `json:"units_per_second"`
			BitsPerUnit    int    `json:"bits_per_unit"`
		} `json:"max"`
		Current struct {
			String         string `json:"string"`
			SataValue      int    `json:"sata_value"`
			UnitsPerSecond int    `json:"units_per_second"`
			BitsPerUnit    int    `json:"bits_per_unit"`
		} `json:"current"`
	} `json:"interface_speed"`

	AtaVersion struct {
		String     string `json:"string"`
		MajorValue int    `json:"major_value"`
		MinorValue int    `json:"minor_value"`
	} `json:"ata_version"`

	AtaSmartData struct {
		OfflineDataCollection struct {
			Status struct {
				String string `json:"string"`
				Value  int    `json:"value"`
			} `json:"status"`
			CompletionSeconds int `json:"completion_seconds"`
		} `json:"offline_data_collection"`
		Capabilities struct {
			Values                        []int `json:"values"`
			ExecOfflineImmediateSupported bool  `json:"exec_offline_immediate_supported"`
			OfflineIsAbortedUponNewCmd    bool  `json:"offline_is_aborted_upon_new_cmd"`
			OfflineSurfaceScanSupported   bool  `json:"offline_surface_scan_supported"`
			SelfTestsSupported            bool  `json:"self_tests_supported"`
			ConveyanceSelfTestSupported   bool  `json:"conveyance_self_test_supported"`
			SelectiveSelfTestSupported    bool  `json:"selective_self_test_supported"`
			AttributeAutosaveEnabled      bool  `json:"attribute_autosave_enabled"`
			ErrorLoggingSupported         bool  `json:"error_logging_supported"`
			GpLoggingSupported            bool  `json:"gp_logging_supported"`
		} `json:"capabilities"`
		SelfTest struct {
			Status struct {
				String string `json:"string"`
				Value  int    `json:"value"`
				Passed bool   `json:"passed"`
			} `json:"status"`
			PollingMinutes struct {
				Short    int `json:"short"`
				Extended int `json:"extended"`
			} `json:"polling_minutes"`
		} `json:"self_test"`
	} `json:"ata_smart_data"`

	ScsiStartStopCycleCounter struct {
		YearOfManufacture                          string `json:"year_of_manufacture"`
		WeekOfManufacture                          string `json:"week_of_manufacture"`
		SpecifiedCycleCountOverDeviceLifetime      int    `json:"specified_cycle_count_over_device_lifetime"`
		AccumulatedStartStopCycles                 int    `json:"accumulated_start_stop_cycles"`
		SpecifiedLoadUnloadCountOverDeviceLifetime int    `json:"specified_load_unload_count_over_device_lifetime"`
		AccumulatedLoadUnloadCycles                int    `json:"accumulated_load_unload_cycles"`
	} `json:"scsi_start_stop_cycle_counter"`

	AtaSmartSelfTestLog struct {
		Standard struct {
			Table []struct {
				Type struct {
					String string `json:"string"`
					Value  int    `json:"value"`
				} `json:"type"`
				Status struct {
					String string `json:"string"`
					Value  int    `json:"value"`
					Passed bool   `json:"passed"`
				} `json:"status"`
				LifetimeHours int `json:"lifetime_hours"`
			} `json:"table"`
			Revision           int `json:"revision"`
			Count              int `json:"count"`
			ErrorCountTotal    int `json:"error_count_total"`
			ErrorCountOutdated int `json:"error_count_outdated"`
		} `json:"standard"`
	} `json:"ata_smart_self_test_log"`
	AtaSmartSelectiveSelfTestLog struct {
		Table []struct {
			Status struct {
				String string `json:"string"`
				Value  int    `json:"value"`
			} `json:"status"`
			LbaMin int `json:"lba_min"`
			LbaMax int `json:"lba_max"`
		} `json:"table"`
		Flags struct {
			Value                int  `json:"value"`
			RemainderScanEnabled bool `json:"remainder_scan_enabled"`
		} `json:"flags"`
		Revision                 int `json:"revision"`
		PowerUpScanResumeMinutes int `json:"power_up_scan_resume_minutes"`
	} `json:"ata_smart_selective_self_test_log"`

	NvmeErrorInformationLog struct {
		Table []struct {
			StatusField struct {
				String         string `json:"string"`
				Value          int    `json:"value"`
				DoNotRetry     bool   `json:"do_not_retry"`
				StatusCodeType int    `json:"status_code_type"`
				StatusCode     int    `json:"status_code"`
			} `json:"status_field"`
			ErrorCount        int  `json:"error_count"`
			SubmissionQueueID int  `json:"submission_queue_id"`
			CommandID         int  `json:"command_id"`
			PhaseTag          bool `json:"phase_tag"`
			ParmErrorLocation int  `json:"parm_error_location"`
			Lba               struct {
				Value int `json:"value"`
			} `json:"lba"`
			Nsid int `json:"nsid"`
		} `json:"table"`
		Size   int `json:"size"`
		Read   int `json:"read"`
		Unread int `json:"unread"`
	} `json:"nvme_error_information_log"`

	NvmeSmartHealthInformationLog struct {
		TemperatureSensors      []int `json:"temperature_sensors"`
		CriticalWarning         int   `json:"critical_warning"`
		Temperature             int   `json:"temperature"`
		AvailableSpare          int   `json:"available_spare"`
		AvailableSpareThreshold int   `json:"available_spare_threshold"`
		PercentageUsed          int   `json:"percentage_used"`
		DataUnitsRead           int   `json:"data_units_read"`
		DataUnitsWritten        int   `json:"data_units_written"`
		HostReads               int   `json:"host_reads"`
		HostWrites              int   `json:"host_writes"`
		ControllerBusyTime      int   `json:"controller_busy_time"`
		PowerCycles             int   `json:"power_cycles"`
		PowerOnHours            int   `json:"power_on_hours"`
		UnsafeShutdowns         int   `json:"unsafe_shutdowns"`
		MediaErrors             int   `json:"media_errors"`
		NumErrLogEntries        int   `json:"num_err_log_entries"`
		WarningTempTime         int   `json:"warning_temp_time"`
		CriticalCompTime        int   `json:"critical_comp_time"`
	} `json:"nvme_smart_health_information_log"`

	Wwn struct {
		Naa int   `json:"naa"`
		Oui int   `json:"oui"`
		ID  int64 `json:"id"`
	} `json:"wwn"`

	UserCapacity struct {
		Blocks uint   `json:"blocks"`
		Bytes  uint64 `json:"bytes"`
	} `json:"user_capacity"`

	// Temps & StartStop
	Temperature struct {
		Current   int `json:"current"`
		DriveTrip int `json:"drive_trip"`
	} `json:"temperature"`

	PowerOnTime struct {
		Hours   int `json:"hours"`
		Minutes int `json:"minutes"`
	} `json:"power_on_time"`

	AtaSctCapabilities struct {
		Value                         int  `json:"value"`
		ErrorRecoveryControlSupported bool `json:"error_recovery_control_supported"`
		FeatureControlSupported       bool `json:"feature_control_supported"`
		DataTableSupported            bool `json:"data_table_supported"`
	} `json:"ata_sct_capabilities"`

	AtaSmartErrorLog struct {
		Summary struct {
			Revision int `json:"revision"`
			Count    int `json:"count"`
		} `json:"summary"`
	} `json:"ata_smart_error_log"`

	NvmePciVendor struct {
		ID          int `json:"id"`
		SubsystemID int `json:"subsystem_id"`
	} `json:"nvme_pci_vendor"`

	LogicalBlockSize  int `json:"logical_block_size"`
	PhysicalBlockSize int `json:"physical_block_size"`
	RotationRate      int `json:"rotation_rate"`

	PowerCycleCount int `json:"power_cycle_count"`

	ScsiGrownDefectList int `json:"scsi_grown_defect_list"`

	NvmeIeeeOuiIdentifier   int   `json:"nvme_ieee_oui_identifier"`
	NvmeTotalCapacity       int64 `json:"nvme_total_capacity"`
	NvmeUnallocatedCapacity int   `json:"nvme_unallocated_capacity"`
	NvmeControllerID        int   `json:"nvme_controller_id"`

	NvmeNumberOfNamespaces int `json:"nvme_number_of_namespaces"`

	Trim struct {
		Supported     bool `json:"supported"`
		Deterministic bool `json:"deterministic"`
		Zeroed        bool `json:"zeroed"`
	} `json:"trim"`

	// SMART
	SmartSupport struct {
		Available bool `json:"available"`
		Enabled   bool `json:"enabled"`
	} `json:"smart_support"`

	SuccessfulQuery bool

	InSmartctlDatabase bool `json:"in_smartctl_database"`

	TemperatureWarning struct {
		Enabled bool `json:"enabled"`
	} `json:"temperature_warning"`
}

func SmartctlQueryDisk

func SmartctlQueryDisk(smartctl_path string, disk_type string, disk_path string) (SmartctlOutput, error)

func SmartctlQueryDiskJsonParse

func SmartctlQueryDiskJsonParse(json_string []byte) (SmartctlOutput, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL