#!/bin/bash set -e usage () { >&2 echo 'makekernel version #VERSION#' >&2 echo 'usage:' >&2 echo ' makekernel [ -a | --allowDownload ] [ -c $version | --compileVersion=$version ]:' >&2 echo ' download and compile kernel' >&2 echo ' -a | --allowDownload:' >&2 echo ' allow to download complete source instead of patch if necessary' >&2 echo ' -c | --compileVersion $version:' >&2 echo ' download and compile version $version instead of most current stable' >&2 echo ' makekernel ( -s | --showVersion ):' >&2 echo ' show version of most current stable kernel' exit 1 } dlExVer () { wget -nd "$1.xz" wget -nd "$1.sign" xz -d "$2.xz" if ! gpg --verify $2{.sign,} then >&2 echo 'ERROR: Wrong signature! Closing.' exit 1 fi rm "$2.sign" } . #ETCDIR#/makekernel.conf if [ "$(whoami)" == "root" ] then >&2 echo 'ERROR: Do not call as root! Closing.' exit 1 fi eval set -- "$( getopt -o ac:s \ --long allowDownload \ --long compileVersion: \ --long showVersion \ -n "$(basename "$0")" \ -- "$@" || echo usage )" allowDownload=false forceVersion=false showVersion=false while true do case "$1" in -a|--allowDownload) ${allowDownload} && usage ${showVersion} && usage allowDownload=true ;; -c|--compileVersion) ${forceVersion} && usage ${showVersion} && usage curVer="$2" forceVersion=true shift ;; -s|--showVersion) ${allowDownload} && usage ${forceVersion} && usage ${showVersion} && usage showVersion=true ;; --) shift break ;; *) >&2 echo "ERROR: Option \"$1\" unknown in the end! Closing." usage esac shift done [ $# -ne 0 ] && usage if ${showVersion} then mainVersion="$( curl 'https://cdn.kernel.org/pub/linux/kernel/' 2> /dev/null | \ tr '>/' '\n' | \ grep '^v.*$' | \ sort -V | \ tail -n1 )" curl "https://cdn.kernel.org/pub/linux/kernel/${mainVersion}/" 2> /dev/null | \ tr '<>' '\n\n' | \ grep '^linux-.*\.tar\.xz$' | \ sed 's/^linux-\(.*\)\.tar\.xz$/\1/' | \ sort -V | \ tail -n1 exit 0 fi [ -z "${curVer}" ] && curVer="$("$0" -s)" mainVer="$( echo "${curVer}" | \ sed 's|^\([0-9]\+\.[0-9]\+\)\(\..*\)\?$|\1|' )" if [ "${curVer}" == "${mainVer}" ] then minPreVer='#invalid#' mainPreVer="${curVer%.*}.$[${curVer##*.}-1]" else minPreVer="${mainVer}.$[${curVer##*.}-1]" mainPreVer='#invalid#' fi # possible updates with patches from old sources are: # - "recompile" old source # - "minor" incremental (e.g. 4.7.2 -> 4.7.3) # - make a "stablePatch" (e.g. 4.7 -> 4.7.3) # - "major" incremental (e.g. 4.6 -> 4.7) # alternative (if allowed): # - download complete source if [ -d "${kernelDir}/linux-${curVer}" ] then updateType='recompile' patchSrc='' dlSrc='' elif [ -d "${kernelDir}/linux-${minPreVer}" ] then updateType='minor' srcDir="linux-${minPreVer}" patch="patch-${minPreVer}-${curVer##*.}" patchSrc="https://cdn.kernel.org/pub/linux/kernel/v${curVer%%.*}.x/incr/${patch}" dlSrc='' elif [ -d "${kernelDir}/linux-${mainVer}" ] then updateType='stablePatch' srcDir="linux-${mainVer}" patch="patch-${curVer}" patchSrc="https://cdn.kernel.org/pub/linux/kernel/v${curVer%%.*}.x/${patch}" dlSrc='' elif [ -d "${kernelDir}/linux-${mainPreVer}" ] then updateType='major' srcDir="linux-${mainPreVer}" patch="patch-${curVer}" patchSrc="https://cdn.kernel.org/pub/linux/kernel/v${curVer%%.*}.x/${patch}" dlSrc='' elif ${allowDownload} then updateType='download' patchSrc='' dlSrc="https://cdn.kernel.org/pub/linux/kernel/v${curVer%%.*}.x/linux-${curVer}.tar" else >&2 echo 'No patch method available and download of complete source not allowed! Closing.' usage fi cd "${kernelDir}" echo "update type: ${updateType}" if [ -n "${patchSrc}" ] then dlExVer "${patchSrc}" "${patch}" cp -r "${srcDir}" "linux-${curVer}" cd "linux-${curVer}" patch -p1 -i "../${patch}" rm "../${patch}" elif [ -n "${dlSrc}" ] then dlExVer "${dlSrc}" "linux-${curVer}.tar" tar -xf "linux-${curVer}.tar" rm "linux-${curVer}.tar" fi cd "${kernelDir}/linux-${curVer}" [ ! -r .config ] && zcat /proc/config.gz > .config make clean make oldconfig make grep -q '^# CONFIG_MODULES is not set$' .config || make modules_install kernelImg="$(find ${kernelDir}/linux-${curVer}/arch/ -type f -iname '*image')" if [ $(echo "${kernelImg}" | wc -l) -ne 1 ] then >&2 echo 'ERROR: Did not find exactly one compiled kernel image:' >&2 echo "${kernelImg}" >&2 echo 'Closing.' exit 1 fi echo 'becoming root ...' su -c ' \ . #ETCDIR#/makekernel.conf && \ before_install_hook && \ install -m644 --owner=root "'"${kernelImg}"'" "/boot/vmlinuz-'"${curVer}"'" && \ grub-mkconfig -o /boot/grub/grub.cfg && \ after_install_hook \ ' echo 'Success.'