docker-apps/cp2nas.ps1
2025-04-03 22:57:52 +02:00

135 lines
4.7 KiB
PowerShell

############### CONST ##############
$destDockerDir="/mnt/SSD1/docker/"
$stacksfolder="stacks/"
$datafolder="data/"
$destStacks=$destDockerDir+$stacksfolder
$destData=$destDockerDir+$datafolder
$destTraefikRulesDir=$destStacks+"traefik/rules/"
$destTraefikUsersDir=$destStacks+"traefik/users/"
$destDataDir=$destData
############### MAIN ###############
# main function
#
$Main =
{
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $destHost,
[Parameter(Mandatory=$false)]
[string[]] $apps
)
$applist=[System.Collections.Generic.List[object]]::new()
If($PSBoundParameters.ContainsKey("apps")) {
foreach ($appname in $apps)
{
if ($appname.Contains('*')) {
$wclist=Get-ChildItem $appname -Directory | ForEach-Object { $_.Name }
# if wildcard is specified, we only add folders with a 'stacks' subfolder
foreach ($wcname in $wclist) {
if ((Test-Path -Path "$wcname\stacks")) {
$applist.Add($wcname)
}
}
}
else {
# here we don't have to check for a 'stacks' subfolder as the user specified appname explicitly
$applist.Add($appname)
}
}
# remove duplicates
$uniqlist=$applist | Sort-Object -Unique
foreach ($appname in $uniqlist)
{
copyfolder $destHost $appname "$appname\"
}
}
else {
# we're in the app subfolder, so only one stacks folder to copy
$appname="$pwd".Split("\\")[-1]
copyfolder $destHost $appname ".\"
}
}
#######################################################################
# copies specified folder to data folder on truenas
#
Function copytosubfolder
{
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $destHost,
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $folder,
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $subfolder,
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $srcdir,
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $destdir
)
$date=Get-Date -format "yyyy-MM-ddTHH:mm:ss"
if ((Test-Path -Path "$srcdir")) {
Write-Host "$date# pscp -P 22 -r ""$srcdir\*.*"" root@${destHost}:""${destdir}""" -ForegroundColor Green
Write-Host "Copying to ${destHost}:""${destDockerDir}" -NoNewline
Write-Host "${folder}" -ForegroundColor Cyan -NoNewline
Write-Host "${subfolder}" -ForegroundColor DarkYellow -NoNewline
Write-Host """:"
pscp -P 22 -r "$srcdir\*.*" root@${destHost}:""${destdir}""
}
}
#######################################################################
# copies folder(s) to truenas
#
Function copyfolder
{
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $destHost,
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $subfolder,
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string] $srcdir
)
$srcStacksDir=$srcdir+"stacks"
$srcTraefikRulesDir=$srcdir+"traefik-rules"
$srcTraefikUsersDir=$srcdir+"traefik-users"
$srcDataDir=$srcdir+"data"
if (-Not(Test-Path -Path $srcStacksDir)) {
Write-Host "Source path doesn't exist: ""$PSScriptRoot\$srcStacksDir\*.*"". No files copied!" -ForegroundColor Red
Write-Host "Usage: in app folder : ./cp2nas DEST|IP"
Write-Host " in app parent folder: ./cp2nas DEST|IP app1, app2, app3, ..."
Write-Host " in app parent folder: ./cp2nas DEST|IP *"
Write-Host " in app parent folder: ./cp2nas DEST|IP wcstring1, wcstring2, ..."
return
}
$destAppStacksDir=$destStacks+$subfolder+"/"
# copy app folder destinations
copytosubfolder $destHost "${stacksfolder}" "${subfolder}" "${srcStacksDir}" "${destAppStacksDir}"
# copy traefik folder destinations
copytosubfolder $destHost "${stacksfolder}" "traefik/rules/" "${srcTraefikRulesDir}" "${destTraefikRulesDir}"
copytosubfolder $destHost "${stacksfolder}" "traefik/users/" "${srcTraefikUsersDir}" "${destTraefikUsersDir}"
# copy data folder destinations
copytosubfolder $destHost "${datafolder}" "${subfolder}/" "${srcDataDir}" "${destDataDir}${subfolder}"
}
###################################
# we call main proc from here
& $Main @Args