I haven't tested it yet

This commit is contained in:
Paul Fey 2025-02-09 08:37:01 +01:00
parent d8a5cd5361
commit ca6d28c918

View file

@ -1,5 +1,11 @@
#!/bin/sh #!/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() { fatal() {
echo "Error: $1" echo "Error: $1"
exit 1 exit 1
@ -21,79 +27,89 @@ warning() {
echo "Warning: $1" echo "Warning: $1"
} }
remount () { beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
overlay_config=/rodeo/configuration/included_overlays
[ -n "$1" ] && overlay_config="$1" endswith() { case $2 in *"$1") true;; *) false;; esac; }
while IFS="" read -r dir || [ -n "$dir" ]
do stripped() {
debug "Scanning for overlays to be mounted on /$dir" string="$1"
lowerdirs="" string2=${string#"("}
string2=${string2%")"}
echo string2
}
get_lower_dirs() {
overlay_config="$1"
dir="$2"
while IFS="" read -r overlay || [ -n "$overlay" ] while IFS="" read -r overlay || [ -n "$overlay" ]
do do
if beginswith "(" "$overlay" && endswith ")" "$overlay" && [ -f "$(stripped "$overlay")" ]; then
get_lower_dirs "$(stripped "$overlay")" "$dir"
else
debug "Checking if $overlay has $dir" debug "Checking if $overlay has $dir"
if [ -d "/rodeo/overlays/$overlay/$dir" ]; then cd $OVERLAY_DIRECTORY || fatal "Failed to change directory"
overlay_path="$(realpath "$overlay")"
if [ -d "$overlay_path/$dir" ]; then
debug "$overlay has $dir" debug "$overlay has $dir"
if [ -z "$lowerdirs" ]; then if [ -z "$lowerdirs" ]; then
lowerdirs="/rodeo/overlays/$overlay/$dir" lowerdirs="$overlay_path/$dir"
else else
lowerdirs="$lowerdirs:/rodeo/overlays/$overlay/$dir" lowerdirs="$lowerdirs:$overlay_path/$dir"
fi fi
else else
debug "$overlay does not have $dir" debug "$overlay does not have $dir"
fi fi
fi
done < "$overlay_config" 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"
get_lower_dirs "$overlay_config" "$dir"
umount "/$dir" || error "Unmounting of /$dir failed" umount "/$dir" || error "Unmounting of /$dir failed"
if [ -z "$lowerdirs" ]; then if [ -z "$lowerdirs" ]; then
warning "No overlay has $dir" warning "No overlay has $dir"
mount --bind "/rodeo/root/$dir" "/$dir" || error "Bind-Mounting /$dir failed" mount --bind "/rodeo/root/$dir" "/$dir" || error "Bind-Mounting /$dir failed"
else 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" mount -t overlay overlay -o lowerdir="$lowerdirs",upperdir="/rodeo/root/$dir",workdir="/rodeo/tmp/$dir" "/$dir" || error "Overlay-Mounting /$dir failed"
fi fi
done < /rodeo/configuration/managed_directories done < $MANAGED_DIRECTORIES_FILE
} }
initial_mount() { initial_mount() {
overlay_config=/rodeo/configuration/included_overlays overlay_config=$DEFAULT_OVERLAY_FILE
[ -n "$1" ] && overlay_config="$1" [ -n "$1" ] && overlay_config="$1"
while IFS="" read -r dir || [ -n "$dir" ] while IFS="" read -r dir || [ -n "$dir" ]
do do
debug "Scanning for overlays to be mounted on /$dir" debug "Scanning for overlays to be mounted on /$dir"
lowerdirs="" get_lower_dirs "$overlay_config" "$dir"
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"
if [ -z "$lowerdirs" ]; then if [ -z "$lowerdirs" ]; then
warning "No overlay has $dir" warning "No overlay has $dir"
mount --bind "/rodeo/root/$dir" "/$dir" || error "Bind-Mounting /$dir failed" mount --bind "/rodeo/root/$dir" "/$dir" || error "Bind-Mounting /$dir failed"
else 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" mount -t overlay overlay -o lowerdir="$lowerdirs",upperdir="/rodeo/root/$dir",workdir="/rodeo/tmp/$dir" "/$dir" || error "Overlay-Mounting /$dir failed"
fi fi
done < /rodeo/configuration/managed_directories done < $MANAGED_DIRECTORIES_FILE
} }
transfer_directory() { transfer_directory() {
dir="$1" dir="$1"
mv "/$dir" "/rodeo/root/$dir" mv "/$dir" "/rodeo/root/$dir"
mkdir -p "/$dir" "/rodeo/tmp/$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" info "Added $dir to the list of managed directories"
initial_mount initial_mount
} }
shell() { shell() {
target="$1" target="$1"
overlay_file=/rodeo/configuration/included_overlays overlay_file=$DEFAULT_OVERLAY_FILE
command="/bin/sh" command="/bin/sh"
[ -n "$2" ] && overlay_file="$2" [ -n "$2" ] && overlay_file="$2"
[ -n "$3" ] && command="$3" [ -n "$3" ] && command="$3"