diff --git a/Samy-new.ps1 b/Samy-new.ps1 new file mode 100644 index 0000000..d1f15b1 --- /dev/null +++ b/Samy-new.ps1 @@ -0,0 +1,136 @@ +<# +.SYNOPSIS + Script Automation Monkey (SAMY) ... +.NOTES + Full documentation: https://git.svstools.ca/.../docs/SAMY.help.md +#> + +#region Safely bypass Restricted Execution Policy +if ($ExecutionContext.SessionState.LanguageMode -ne 'FullLanguage' -or + (Get-ExecutionPolicy) -eq 'Restricted') { + + Write-Host "[Info] Relaunching with ExecutionPolicy Bypass..." -ForegroundColor Yellow + + # Build token list (NO manual quoting) + $argList = foreach ($a in $args) { [string]$a } + + if ($PSCommandPath) { + powershell.exe -NoProfile -ExecutionPolicy Bypass -File "$PSCommandPath" @argList + } + else { + # Download -> create ScriptBlock -> INVOKE it with @args so $args survives the relaunch + $bootstrap = "& { `$sb = [ScriptBlock]::Create((Invoke-WebRequest 'https://samybeta.svstools.ca' -UseBasicParsing).Content); & `$sb @args }" + powershell.exe -NoProfile -ExecutionPolicy Bypass -Command $bootstrap @argList + + # temp + Write-Host "[Debug] Script saw args: $($args -join ' | ')" -ForegroundColor Magenta + } + + exit +} +#endregion Safely bypass Restricted Execution Policy + +# TLS and silent install defaults +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$ProgressPreference = 'SilentlyContinue' +$ConfirmPreference = 'None' + +#region Remote chunk loader + +function Import-SamyChunk { + [CmdletBinding()] + param( + [Parameter(Mandatory)][string]$Url, + [Parameter(Mandatory)][string]$Name + ) + + try { + Write-Host "[Info] Loading chunk: $Name" -ForegroundColor Cyan + $content = (Invoke-WebRequest -UseBasicParsing -Uri $Url -ErrorAction Stop).Content + + if ([string]::IsNullOrWhiteSpace($content)) { + throw "Downloaded content was empty." + } + + . ([ScriptBlock]::Create($content)) + Write-Host "[Success] Loaded: $Name" -ForegroundColor Green + } + catch { + throw "Failed to load chunk '$Name' from $Url. $($_.Exception.Message)" + } +} + +# Single source of truth for where chunks live +# (Matches your current inline values) +$Script:SamyRepoBase = 'https://git.svstools.ca/SVS_Public_Repo/SAMY/raw/branch' +$Script:SamyBranch = 'beta' # 'main' or 'beta' + +$Script:ChunkBase = "$Script:SamyRepoBase/$Script:SamyBranch/src" + +# Load chunks (dependencies first) +$chunks = @( + @{ Name = 'config.ps1'; Url = "$Script:ChunkBase/config.ps1?raw=1" }, + @{ Name = 'logging.fallback.ps1'; Url = "$Script:ChunkBase/logging.fallback.ps1?raw=1" }, + @{ Name = 'remote.ps1'; Url = "$Script:ChunkBase/remote.ps1?raw=1" }, + @{ Name = 'helpers.ps1'; Url = "$Script:ChunkBase/helpers.ps1?raw=1" }, + @{ Name = 'tasks.ps1'; Url = "$Script:ChunkBase/tasks.ps1?raw=1" }, + @{ Name = 'http.ps1'; Url = "$Script:ChunkBase/http.ps1?raw=1" }, + + @{ Name = 'svsmsp.install.ps1'; Url = "$Script:ChunkBase/svsmsp.install.ps1?raw=1" }, + @{ Name = 'integrations.datto.ps1';Url = "$Script:ChunkBase/integrations.datto.ps1?raw=1" }, + + @{ Name = 'ui.ps1'; Url = "$Script:ChunkBase/ui.ps1?raw=1" }, + @{ Name = 'handlers.datto.ps1'; Url = "$Script:ChunkBase/handlers.datto.ps1?raw=1" }, + @{ Name = 'handlers.onboard.ps1'; Url = "$Script:ChunkBase/handlers.onboard.ps1?raw=1" }, + @{ Name = 'handlers.offboard.ps1'; Url = "$Script:ChunkBase/handlers.offboard.ps1?raw=1" }, + @{ Name = 'handlers.printers.ps1'; Url = "$Script:ChunkBase/handlers.printers.ps1?raw=1" }, + + @{ Name = 'router.ps1'; Url = "$Script:ChunkBase/router.ps1?raw=1" }, + @{ Name = 'server.ps1'; Url = "$Script:ChunkBase/server.ps1?raw=1" }, + + @{ Name = 'core.ps1'; Url = "$Script:ChunkBase/core.ps1?raw=1" } +) + +foreach ($c in $chunks) { + Import-SamyChunk -Url $c.Url -Name $c.Name +} + +if (-not (Get-Command Invoke-ScriptAutomationMonkey -ErrorAction SilentlyContinue)) { + throw "Bootstrap loaded chunks, but Invoke-ScriptAutomationMonkey was not found. Ensure src/core.ps1 defines it." +} + +#endregion Remote chunk loader + +#region Entry behavior (same intent as your original) + +if ($MyInvocation.InvocationName -eq '.') { + # dot-sourced, don't invoke + return +} +elseif ($PSCommandPath) { + # script was saved and run directly + Invoke-ScriptAutomationMonkey @args +} +else { + # iwr | iex fallback + if ($args.Count -gt 0) { + $namedArgs = @{} + for ($i = 0; $i -lt $args.Count; $i++) { + if ($args[$i] -is [string] -and $args[$i].StartsWith('-')) { + $key = $args[$i].TrimStart('-') + $next = $args[$i + 1] + if ($next -and ($next -notlike '-*')) { + $namedArgs[$key] = $next + $i++ + } else { + $namedArgs[$key] = $true + } + } + } + Invoke-ScriptAutomationMonkey @namedArgs + } else { + Invoke-ScriptAutomationMonkey + } +} + +#endregion Entry behavior