From ca6d28c9184a8cf4a310dac77ea256e9002c0aa9 Mon Sep 17 00:00:00 2001 From: pauljako Date: Sun, 9 Feb 2025 08:37:01 +0100 Subject: [PATCH] I haven't tested it yet --- rodeo-overlay.sh | 92 ++++++++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 38 deletions(-) diff --git a/rodeo-overlay.sh b/rodeo-overlay.sh index 5d4ca6a..f2d8518 100644 --- a/rodeo-overlay.sh +++ b/rodeo-overlay.sh @@ -1,5 +1,11 @@ #!/bin/sh +VERSION=0.1 +CONFIG_DIR=/rodeo/configuration +OVERLAY_DIRECTORY=/rodeo/overlays +DEFAULT_OVERLAY_FILE=$CONFIG_DIR/included_overlays +MANAGED_DIRECTORIES_FILE=$CONFIG_DIR/managed_directories + fatal() { echo "Error: $1" exit 1 @@ -21,79 +27,89 @@ warning() { echo "Warning: $1" } -remount () { - overlay_config=/rodeo/configuration/included_overlays +beginswith() { case $2 in "$1"*) true;; *) false;; esac; } + +endswith() { case $2 in *"$1") true;; *) false;; esac; } + +stripped() { + string="$1" + string2=${string#"("} + string2=${string2%")"} + echo string2 +} + +get_lower_dirs() { + overlay_config="$1" + dir="$2" + while IFS="" read -r overlay || [ -n "$overlay" ] + do + if beginswith "(" "$overlay" && endswith ")" "$overlay" && [ -f "$(stripped "$overlay")" ]; then + get_lower_dirs "$(stripped "$overlay")" "$dir" + else + debug "Checking if $overlay has $dir" + cd $OVERLAY_DIRECTORY || fatal "Failed to change directory" + overlay_path="$(realpath "$overlay")" + if [ -d "$overlay_path/$dir" ]; then + debug "$overlay has $dir" + if [ -z "$lowerdirs" ]; then + lowerdirs="$overlay_path/$dir" + else + lowerdirs="$lowerdirs:$overlay_path/$dir" + fi + else + debug "$overlay does not have $dir" + fi + fi + done < "$overlay_config" +} + +remount() { + overlay_config=$DEFAULT_OVERLAY_FILE [ -n "$1" ] && overlay_config="$1" while IFS="" read -r dir || [ -n "$dir" ] do debug "Scanning for overlays to be mounted on /$dir" - lowerdirs="" - while IFS="" read -r overlay || [ -n "$overlay" ] - do - debug "Checking if $overlay has $dir" - if [ -d "/rodeo/overlays/$overlay/$dir" ]; then - debug "$overlay has $dir" - if [ -z "$lowerdirs" ]; then - lowerdirs="/rodeo/overlays/$overlay/$dir" - else - lowerdirs="$lowerdirs:/rodeo/overlays/$overlay/$dir" - fi - else - debug "$overlay does not have $dir" - fi - done < "$overlay_config" + get_lower_dirs "$overlay_config" "$dir" umount "/$dir" || error "Unmounting of /$dir failed" if [ -z "$lowerdirs" ]; then warning "No overlay has $dir" mount --bind "/rodeo/root/$dir" "/$dir" || error "Bind-Mounting /$dir failed" else + debug "Overlays to be mounted on /$dir: $lowerdirs" mount -t overlay overlay -o lowerdir="$lowerdirs",upperdir="/rodeo/root/$dir",workdir="/rodeo/tmp/$dir" "/$dir" || error "Overlay-Mounting /$dir failed" fi - done < /rodeo/configuration/managed_directories + done < $MANAGED_DIRECTORIES_FILE } -initial_mount () { - overlay_config=/rodeo/configuration/included_overlays +initial_mount() { + overlay_config=$DEFAULT_OVERLAY_FILE [ -n "$1" ] && overlay_config="$1" while IFS="" read -r dir || [ -n "$dir" ] do debug "Scanning for overlays to be mounted on /$dir" - lowerdirs="" - while IFS="" read -r overlay || [ -n "$overlay" ] - do - debug "Checking if $overlay has $dir" - if [ -d "/rodeo/overlays/$overlay/$dir" ]; then - debug "$overlay has $dir" - if [ -z "$lowerdirs" ]; then - lowerdirs="/rodeo/overlays/$overlay/$dir" - else - lowerdirs="$lowerdirs:/rodeo/overlays/$overlay/$dir" - fi - else - debug "$overlay does not have $dir" - fi - done < "$overlay_config" + get_lower_dirs "$overlay_config" "$dir" if [ -z "$lowerdirs" ]; then warning "No overlay has $dir" mount --bind "/rodeo/root/$dir" "/$dir" || error "Bind-Mounting /$dir failed" else + debug "Overlays to be mounted on /$dir: $lowerdirs" mount -t overlay overlay -o lowerdir="$lowerdirs",upperdir="/rodeo/root/$dir",workdir="/rodeo/tmp/$dir" "/$dir" || error "Overlay-Mounting /$dir failed" fi - done < /rodeo/configuration/managed_directories + done < $MANAGED_DIRECTORIES_FILE } transfer_directory() { dir="$1" mv "/$dir" "/rodeo/root/$dir" mkdir -p "/$dir" "/rodeo/tmp/$dir" - echo "$dir" >> /rodeo/configuration/managed_directories + echo "$dir" >> $MANAGED_DIRECTORIES_FILE info "Added $dir to the list of managed directories" initial_mount } shell() { target="$1" - overlay_file=/rodeo/configuration/included_overlays + overlay_file=$DEFAULT_OVERLAY_FILE command="/bin/sh" [ -n "$2" ] && overlay_file="$2" [ -n "$3" ] && command="$3"