forked from stove/risotto
197 lines
6.6 KiB
Text
197 lines
6.6 KiB
Text
|
#!/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
|