fix: abort installation on critical step failure

Previously all step errors were treated as warnings and installation
continued silently. Now critical steps (create dir, extract binary,
extract data/scripts, write config) will abort with an error message.
Non-critical steps (libusb, python venv, symlink, auto-start) still
warn and skip.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jim800121chen 2026-03-09 18:15:21 +08:00
parent 5d9ef44526
commit 3bc537df95

View File

@ -200,20 +200,21 @@ func (inst *Installer) StartInstall(config InstallConfig) error {
func (inst *Installer) runInstall(config InstallConfig) {
steps := []struct {
name string
percent float64
fn func(config InstallConfig) error
name string
percent float64
critical bool // if true, abort installation on failure
fn func(config InstallConfig) error
}{
{"Creating installation directory", 5, inst.stepCreateDir},
{"Extracting server binary", 10, inst.stepExtractBinary},
{"Extracting models and firmware", 30, inst.stepExtractData},
{"Extracting scripts", 48, inst.stepExtractScripts},
{"Configuring system", 55, inst.stepConfigureSystem},
{"Setting up USB driver", 62, inst.stepSetupLibusb},
{"Setting up Python environment", 72, inst.stepSetupPython},
{"Writing configuration", 85, inst.stepWriteConfig},
{"Verifying installation", 90, inst.stepVerify},
{"Setting up auto-start launcher", 95, inst.stepAutoRestart},
{"Creating installation directory", 5, true, inst.stepCreateDir},
{"Extracting server binary", 10, true, inst.stepExtractBinary},
{"Extracting models and firmware", 30, true, inst.stepExtractData},
{"Extracting scripts", 48, true, inst.stepExtractScripts},
{"Configuring system", 55, false, inst.stepConfigureSystem},
{"Setting up USB driver", 62, false, inst.stepSetupLibusb},
{"Setting up Python environment", 72, false, inst.stepSetupPython},
{"Writing configuration", 85, true, inst.stepWriteConfig},
{"Verifying installation", 90, false, inst.stepVerify},
{"Setting up auto-start launcher", 95, false, inst.stepAutoRestart},
}
for _, step := range steps {
@ -224,13 +225,21 @@ func (inst *Installer) runInstall(config InstallConfig) {
})
if err := step.fn(config); err != nil {
if step.critical {
inst.emitProgress(ProgressEvent{
Step: step.name,
Message: fmt.Sprintf("Error: %s — %s", step.name, err),
Percent: step.percent,
IsError: true,
})
return // abort installation
}
inst.emitProgress(ProgressEvent{
Step: step.name,
Message: fmt.Sprintf("Warning: %s — %s", step.name, err),
Message: fmt.Sprintf("Warning: %s — %s (skipped)", step.name, err),
Percent: step.percent,
IsError: true,
})
// Non-critical steps continue; critical ones are handled inside
}
}