#!/bin/bash -e IMAGE_NAME=$1 if [ -z "$IMAGE_NAME" ]; then echo "PAS DE NOM DE MODULE" exit 1 fi # root dir configuration RISOTTO_DIR="/var/lib/risotto" RISOTTO_IMAGE_DIR="$RISOTTO_DIR/images" # image configuration IMAGE_BASE_RISOTTO_BASE_DIR="$RISOTTO_IMAGE_DIR/image_bases" IMAGE_NAME_RISOTTO_IMAGE_DIR="$RISOTTO_IMAGE_DIR/$IMAGE_NAME" IMAGE_NAME_RISOTTO_IMAGE_NAME="$RISOTTO_IMAGE_DIR/$IMAGE_NAME".tar IMAGE_DIR_RECIPIENT_IMAGE="/var/lib/risotto/images_files/$IMAGE_NAME" #FIXME ou ? rm -rf "$IMAGE_NAME_RISOTTO_IMAGE_DIR" "$RISOTTO_IMAGE_DIR/tmp" mkdir -p "$RISOTTO_IMAGE_DIR" PKG="" BASE_DIR="" for script in $(ls "$IMAGE_DIR_RECIPIENT_IMAGE"/preinstall/*.sh 2> /dev/null); do . "$script" done if [ -z "$OS_NAME" ]; then echo "NO OS NAME DEFINED" exit 0 fi if [ -z "$RELEASEVER" ]; then echo "NO RELEASEVER DEFINED" exit 0 fi if [ -z "$INSTALL_TOOL" ]; then echo "NO INSTALL TOOL DEFINED" exit 0 fi BASE_NAME="$OS_NAME-$RELEASEVER" BASE_DIR="$IMAGE_BASE_RISOTTO_BASE_DIR/$BASE_NAME" BASE_TAR="$IMAGE_BASE_RISOTTO_BASE_DIR-$BASE_NAME".tar BASE_PKGS_FILE="$IMAGE_BASE_RISOTTO_BASE_DIR-$BASE_NAME.pkgs" BASE_LOCK="$IMAGE_BASE_RISOTTO_BASE_DIR-$BASE_NAME.build" function dnf_opt_base() { INSTALL_DIR=$1 echo "--setopt=install_weak_deps=False --nodocs --noplugins --installroot=$INSTALL_DIR --releasever $RELEASEVER" } function dnf_opt() { INSTALL_DIR=$1 INSTALL_PKG=$2 OPT=$(dnf_opt_base "$INSTALL_DIR") echo "$OPT install $INSTALL_PKG" } function new_package_base() { if [ "$INSTALL_TOOL" = "dnf" ]; then OPT=$(dnf_opt "$BASE_DIR" "$BASE_PKG") dnf --assumeno $OPT | grep ^" " > "$BASE_PKGS_FILE".new else debootstrap --include="$BASE_PKG" --variant=minbase "$RELEASEVER" "$BASE_DIR" > /dev/null chroot "$BASE_DIR" dpkg-query -f '${binary:Package} ${source:Version}\n' -W > "$BASE_PKGS_FILE".new fi } function install_base() { if [ "$INSTALL_TOOL" = "dnf" ]; then OPT=$(dnf_opt "$BASE_DIR" "$BASE_PKG") dnf --assumeyes $OPT fi } function new_package() { if [ "$INSTALL_TOOL" = "dnf" ]; then OPT=$(dnf_opt_base "$IMAGE_NAME_RISOTTO_IMAGE_DIR") dnf $OPT update OPT=$(dnf_opt "$IMAGE_NAME_RISOTTO_IMAGE_DIR" "$PKG") dnf --assumeno $OPT | grep ^" " > "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs.new else chroot "$IMAGE_NAME_RISOTTO_IMAGE_DIR" apt update > /dev/null 2>&1 chroot "$IMAGE_NAME_RISOTTO_IMAGE_DIR" apt install --no-install-recommends --yes $PKG -s 2>/dev/null|grep ^"Inst " > "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs.new fi } function install_pkg() { if [ "$INSTALL_TOOL" = "dnf" ]; then OPT=$(dnf_opt "$IMAGE_NAME_RISOTTO_IMAGE_DIR" "$PKG") dnf --assumeyes $OPT else chroot "$IMAGE_NAME_RISOTTO_IMAGE_DIR" apt install --no-install-recommends --yes $PKG fi } if [ ! -f "$BASE_LOCK" ] || [ ! -f "$BASE_TAR" ]; then echo " - reinstallation de l'image de base" rm -rf "$BASE_DIR" new_package_base diff -u "$BASE_PKGS_FILE" "$BASE_PKGS_FILE".new && NEW_BASE=false || NEW_BASE=true if [ ! -f "$BASE_TAR" ] || [ "$NEW_BASE" = true ]; then mkdir -p "$IMAGE_BASE_RISOTTO_BASE_DIR" install_base cd "$IMAGE_BASE_RISOTTO_BASE_DIR" tar cf "$BASE_TAR" "$BASE_NAME" cd - > /dev/null if [ -f "$BASE_PKGS_FILE" ]; then mv "$BASE_PKGS_FILE" "$BASE_PKGS_FILE".old fi mv "$BASE_PKGS_FILE".new "$BASE_PKGS_FILE" rm -rf "$IMAGE_BASE_RISOTTO_BASE_DIR" fi rm -rf "$BASE_DIR" touch "$BASE_LOCK" fi tar xf "$BASE_TAR" mv "$BASE_NAME" "$IMAGE_NAME_RISOTTO_IMAGE_DIR" if [ -n "$COPR" ]; then #FIXME signature... mkdir -p "$REPO_DIR" cd "$REPO_DIR" wget -q "$COPR" cd - > /dev/null fi if [ "$FUSION" = true ]; then dnf -y install "https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$RELEASEVER.noarch.rpm" --installroot="$IMAGE_NAME_RISOTTO_IMAGE_DIR" > /dev/null fi # FIXME verifier s'il y a des modifs sur pre/post if [ -f "$IMAGE_NAME_RISOTTO_IMAGE_DIR".base.pkgs ] && [ -f "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs ]; then echo " - différence(s) avec les paquets de base" diff -u "$IMAGE_NAME_RISOTTO_IMAGE_DIR".base.pkgs "$BASE_PKGS_FILE" && INSTALL=false || INSTALL=true else INSTALL=true fi new_package if [ "$INSTALL" = false ]; then echo " - différence(s) avec les paquets de l'image" diff -u "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs.new && INSTALL=false || INSTALL=true fi find "$IMAGE_DIR_RECIPIENT_IMAGE" -type f -exec md5sum '{}' \; > "$IMAGE_NAME_RISOTTO_IMAGE_DIR".md5sum.new if [ "$INSTALL" = false ]; then diff -u "$IMAGE_NAME_RISOTTO_IMAGE_DIR".md5sum "$IMAGE_NAME_RISOTTO_IMAGE_DIR".md5sum.new && INSTALL=false || INSTALL=true fi if [ "$INSTALL" = true ]; then echo " - installation" if [ -f "$IMAGE_NAME_RISOTTO_IMAGE_DIR"_"$RELEASEVER".version ]; then VERSION=$(cat "$IMAGE_NAME_RISOTTO_IMAGE_DIR"_"$RELEASEVER".version) else VERSION=0 fi mkdir "$RISOTTO_IMAGE_DIR/tmp" ORI_DIR=$PWD cd "$RISOTTO_IMAGE_DIR/tmp" if [ ! "$VERSION" = 0 ] && [ -f "$IMAGE_NAME_RISOTTO_IMAGE_NAME" ]; then tar xf "$IMAGE_NAME_RISOTTO_IMAGE_NAME" # if [ "$INSTALL_TOOL" = "apt" ]; then # chown _apt "$IMAGE_NAME" # fi # else # mkdir "$IMAGE_NAME" fi #cd "$IMAGE_NAME" make_changelog "$IMAGE_NAME" "$VERSION" "$OS_NAME" "$RELEASEVER" > "$IMAGE_NAME_RISOTTO_IMAGE_DIR"_"$RELEASEVER"_"$VERSION"_changelog.md cd $ORI_DIR rm -rf "$RISOTTO_IMAGE_DIR/tmp" install_pkg sleep 2 for script in $(ls $IMAGE_DIR_RECIPIENT_IMAGE/postinstall/*.sh 2> /dev/null); do . "$script" done CONTAINER=$IMAGE_NAME make_volatile /etc if [ ! "$?" = 0 ]; then echo "make_volatile failed" exit 1 fi cd "$RISOTTO_IMAGE_DIR/$IMAGE_NAME" if [ -f "$IMAGE_NAME_RISOTTO_IMAGE_NAME" ]; then mv -f "$IMAGE_NAME_RISOTTO_IMAGE_NAME" "$IMAGE_NAME_RISOTTO_IMAGE_NAME".old fi tar cf "$IMAGE_NAME_RISOTTO_IMAGE_NAME" . sha256sum "$IMAGE_NAME_RISOTTO_IMAGE_NAME" > "$IMAGE_NAME_RISOTTO_IMAGE_NAME".sha cd - > /dev/null cp -f "$BASE_PKGS_FILE" "$IMAGE_NAME_RISOTTO_IMAGE_DIR".base.pkgs mv -f "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs.new "$IMAGE_NAME_RISOTTO_IMAGE_DIR".pkgs mv -f "$IMAGE_NAME_RISOTTO_IMAGE_DIR".md5sum.new "$IMAGE_NAME_RISOTTO_IMAGE_DIR".md5sum VERSION=$((VERSION + 1)) echo "$VERSION" > "$IMAGE_NAME_RISOTTO_IMAGE_DIR"_"$RELEASEVER".version fi rm -rf "$IMAGE_NAME_RISOTTO_IMAGE_DIR" echo " => OK" exit 0