Sophie

Sophie

distrib > Mageia > 1 > i586 > by-pkgid > efd3a9e4d12b18e6fb3e673e7cc73fc4 > files > 7

microcode_ctl-1.17-13.mga1.src.rpm

#!/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
    /etc/rc.d/init.d/microcode_ctl reload
fi