Easier sync

This commit is contained in:
2026-01-17 16:49:25 +02:00
parent 744b7a3221
commit f19eec605a
2 changed files with 53 additions and 8 deletions

6
MANUAL
View File

@@ -11,6 +11,11 @@ DESCRIPTION
scripts for ongoing synchronization. Uses tar for initial sync and rsync scripts for ongoing synchronization. Uses tar for initial sync and rsync
for subsequent syncs. for subsequent syncs.
Server project path defaults to ~/public_leo if left empty. Paths starting
with ~ are automatically resolved to full paths via SSH.
New servers are automatically trusted (StrictHostKeyChecking=accept-new).
OPTIONS OPTIONS
-h, --help -h, --help
Display this help and exit. Display this help and exit.
@@ -26,6 +31,7 @@ OPTIONS
MODES MODES
Default mode: Default mode:
- Syncs terminal info (xterm-ghostty or xterm-kitty)
- Downloads all project files - Downloads all project files
- Creates .vscode/sftp.json - Creates .vscode/sftp.json
- Generates all helper scripts - Generates all helper scripts

View File

@@ -15,6 +15,9 @@ SCRIPT_PATH="$(realpath "$0")"
SCRIPT_DIR="$(dirname "$SCRIPT_PATH")" SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"
ARCHIVE_NAME="sync.tar.gz" ARCHIVE_NAME="sync.tar.gz"
# SSH options - auto-accept new host keys
SSH_OPTS="-o StrictHostKeyChecking=accept-new"
# Parse command line arguments # Parse command line arguments
SFTP_ONLY=false SFTP_ONLY=false
FILES_ONLY=false FILES_ONLY=false
@@ -55,15 +58,31 @@ echo ""
if [ -f ".sync-credentials" ]; then if [ -f ".sync-credentials" ]; then
source ".sync-credentials" source ".sync-credentials"
else else
# Prompt for configuration # Prompt for configuration (password before path for SSH resolution)
read -p "Server user@host (e.g., leo@server.com): " SERVER_HOST read -p "Server user@host (e.g., leo@server.com): " SERVER_HOST
read -p "Server project path (e.g., /home/leo/public_leo): " SERVER_PROJECT_PATH
read -p "Local folder path (e.g., Delta Pharmacy): " LOCAL_FOLDER
read -sp "SSH Password: " SSH_PASSWORD read -sp "SSH Password: " SSH_PASSWORD
echo "" echo ""
read -p "Server project path (default: ~/public_leo): " SERVER_PROJECT_PATH
read -p "Local folder path (e.g., Delta Pharmacy): " LOCAL_FOLDER
echo "" echo ""
fi fi
# Default path to ~/public_leo if empty
if [ -z "$SERVER_PROJECT_PATH" ]; then
SERVER_PROJECT_PATH="~/public_leo"
fi
# Resolve ~ to full path via SSH
if [[ "$SERVER_PROJECT_PATH" == ~* ]]; then
echo "Resolving path..."
SERVER_PROJECT_PATH=$(sshpass -p "${SSH_PASSWORD}" ssh $SSH_OPTS ${SERVER_HOST} "cd ${SERVER_PROJECT_PATH} && pwd")
if [ $? -ne 0 ]; then
echo -e "${RED}Failed to resolve path${NC}"
exit 1
fi
echo -e "${GREEN}Resolved to: ${SERVER_PROJECT_PATH}${NC}"
fi
# Validate required variables (all except password) # Validate required variables (all except password)
if [ -z "$SERVER_HOST" ]; then if [ -z "$SERVER_HOST" ]; then
echo -e "${RED}Error: SERVER_HOST is not set${NC}" echo -e "${RED}Error: SERVER_HOST is not set${NC}"
@@ -80,15 +99,35 @@ if [ -z "$LOCAL_FOLDER" ]; then
exit 1 exit 1
fi fi
# Sync terminal info on full sync (no flags)
if [ "$SFTP_ONLY" = false ] && [ "$FILES_ONLY" = false ]; then
# Detect terminal type
if [[ "$TERM" == *"ghostty"* ]]; then
TERM_TYPE="xterm-ghostty"
elif [[ "$TERM" == *"kitty"* ]]; then
TERM_TYPE="xterm-kitty"
else
TERM_TYPE=""
fi
if [ -n "$TERM_TYPE" ]; then
echo "Syncing terminal info ($TERM_TYPE)..."
infocmp -x "$TERM_TYPE" | sshpass -p "${SSH_PASSWORD}" ssh $SSH_OPTS ${SERVER_HOST} -- tic -x -
echo -e "${GREEN}Terminal info synced${NC}"
else
echo -e "${YELLOW}Warning: Unknown terminal ($TERM), skipping terminfo sync${NC}"
fi
fi
# Start sync process # Start sync process
echo "Starting project sync..." echo "Starting project sync..."
# Step 1: SSH into server and create tar archive # Step 1: SSH into server and create tar archive
echo "Creating archive on server..." echo "Creating archive on server..."
if [ "$FILES_ONLY" = true ]; then if [ "$FILES_ONLY" = true ]; then
sshpass -p "${SSH_PASSWORD}" ssh ${SERVER_HOST} "cd ${SERVER_PROJECT_PATH} && tar -czf ../${ARCHIVE_NAME} --exclude='node_modules' --exclude='vendor' ." sshpass -p "${SSH_PASSWORD}" ssh $SSH_OPTS ${SERVER_HOST} "cd ${SERVER_PROJECT_PATH} && tar -czf ../${ARCHIVE_NAME} --exclude='node_modules' --exclude='vendor' ."
else else
sshpass -p "${SSH_PASSWORD}" ssh ${SERVER_HOST} "cd ${SERVER_PROJECT_PATH} && tar -czf ../${ARCHIVE_NAME} ." sshpass -p "${SSH_PASSWORD}" ssh $SSH_OPTS ${SERVER_HOST} "cd ${SERVER_PROJECT_PATH} && tar -czf ../${ARCHIVE_NAME} ."
fi fi
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
@@ -103,7 +142,7 @@ mkdir -p "${LOCAL_FOLDER}"
# Step 3: Copy archive from server to local # Step 3: Copy archive from server to local
echo "Copying archive to local machine..." echo "Copying archive to local machine..."
sshpass -p "${SSH_PASSWORD}" scp ${SERVER_HOST}:~/${ARCHIVE_NAME} "${LOCAL_FOLDER}/" sshpass -p "${SSH_PASSWORD}" scp $SSH_OPTS ${SERVER_HOST}:~/${ARCHIVE_NAME} "${LOCAL_FOLDER}/"
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo -e "${RED}Failed to copy archive${NC}" echo -e "${RED}Failed to copy archive${NC}"
@@ -130,7 +169,7 @@ rm ${ARCHIVE_NAME}
# Step 6: Clean up - delete server archive # Step 6: Clean up - delete server archive
echo "Cleaning up server archive..." echo "Cleaning up server archive..."
sshpass -p "${SSH_PASSWORD}" ssh ${SERVER_HOST} "rm ~/${ARCHIVE_NAME}" sshpass -p "${SSH_PASSWORD}" ssh $SSH_OPTS ${SERVER_HOST} "rm ~/${ARCHIVE_NAME}"
echo -e "${GREEN}File sync complete!${NC}" echo -e "${GREEN}File sync complete!${NC}"
@@ -209,7 +248,7 @@ done
if [ "$SFTP_ONLY" = false ]; then if [ "$SFTP_ONLY" = false ]; then
echo "Uploading lazygit to server..." echo "Uploading lazygit to server..."
sshpass -p "${SSH_PASSWORD}" scp "${SCRIPT_DIR}/lazygit" ${SERVER_HOST}:${SERVER_PROJECT_PATH} sshpass -p "${SSH_PASSWORD}" scp $SSH_OPTS "${SCRIPT_DIR}/lazygit" ${SERVER_HOST}:${SERVER_PROJECT_PATH}
echo -e "${GREEN}lazygit uploaded successfully${NC}" echo -e "${GREEN}lazygit uploaded successfully${NC}"
# Add lazygit to .gitignore # Add lazygit to .gitignore