#!/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

set -e

# This script will download and update the Intel microcode

# Check wget
if ! which wget > /dev/null 2> /dev/null; then
    echo "wget not found. Please install wget" 1>&2
    exit 1
fi
if ! grep -sq GenuineIntel /proc/cpuinfo; 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

REMOTE_RSS='http://feeds.downloadcenter.intel.com/rss/?p=483&lang=eng'
REMOTE_DATA="$(wget -t 2 -T 20 -nv -q -O - "$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_DIR=/usr/share/misc
LOCAL_FILE="$LOCAL_DIR/intel-microcode.dat"

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

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 wget -t 2 -T 20 -nv -q -O - "$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. (See /usr/share/doc/microcode.ctl/README.Debian)" 1>&2
    exit 1
fi

# load the new microcode


if [ "-$1" != "--no-reload" ] ; then
    /etc/init.d/microcode.ctl reload
fi

