#!/bin/bash
# 20060310 patch_kernel_src.sh hse@ukr.net
# Distributed under the terms of the GNU General Public License v2 or late
# patching linux kernel source code (installing)
# use code from scripts/patch-kernel

patchdir=/usr/portage/distfiles         # директорія куди скачали архіви ядра та патчів
VER=2.6.10                              # версія ядра (kernel-2.6.*.bz2 ядро без припатчу)
STOP=2.6.15                             # версія ядра на якій спинити patch-kernel, обов'язково використовуйте при накладанні припатчів!
sourcedir0=/usr/src                     # директорія де розпакуються і пропатчаться сирці ядра
sourcedir=$sourcedir0/linux-$VER        # директорія де розпакуються і пропатчаться сирці ядра

# Уважно слідкуйте, щоб версія патчів співпадала з версією ядра (STOP=2.6.15)!
# Послідовність патчів можу бути дуже суттева
addpatch[1]=genpatches-2.6.15-10.base.tar.bz2   # стабілізаційні патчі Gentoo
addpatch[2]=genpatches-2.6.15-10.extras.tar.bz2 # збірка додаткових патчів Gentoo
addpatch[3]=patch-2.6.15-om-1.bz2               # патч для кластеризації openmosix
addpatch[4]=ruby-2.6.13-A0.diff.bz2             # патч для багатотермінальності
addpatch[5]=fusion-2.6.11.diff.bz2              # патч для використання заліза DirectFBодночасно багатьма прогами
N=3                                             # кількість патчів

# verifing signature (перевірка підписів)
for i in `ls -v $patchdir/ |grep '.bz2.sign'`
  do
    j="`echo "$i" |awk -F'bz2' '{ print $1 }'`""bz2"
    gpg --verify $patchdir/$i $patchdir/$j > ./verify.gpg 2>&1
    if [ "`cat ./verify.gpg |grep 'gpg: Good signature from'`" = "" ]
      then
        echo " $j bad signature exiting ... "
        exit 1
      else
        echo " $j Good signature "
    fi
  done

# unpaking source code (розпаковуємо ядро)
echo "Unpacking kernel source..."
if [ -d $sourcedir ]
  then
    echo " dirictory $sourcedir exist!!! "
    exit 1
  else
    cd $sourcedir0
    bzip2 -dkc $patchdir/linux-$VER.tar.bz2 | tar xf -
fi

#patching kernel (патчемо ядро)
$sourcedir/scripts/patch-kernel $sourcedir $patchdir $STOP
cd $sourcedir
((i=1))
while (( $i <= $N ))
  do
    echo -n "Applying ${addpatch[$i]} (bzip2)..."
    bzip2 -dkc $patchdir/${addpatch[$i]} | patch -Np1 -s || exit 1
    echo "done."
    echo "${addpatch[$i]}" >> patches.txt
    ((i=$i+1))
  done

# determine current kernel version (визначаємо версію ядра)
TMPFILE=`mktemp .tmpver.XXXXXX` || { echo "cannot make temp file" ; exit 1; }
grep -E "^(VERSION|PATCHLEVEL|SUBLEVEL|EXTRAVERSION)" $sourcedir/Makefile > $TMPFILE
tr -d [:blank:] < $TMPFILE > $TMPFILE.1
source $TMPFILE.1
rm -f $TMPFILE*
if [ -z "$VERSION" -o -z "$PATCHLEVEL" -o -z "$SUBLEVEL" ]
  then
    echo "unable to determine current kernel version" >&2
    exit 1
fi
NAME=`grep ^NAME $sourcedir/Makefile`
NAME=${NAME##*=}
VER=$VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION}
echo "Current kernel version is $VER ($NAME)"
if [ -d $sourcedir0/linux-$VER ]
  then
    echo " dirictory $sourcedir0/linux-$VER exist!!! "
    exit 1
  else
    mv $sourcedir $sourcedir0/linux-$VER
fi

echo "

  Компіляція та встановлення Лінукс ядра версії-$VER
  Якщо Ви цього не бажаєте натисніть Ctrl+C
  "
sleep 20

# "перевірка" сирців
cd $sourcedir0/linux-$VER
make mrproper
# конфігурація
cp ../.config ./

if ?span> <span class="hl opt">
  then
        emerge -n genkernel
        #genkernel --oldconfig --no-mrproper --gensplash=livecd-2005.0 --kerneldir=/usr/src/linux-$VER/ --kernname=LiveCD --lvm2 --dmraid all
        genkernel --gensplash=livecd-2005.0 --kerneldir=/usr/src/linux-$VER/ --kernel-config=/usr/src/.config --kernname=LiveCD --lvm2 all
  else
        # конфігурація
        cp ../.config ./
        make oldconfig
        # компіляція та встановлення
        make && make modules_install && cp arch/i386/boot/bzImage /boot/kernel-$VER && cp System.map /boot/System.map-$VER
fi
rm /usr/src/linux; ln -s $sourcedir0/linux-$VER /usr/src/linux

echo "

  Тепер Вам необхідно перезібрати всі пакети, що залежать від ядра!
  Переважно це драйвери, що не входять в ядро (ati-drivers, lm_sensors, drbd...)
  Додайте нове ядро в /boot/grub/grub.conf та перезавантажтесь з новим ядром.
  "
sleep 1

exit 0