文件预览

setup.sh

查看 Sync Notes 技能包中的文件内容。

文件内容

scripts/setup.sh

#!/usr/bin/env bash
# Interactive configuration wizard for the sync-notes skill.
# Writes config/rclone.conf and config/.env (chmod 600).

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
CONFIG_DIR="$SKILL_DIR/config"
RCLONE_CONFIG_FILE="$CONFIG_DIR/rclone.conf"
ENV_FILE="$CONFIG_DIR/.env"

command -v rclone >/dev/null 2>&1 || { echo "rclone is required" >&2; exit 1; }

prompt() {
  # prompt <var> <question> [default] [silent]
  local var="$1" q="$2" def="${3:-}" silent="${4:-}"
  local ans
  if [[ "$silent" == "silent" ]]; then
    read -r -s -p "$q${def:+ [$def]}: " ans; echo
  else
    read -r -p "$q${def:+ [$def]}: " ans
  fi
  ans="${ans:-$def}"
  printf -v "$var" '%s' "$ans"
}

confirm_overwrite() {
  local path="$1"
  if [[ -f "$path" ]]; then
    local yn
    read -r -p "$path exists. Overwrite? [y/N] " yn
    [[ "$yn" =~ ^[Yy]$ ]] || { echo "aborted."; exit 1; }
  fi
}

echo "=== sync-notes setup ==="
echo "Config will be written to: $CONFIG_DIR"
echo

confirm_overwrite "$RCLONE_CONFIG_FILE"
confirm_overwrite "$ENV_FILE"

echo "--- Cloudflare R2 (S3) ---"
prompt R2_ENDPOINT     "R2 endpoint URL (https://<account>.r2.cloudflarestorage.com)"
prompt R2_ACCESS_KEY   "R2 Access Key ID"
prompt R2_SECRET       "R2 Secret Access Key" "" silent
prompt R2_BUCKET       "R2 bucket name"
prompt R2_PREFIX       "Subpath inside bucket (optional, no leading slash)" ""

echo
echo "--- rclone crypt (must match Remotely Save settings) ---"
prompt CRYPT_PASSWORD  "Crypt password" "" silent
prompt CRYPT_PASSWORD2 "Crypt salt / password2 (leave blank if not set in Remotely Save)" "" silent
prompt CRYPT_FN_ENC    "Filename encryption mode (standard|obfuscate|off)" "standard"
prompt CRYPT_FN_ENCODING "Filename encoding (base32|base64|base32768) [Remotely Save uses base64]" "base64"
prompt CRYPT_DIR_ENC   "Directory name encryption (true|false)" "true"

echo
echo "--- skill behaviour ---"
prompt RCLONE_REMOTE   "Crypt remote name to expose to scripts" "notes"
prompt BACKUP_KEEP     "Local backup snapshots to keep" "1"
prompt EXTRA_FLAGS     "Extra rclone flags" "--transfers=4 --checkers=8"

# obscure passwords (only if non-empty)
OBS_PW="$(rclone obscure "$CRYPT_PASSWORD")"
OBS_PW2=""
[[ -n "$CRYPT_PASSWORD2" ]] && OBS_PW2="$(rclone obscure "$CRYPT_PASSWORD2")"

# build remote target string
REMOTE_TARGET="r2-raw:${R2_BUCKET}"
[[ -n "$R2_PREFIX" ]] && REMOTE_TARGET="${REMOTE_TARGET}/${R2_PREFIX}"

mkdir -p "$CONFIG_DIR"
umask 077

cat > "$RCLONE_CONFIG_FILE" <<EOF
[r2-raw]
type = s3
provider = Cloudflare
access_key_id = ${R2_ACCESS_KEY}
secret_access_key = ${R2_SECRET}
endpoint = ${R2_ENDPOINT}
acl = private

[${RCLONE_REMOTE}]
type = crypt
remote = ${REMOTE_TARGET}
filename_encryption = ${CRYPT_FN_ENC}
filename_encoding = ${CRYPT_FN_ENCODING}
directory_name_encryption = ${CRYPT_DIR_ENC}
password = ${OBS_PW}
EOF
[[ -n "$OBS_PW2" ]] && echo "password2 = ${OBS_PW2}" >> "$RCLONE_CONFIG_FILE"
chmod 600 "$RCLONE_CONFIG_FILE"

cat > "$ENV_FILE" <<EOF
RCLONE_REMOTE=${RCLONE_REMOTE}
BACKUP_KEEP=${BACKUP_KEEP}
RCLONE_EXTRA_FLAGS="${EXTRA_FLAGS}"
EOF
chmod 600 "$ENV_FILE"

echo
echo "✅ wrote $RCLONE_CONFIG_FILE"
echo "✅ wrote $ENV_FILE"
echo
echo "Next:"
echo "  1. export CLOUD_NOTES_PATH=/path/to/your/local/vault"
echo "  2. $SCRIPT_DIR/sync.sh status   # sanity-check"
echo "  3. $SCRIPT_DIR/sync.sh init     # establish bisync baseline"