@@ -201,15 +201,53 @@ func formatDuration(d time.Duration) string {
201201}
202202
203203func getModel () string {
204- data , err := os .ReadFile ("/sys/class/dmi/id/product_name" )
205- if err == nil {
204+ readFile := func (path string ) string {
205+ data , err := os .ReadFile (path )
206+ if err != nil {
207+ return ""
208+ }
206209 return strings .TrimSpace (string (data ))
207210 }
208- data , err = os .ReadFile ("/sys/class/dmi/id/board_name" )
209- if err == nil {
210- return strings .TrimSpace (string (data ))
211+
212+ vendor := readFile ("/sys/class/dmi/id/sys_vendor" )
213+ product := readFile ("/sys/class/dmi/id/product_name" )
214+ version := readFile ("/sys/class/dmi/id/product_version" )
215+
216+ if product == "" {
217+ product = readFile ("/sys/class/dmi/id/board_name" )
218+ }
219+
220+ var res string
221+ if product != "" && version != "" && product != version {
222+ // If product name is a short model ID (common on Lenovo), use version which often has the marketing name
223+ if len (product ) < 6 || strings .Contains (version , product ) {
224+ res = version
225+ } else {
226+ res = fmt .Sprintf ("%s %s" , product , version )
227+ }
228+ } else if product != "" {
229+ res = product
230+ } else if version != "" {
231+ res = version
232+ } else {
233+ return "Unknown"
234+ }
235+
236+ // Clean up "None", "Default string", etc.
237+ lowRes := strings .ToLower (res )
238+ if lowRes == "none" || lowRes == "default string" || lowRes == "not specified" {
239+ if vendor != "" {
240+ return vendor
241+ }
242+ return "Unknown"
211243 }
212- return "Unknown"
244+
245+ // Add vendor prefix if missing
246+ if vendor != "" && ! strings .HasPrefix (strings .ToLower (res ), strings .ToLower (vendor )) {
247+ res = fmt .Sprintf ("%s %s" , vendor , res )
248+ }
249+
250+ return res
213251}
214252
215253func getGPU () []string {
0 commit comments