Raspberry Pi Model As Environment Variable

From Wiki
Jump to: navigation, search

Overview

Run a script at start that leaves an environment variable set.

In this particular case, an application needed to know which version of a Raspberry Pi it was running on. This information is available in the kernel ring buffer, and is available in the /var/log/messages. I did not want to grep the log every time I needed the information, rather, I wanted an environment variable set.

Copy the text below into the respective files (you'll need to be root), then execute the following commands.

sudo chmod 755 /etc/init.d/rpimodel.sh
sudo chmod 644 /etc/profile.d/rpimodel.sh
sudo systemctl enable rpimodel

Next time the system is started, /etc/rpimodel should contain the Raspberry Pi model, and the environment variable RPIMODEL should be set.

$ cat /etc/rpimodel
RPIMODEL="Raspberry Pi Zero W Rev 1.1"
$ set | grep RPIMODEL
RPIMODEL='Raspberry Pi Zero W Rev 1.1'
$

/etc/init.d/rpimodel.sh

#! /bin/sh
### BEGIN INIT INFO
# Provides:          rpimodel
# Required-Start:    $syslog $network +ntp
# Required-Stop:     $null
# Should-Start:      glibc
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Set RPIMODEL based on dmesg
# Description:       Read the 'Machine model:' string using 'dmesg'
#                    and export it as RPIMODEL variable.
### END INIT INFO

PATH=/sbin:/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start () {
  RPIMODEL=`dmesg | grep -oP 'fdt:Machine model: \K.*'`
  export RPIMODEL
  echo "RPIMODEL=\"${RPIMODEL}\"" >/etc/rpimodel
  exit 0
}

case "$1" in
  start|"")
        do_start
        ;;
  restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
  stop)
        # No-op
        ;;
  status)
        # No-op
        ;;
  *)
        echo "Usage: rpimodel.sh [start|stop]" >&2
        exit 3
        ;;
esac

:

/etc/profile.c/rpimodel.sh

if [ -r /etc/rpimodel ]; then
    . /etc/rpimodel
    export RPIMODEL
fi

/lib/systemd/system/rpimodel.service

[Unit]
SourcePath=/etc/init.d/rpimodel.sh
Description=Set RPIMODEL based on dmesg
Before=runlevel2.target runlevel3.target runlevel4.target runlevel5.target
After=glibc.service

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SysVStartPriority=3
ExecStart=/etc/init.d/rpimodel.sh start
ExecStop=/etc/init.d/rpimodel.sh stop

[Install]
WantedBy=multi-user.target