Surveiller la version du BIOS

Je cherche à surveiller la version du BIOS de mon NUC10i7FNK, la comparer à la version disponible en ligne et remonter une alerte si une mise à jour est nécessaire.

J'utilise dmidecode découvert récemment pour obtenir l'information. Le programme s'appuie sur System Management BIOS. La lecture du man de la commande nous indique qu'il est possible d'accéder à certaines informations directement avec un mot clé:

$ sudo dmidecode --string bios-version
FNCML357.0047.2020.1118.1629

La chaîne de caractères obtenue se compose du modèle du BIOS (FNCML357), de sa version (0047), la date (2020.1118) et l'heure du build (1629). Je crée une fonction bash qui va séparer ces informations et me retourner uniquement la version:

function checkLocalVersion {

    if which dmidecode 1>/dev/null 2>&1 ; then
        DMIDECODE_VERSION=$(dmidecode --version)
        LOCAL_FULL_BIOS_VERSION=$(dmidecode --string bios-version)

        ARRAY_LOCAL_BIOS_VERSION=(${LOCAL_FULL_BIOS_VERSION//./ })

        LOCAL_BIOS_TYPE=${ARRAY_LOCAL_BIOS_VERSION[0]}
        LOCAL_BIOS_VERSION=${ARRAY_LOCAL_BIOS_VERSION[1]}

        if [[ "${LOCAL_BIOS_VERSION}" =~ ^[0-9]+$ ]] ; then
            echo ${LOCAL_BIOS_VERSION}
        else
            return 1
        fi
    else
        echo "ERROR - dmidecode is not present"
        return 1
    fi

}

La prochaine étape consiste à récupérer le numéro de la version mise en ligne par Intel sur la page "Drivers & Software" pour le BIOS FNCML357. Dans le code source de cette dernière, je récupère l'URL canonique qui va être utilisé par curl.

function checkLastestVersion {

    if which curl 1>/dev/null 2>&1 ; then
        INTEL_FNCML357_URL="https://downloadcenter.intel.com/download/30073/BIOS-Update-FNCML357-"

        CURL_RESULT=$(curl --silent ${INTEL_FNCML357_URL} | grep DownloadVersion)
        LASTEST_BIOS_VERSION=${CURL_RESULT//[!0-9]/}

        if [[ "${LASTEST_BIOS_VERSION}" =~ ^[0-9]+$ ]] ; then
            echo ${LASTEST_BIOS_VERSION}
        else
            return 1
        fi
    else
        echo "ERROR - curl is not present"
        return 1
    fi

}

Maintenant, je compare le résultat des deux fonctions:

if [ $(checkLocalVersion) = $(checkLastestVersion) ] ; then
    echo "INFO - FNCML357 BIOS is up to date."
else
    echo "WARNING - FNCML357 BIOS needs to be updated."
fi

Le résultat final peut être utilisé de plusieurs façon et le choix variera en fonction des besoins et de l'infrastructure de chacun. Pour ma part, je décide d'utiliser un serveur syslog distant qui va être alimenté par le programme logger:

logger --priority user.info --tag "${SCRIPT_NAME}" "FNCML357 BIOS is up to date"
logger --priority user.err --tag "${SCRIPT_NAME}" "FNCML357 BIOS needs to be updated"