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"