135 lines
3.2 KiB
Go
135 lines
3.2 KiB
Go
package provision
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"zlh-agent/internal/state"
|
|
"zlh-agent/internal/provision/devcontainer"
|
|
"zlh-agent/internal/provision/minecraft"
|
|
"zlh-agent/internal/provision/steam"
|
|
)
|
|
|
|
/*
|
|
ProvisionAll — unified entrypoint for provisioning.
|
|
IMPORTANT:
|
|
- This function ONLY performs installation.
|
|
- Validation/verification happens in ensureProvisioned().
|
|
- state.Config is treated as immutable desired state.
|
|
*/
|
|
func ProvisionAll(cfg state.Config) error {
|
|
|
|
/* ---------------------------------------------------------
|
|
DEV CONTAINERS
|
|
--------------------------------------------------------- */
|
|
if cfg.ContainerType == "dev" {
|
|
return devcontainer.Provision(cfg)
|
|
}
|
|
|
|
// Legacy / default behavior assumes game containers
|
|
game := strings.ToLower(cfg.Game)
|
|
variant := strings.ToLower(cfg.Variant)
|
|
|
|
/* ---------------------------------------------------------
|
|
MINECRAFT
|
|
--------------------------------------------------------- */
|
|
if game == "minecraft" {
|
|
|
|
// 1. Install Java (runtime)
|
|
if err := InstallJava(cfg); err != nil {
|
|
return fmt.Errorf("java install failed: %w", err)
|
|
}
|
|
|
|
// 2. Game variant install
|
|
switch variant {
|
|
|
|
case "vanilla", "paper", "purpur", "fabric", "quilt":
|
|
if err := minecraft.InstallMinecraftVanilla(cfg); err != nil {
|
|
return fmt.Errorf("minecraft vanilla install failed: %w", err)
|
|
}
|
|
|
|
case "forge":
|
|
if err := minecraft.InstallMinecraftForge(cfg); err != nil {
|
|
return fmt.Errorf("forge install failed: %w", err)
|
|
}
|
|
|
|
case "neoforge":
|
|
if err := minecraft.InstallMinecraftNeoForge(cfg); err != nil {
|
|
return fmt.Errorf("neoforge install failed: %w", err)
|
|
}
|
|
|
|
default:
|
|
return fmt.Errorf("unsupported minecraft variant: %s", variant)
|
|
}
|
|
|
|
// 3. Config files generated AFTER variant installer
|
|
if err := WriteEula(cfg); err != nil {
|
|
return err
|
|
}
|
|
if err := WriteServerProperties(cfg); err != nil {
|
|
return err
|
|
}
|
|
if err := WriteStartScript(cfg); err != nil {
|
|
return err
|
|
}
|
|
|
|
// DO NOT VERIFY HERE.
|
|
return nil
|
|
}
|
|
|
|
/* ---------------------------------------------------------
|
|
STEAM GAMES
|
|
--------------------------------------------------------- */
|
|
if IsSteamGame(game) {
|
|
|
|
// 1. SteamCMD install
|
|
if err := steam.EnsureSteamCMD(); err != nil {
|
|
return fmt.Errorf("steamcmd install failed: %w", err)
|
|
}
|
|
|
|
// 2. Install game-specific content
|
|
switch game {
|
|
|
|
case "valheim":
|
|
if err := steam.InstallValheim(cfg); err != nil {
|
|
return err
|
|
}
|
|
|
|
case "rust":
|
|
if err := steam.InstallRust(cfg); err != nil {
|
|
return err
|
|
}
|
|
|
|
case "terraria":
|
|
if err := steam.InstallTerraria(cfg); err != nil {
|
|
return err
|
|
}
|
|
|
|
case "projectzomboid":
|
|
if err := steam.InstallProjectZomboid(cfg); err != nil {
|
|
return err
|
|
}
|
|
|
|
default:
|
|
return fmt.Errorf("unsupported steam game: %s", game)
|
|
}
|
|
|
|
// 3. Start script
|
|
if err := WriteStartScript(cfg); err != nil {
|
|
return err
|
|
}
|
|
|
|
// DO NOT VERIFY HERE.
|
|
return nil
|
|
}
|
|
|
|
/* ---------------------------------------------------------
|
|
UNKNOWN CONTAINER TYPE
|
|
--------------------------------------------------------- */
|
|
return fmt.Errorf(
|
|
"unsupported container identity (containerType=%q game=%q)",
|
|
cfg.ContainerType,
|
|
cfg.Game,
|
|
)
|
|
}
|