diff --git a/peerstash-control/peerstash/cli/cmd_unmount.py b/peerstash-control/peerstash/cli/cmd_unmount.py index 9e8a66a..ffaf8f7 100644 --- a/peerstash-control/peerstash/cli/cmd_unmount.py +++ b/peerstash-control/peerstash/cli/cmd_unmount.py @@ -39,6 +39,9 @@ def unmount( except ValueError as e: typer.secho(f"Error: {e}", fg=typer.colors.RED, err=True) raise typer.Exit(1) + except RuntimeError as e: + typer.secho(f"Error: {e}", fg=typer.colors.RED, err=True) + raise typer.Exit(1) except Exception as e: typer.secho(f"System Error: {e}", fg=typer.colors.RED, err=True) raise typer.Exit(1) diff --git a/peerstash-control/peerstash/core/backup.py b/peerstash-control/peerstash/core/backup.py index 884dea8..78c77d0 100644 --- a/peerstash-control/peerstash/core/backup.py +++ b/peerstash-control/peerstash/core/backup.py @@ -14,6 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import errno import os import random import shutil @@ -496,6 +497,9 @@ def restore_snapshot( raise Exception( f"Failed to restore snapshot '{snapshot}' for task '{name}' ({e})" ) + finally: + if os.path.exists(temp_folder): + shutil.rmtree(temp_folder) logger.info(f"[{name}] Restored snapshot {snapshot} in {folder}") return folder @@ -576,7 +580,18 @@ def unmount_task(name: str) -> None: subprocess.run(["fusermount", "-uz", mount_point], capture_output=True) # delete the file if exists - if os.path.exists(mount_point): - shutil.rmtree(mount_point) + try: + if os.path.exists(mount_point): + shutil.rmtree(mount_point) + except OSError as e: + if e.errno == errno.EROFS: + log(f"[{name}] Failed to remove repo folders. No permissions for {mount_point}", "warning") + raise RuntimeError(f"No permissions. Use sudo if mounted as root.") + else: + logger.error(f"[{name}] Failed to unmount repo: {e}") + raise OSError(e) + except Exception as e: + logger.error(f"[{name}] Failed to unmount repo: {e}") + raise Exception(e) logger.info(f"[{name}] Unmounted repo.") diff --git a/peerstash-control/peerstash/setup.py b/peerstash-control/peerstash/setup.py index 642ae41..99f4d77 100644 --- a/peerstash-control/peerstash/setup.py +++ b/peerstash-control/peerstash/setup.py @@ -23,6 +23,7 @@ import requests +from peerstash.core.backup import unmount_task from peerstash.core.utils import update_crontab from peerstash.cli import __version__ @@ -60,6 +61,8 @@ def init_db_and_restore(): f"{prune_schedule} {PEERSTASH_BIN} prune {name} 10" ) update_crontab(name, [backup_job, prune_job]) + # force unmount stale repos + unmount_task(name) else: print("No database found. Creating a new empty database...") diff --git a/peerstash-control/scripts/setup.sh b/peerstash-control/scripts/setup.sh index e4651ec..b2b8d9a 100644 --- a/peerstash-control/scripts/setup.sh +++ b/peerstash-control/scripts/setup.sh @@ -17,13 +17,13 @@ # along with this program. If not, see . -SSH_FOLDER="/var/lib/peerstash" +PEERSTASH_CONFIG="/var/lib/peerstash" # set up logging LOG_DIR="/var/log/peerstash" mkdir -p "$LOG_DIR" -BIND_LOG_DIR="/var/lib/peerstash/logs" +BIND_LOG_DIR="$PEERSTASH_CONFIG/logs" mkdir -p "$BIND_LOG_DIR" if [ ! -L "$LOG_DIR" ]; then @@ -46,13 +46,13 @@ exec > >(while IFS= read -r line; do echo "[$(date '+%Y-%m-%d %H:%M:%S')] $line" # Generate SSH host keys mkdir -p /var/run/sshd -if [ ! -f "$SSH_FOLDER"/ssh_host_rsa_key ]; then +if [ ! -f "$PEERSTASH_CONFIG"/ssh_host_rsa_key ]; then echo "Generating SSH host keys..." ssh-keygen -A - cp /etc/ssh/ssh_host_* "$SSH_FOLDER"/ + cp /etc/ssh/ssh_host_* "$PEERSTASH_CONFIG"/ else echo "Using existing SSH host keys..." - cp "$SSH_FOLDER"/ssh_host_* /etc/ssh/ + cp "$PEERSTASH_CONFIG"/ssh_host_* /etc/ssh/ fi # create admin user @@ -63,15 +63,15 @@ adduser "$USERNAME" sudo # Generate SSH user keys mkdir -p /home/"$USERNAME"/.ssh -if [ ! -f "$SSH_FOLDER"/id_ed25519 ]; then +if [ ! -f "$PEERSTASH_CONFIG"/id_ed25519 ]; then echo "Generating SSH user keys..." >&2 if [ ! -f /home/"$USERNAME"/.ssh/id_ed25519 ]; then ssh-keygen -t ed25519 -N "" -f /home/"$USERNAME"/.ssh/id_ed25519 -C "$USERNAME" fi - cp /home/"$USERNAME"/.ssh/id_* $SSH_FOLDER/ + cp /home/"$USERNAME"/.ssh/id_* $PEERSTASH_CONFIG/ else echo "Using existing SSH user keys..." >&2 - cp $SSH_FOLDER/id_* /home/"$USERNAME"/.ssh/ + cp $PEERSTASH_CONFIG/id_* /home/"$USERNAME"/.ssh/ fi { echo "" @@ -81,6 +81,10 @@ fi echo "" > /home/"$USERNAME"/.ssh/known_hosts chown -R "$USERNAME":"$USERNAME" /home/"$USERNAME"/.ssh +# set up filesystem perms +chown "$USERNAME":"$USERNAME" "$PEERSTASH_CONFIG" +chmod 777 /tmp/peerstash_mnt +chmod 777 /mnt/peerstash_restore # prevent indexing FUSE mounts touch /tmp/peerstash_mnt/.nomedia