Ensemble de scripts BASH

Les scripts doivent s’exécuter les un après les autres dans l’ordre. Ils s’interrompent si une erreur survient. Ils utilisent le fichier 0_Config.sh pour référence.
Couramment dans Linux les sources sont déposées dans le dossier usr/src mais dans cette méthode j’utilise un dossier nommé Xenomai dans le dossier utilisateur. Pour adapter les scripts à d’autres versions, il suffit d’en modifier les variables d’initialisations dans 0_config.sh. Je télécharge les sources dans le dossier Téléchargement, ce qui permet de recommencer les préparations et compilations si vous modifiez les paramètres. Ces documents et dossiers peuvent être supprimés après l’installation.

0_config.sh

Est appelé par les autres scripts et il n’est pas nécessaire de l’exécuter. Il contient les variables d’initialisation, dans celui-ci il est possible de modifier facilement les versions des sources et les dossiers de compilations.

[1_prepubuntu.sh]

Prépare Ubuntu pour les opérations de compilation ultérieures. Cela consiste principalement dans l’installation d’outils et de librairie.

[2_constructxeno.sh]

Télécharge les sources et construit les paquets de Xenomai.

[3_preparkernel.sh]

Télécharge les sources du noyau et applique les patchs pour l’installation de Xenomai.

[4_Compilekernel.sh]

Lance l’outil de configuration menuconfig et poursuit par la compilation du noyau et l’installe.

[shcolor.sh]

Facilite la coloration des messages dans la console.

[toolscript.sh]

Diverses fonctions utiles pour les scripts

0_Config.sh variable de configuration
# Insérer dans un script avec . /0_config.sh
# Téléchargement et construction de Xenomai
# Nov 2013
# Fichier de configuration des paramètres
#
# set -x         # trace d'execution
set -u          # detection paramètre non initialisé
set -o errexit  # arrèt sur erreur
#set +o errexit

# Récupération les variables de localisation
. $HOME/.config/user-dirs.dirs

# Variable de configuration pour l'importation et décompression
SRC_DIR=$HOME         # Modifier eventuellement en /usr/src
EXT_SRCDIR="Xenomai"  # Dossier extension source peut etre vide
KVERSION="3.8.13"     # Version du noyau
XENO_VERSION="2.6.3"  # Version de xenomai

# Variable de configuration pour construction du noyau
# Le patches, on les retrouve pour différent noyau dans le
# dossier xenomai /ksrc/arch/x86/patches
IPIPE_VERSION="3.8.13-x86-4"

# Architecture
# 64 bits = x86_64 ou amd64 ou emt64 ou x8664
# 32 bits = x86 ou x286 ou ?386,?486,?586,?686 ...
#DEB_ARCH=i386
DEB_ARCH=$(uname -m)    # Reconnaissance automatique

# Nbr de processeur + 1
NBR_PROC=$(echo $(lscpu | grep '^CPU(s):') | cut -f2 -d' ')
NBR_PROC=`expr $NBR_PROC + 1`

KERNEL_PKG_RELEASE=0
UBUNTU_RELEASE="precise"

# Votre nom et votre email pour le changelog
# Ce n'est pas important si vous ne distribuez pas les paquets
FULLNAME="Votre nom ici"
EMAIL="votre@email.org"
1_PrepUbuntu.sh Préparation d’Ubuntu
#!/bin/bash

# Préparation de Ubuntu pour compiler et installer xenomai
# Installation d'utilitaires divers

# Variable de configuration
. ./0_config.sh

# Recupération des noms de dossier par défaut
#. $HOME/.config/user-dirs.dirs

. ./shcolor.sh # Pour coloriser la console

DTSTART=$(date +"%D_%T")
message $FYellow "Début du script "$0" \n"$DTSTART
message $FYellow "Installation des mises à jour et utilitaires "
#Passer en super utilisateur
#sudo apt-get upgrade -y

sudo apt-get install -y synaptic  --force-yes
#sudo apt-get install -y geany
sudo add-apt-repository -y ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install -y grub-customizer

#Outils pour compilation Xenomai
message $FYellow "Installation des outils pour compilation Xenomai"
sudo apt-get install -y devscripts debhelper dh-kpatches findutils autotools-dev autoconf automake libtool

#Outils pour compilation du noyau
message $FYellow "Installation des outils pour compilation du noyau"
sudo apt-get install -y fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge kernel-package
sudo apt-get -y build-dep linux
sudo apt-get install -y git-core libncurses5 libncurses5-dev libelf-dev asciidoc binutils-dev
#Fin super utilisateur
exit

message $FYellow "Fin du script "$0
message $FYellow " Début :"$DTSTART
message $FYellow " Fin"$(date +"%D_%T")
2_ConstructXeno.sh Construction des paquets Xenomai
#!/bin/bash
# Préparation de Ubuntu pour compiler et installer xenomai
# Téléchargement et construction de Xenomai

# Variable de configuration
# Les variables sont initialisées dans 0_Config.sh
. ./0_config.sh

. ./shcolor.sh # Pour coloriser la console
. ./toolscript.sh  # pour question avec rep O/N et divers

#Téléchargement décompression de xenomai
DTSTART=$(date +"%D_%T")
DESTDIR=$SRC_DIR/$EXT_SRCDIR

message $FYellow "Début du script "$0" \n"$DTSTART
message $FYellow "Téléchargement décompression de xenomai"
message $FYellow "      Téléchargement dans :"$XDG_DOWNLOAD_DIR
message $FYellow "      Décompression dans :"$DESTDIR
message $FYellow "      Version de Xenomai :"$XENO_VERSION

# Variable de controle de l'éxecution du script
TELECHARGE=true
DECOMPRESSE=true
CONSTRUIT=true

#Test si déjà exécute et question à l'utilisateur

if [ -f $XDG_DOWNLOAD_DIR/xenomai-$XENO_VERSION.tar.bz2 ]
then
        questyesno qresult 'le fichier existe. Voulez vous le télécharger à nouveau ? (O/N) :'
        if [ $qresult = 'N' ]
        then
        TELECHARGE=false
        fi
        echo
fi

if [ -d $DESTDIR/xenomai-$XENO_VERSION ]
then
        questyesno qresult 'Les sources sont déja présent. Ecraser ? (O/N) :'
        if [ $qresult = 'N' ]
        then
        DECOMPRESSE=false
        fi
        echo
fi

if [ -f $DESTDIR/xenomai_2.6.3.dsc ]
then
        questyesno qresult 'les paquet sont déja construit. Reconstruire ? (O/N) :'
        if [ $qresult = 'N' ]
        then
        CONSTRUIT=false
        fi
        echo
fi

cd $XDG_DOWNLOAD_DIR

if $TELECHARGE
then
        message $FYellow "Téléchargement "
        rm -f xenomai-$XENO_VERSION.tar.bz2
        wget http://download.gna.org/xenomai/stable/xenomai-$XENO_VERSION.tar.bz2
fi

mkdir -p $DESTDIR
cd $DESTDIR                     #dans le dossier sélectionné des sources

if $DECOMPRESSE
then
        message $FYellow "Décompression "
        rm -r -f xenomai-$XENO_VERSION
        tar -xvjf $XDG_DOWNLOAD_DIR/xenomai-$XENO_VERSION.tar.bz2
fi

if $CONSTRUIT
then
        message $FYellow "Construction "
        deletefile $DESTDIR "*"

        cd xenomai-$XENO_VERSION  # dans dossier des sources xeno
        dpkg-buildpackage -uc -us
        cd ..                     # dans dossier des constructions

# Installation des paquets.
        sudo dpkg -i libxeno*.deb
        sudo dpkg -i xenomai*.deb
fi

message $FYellow "Fin du script "$0
message $FYellow " Début :"$DTSTART
message $FYellow " Fin"$(date +"%D_%T")
3_PreparKernel.sh Préparation du noyau
#!/bin/bash
# Téléchargement et construction de Xenomai

# Variable de configuration
# Les variables sont initialisées dans 0_Config.sh

. ./0_config.sh

. ./shcolor.sh # Pour coloriser la console
. ./toolscript.sh  # pour question avec rep O/N

DTSTART=$(date +"%D_%T")
DESTDIR=$SRC_DIR/$EXT_SRCDIR

message $FYellow "Début du script "$0" \n"$DTSTART
message $FYellow "Téléchargement des sources du noyau"
message $FYellow "      Téléchargement dans :"$XDG_DOWNLOAD_DIR
message $FYellow "      Décompression dans :"$SRC_DIR
message $FYellow "      Version du noyau :"$KVERSION

# Variable de controle de l'éxecution du script
TELECHARGE=true
DECOMPRESSE=true
PATCHES=true

#Test si deja executé et question à l'utilisateur

if [ -f $XDG_DOWNLOAD_DIR/linux-$KVERSION.tar.bz2 ]
then
        questyesno qresult 'le fichier existe. Voulez vous le télécharger à nouveau ? (O/N) :'
        if [ $qresult = 'N' ]
        then
        TELECHARGE=false
        fi
        echo
fi

if [ -d $DESTDIR/linux-$KVERSION ]
then
        questyesno qresult 'Les sources sont deja présent. Ecraser ? (O/N) :'
        if [ $qresult = 'N' ]
        then
    DECOMPRESSE=false
        fi
        echo
fi

if [ -d $DESTDIR/linux-$KVERSION/include/xenomai ]
then
        questyesno qresult 'le souurces sont déja patchés. Refaire ? (O/N) :'
        if [ $qresult = 'N' ]
        then
    PATCHES=false
        fi
        echo
fi

cd $XDG_DOWNLOAD_DIR  #dans le dossier téléchargement

if $TELECHARGE
then
        message $FYellow "Téléchargement "
        rm -f linux-$KVERSION.tar.bz2
        wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-$KVERSION.tar.bz2
fi

mkdir -p $DESTDIR
cd $DESTDIR #dans le dossier sélectioné des sources

if $DECOMPRESSE
then
        message $FYellow "Décompression "
        rm -r -f linux-$KVERSION
        tar -xvjf $XDG_DOWNLOAD_DIR/linux-$KVERSION.tar.bz2
fi

cd xenomai-$XENO_VERSION # dans le dossier des sources xeno

if $PATCHES
then
        message $FYellow "Préparation du noyau (patch) "
        scripts/prepare-kernel.sh --arch=$DEB_ARCH --ipipe=ksrc/arch/x86/patches/ipipe-core-$IPIPE_VERSION.patch --linux=../linux-$KVERSION --verbose
fi

message $FYellow "Fin du script "$0
message $FYellow "Début :"$DTSTART
message $FYellow " fin"$(date +"%D_%T")
4_Compilekernel.sh Préparation du noyau
#!/bin/bash
# Compilation du noyau

# Variable de configuration
# Les variables sont initialisées dans 0_Config.sh
. ./0_config.sh

. ./shcolor.sh # Pour coloriser la console
. ./toolscript.sh  # pour question avec rep O/N

DTSTART=$(date +"%D_%T")
DESTDIR=$SRC_DIR/$EXT_SRCDIR

message $FYellow "Début du script "$0" \n"$DTSTART

CONFIGURE=true
COMPILE=true
INSTALLE=true
CONTINUE=true

# Selon ce qui à été fait question a l'utilisateur
# Test de la configuration

if [ -f $DESTDIR/linux-$KVERSION/.config ]
then
        questyesno qresult 'le fichier de configuration existe Voulez vous le modifier ? (O/N) :'
        if [ $qresult = 'N' ]
        then
                CONFIGURE=false
        fi
        echo
fi

NBFILE=$(ls $DESTDIR/linux-*.deb | wc -l)

if [ $NBFILE -eq 2 ]
then
        questyesno qresult 'les fichiers compilés du noyau existes. Recompiler ? (O/N) :'
        if [ $qresult = 'N' ]
        then
        COMPILE=false
        fi
        echo
fi

NBLIN=$( dpkg --get-selections  | grep -o xenomai |wc -l )

if [ $NBLIN -gt 0 ]
then
        questyesno qresult 'les paquet sont déja installé. Le remplacer ? (O/N) :'
        if [ $qresult = 'N' ]
        then
        INSTALLE=false
        fi
        echo
fi

# Et action

cd $DESTDIR/linux-$KVERSION # dans dossier source linux
echo $DESTDIR/linux-$KVERSION

while $CONTINUE
do
        if $CONFIGURE
        then
                echo
                #attention a la dimension du terminal min 19x80
                make menuconfig
        fi
        # test des valeurs dans le fichier configuration
        COACPI=$(awk -F "=" '/CONFIG_ACPI=/ {print $NF}' $DESTDIR/linux-$KVERSION/.config)
        COHIBER=$(awk -F "=" '/CONFIG_ARCH_HIBERNATION_HEADER=/ {print $NF}' $DESTDIR/linux-$KVERSION/.config)
        COCPUFRQ=$(awk -F "=" '/CONFIG_CPU_FREQ=/ {print $NF}' $DESTDIR/linux-$KVERSION/.config)
        COSTACKPR=$(awk -F "=" '/CONFIG_CC_STACKPROTECTOR=/ {print $NF}' $DESTDIR/linux-$KVERSION/.config)
        if [ $COACPI'X' == 'yX' ] || [ $COHIBER'X' == 'yX' ] || [ $COCPUFRQ'X' == 'yX' ] || [ $COSTACKPR'X' == 'yX' ]
        then
                questyesno qresult "la configuration n'est pas complète, voulez vous vérifier ? (O/N) :"
                if [ $qresult = 'O' ]
                then
                    echo
                    #attention a la dimension du terminal min 19x80
                        make menuconfig
                fi
        else
          CONTINUE=false
        fi
done

if $COMPILE
then
        rm -r -f Linux-*.deb
        make-kpkg clean
        CONCURENCY_LEVEL=$NBR_PROC
        fakeroot make-kpkg --bzimage --initrd --append-to-version=-xenomai-$XENO_VERSION kernel-image kernel-headers modules
fi
cd .. # dans dossier construction

if $INSTALLE
then
    #sudo apt-get --purge remove Linux-headers-$KVERSION-xenomai-$XENO_VERSION
    #sudo apt-get --purge remove linux-image-$KVERSION-xenomai-$XENO_VERSION

        sudo dpkg -i linux-headers-$KVERSION*.deb
        sudo dpkg -i linux-image-$KVERSION*.deb
        sudo update-initramfs -c -k 3.8.13-xenomai-2.6.3
        sudo update-grub
fi

message $FYellow "Fin du script "$0
message $FYellow " Début :"$DTSTART
message $FYellow " fin"$(date +"%D_%T")

questyesno qresult 'Redémarer le système ? (O/N) :'
if [ $qresult = 'O' ]
then
    echo
        sudo shutdown -r 1
fi
shcolor.sh facilite la coloration des messages dans la console
# Insérer dans un script avec . ./shcolor.sh
# Pour coloriser la console
# Exemple echo $ESCA$Abold;$Bred'm Message en couleur '$CDEFAULT
#         echo $( color $Abold $Bred) le message en couleur
#         message FGreen 'Hello le amis'


#Attribute
AReset=0
ABold=1
ADim=2
AUnder=4
ARev=7
AHid=8

#Background
BBlack=40
BRed=41
BGreen=42
BYellow=43
BBlue=44
BMengenta=45
BCyan=46
BWhite=47

#Foreground
FBlack=30
FRed=31
FGreen=32
FYellow=33
FBlue=34
FMengenta=35
FCyan=36
FWhite=37

#Prefix
ESCA="\\033["
CDEFAULT="\\033[0m"
CONSOLERESET="\\033c"
CLRSCREEN="\\033[2J\e[0;0H"


color(){
        if [ "x$2" = "x" ]
        then
          echo "$ESCA$1m"
        else
                if [ "x$3" = "x" ]
                then
                        echo "$ESCA$1;$2m"
                else
                        echo "$ESCA$1;$2;$3m"
                fi
        fi
}

message(){
  if [ "x$2" = "x" ]
        then
          echo -e "$1"
        else
          echo -e "$ESCA$1m"$2$CDEFAULT
        fi
}

toolscript.sh diverses fonctions utiles pour les scripts
# Insérer dans un script avec . ./toolscript.sh
# Affiche une question avec réponse oui non yes no
# Retourne O ou N
#
# Exemple d'utilisation
# questyesno result 'le voulez vous :'
# echo
# echo ">"$result"<=1"

# questyesno result
# echo
# echo ">"$result"<=2"

# echo -n 'Vraiment :'
# result2=$(questyesno)
# echo ">"$result2"<=3"

function questyesno()
{
  # Variable local
  local resultvar=$1 # Nom de la variable de retrour
  local funcresult   # Valeur de retrour
  local loopexit=N   # Controle de boucle

  if ! [ "x$2" = "x" ]
  then
    echo -e -n $2
  fi
  #echo -e -n $2
  while [ $loopexit = N ]
  do
   loopexit=Y
   read -n1 -s
    case $REPLY in
      Y|y|o|O) funcresult=O;;
      n|N) funcresult=N;;
      *) loopexit=N;;
    esac
  done
  if [[ "$resultvar" ]]; then
      echo -n $REPLY
      eval $resultvar="'$funcresult'"
  else
      echo "$funcresult"
  fi
}


function deletefile()
{
if ! [ "x$1" = "x" ] | [ "x$2" = "x" ]
then
        for file in $1"/"$2; do
                TPFILE=$(stat -c"%f" "$file")
                TPFILE=${TPFILE:0:1}
                if [ $TPFILE = 8 ]
                then
          rm -f  $1"/"$TPFILE
                fi
        done
else
    echo "Error in deletefile"
    echo "deletefile Path_file File_Token"
    echo 'Ex : deletefile "~home\test" "*.txt'
        return 1
fi
}