diff --git a/Proxmox/UI.pm b/Proxmox/UI.pm index 7d8bd4f..68a9cd4 100644 --- a/Proxmox/UI.pm +++ b/Proxmox/UI.pm @@ -56,6 +56,11 @@ sub error { get_ui()->error($msg); } +sub finished { + my ($success, $msg) = @_; + get_ui()->finished(!!$success, $msg); +} + sub prompt { my ($query) = @_; return get_ui()->prompt($query); diff --git a/Proxmox/UI/Base.pm b/Proxmox/UI/Base.pm index 288bf81..c68d3f8 100644 --- a/Proxmox/UI/Base.pm +++ b/Proxmox/UI/Base.pm @@ -40,6 +40,12 @@ sub error { croak "implement me in sub-class"; } +sub finished { + my ($self, $success, $msg) = @_; + + croak "implement me in sub-class"; +} + sub prompt { my ($self, $query) = @_; diff --git a/Proxmox/UI/Gtk3.pm b/Proxmox/UI/Gtk3.pm index 7bb9ddf..19fcfd7 100644 --- a/Proxmox/UI/Gtk3.pm +++ b/Proxmox/UI/Gtk3.pm @@ -25,6 +25,11 @@ sub error { $dialog->destroy(); } +sub finished { + my ($self, $success, $msg) = @_; + # handled manually in proxinstall at the moment +} + sub prompt { my ($self, $query) = @_; diff --git a/Proxmox/UI/StdIO.pm b/Proxmox/UI/StdIO.pm index f510dd3..2532f63 100644 --- a/Proxmox/UI/StdIO.pm +++ b/Proxmox/UI/StdIO.pm @@ -5,6 +5,8 @@ use warnings; use base qw(Proxmox::UI::Base); +use Proxmox::Log; + sub init { my ($self) = @_; @@ -19,10 +21,18 @@ sub message { sub error { my ($self, $msg) = @_; - + log_err("error: $msg\n"); print STDOUT "error: $msg\n"; } +sub finished { + my ($self, $success, $msg) = @_; + + my $state = $success ? 'ok' : 'err'; + log_info("finished: $state, $msg\n"); + print STDOUT "finished: $state, $msg\n"; +} + sub prompt { my ($self, $query) = @_; diff --git a/proxmox-low-level-installer b/proxmox-low-level-installer index 5802ccd..159df4e 100755 --- a/proxmox-low-level-installer +++ b/proxmox-low-level-installer @@ -102,20 +102,18 @@ if ($cmd eq 'dump-env') { if (my $err = $@) { # suppress "empty" error as we got some case where the user choose to abort on a prompt, # there it doesn't make sense to show them an error again, they "caused" it after all. - warn "installation failed - $err\n"; - log_error("installation failed: $err"); - Proxmox::UI::error($err) if $err ne "\n"; + if ($err ne "\n") { + warn "installation failed - $err\n"; + log_error("installation failed: $err"); + Proxmox::UI::finished(0, $err); + } } else { if (Proxmox::Install::Config::get_autoreboot()) { - Proxmox::UI::message("Installation finished - auto-rebooting in ~ 5 seconds"); - for (my $i = 5; $i > 0; $i--) { - sleep(1); - exit(0) - } + Proxmox::UI::finished(1, "Installation finished - auto-rebooting in ~ 5 seconds"); } else { - while (!Proxmox::UI::prompt("Installation complete - reboot now?")) {} - exit(0); + Proxmox::UI::finished(1, "Installation complete - reboot now?"); } + exit(0); } } elsif ($cmd eq 'start-session-test') { Proxmox::UI::init_stdio({}, $env); diff --git a/proxmox-tui-installer/src/main.rs b/proxmox-tui-installer/src/main.rs index 3d2e838..af44fa7 100644 --- a/proxmox-tui-installer/src/main.rs +++ b/proxmox-tui-installer/src/main.rs @@ -746,16 +746,20 @@ fn install_progress_dialog(siv: &mut Cursive) -> InstallerView { progress_text.set_content(s); Ok(()) } + UiMessage::Finished(success, msg) => { + counter.set(100); + progress_text.set_content(msg.to_owned()); + cb_sink.send(Box::new(move |siv| { + let title = if success { "Success" } else { "Failure" }; + siv.add_layer( + Dialog::text(msg).title(title).button("Reboot", |s| s.quit()), + ); + })) + } } .unwrap(); } - cb_sink - .send(Box::new(|siv| { - siv.add_layer(Dialog::info("low-level install finished")); - })) - .unwrap(); - Some(()) }; @@ -799,6 +803,7 @@ enum UiMessage { Info(String), Error(String), Prompt(String), + Finished(bool, String), Progress(usize, String), } @@ -812,12 +817,16 @@ impl FromStr for UiMessage { "message" => Ok(UiMessage::Info(rest.to_owned())), "error" => Ok(UiMessage::Error(rest.to_owned())), "prompt" => Ok(UiMessage::Prompt(rest.to_owned())), + "finished" => { + let (state, rest) = rest.split_once(", ").ok_or("invalid message: no state")?; + Ok(UiMessage::Finished(state == "ok", rest.to_owned())) + } "progress" => { let (percent, rest) = rest.split_once(' ').ok_or("invalid progress message")?; Ok(UiMessage::Progress( percent .parse::() - .map(|v| v.round() as usize) + .map(|v| (v * 100.).floor() as usize) .map_err(|err| err.to_string())?, rest.to_owned(), ))