3

I need to programmatically detect if Linux is running on a ThinkPad.

A shell script would be ideal but I can programmatically generate any binary by downloading some source and compiling it on the machine if only a custom program will be able to reliably do that.

Focus is: reliability/accuracy. If in doubt, I prefer not to run the script.

I have a hunch this may be cleverly done using text parsing of things like dmesg or lshw, but which method is the most reliable?

Restriction: run as a normal user, as part of a login script, no possibility of temporarily elevating privileges just to detect the machine model.

Permission: take as long as needed, speed is not a factor.

Environment: Ubuntu, but Linux generality is nice to have. Availability of developer-level build tools (GCC can be assumed to "just work"). The login script is run by bash so a code snippet in that syntax would be more directly usable.

3
  • As far as I can understand, you want to make sure you are on Linux using a shell script. I guess uname -o # --operating-system may help. I'm on Ubuntu 13.4 latest, and it reports GNU/Linux.
    – user27225
    Apr 10, 2013 at 11:06
  • @gkya He doesn't: he wants to make sure he's on Linux running on a ThinkPad machine.
    – Renan
    Apr 10, 2013 at 14:00
  • You might be able to do dmesg or lspci -v and then grep (IBM|Lenovo) on their output.
    – Renan
    Apr 10, 2013 at 14:14

2 Answers 2

2

The following works on my Lenovo ThinkPad (Running FC17):

cat /sys/devices/virtual/dmi/id/chassis_vendor

Prints:

LENOVO

The following directory can be checked for /proc/acpi/ibm/. You could look in /proc/acpi/ibm/driver for "ThinkPad ACPI Extras".

0

dmidecode can provide this information. It however requires root privileges to access /dev/mem, so due to your restrictions this can not be used directly.

You have two options.

A) Log in as root and run dmidecode -t system > /var/tmp/dmidecode_system Then ensure that the file is world readable and check the contents of that file in the user's login script.

The problem is that the information will only be updated "manually". You could however simply update it from an init script.

B) A more "live" option is to create a little tool which provides the required information to non-priviledged processes.

First create an interface, eg mkfifo /var/tmp/dmidecode_read

Then spawn a process which will write the information every time someone requests it, eg

while true; do dmidecide -t system > /var/tmp/dmidecode_read; done

In this case this will work, because you can not replace a motherboard while the system is running. But for completeness' sake I mention that this information could still theoretically become stale. Each time a a user reads from the pipe, the current buffer is emptied, the sleeping "supplier" exists, a and then after the reader received the existing buffer, a new "supplier" will be spawned and it will put fresh information into the buffer ready for the next reader, whenever that will be.

2
  • It's probably easier to make dmidecode setuid Apr 10, 2013 at 14:13
  • That would violate the "do not temporarily increase privileges" requirement.
    – Johan
    Apr 11, 2013 at 6:25

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .