126 lines
3.2 KiB
Go
126 lines
3.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"regexp"
|
|
"sort"
|
|
"strconv"
|
|
|
|
socketio "github.com/googollee/go-socket.io"
|
|
)
|
|
|
|
func copyBuild(server *socketio.Server, plant string, drive string) {
|
|
// Load from environment in real-life code!
|
|
user := os.Getenv("ADM_USER")
|
|
pass := os.Getenv("ADM_PASS")
|
|
|
|
// latest build
|
|
latestbuild := lastestBuild()
|
|
src := latestbuild
|
|
plantServer := fmt.Sprintf("\\\\%v\\%v$\\lst", plant, drive)
|
|
|
|
// Build PowerShell
|
|
psScript := fmt.Sprintf(`
|
|
$secPass = ConvertTo-SecureString '%s' -AsPlainText -Force
|
|
$cred = New-Object System.Management.Automation.PSCredential ('%s', $secPass)
|
|
|
|
# Clean up any previous mapped drive
|
|
Get-PSDrive -Name "z" -ErrorAction SilentlyContinue | Remove-PSDrive -Force
|
|
|
|
try {
|
|
# Map a temporary drive "z:" to the destination UNC with creds
|
|
New-PSDrive -Name "z" -PSProvider FileSystem -Root '%s' -Credential $cred | Out-Null
|
|
|
|
# Ensure target dir exists on server
|
|
if (-not (Test-Path -Path '%s')) {
|
|
New-Item -ItemType Directory -Path '%s' -Force | Out-Null
|
|
}
|
|
|
|
Write-Host "Starting to copy files to the server"
|
|
Copy-Item -Path '%s' -Destination "z:\" -Force
|
|
|
|
#Write-Host "Copy successful completed"
|
|
}
|
|
catch {
|
|
Write-Host "Error: $_"
|
|
}
|
|
finally {
|
|
# Always remove the drive
|
|
if (Get-PSDrive -Name "z" -ErrorAction SilentlyContinue) {
|
|
Remove-PSDrive -Name "z"
|
|
}
|
|
}
|
|
`, pass, user, plantServer, plantServer, plantServer, src)
|
|
|
|
msg := fmt.Sprintf("Getting ready to copy %s to %s", src, plantServer)
|
|
fmt.Printf("Getting ready to copy %s to %s", src, plant)
|
|
|
|
server.BroadcastToRoom("/", "update", "updateLogs", msg)
|
|
|
|
cmd := exec.Command("powershell", "-NoProfile", "-NonInteractive", "-Command", psScript)
|
|
|
|
stdout, _ := cmd.StdoutPipe() // writes to the system what the powershell script is doing
|
|
stderr, _ := cmd.StderrPipe()
|
|
|
|
if err := cmd.Start(); err != nil {
|
|
server.BroadcastToRoom("/", "update", "updateLogs", fmt.Sprintf("❌ Failed to start copy: %v", err))
|
|
fmt.Printf("❌ Failed to start copy: %v", err)
|
|
return
|
|
}
|
|
|
|
// Forward stdout + stderr live
|
|
go streamOutput(stdout, server, "update")
|
|
go streamOutput(stderr, server, "update")
|
|
|
|
if err := cmd.Wait(); err != nil {
|
|
server.BroadcastToRoom("/", "update", "updateLogs", fmt.Sprintf("❌ Copy process failed: %v", err))
|
|
return
|
|
}
|
|
|
|
server.BroadcastToRoom("/", "update", "updateLogs", fmt.Sprintf("✅ Copy to %s successful", plant))
|
|
}
|
|
|
|
func lastestBuild() string {
|
|
// Path to your build folder
|
|
buildDir := "../builds"
|
|
|
|
entries, err := os.ReadDir(buildDir)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
// Regex to match release-1234.zip
|
|
re := regexp.MustCompile(`^release-(\d+)\.zip$`)
|
|
|
|
var builds []int
|
|
files := make(map[int]string)
|
|
|
|
for _, entry := range entries {
|
|
if entry.IsDir() {
|
|
continue
|
|
}
|
|
name := entry.Name()
|
|
match := re.FindStringSubmatch(name)
|
|
if match != nil {
|
|
num, _ := strconv.Atoi(match[1])
|
|
builds = append(builds, num)
|
|
files[num] = filepath.Join(buildDir, name)
|
|
}
|
|
}
|
|
|
|
if len(builds) == 0 {
|
|
log.Fatal("No release zip files found")
|
|
}
|
|
|
|
// Sort build numbers ascending
|
|
sort.Ints(builds)
|
|
latest := builds[len(builds)-1]
|
|
latestFile := files[latest]
|
|
|
|
return latestFile
|
|
}
|