Pushing a v* tag runs .github/workflows/release.yml: vet, test, govulncheck, then scripts/build-release.sh builds reproducible archives for linux/amd64 and linux/arm64 with a SHA256SUMS file, and attaches them to the release. workflow_dispatch takes a tag for a run that never started. Same shape as ihasmail-oneshot's releases. Adds a version subcommand, set at build time. go.mod moves to 1.26.8: the workflow builds with the go.mod version, and govulncheck finds four standard-library vulnerabilities the tool reaches in 1.26.5 (GO-2026-6218, GO-2026-6090, GO-2026-5972, GO-2026-5026), all fixed in 1.26.6. README installs from the latest release, with building from source as the alternative; CONTRIBUTING describes how releases are cut.
64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
// SPDX-FileCopyrightText: 2026 Coffey Labs
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
// Command stalwart-migrate drives an in-place Stalwart Mail Server upgrade
|
|
// (0.15.5 -> latest) through preflight checks, a defense-in-depth backup,
|
|
// a checkpointed migration, and post-migration validation. Recovery from a
|
|
// failed migration is the operator's own snapshot or backup and is out of
|
|
// scope for this tool - see ARCHITECTURE.md §4.8.
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
// version is set at build time: -ldflags "-X main.version=...".
|
|
var version = "dev"
|
|
|
|
func main() {
|
|
if len(os.Args) < 2 {
|
|
usage()
|
|
os.Exit(1)
|
|
}
|
|
|
|
var err error
|
|
switch os.Args[1] {
|
|
case "preflight":
|
|
err = runPreflight(os.Args[2:])
|
|
case "rehearse":
|
|
err = runRehearse(os.Args[2:])
|
|
case "run":
|
|
err = runRun(os.Args[2:])
|
|
case "tenants":
|
|
err = runTenants(os.Args[2:])
|
|
case "status":
|
|
err = runStatus(os.Args[2:])
|
|
case "report":
|
|
err = runReport(os.Args[2:])
|
|
case "version", "--version":
|
|
fmt.Println("stalwart-migrate", version)
|
|
default:
|
|
usage()
|
|
os.Exit(1)
|
|
}
|
|
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "stalwart-migrate:", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func usage() {
|
|
fmt.Fprintln(os.Stderr, `usage: stalwart-migrate <command> [flags]
|
|
|
|
commands:
|
|
preflight run read-only checks and print the migration plan
|
|
rehearse convert this instance's settings and report what will NOT carry over (read-only)
|
|
run perform the migration (needs --yes and --recovery-point-confirmed)
|
|
tenants show which tenant owns which domain, and what blocks a migration (read-only)
|
|
status show the state of an in-progress or completed run
|
|
report print the validation report for a run
|
|
version print the version of this binary`)
|
|
}
|