From e42de54c52ae8ce9a069e9658743a8ca90da0f8c Mon Sep 17 00:00:00 2001 From: pycook Date: Mon, 18 Aug 2025 19:30:21 +0800 Subject: [PATCH] fix(deploy): add cross-platform sed compatibility for macOS and Linux --- deploy/migrate-passwords.sh | 34 ++++++++++++++++++++++++++----- deploy/setup.sh | 40 ++++++++++++++++++++++++++++++------- 2 files changed, 62 insertions(+), 12 deletions(-) diff --git a/deploy/migrate-passwords.sh b/deploy/migrate-passwords.sh index df28d05..c9631dc 100755 --- a/deploy/migrate-passwords.sh +++ b/deploy/migrate-passwords.sh @@ -29,6 +29,30 @@ check_docker_compose() { fi } +# Cross-platform sed function +cross_platform_sed() { + local pattern="$1" + local file="$2" + + if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i "" "$pattern" "$file" + else + sed -i "$pattern" "$file" + fi +} + +# Cross-platform sed function with backup +cross_platform_sed_backup() { + local pattern="$1" + local file="$2" + local backup_suffix="$3" + + if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i ".${backup_suffix}" "$pattern" "$file" + else + sed -i".${backup_suffix}" "$pattern" "$file" + fi +} # Function to verify container is running check_container_running() { local container_name=$1 @@ -195,14 +219,14 @@ if [ -f docker-compose.yaml ]; then ESCAPED_NEW_ROOT=$(printf '%s\n' "$NEW_ROOT" | sed 's/[[\.*^$()+?{|]/\\&/g') # Update MySQL root password - use escaped password - sed -i '' "s|MYSQL_ROOT_PASSWORD: '[^']*'|MYSQL_ROOT_PASSWORD: '${ESCAPED_NEW_ROOT}'|g" docker-compose.yaml.tmp - sed -i '' "s|MYSQL_ROOT_PASSWORD: \"[^\"]*\"|MYSQL_ROOT_PASSWORD: \"${ESCAPED_NEW_ROOT}\"|g" docker-compose.yaml.tmp + cross_platform_sed "s|MYSQL_ROOT_PASSWORD: '[^']*'|MYSQL_ROOT_PASSWORD: '${ESCAPED_NEW_ROOT}'|g" docker-compose.yaml.tmp + cross_platform_sed "s|MYSQL_ROOT_PASSWORD: \"[^\"]*\"|MYSQL_ROOT_PASSWORD: \"${ESCAPED_NEW_ROOT}\"|g" docker-compose.yaml.tmp # Handle unquoted passwords - sed -i '' "s|MYSQL_ROOT_PASSWORD: [^'\"[:space:]]*$|MYSQL_ROOT_PASSWORD: '${ESCAPED_NEW_ROOT}'|g" docker-compose.yaml.tmp + cross_platform_sed "s|MYSQL_ROOT_PASSWORD: [^'\"[:space:]]*$|MYSQL_ROOT_PASSWORD: '${ESCAPED_NEW_ROOT}'|g" docker-compose.yaml.tmp # Update healthcheck password for MySQL - handle current format - sed -i '' "s|\"-p[0-9][0-9]*\"|\"-p${ESCAPED_NEW_ROOT}\"|g" docker-compose.yaml.tmp + cross_platform_sed "s|\"-p[0-9][0-9]*\"|\"-p${ESCAPED_NEW_ROOT}\"|g" docker-compose.yaml.tmp # Move updated file back mv docker-compose.yaml.tmp docker-compose.yaml @@ -216,7 +240,7 @@ if [ -f config.yaml ]; then # config.yaml uses root user, so use root password ESCAPED_NEW_ROOT_FOR_CONFIG=$(printf '%s\n' "$NEW_ROOT" | sed 's/[[\.*^$()+?{|]/\\&/g') # Update only MySQL password section, not Redis - sed -i .tmp '/^mysql:/,/^[a-z]/s|password: [^#]*|password: '"${ESCAPED_NEW_ROOT_FOR_CONFIG}"'|g' config.yaml + cross_platform_sed_backup '/^mysql:/,/^[a-z]/s|password: [^#]*|password: '"${ESCAPED_NEW_ROOT_FOR_CONFIG}"'|g' config.yaml tmp rm -f config.yaml.tmp echo -e "${GREEN}SUCCESS: config.yaml updated${NC}" fi diff --git a/deploy/setup.sh b/deploy/setup.sh index bae9cbb..cb48727 100755 --- a/deploy/setup.sh +++ b/deploy/setup.sh @@ -70,6 +70,32 @@ validate_password() { return 0 } +# Cross-platform sed function +cross_platform_sed() { + local pattern="$1" + local file="$2" + + if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' "$pattern" "$file" + else + sed -i "$pattern" "$file" + fi +} + + +# Cross-platform sed function with backup +cross_platform_sed_backup() { + local pattern="$1" + local file="$2" + local backup_suffix="$3" + + if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i ".${backup_suffix}" "$pattern" "$file" + else + sed -i".${backup_suffix}" "$pattern" "$file" + fi +} + # Check prerequisites check_files @@ -163,12 +189,12 @@ cp docker-compose.yaml docker-compose.yaml.tmp ESCAPED_ROOT_PASS=$(printf '%s\n' "$ROOT_PASS" | sed 's/[[\.*^$()+?{|]/\\&/g') # Update MySQL root password patterns - handle various formats -sed -i '' "s|MYSQL_ROOT_PASSWORD: '[^']*'|MYSQL_ROOT_PASSWORD: '${ESCAPED_ROOT_PASS}'|g" docker-compose.yaml.tmp -sed -i '' "s|MYSQL_ROOT_PASSWORD: \"[^\"]*\"|MYSQL_ROOT_PASSWORD: \"${ESCAPED_ROOT_PASS}\"|g" docker-compose.yaml.tmp -sed -i '' "s|MYSQL_ROOT_PASSWORD: [^'\"[:space:]]*$|MYSQL_ROOT_PASSWORD: '${ESCAPED_ROOT_PASS}'|g" docker-compose.yaml.tmp +cross_platform_sed "s|MYSQL_ROOT_PASSWORD: '[^']*'|MYSQL_ROOT_PASSWORD: '${ESCAPED_ROOT_PASS}'|g" docker-compose.yaml.tmp +cross_platform_sed "s|MYSQL_ROOT_PASSWORD: \"[^\"]*\"|MYSQL_ROOT_PASSWORD: \"${ESCAPED_ROOT_PASS}\"|g" docker-compose.yaml.tmp +cross_platform_sed "s|MYSQL_ROOT_PASSWORD: [^'\"[:space:]]*$|MYSQL_ROOT_PASSWORD: '${ESCAPED_ROOT_PASS}'|g" docker-compose.yaml.tmp # Update healthcheck password -sed -i '' "s|\"-p[0-9][0-9]*\"|\"-p${ESCAPED_ROOT_PASS}\"|g" docker-compose.yaml.tmp +cross_platform_sed "s|\"-p[0-9][0-9]*\"|\"-p${ESCAPED_ROOT_PASS}\"|g" docker-compose.yaml.tmp # Move updated file back mv docker-compose.yaml.tmp docker-compose.yaml @@ -178,7 +204,7 @@ echo "Updating config.yaml..." # config.yaml uses root user, so use root password ESCAPED_ROOT_PASS_FOR_CONFIG=$(printf '%s\n' "$ROOT_PASS" | sed 's/[[\.*^$()+?{|]/\\&/g') # Only update MySQL password section, not Redis -sed -i .tmp '/^mysql:/,/^[a-z]/s|password: [^#]*|password: '"${ESCAPED_ROOT_PASS_FOR_CONFIG}"'|g' config.yaml +cross_platform_sed_backup '/^mysql:/,/^[a-z]/s|password: [^#]*|password: '"${ESCAPED_ROOT_PASS_FOR_CONFIG}"'|g' config.yaml tmp rm -f config.yaml.tmp # Update create-users.sql @@ -187,8 +213,8 @@ echo "Updating create-users.sql..." ESCAPED_ONETERM_PASS=$(printf '%s\n' "$ONETERM_PASS" | sed 's/[[\.*^$()+?{|]/\\&/g') ESCAPED_ACL_PASS=$(printf '%s\n' "$ACL_PASS" | sed 's/[[\.*^$()+?{|]/\\&/g') # Update passwords using | as delimiter -sed -i .tmp "s|'oneterm'@'%' IDENTIFIED BY '[^']*'|'oneterm'@'%' IDENTIFIED BY '${ESCAPED_ONETERM_PASS}'|g" create-users.sql -sed -i .tmp "s|'acl'@'%' IDENTIFIED BY '[^']*'|'acl'@'%' IDENTIFIED BY '${ESCAPED_ACL_PASS}'|g" create-users.sql +cross_platform_sed_backup "s|'oneterm'@'%' IDENTIFIED BY '[^']*'|'oneterm'@'%' IDENTIFIED BY '${ESCAPED_ONETERM_PASS}'|g" create-users.sql tmp +cross_platform_sed_backup "s|'acl'@'%' IDENTIFIED BY '[^']*'|'acl'@'%' IDENTIFIED BY '${ESCAPED_ACL_PASS}'|g" create-users.sql tmp rm -f create-users.sql.tmp # Create/update .env file for ACL