############### 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