#!/bin/sh # Copyright (c) 2008 by Giacomo A. Catenazzi <cate@debian.org> # This file is licensed with GPL version 2 (or at your option any later versions) # For the full license, see http://fsf.org # This script will download and update the Intel microcode # Check curl if ! which curl > /dev/null 2> /dev/null; then echo "curl not found. Please install curl" 1>&2 exit 1 fi grep -sq GenuineIntel /proc/cpuinfo RETVAL=$? if [ $RETVAL -ne 0 -a "-$1" != "---download-only" ]; then echo "microcode.ctl: Yet we provide only microcodes for Intel processors" 1>&2 echo "Your CPU seems not an Intel processor" 1>&2 exit 1 fi if [ "-$1" == "---download-only" ]; then LOCAL_DIR=$PWD DOWNLOAD_ONLY=1 else LOCAL_DIR=/lib/firmware/intel-microcode fi REMOTE_RSS='http://feeds.downloadcenter.intel.com/rss/?p=483&lang=eng' REMOTE_DATA="$(curl --retry 2 --retry-delay 20 --silent "$REMOTE_RSS" | perl -pe 's|^.+?<IntelDC:Type>Firmware</IntelDC:Type><IntelDC:Version>(20[0-9]*)</IntelDC:Version><IntelDC:Status>latest</IntelDC:Status>.+?<IntelDC:FileURL>([^<]*\1[^<]*)</IntelDC:FileURL>.*$|\1 \2\n|' - || echo 'ERROR')" if [ "0$REMOTE_DATA" = "0" -o "0$REMOTE_DATA" = "0ERROR" ] ; then echo "Error: could not find remote data in $REMOTE_RSS" 1>&2 echo "...exiting" 1>&2 exit 1 fi REMOTE_FILE=$(echo $REMOTE_DATA | sed -ne 's#^\(.*\) \(http://.*\)$#\2#p' -) REMOTE_DATE=$(echo $REMOTE_DATA | sed -ne 's#^\(.*\) \(http://.*\)$#\1#p' -) LOCAL_FILE="$LOCAL_DIR/intel-microcode.dat" if [ ! $DOWNLOAD_ONLY ]; then if [ -f "$LOCAL_FILE" ]; then LOCAL_DATE=$(sed -ne 's#^/\*\(.*\)\*/.*$#\1#p' "$LOCAL_FILE" | head -n 1 | date "+%Y%m%d" -f - ) echo "Local version: $LOCAL_DATE" echo "Remote version: $REMOTE_DATE" if [ "0$REMOTE_DATE" = "0" ] ; then echo "could not extract the actual data of remote microcode" exit 1 elif [ "0$REMOTE_DATE" -le "0$LOCAL_DATE" ] ; then echo "No need to download a new microcode" 1>&2 exit 0 fi else echo "Local version: (none)" echo "Remote version: $REMOTE_DATE" fi fi # ! DOWNLOAD_ONLY echo "Downloading a new version of microcode." case "$REMOTE_FILE" in *.tgz | *.tar.gz ) FILTER=" tar xzOf - " ;; *.dat.gz ) FILTER=" gzip -cd " ;; * ) FILTER=" cat - " ;; esac if curl --retry 2 --retry-delay 20 --silent "$REMOTE_FILE" | $FILTER > "$LOCAL_FILE".tmp ; then mv "$LOCAL_FILE".tmp "$LOCAL_FILE" echo "microcode downloaded sucessfully" 1>&2 else echo "Error on downloading the microcode." 1>&2 echo "Install microcode manually." 1>&2 exit 1 fi # load the new microcode if [ "-$1" != "---no-reload" -a "-$1" != "---download-only" ] ; then modprobe -r microcode modprobe microcode fi