mirror of
https://github.com/azerothcore/azerothcore-wotlk.git
synced 2025-11-10 20:34:53 +08:00
feat(Bash/ServiceManager): enhance path portability (#22982)
This commit is contained in:
parent
c24c381bf5
commit
9f732c8cea
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@ -122,5 +122,7 @@
|
|||||||
"C_Cpp.default.compileCommands": "${workspaceFolder}/build/compile_commands.json",
|
"C_Cpp.default.compileCommands": "${workspaceFolder}/build/compile_commands.json",
|
||||||
"C_Cpp.default.cppStandard": "c++17",
|
"C_Cpp.default.cppStandard": "c++17",
|
||||||
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
|
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
|
||||||
"C_Cpp.default.compilerPath": "/usr/bin/clang"
|
"C_Cpp.default.compilerPath": "/usr/bin/clang",
|
||||||
|
"cmake.sourceDirectory": ["${workspaceFolder}"],
|
||||||
|
"cmake.buildDirectory": "${workspaceFolder}/var/build",
|
||||||
}
|
}
|
||||||
|
|||||||
@ -453,6 +453,40 @@ This is particularly useful for:
|
|||||||
- **Multiple Projects**: Separate service configurations per project
|
- **Multiple Projects**: Separate service configurations per project
|
||||||
- **Team Collaboration**: Share service setups across development teams
|
- **Team Collaboration**: Share service setups across development teams
|
||||||
|
|
||||||
|
#### Service Configuration Portability
|
||||||
|
|
||||||
|
The service manager automatically stores binary and configuration paths as relative paths when they are located under the `AC_SERVICE_CONFIG_DIR`, making service configurations portable across environments:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Set up a portable project structure
|
||||||
|
export AC_SERVICE_CONFIG_DIR="/opt/myproject/services"
|
||||||
|
mkdir -p "$AC_SERVICE_CONFIG_DIR"/{bin,etc}
|
||||||
|
|
||||||
|
# Copy your binaries and configs
|
||||||
|
cp /path/to/compiled/authserver "$AC_SERVICE_CONFIG_DIR/bin/"
|
||||||
|
cp /path/to/authserver.conf "$AC_SERVICE_CONFIG_DIR/etc/"
|
||||||
|
|
||||||
|
# Create service - paths under AC_SERVICE_CONFIG_DIR will be stored as relative
|
||||||
|
./service-manager.sh create auth authserver \
|
||||||
|
--bin-path "$AC_SERVICE_CONFIG_DIR/bin" \
|
||||||
|
--server-config "$AC_SERVICE_CONFIG_DIR/etc/authserver.conf"
|
||||||
|
|
||||||
|
# Registry will contain relative paths like "bin/authserver" and "etc/authserver.conf"
|
||||||
|
# instead of absolute paths, making the entire directory portable
|
||||||
|
```
|
||||||
|
|
||||||
|
**Benefits:**
|
||||||
|
- **Environment Independence**: Move the entire services directory between machines
|
||||||
|
- **Container Friendly**: Perfect for Docker volumes and bind mounts
|
||||||
|
- **Backup/Restore**: Archive and restore complete service configurations
|
||||||
|
- **Development/Production Parity**: Same relative structure across environments
|
||||||
|
|
||||||
|
**How it works:**
|
||||||
|
- Paths under `AC_SERVICE_CONFIG_DIR` are automatically stored as relative paths
|
||||||
|
- Paths outside `AC_SERVICE_CONFIG_DIR` are stored as absolute paths for safety
|
||||||
|
- When services are restored or started, relative paths are resolved from `AC_SERVICE_CONFIG_DIR`
|
||||||
|
- If `AC_SERVICE_CONFIG_DIR` is not set, all paths are stored as absolute paths (traditional behavior)
|
||||||
|
|
||||||
#### Migration from Legacy Format
|
#### Migration from Legacy Format
|
||||||
|
|
||||||
If you have existing services in the old format, use the migration script:
|
If you have existing services in the old format, use the migration script:
|
||||||
|
|||||||
@ -219,6 +219,13 @@ function parse_arguments() {
|
|||||||
export PARSED_CONFIG_FILE="$config_file"
|
export PARSED_CONFIG_FILE="$config_file"
|
||||||
export PARSED_SERVERCONFIG="$serverconfig"
|
export PARSED_SERVERCONFIG="$serverconfig"
|
||||||
export PARSED_SESSION_MANAGER="$session_manager"
|
export PARSED_SESSION_MANAGER="$session_manager"
|
||||||
|
|
||||||
|
echo "Parsed arguments:"
|
||||||
|
echo " Mode: $PARSED_MODE"
|
||||||
|
echo " Server Binary: $PARSED_SERVERBIN"
|
||||||
|
echo " Config File: $PARSED_CONFIG_FILE"
|
||||||
|
echo " Server Config: $PARSED_SERVERCONFIG"
|
||||||
|
echo " Session Manager: $PARSED_SESSION_MANAGER"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Start service (single run or with simple-restarter)
|
# Start service (single run or with simple-restarter)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
183
apps/startup-scripts/test/test_startup_scripts.bats
Normal file → Executable file
183
apps/startup-scripts/test/test_startup_scripts.bats
Normal file → Executable file
@ -160,7 +160,19 @@ teardown() {
|
|||||||
# Create registry with pm2 provider service
|
# Create registry with pm2 provider service
|
||||||
cat > "$AC_SERVICE_CONFIG_DIR/service_registry.json" << 'EOF'
|
cat > "$AC_SERVICE_CONFIG_DIR/service_registry.json" << 'EOF'
|
||||||
[
|
[
|
||||||
{"name":"test-world","provider":"pm2","type":"service","bin_path":"/bin/worldserver","args":"","systemd_type":"--user","restart_policy":"always"}
|
{
|
||||||
|
"name":"test-world",
|
||||||
|
"provider":"pm2",
|
||||||
|
"type":"service",
|
||||||
|
"bin_path":"/bin/worldserver",
|
||||||
|
"args":"",
|
||||||
|
"systemd_type":"--user",
|
||||||
|
"restart_policy":"always",
|
||||||
|
"exec":{
|
||||||
|
"command":"/bin/true",
|
||||||
|
"args":[]
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
EOF
|
EOF
|
||||||
# Create minimal service config and run-engine config files required by 'send'
|
# Create minimal service config and run-engine config files required by 'send'
|
||||||
@ -215,7 +227,19 @@ EOF
|
|||||||
# Create registry and config as in previous test
|
# Create registry and config as in previous test
|
||||||
cat > "$AC_SERVICE_CONFIG_DIR/service_registry.json" << 'EOF'
|
cat > "$AC_SERVICE_CONFIG_DIR/service_registry.json" << 'EOF'
|
||||||
[
|
[
|
||||||
{"name":"test-world","provider":"pm2","type":"service","bin_path":"/bin/worldserver","args":"","systemd_type":"--user","restart_policy":"always"}
|
{
|
||||||
|
"name":"test-world",
|
||||||
|
"provider":"pm2",
|
||||||
|
"type":"service",
|
||||||
|
"bin_path":"/bin/worldserver",
|
||||||
|
"args":"",
|
||||||
|
"systemd_type":"--user",
|
||||||
|
"restart_policy":"always",
|
||||||
|
"exec":{
|
||||||
|
"command":"/bin/true",
|
||||||
|
"args":[]
|
||||||
|
}
|
||||||
|
}
|
||||||
]
|
]
|
||||||
EOF
|
EOF
|
||||||
echo "RUN_ENGINE_CONFIG_FILE=\"$AC_SERVICE_CONFIG_DIR/test-world-run-engine.conf\"" > "$AC_SERVICE_CONFIG_DIR/test-world.conf"
|
echo "RUN_ENGINE_CONFIG_FILE=\"$AC_SERVICE_CONFIG_DIR/test-world-run-engine.conf\"" > "$AC_SERVICE_CONFIG_DIR/test-world.conf"
|
||||||
@ -258,6 +282,31 @@ EOF
|
|||||||
[ "$status" -eq 0 ]
|
[ "$status" -eq 0 ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "service-manager: restore helper recreates missing configs" {
|
||||||
|
command -v jq >/dev/null 2>&1 || skip "jq not installed"
|
||||||
|
export AC_SERVICE_CONFIG_DIR="$TEST_DIR/services"
|
||||||
|
mkdir -p "$AC_SERVICE_CONFIG_DIR"
|
||||||
|
source "$SCRIPT_DIR/service-manager.sh"
|
||||||
|
|
||||||
|
local service_name="restore-test"
|
||||||
|
local run_engine_config="$AC_SERVICE_CONFIG_DIR/$service_name-run-engine.conf"
|
||||||
|
local service_conf="$AC_SERVICE_CONFIG_DIR/$service_name.conf"
|
||||||
|
rm -f "$run_engine_config" "$service_conf"
|
||||||
|
|
||||||
|
mkdir -p "$TEST_DIR/bin" "$TEST_DIR/etc"
|
||||||
|
touch "$TEST_DIR/bin/worldserver"
|
||||||
|
touch "$TEST_DIR/etc/worldserver.conf"
|
||||||
|
|
||||||
|
ensure_service_configs_restored "$service_name" "world" "systemd" "$TEST_DIR/bin/worldserver" "$TEST_DIR/etc/worldserver.conf" "always" "none" "0" "--user" "" "$run_engine_config"
|
||||||
|
|
||||||
|
[ -f "$run_engine_config" ]
|
||||||
|
[ -f "$service_conf" ]
|
||||||
|
grep -Fq 'export SESSION_MANAGER="none"' "$run_engine_config"
|
||||||
|
grep -Fq 'export BINPATH="'$TEST_DIR'/bin"' "$run_engine_config"
|
||||||
|
grep -Fq "RUN_ENGINE_CONFIG_FILE=\"$run_engine_config\"" "$service_conf"
|
||||||
|
grep -Fq 'RESTART_POLICY="always"' "$service_conf"
|
||||||
|
}
|
||||||
|
|
||||||
@test "service-manager: wait-uptime times out for unknown service" {
|
@test "service-manager: wait-uptime times out for unknown service" {
|
||||||
command -v jq >/dev/null 2>&1 || skip "jq not installed"
|
command -v jq >/dev/null 2>&1 || skip "jq not installed"
|
||||||
export AC_SERVICE_CONFIG_DIR="$TEST_DIR/services"
|
export AC_SERVICE_CONFIG_DIR="$TEST_DIR/services"
|
||||||
@ -279,6 +328,136 @@ EOF
|
|||||||
[[ "$output" =~ "Configuration file not found" ]]
|
[[ "$output" =~ "Configuration file not found" ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ===== PATH PORTABILITY TESTS =====
|
||||||
|
|
||||||
|
@test "service-manager: path conversion functions work correctly" {
|
||||||
|
# Source the service-manager script to access helper functions
|
||||||
|
source "$SCRIPT_DIR/service-manager.sh"
|
||||||
|
|
||||||
|
# Test make_path_relative without AC_SERVICE_CONFIG_DIR
|
||||||
|
unset AC_SERVICE_CONFIG_DIR
|
||||||
|
result=$(make_path_relative "/absolute/path/test")
|
||||||
|
[[ "$result" == "/absolute/path/test" ]]
|
||||||
|
|
||||||
|
# Test make_path_relative with AC_SERVICE_CONFIG_DIR
|
||||||
|
export AC_SERVICE_CONFIG_DIR="/tmp/test-config"
|
||||||
|
mkdir -p "$AC_SERVICE_CONFIG_DIR/subdir"
|
||||||
|
|
||||||
|
result=$(make_path_relative "$AC_SERVICE_CONFIG_DIR/subdir/binary")
|
||||||
|
[[ "$result" == "subdir/binary" ]]
|
||||||
|
|
||||||
|
result=$(make_path_relative "/opt/bin/authserver")
|
||||||
|
[[ "$result" == "../../opt/bin/authserver" ]]
|
||||||
|
|
||||||
|
# Test make_path_absolute
|
||||||
|
result=$(make_path_absolute "subdir/binary")
|
||||||
|
[[ "$result" == "$AC_SERVICE_CONFIG_DIR/subdir/binary" ]]
|
||||||
|
|
||||||
|
result=$(make_path_absolute "../../opt/bin/authserver")
|
||||||
|
[[ "$result" == "/opt/bin/authserver" ]]
|
||||||
|
|
||||||
|
# Test absolute path stays absolute
|
||||||
|
result=$(make_path_absolute "/absolute/path")
|
||||||
|
[[ "$result" == "/absolute/path" ]]
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
rm -rf "$AC_SERVICE_CONFIG_DIR"
|
||||||
|
unset AC_SERVICE_CONFIG_DIR
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "service-manager: registry stores relative paths when possible" {
|
||||||
|
# Set up test environment
|
||||||
|
export AC_SERVICE_CONFIG_DIR="$TEST_DIR/service-config"
|
||||||
|
mkdir -p "$AC_SERVICE_CONFIG_DIR"
|
||||||
|
|
||||||
|
# Create a temporary service registry in our test directory
|
||||||
|
local test_registry="$AC_SERVICE_CONFIG_DIR/test_registry.json"
|
||||||
|
echo "[]" > "$test_registry"
|
||||||
|
|
||||||
|
# Source the service-manager and override REGISTRY_FILE
|
||||||
|
source "$SCRIPT_DIR/service-manager.sh"
|
||||||
|
REGISTRY_FILE="$test_registry"
|
||||||
|
|
||||||
|
# Create test binary directory under config dir
|
||||||
|
mkdir -p "$AC_SERVICE_CONFIG_DIR/bin"
|
||||||
|
|
||||||
|
# Test that paths under AC_SERVICE_CONFIG_DIR are stored as relative
|
||||||
|
add_service_to_registry "test-service" "pm2" "auth" "$AC_SERVICE_CONFIG_DIR/bin/authserver" "--config test.conf" "" "always" "none" "0" "" "$AC_SERVICE_CONFIG_DIR/etc/test.conf"
|
||||||
|
|
||||||
|
# Check that paths were stored as relative
|
||||||
|
local stored_bin_path=$(jq -r '.[0].bin_path' "$test_registry")
|
||||||
|
local stored_config_path=$(jq -r '.[0].server_config' "$test_registry")
|
||||||
|
|
||||||
|
[[ "$stored_bin_path" == "bin/authserver" ]]
|
||||||
|
[[ "$stored_config_path" == "etc/test.conf" ]]
|
||||||
|
|
||||||
|
# Test that absolute paths outside config dir are stored as absolute
|
||||||
|
add_service_to_registry "test-service2" "pm2" "auth" "/opt/azerothcore/bin/authserver" "--config test.conf" "" "always" "none" "0" "" "/opt/azerothcore/etc/test.conf"
|
||||||
|
|
||||||
|
local stored_bin_path2=$(jq -r '.[1].bin_path' "$test_registry")
|
||||||
|
local stored_config_path2=$(jq -r '.[1].server_config' "$test_registry")
|
||||||
|
|
||||||
|
local expected_bin_rel=$(make_path_relative "/opt/azerothcore/bin/authserver")
|
||||||
|
local expected_cfg_rel=$(make_path_relative "/opt/azerothcore/etc/test.conf")
|
||||||
|
|
||||||
|
[[ "$stored_bin_path2" == "$expected_bin_rel" ]]
|
||||||
|
[[ "$stored_config_path2" == "$expected_cfg_rel" ]]
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
rm -rf "$AC_SERVICE_CONFIG_DIR"
|
||||||
|
unset AC_SERVICE_CONFIG_DIR
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "service-manager: restore --sync-only recreates config files" {
|
||||||
|
command -v jq >/dev/null 2>&1 || skip "jq not installed"
|
||||||
|
export AC_SERVICE_CONFIG_DIR="$TEST_DIR/services"
|
||||||
|
mkdir -p "$AC_SERVICE_CONFIG_DIR"
|
||||||
|
|
||||||
|
cat > "$AC_SERVICE_CONFIG_DIR/service_registry.json" <<'EOF'
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "sync-test",
|
||||||
|
"provider": "pm2",
|
||||||
|
"type": "auth",
|
||||||
|
"bin_path": "bin/authserver",
|
||||||
|
"exec": {
|
||||||
|
"command": "../src/run-engine",
|
||||||
|
"args": [
|
||||||
|
"start",
|
||||||
|
"bin/authserver",
|
||||||
|
"--config",
|
||||||
|
"sync-test-run-engine.conf"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"args": "",
|
||||||
|
"created": "2025-10-12T20:00:54+02:00",
|
||||||
|
"status": "active",
|
||||||
|
"systemd_type": "--user",
|
||||||
|
"restart_policy": "always",
|
||||||
|
"session_manager": "none",
|
||||||
|
"gdb_enabled": "0",
|
||||||
|
"pm2_opts": " ",
|
||||||
|
"server_config": "etc/authserver.conf"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
EOF
|
||||||
|
|
||||||
|
rm -f "$AC_SERVICE_CONFIG_DIR/sync-test.conf" "$AC_SERVICE_CONFIG_DIR/sync-test-run-engine.conf"
|
||||||
|
|
||||||
|
mkdir -p "$AC_SERVICE_CONFIG_DIR/bin" "$AC_SERVICE_CONFIG_DIR/etc"
|
||||||
|
touch "$AC_SERVICE_CONFIG_DIR/bin/authserver"
|
||||||
|
touch "$AC_SERVICE_CONFIG_DIR/etc/authserver.conf"
|
||||||
|
|
||||||
|
run "$SCRIPT_DIR/service-manager.sh" restore --sync-only
|
||||||
|
debug_on_failure
|
||||||
|
[ "$status" -eq 0 ]
|
||||||
|
|
||||||
|
[ -f "$AC_SERVICE_CONFIG_DIR/sync-test.conf" ]
|
||||||
|
[ -f "$AC_SERVICE_CONFIG_DIR/sync-test-run-engine.conf" ]
|
||||||
|
grep -Fq "RUN_ENGINE_CONFIG_FILE=\"$AC_SERVICE_CONFIG_DIR/sync-test-run-engine.conf\"" "$AC_SERVICE_CONFIG_DIR/sync-test.conf"
|
||||||
|
grep -Fq "export BINPATH=\"$AC_SERVICE_CONFIG_DIR/bin\"" "$AC_SERVICE_CONFIG_DIR/sync-test-run-engine.conf"
|
||||||
|
}
|
||||||
|
|
||||||
@test "examples: restarter-auth should show configuration error" {
|
@test "examples: restarter-auth should show configuration error" {
|
||||||
run "$SCRIPT_DIR/examples/restarter-auth.sh"
|
run "$SCRIPT_DIR/examples/restarter-auth.sh"
|
||||||
[[ "$output" =~ "Configuration file not found" ]]
|
[[ "$output" =~ "Configuration file not found" ]]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user