get_ui()->error($msg);
}
+sub finished {
+ my ($success, $msg) = @_;
+ get_ui()->finished(!!$success, $msg);
+}
+
sub prompt {
my ($query) = @_;
return get_ui()->prompt($query);
croak "implement me in sub-class";
}
+sub finished {
+ my ($self, $success, $msg) = @_;
+
+ croak "implement me in sub-class";
+}
+
sub prompt {
my ($self, $query) = @_;
$dialog->destroy();
}
+sub finished {
+ my ($self, $success, $msg) = @_;
+ # handled manually in proxinstall at the moment
+}
+
sub prompt {
my ($self, $query) = @_;
use base qw(Proxmox::UI::Base);
+use Proxmox::Log;
+
sub init {
my ($self) = @_;
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) = @_;
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);
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(())
};
Info(String),
Error(String),
Prompt(String),
+ Finished(bool, String),
Progress(usize, String),
}
"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::<f64>()
- .map(|v| v.round() as usize)
+ .map(|v| (v * 100.).floor() as usize)
.map_err(|err| err.to_string())?,
rest.to_owned(),
))