Sync the env file at startup, not just at install: updates append new settings
This commit is contained in:
@@ -237,7 +237,7 @@ override file values. A missing file is fine; a malformed one is fatal.
|
|||||||
| `UPDATE_REPO` | `https://git.rambossek.at/PUBLIC/gpu-turnstile` | repository to check for releases |
|
| `UPDATE_REPO` | `https://git.rambossek.at/PUBLIC/gpu-turnstile` | repository to check for releases |
|
||||||
| `UPDATE_ASSET` | `gpu-turnstile.exe` | release asset to download |
|
| `UPDATE_ASSET` | `gpu-turnstile.exe` | release asset to download |
|
||||||
| `APP_VER` | `stable` | version to run: `dev` disables updates, `stable` tracks the latest release, or an exact `vX.Y.Z` pin (up- or downgraded to) |
|
| `APP_VER` | `stable` | version to run: `dev` disables updates, `stable` tracks the latest release, or an exact `vX.Y.Z` pin (up- or downgraded to) |
|
||||||
| `CFG_VER` | _(installer-managed)_ | config format reference written by `--install-service` (always a concrete `vX.Y.Z`; a dev build stamps `v0.0.0`); missing = the file is replaced with a fresh sample (backup `.bak`) |
|
| `CFG_VER` | _(installer-managed)_ | config format reference written by `--install-service` (always a concrete `vX.Y.Z`; a dev build stamps `v0.0.0`); missing = the file is replaced with a fresh sample (backup `.bak`). New settings are appended (commented out) at install and at every startup after an update changed the version |
|
||||||
|
|
||||||
Startup fails fast on unparsable values and when neither consumer URL is
|
Startup fails fast on unparsable values and when neither consumer URL is
|
||||||
set. Enabled upstreams are probed once at start (`/api/version`,
|
set. Enabled upstreams are probed once at start (`/api/version`,
|
||||||
|
|||||||
@@ -172,6 +172,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
log, logOut, logCloser := newLogger(cfg)
|
log, logOut, logCloser := newLogger(cfg)
|
||||||
defer logCloser.Close()
|
defer logCloser.Close()
|
||||||
|
syncEnvFile(resolveConfigPath(configPath), cfg.LogFile, log)
|
||||||
|
|
||||||
if service.IsService() {
|
if service.IsService() {
|
||||||
if err := service.Run(func(ctx context.Context) error { return run(ctx, cfg, log, logOut, true) }); err != nil {
|
if err := service.Run(func(ctx context.Context) error { return run(ctx, cfg, log, logOut, true) }); err != nil {
|
||||||
@@ -188,6 +189,27 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// syncEnvFile upgrades an installer-written config file after an update:
|
||||||
|
// settings added since its CFG_VER are appended (commented out) and CFG_VER
|
||||||
|
// is bumped. Files not written by the installer (no CFG_VER), up-to-date
|
||||||
|
// files and dev builds are left untouched; a write failure is logged, not
|
||||||
|
// fatal.
|
||||||
|
func syncEnvFile(path, logFile string, log *slog.Logger) {
|
||||||
|
data, err := os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return // no config file; nothing to upgrade
|
||||||
|
}
|
||||||
|
synced, changed := config.SyncSample(string(data), version, logFile)
|
||||||
|
if !changed {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := os.WriteFile(path, []byte(synced), 0o644); err != nil {
|
||||||
|
log.Warn("could not append new settings to the config file", "path", path, "err", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Warn("config file updated: new settings appended", "path", path, "version", version)
|
||||||
|
}
|
||||||
|
|
||||||
// defaultConfigPath returns gpu-turnstile.env next to the executable.
|
// defaultConfigPath returns gpu-turnstile.env next to the executable.
|
||||||
func defaultConfigPath() string {
|
func defaultConfigPath() string {
|
||||||
exe, err := os.Executable()
|
exe, err := os.Executable()
|
||||||
|
|||||||
@@ -66,7 +66,8 @@ func sampleEntries(logFile string) []sampleEntry {
|
|||||||
// comment line. Everything is commented out — so all defaults apply —
|
// comment line. Everything is commented out — so all defaults apply —
|
||||||
// except the CFG_VER/APP_VER header and LOG_FILE when logFile is non-empty
|
// except the CFG_VER/APP_VER header and LOG_FILE when logFile is non-empty
|
||||||
// (a Windows service has no console). CFG_VER records the version that
|
// (a Windows service has no console). CFG_VER records the version that
|
||||||
// wrote the file so later installs can upgrade it.
|
// wrote the file so installs — and startups after an update — can upgrade
|
||||||
|
// it.
|
||||||
func SampleEnv(version, logFile string) string {
|
func SampleEnv(version, logFile string) string {
|
||||||
// CFG_VER is always a concrete vX.Y.Z — never "dev". A dev build
|
// CFG_VER is always a concrete vX.Y.Z — never "dev". A dev build
|
||||||
// stamps v0.0.0, which sorts older than any release, so the next
|
// stamps v0.0.0, which sorts older than any release, so the next
|
||||||
|
|||||||
Reference in New Issue
Block a user