param( [Parameter(Mandatory = $true)] [string]$RemoteHost, [int]$Port = 22, [Parameter(Mandatory = $true)] [string]$User, [string]$RootDir = "/volume4/Music_Cloud" ) function Quote-RemotePathForPosixShell { param( [Parameter(Mandatory = $true)] [string]$Path ) $EscapedPath = $Path.Replace("'", "'\''") return "'$EscapedPath'" } function New-ScpRemoteTarget { param( [Parameter(Mandatory = $true)] [string]$Remote, [Parameter(Mandatory = $true)] [string]$Path ) return "${Remote}:$(Quote-RemotePathForPosixShell -Path $Path)" } $AppHome = "$RootDir/catalogsync" $RemoteDirs = @( $RootDir, "$RootDir/library", "$AppHome/app", "$AppHome/bin", "$AppHome/config", "$AppHome/data", "$AppHome/inputs", "$AppHome/logs" ) $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path $ProjectRoot = Resolve-Path (Join-Path $ScriptDir "..\..") $Remote = "$User@$RemoteHost" $QuotedDirs = $RemoteDirs | ForEach-Object { Quote-RemotePathForPosixShell -Path $_ } $RemoteMkdirCommand = "mkdir -p " + ($QuotedDirs -join " ") ssh -p $Port $Remote $RemoteMkdirCommand if ($LASTEXITCODE -ne 0) { throw "Failed to create remote directories." } $AppSources = @( (Join-Path $ProjectRoot "musicdl"), (Join-Path $ProjectRoot "setup.py"), (Join-Path $ProjectRoot "README.md"), (Join-Path $ProjectRoot "LICENSE"), (Join-Path $ProjectRoot "requirements.txt"), (Join-Path $ProjectRoot "requirements-optional.txt") ) $RemoteAppDirTarget = New-ScpRemoteTarget -Remote $Remote -Path "$AppHome/app/" foreach ($Source in $AppSources) { scp -P $Port -r $Source $RemoteAppDirTarget if ($LASTEXITCODE -ne 0) { throw "Failed to copy app source: $Source" } } $BinTemplates = @( (Join-Path $ScriptDir "templates\download_all.sh"), (Join-Path $ScriptDir "templates\download_from_file.sh"), (Join-Path $ScriptDir "templates\upload_all.sh"), (Join-Path $ScriptDir "templates\install_runtime.sh"), (Join-Path $ScriptDir "templates\serve_console.sh"), (Join-Path $ScriptDir "templates\deploy_and_restart.sh") ) $RemoteBinDirTarget = New-ScpRemoteTarget -Remote $Remote -Path "$AppHome/bin/" foreach ($Template in $BinTemplates) { scp -P $Port $Template $RemoteBinDirTarget if ($LASTEXITCODE -ne 0) { throw "Failed to copy bin template: $Template" } } $RemoteEnvExample = "$AppHome/config/catalogsync.env.example" $LocalEnvExample = Join-Path $ScriptDir "templates\catalogsync.env.example" $RemoteEnvExampleTarget = New-ScpRemoteTarget -Remote $Remote -Path $RemoteEnvExample scp -P $Port $LocalEnvExample $RemoteEnvExampleTarget if ($LASTEXITCODE -ne 0) { throw "Failed to copy catalogsync.env.example." }