mirror of
https://github.com/webmin/webmin.git
synced 2026-06-05 12:50:23 +01:00
145 lines
3.9 KiB
Perl
Executable File
145 lines
3.9 KiB
Perl
Executable File
#!/usr/local/bin/perl
|
|
# Generate the GRUB 2 menu file after a successful test generation.
|
|
|
|
use strict;
|
|
use warnings;
|
|
require './grub2-lib.pl'; ## no critic
|
|
|
|
our (%in, %text);
|
|
|
|
&ReadParse();
|
|
&error_setup($text{'generate_err'});
|
|
my %access = &get_module_acl();
|
|
&error("$text{'eacl_np'} $text{'eacl_papply'}") if (!$access{'apply'});
|
|
|
|
my $return_url = $in{'redir'} || "index.cgi";
|
|
my ($current_step, $failed_printed, $failure_output_shown, $command_output) =
|
|
('', 0, 0, '');
|
|
|
|
&ui_print_unbuffered_header(undef, $text{'generate_title'}, "");
|
|
|
|
# The generator emits coarse events so failures can show the right phase.
|
|
my $callback = sub {
|
|
my ($event, $value) = @_;
|
|
if ($event eq 'command') {
|
|
# Capture the command text and all output for a single disclosure block.
|
|
$current_step = 'command';
|
|
$command_output = $value."\n";
|
|
&print_step_start($text{'generate_regenerating'});
|
|
return;
|
|
}
|
|
if ($event eq 'output') {
|
|
$command_output .= $value;
|
|
return;
|
|
}
|
|
if ($event eq 'command_done') {
|
|
# Successful generation keeps noisy mkconfig output collapsed.
|
|
&print_step_output($text{'generate_done'}, $command_output);
|
|
$current_step = '';
|
|
return;
|
|
}
|
|
if ($event eq 'command_failed') {
|
|
# On command failure the captured output is the most useful detail.
|
|
&print_step_output($text{'generate_failed_status'},
|
|
$command_output);
|
|
$current_step = '';
|
|
$failed_printed = 1;
|
|
$failure_output_shown = 1;
|
|
return;
|
|
}
|
|
if ($event eq 'check') {
|
|
# The generated temporary grub.cfg is syntax-checked before replace.
|
|
$current_step = 'check';
|
|
&print_step_start($text{'generate_check'});
|
|
return;
|
|
}
|
|
if ($event eq 'check_done') {
|
|
&print_step_done(\$current_step);
|
|
return;
|
|
}
|
|
if ($event eq 'check_failed') {
|
|
&print_step_failed(\$current_step, \$failed_printed);
|
|
return;
|
|
}
|
|
if ($event eq 'replace') {
|
|
# Replacement only happens after a successful generation and check.
|
|
$current_step = 'replace';
|
|
&print_step_start($text{'generate_replace'});
|
|
return;
|
|
}
|
|
if ($event eq 'replace_done') {
|
|
&print_step_done(\$current_step);
|
|
return;
|
|
}
|
|
};
|
|
|
|
my $err = &grub2_generate_config($callback);
|
|
if ($err) {
|
|
# If the command output was not already shown, print the returned error.
|
|
&print_step_failed(\$current_step, \$failed_printed)
|
|
if ($current_step);
|
|
&print_step_output($text{'generate_failed_status'}, $err)
|
|
if (!$failure_output_shown);
|
|
}
|
|
else {
|
|
&grub2_mark_generated();
|
|
&webmin_log("generate", undef, &grub2_config_value('grub_cfg'));
|
|
}
|
|
|
|
&ui_print_footer($return_url, $text{'generate_return'});
|
|
|
|
# print_step_start(text)
|
|
# Prints the first progress line for one generation step.
|
|
sub print_step_start
|
|
{
|
|
my ($msg) = @_;
|
|
print &ui_tag('span', &html_escape($msg." .."),
|
|
{ 'data-first-print' => undef });
|
|
print "<br>\n";
|
|
return;
|
|
}
|
|
|
|
# print_step_output(status, output)
|
|
# Prints command output inside an inline details disclosure.
|
|
sub print_step_output
|
|
{
|
|
my ($status, $output) = @_;
|
|
$output = '' if (!defined($output));
|
|
print &ui_details({
|
|
'html' => 1,
|
|
'title' => &ui_tag('span', &html_escape(".. ".$status),
|
|
{ 'data-second-print' => undef }),
|
|
'content' => &ui_tag('pre', &html_escape($output),
|
|
{ 'style' => 'margin-left: 10px;' }),
|
|
'class' => 'inline inlined',
|
|
});
|
|
print "<div data-x-br=\"\"></div>\n";
|
|
return;
|
|
}
|
|
|
|
# print_step_done(¤t-step)
|
|
# Prints a successful progress line and clears the active step.
|
|
sub print_step_done
|
|
{
|
|
my ($current) = @_;
|
|
print &ui_tag('span', &html_escape(".. ".$text{'generate_done'}),
|
|
{ 'data-second-print' => undef });
|
|
print "<br><div data-x-br=\"\"></div>\n";
|
|
$$current = '';
|
|
return;
|
|
}
|
|
|
|
# print_step_failed(¤t-step, &printed-flag)
|
|
# Prints a failed progress line once and clears the active step.
|
|
sub print_step_failed
|
|
{
|
|
my ($current, $printed) = @_;
|
|
return if ($$printed);
|
|
print &ui_tag('span', &html_escape(".. ".$text{'generate_failed_status'}),
|
|
{ 'data-second-print' => undef });
|
|
print "<br><div data-x-br=\"\"></div>\n";
|
|
$$current = '';
|
|
$$printed = 1;
|
|
return;
|
|
}
|