@@ -148,24 +148,41 @@ def _parse_vendor(self):
148
148
def fetch_generic_ssd_info (self , diskdev ):
149
149
self .ssd_info = self ._execute_shell (self .vendor_ssd_utility ["Generic" ]["utility" ].format (diskdev ))
150
150
151
+ def parse_nvme_ssd_info (self ):
152
+ self .model = self ._parse_re ('Model Number:\s*(.+?)\n ' , self .ssd_info )
153
+
154
+ health_raw = self ._parse_re ('Percentage Used\s*(.+?)\n ' , self .ssd_info )
155
+ if health_raw == NOT_AVAILABLE :
156
+ self .health = NOT_AVAILABLE
157
+ else :
158
+ health_raw = health_raw .split ()[- 1 ]
159
+ self .health = 100 - float (health_raw .strip ('%' ))
160
+
161
+ temp_raw = self ._parse_re ('Temperature\s*(.+?)\n ' , self .ssd_info )
162
+ if temp_raw == NOT_AVAILABLE :
163
+ self .temperature = NOT_AVAILABLE
164
+ else :
165
+ temp_raw = temp_raw .split ()[- 2 ]
166
+ self .temperature = float (temp_raw )
167
+
168
+ spare_blocks_raw = self ._parse_re ('Available Spare\s*(.+?)\n ' , self .ssd_info )
169
+ if spare_blocks_raw != NOT_AVAILABLE :
170
+ spare_blocks_raw = spare_blocks_raw .split ()[- 1 ]
171
+ self .reserved_blocks = float (spare_blocks_raw .strip ('%' ))
172
+
173
+ disk_io_reads_raw = self ._parse_re ('Data Units Read\s*(.+?)\n ' , self .ssd_info )
174
+ if disk_io_reads_raw != NOT_AVAILABLE :
175
+ self .disk_io_reads = disk_io_reads_raw .split (':' )[- 1 ].strip ()
176
+
177
+ disk_io_writes_raw = self ._parse_re ('Data Units Written\s*(.+?)\n ' , self .ssd_info )
178
+ if disk_io_writes_raw != NOT_AVAILABLE :
179
+ self .disk_io_writes = disk_io_writes_raw .split (':' )[- 1 ].strip ()
180
+
151
181
# Health and temperature values may be overwritten with vendor specific data
152
182
def parse_generic_ssd_info (self ):
153
- if "nvme" in self .dev :
154
- self .model = self ._parse_re ('Model Number:\s*(.+?)\n ' , self .ssd_info )
155
183
156
- health_raw = self ._parse_re ('Percentage Used\s*(.+?)\n ' , self .ssd_info )
157
- if health_raw == NOT_AVAILABLE :
158
- self .health = NOT_AVAILABLE
159
- else :
160
- health_raw = health_raw .split ()[- 1 ]
161
- self .health = 100 - float (health_raw .strip ('%' ))
162
-
163
- temp_raw = self ._parse_re ('Temperature\s*(.+?)\n ' , self .ssd_info )
164
- if temp_raw == NOT_AVAILABLE :
165
- self .temperature = NOT_AVAILABLE
166
- else :
167
- temp_raw = temp_raw .split ()[- 2 ]
168
- self .temperature = float (temp_raw )
184
+ if "nvme" in self .dev :
185
+ self .parse_nvme_ssd_info ()
169
186
else :
170
187
self .model = self ._parse_re ('Device Model:\s*(.+?)\n ' , self .ssd_info )
171
188
@@ -184,21 +201,21 @@ def parse_generic_ssd_info(self):
184
201
else :
185
202
self .temperature = temp_raw .split ()[7 ].split ()[0 ]
186
203
187
- self . serial = self ._parse_re ( 'Serial Number:\s*(.+?) \n ' , self .ssd_info )
188
- self .firmware = self . _parse_re ( 'Firmware Version:\s*(.+?) \n ' , self . ssd_info )
204
+ io_reads_raw = self .parse_id_number ( GENERIC_IO_READS_ID , self .ssd_info )
205
+ self .disk_io_reads = NOT_AVAILABLE if io_reads_raw == NOT_AVAILABLE else io_reads_raw . split ()[ - 1 ]
189
206
190
- io_reads_raw = self .parse_id_number (GENERIC_IO_READS_ID , self .ssd_info )
191
- self .disk_io_reads = NOT_AVAILABLE if io_reads_raw == NOT_AVAILABLE else io_reads_raw .split ()[- 1 ]
207
+ io_writes_raw = self .parse_id_number (GENERIC_IO_WRITES_ID , self .ssd_info )
208
+ self .disk_io_writes = NOT_AVAILABLE if io_writes_raw == NOT_AVAILABLE else io_writes_raw .split ()[- 1 ]
192
209
193
- io_writes_raw = self .parse_id_number (GENERIC_IO_WRITES_ID , self .ssd_info )
194
- self .disk_io_writes = NOT_AVAILABLE if io_writes_raw == NOT_AVAILABLE else io_writes_raw .split ()[- 1 ]
210
+ for ID in GENERIC_RESERVED_BLOCKS_ID :
211
+ rbc_raw = self .parse_id_number (ID , self .ssd_info )
212
+ if rbc_raw == NOT_AVAILABLE : self .reserved_blocks = NOT_AVAILABLE
213
+ else :
214
+ self .reserved_blocks = rbc_raw .split ()[- 1 ]
215
+ break
195
216
196
- for ID in GENERIC_RESERVED_BLOCKS_ID :
197
- rbc_raw = self .parse_id_number (ID , self .ssd_info )
198
- if rbc_raw == NOT_AVAILABLE : self .reserved_blocks = NOT_AVAILABLE
199
- else :
200
- self .reserved_blocks = rbc_raw .split ()[- 1 ]
201
- break
217
+ self .serial = self ._parse_re ('Serial Number:\s*(.+?)\n ' , self .ssd_info )
218
+ self .firmware = self ._parse_re ('Firmware Version:\s*(.+?)\n ' , self .ssd_info )
202
219
203
220
def parse_innodisk_info (self ):
204
221
if self .vendor_ssd_info :
0 commit comments