Rename module github.com/johnellis/stalwart-migrator -> github.com/LINUXexpert-org/stalwart-migrator to match the repository location, so the module resolves under `go get`. The initial commit's .gitignore listed the compiled binary as a bare `stalwart-migrate` pattern, which Git matches at any depth -- so it also excluded the cmd/stalwart-migrate/ source directory, and the initial commit shipped without the CLI entrypoint. Anchor the pattern to the repo root as /stalwart-migrate and add the four missing files. go build, go vet, and go test ./... all pass.
60 lines
2.3 KiB
Go
60 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/LINUXexpert-org/stalwart-migrator/internal/checkpoint"
|
|
"github.com/LINUXexpert-org/stalwart-migrator/internal/preflight"
|
|
)
|
|
|
|
func runPreflight(args []string) error {
|
|
fs := flag.NewFlagSet("preflight", flag.ExitOnError)
|
|
binaryPath := fs.String("binary", "/usr/local/bin/stalwart", "path to the installed stalwart binary")
|
|
configPath := fs.String("config", "/etc/stalwart/config.toml", "path to stalwart's config file")
|
|
dataDir := fs.String("data-dir", "/var/lib/stalwart", "stalwart data directory")
|
|
containerName := fs.String("container", "stalwart", "docker container name, if applicable")
|
|
adminURL := fs.String("admin-url", "", "base URL for a JMAP reachability check (optional but recommended)")
|
|
adminUser := fs.String("admin-user", "", "admin username for the reachability check")
|
|
adminPassword := fs.String("admin-password", os.Getenv("STALWART_MIGRATE_ADMIN_PASSWORD"),
|
|
"admin password for the reachability check (or set STALWART_MIGRATE_ADMIN_PASSWORD)")
|
|
targetVersion := fs.String("target", "latest", `target Stalwart version, or "latest"`)
|
|
minFree := fs.Float64("min-free-multiple", 2.0, "required free disk space as a multiple of the data directory size")
|
|
stateDir := fs.String("state-dir", checkpoint.DefaultBaseDir, "directory to store run checkpoints in")
|
|
if err := fs.Parse(args); err != nil {
|
|
return err
|
|
}
|
|
|
|
store := checkpoint.NewStore(*stateDir)
|
|
rs, err := store.Create("", *targetVersion)
|
|
if err != nil {
|
|
return fmt.Errorf("create run: %w", err)
|
|
}
|
|
|
|
checker := preflight.New(preflight.Options{
|
|
BinaryPath: *binaryPath,
|
|
ConfigPath: *configPath,
|
|
DataDir: *dataDir,
|
|
ContainerName: *containerName,
|
|
AdminURL: *adminURL,
|
|
AdminUser: *adminUser,
|
|
AdminPassword: *adminPassword,
|
|
TargetVersion: *targetVersion,
|
|
MinFreeMultiple: *minFree,
|
|
})
|
|
|
|
report, err := checker.Run(context.Background(), store, rs)
|
|
fmt.Print(report.String())
|
|
fmt.Printf("\nrun id: %s\n", rs.RunID)
|
|
if err != nil {
|
|
return fmt.Errorf("preflight run %s failed to complete: %w", rs.RunID, err)
|
|
}
|
|
if report.Blocking() {
|
|
return fmt.Errorf("preflight found blocking issues for run %s - see FAIL lines above", rs.RunID)
|
|
}
|
|
fmt.Println("preflight passed - safe to proceed with `stalwart-migrate run`")
|
|
return nil
|
|
}
|