From cb1285292463b54cbc5191990a26dbfd459813ce Mon Sep 17 00:00:00 2001 From: rowan Date: Fri, 7 Mar 2025 10:36:35 -0600 Subject: [PATCH] initial commit --- configctl | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100755 configctl diff --git a/configctl b/configctl new file mode 100755 index 0000000..76a4530 --- /dev/null +++ b/configctl @@ -0,0 +1,68 @@ +#!/usr/bin/env sh + +XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}" +XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}" +XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}" + +BASE_CONFIG="$XDG_DATA_HOME/config/base" +CHANGESET_DIR="$XDG_DATA_HOME/config/changeset" +MOUNT_POINT="$XDG_CONFIG_HOME" + +usage() { + SCRIPT_NAME=$(basename $0) + echo "Usage: $SCRIPT_NAME [unmount]" + exit 1 +} + +if [ $# -lt 1 ]; then + usage +fi + +SELECTED="$1" +CHANGESET="$CHANGESET_DIR/$SELECTED" +UPPER_DIR="$XDG_STATE_HOME/config/$SELECTED" +WORKDIR="$XDG_STATE_HOME/config/.work_$SELECTED" + +if [ ! -d "$CHANGESET" ]; then + echo "'$CHANGESET' not found." + exit 1 +fi + +if [ ! -d "$UPPER_DIR" ]; then + mkdir -p $UPPER_DIR +fi + +if [ "$2" == "unmount" ]; then + fusermount -u "$MOUNT_POINT" + echo "Unmounted $MOUNT_POINT" + exit 0 +fi + +# Unmount if already mounted. +if mountpoint -q "$MOUNT_POINT"; then + fusermount -u "$MOUNT_POINT" +fi + +SYSD_DIR="$XDG_CONFIG_HOME/systemd/user" +SVC_NAME="$SELECTED-automount.service" +mkdir -p "$SYSD_DIR" +cat << EOF > "$SYSD_DIR/$SVC_NAME" +[Unit] +Description=Mount fuse-overlayfs config + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=fuse-overlayfs -o lowerdir="$BASE_CONFIG:$CHANGESET",upperdir="$UPPER_DIR",workdir="$WORKDIR" "$MOUNT_POINT" +ExecStop=/usr/bin/fusermount -u ~/.$MOUNT_POINT + +[Install] +WantedBy=default.target +EOF + +mkdir -p "$WORKDIR" + +fuse-overlayfs -o lowerdir="$BASE_CONFIG:$CHANGESET",upperdir="$UPPER_DIR",workdir="$WORKDIR" "$MOUNT_POINT" + +echo "Mounted $MOUNT_POINT with changeset '$SELECTED'" +echo "Run 'systemctl --user enable --now $SVC_NAME' to automount this config"