8 use File
::Path
qw(make_path);
11 use Time
::HiRes
qw(usleep);
16 'test-image|t=s' => \
$test_image
17 ) or die "usage error\n";
19 Proxmox
::Install
::ISOEnv
::set_test_image
($test_image) if $test_image;
22 use Proxmox
::Install
::ISOEnv
;
23 use Proxmox
::Install
::RunEnv
;
25 use Proxmox
::Sys
::File
qw(file_write_all);
29 use Proxmox
::Install
::Config
;
33 'dump-env' => 'Dump the current ISO and Hardware environment to base the installer UI on.',
34 'start-session' => 'Start an installation session, with command and result transmitted via stdin/out',
35 'start-session-test' => 'Start an installation TEST session, with command and result transmitted via stdin/out',
36 'help' => 'Output this usage help.',
43 printf("ERROR: missing command\n\n");
44 } elsif (!exists($commands->{$cmd})) {
45 printf("ERROR: unknown command '$cmd'\n\n");
48 print "USAGE: $0 <cmd>\n";
49 for my $cmd (sort keys $commands->%*) {
50 printf(" %-20s - %s\n", $cmd, $commands->{$cmd});
53 exit($cmd ne 'help' ?
1 : 0);
56 sub read_and_merge_config
{
58 while (my $line = <>) {
59 if ($line =~ /^\s*\{/) {
65 my $config = eval { from_json
($config_raw, { utf8
=> 1 }) };
66 die "failed to parse config from stdin - $@\n" if $@;
68 Proxmox
::Install
::Config
::merge
($config);
69 log_info
("got installation config: ". to_json
(Proxmox
::Install
::Config
::get
(), { utf8
=> 1, canonical
=> 1 }) ."\n");
72 sub send_reboot_ui_message
{
73 if (Proxmox
::Install
::Config
::get_autoreboot
()) {
76 Proxmox
::UI
::finished
(1, "Installation finished - auto-rebooting in $secs seconds ..");
81 Proxmox
::UI
::finished
(1, "Installation finished - reboot now?");
86 if (!$cmd || $cmd eq 'help' || !exists($commands->{$cmd})) {
90 Proxmox
::Log
::init
("/tmp/install-low-level-${cmd}.log");
92 my $env = Proxmox
::Install
::ISOEnv
::get
();
93 if ($cmd eq 'dump-env') {
94 Proxmox
::UI
::init_stdio
({}, $env);
96 my $out_dir = $env->{locations
}->{run
};
98 die "failed to create output directory '$out_dir'\n" if !-d
$out_dir;
100 my $locales_serialized = to_json
($env->{locales
}, {canonical
=> 1, utf8
=> 1}) ."\n";
101 file_write_all
("$out_dir/locales.json", $locales_serialized);
104 'iso-info' => $env->{iso
},
105 'product' => $env->{product
},
106 'product-cfg' => $env->{cfg
},
107 'run-env-cache-file' => $env->{'run-env-cache-file'},
108 'locations' => $env->{locations
},
110 my $iso_serialized = to_json
($iso_info, {canonical
=> 1, utf8
=> 1}) ."\n";
111 file_write_all
("$out_dir/iso-info.json", $iso_serialized);
113 my $run_env_file = Proxmox
::Install
::ISOEnv
::get
('run-env-cache-file');
115 my $run_env = Proxmox
::Install
::RunEnv
::query_installation_environment
();
116 my $run_env_serialized = to_json
($run_env, {canonical
=> 1, utf8
=> 1}) ."\n";
117 file_write_all
($run_env_file, $run_env_serialized);
118 } elsif ($cmd eq 'start-session') {
119 Proxmox
::UI
::init_stdio
({}, $env);
120 read_and_merge_config
();
122 eval { Proxmox
::Install
::extract_data
() };
124 # suppress "empty" error as we got some case where the user choose to abort on a prompt,
125 # there it doesn't make sense to show them an error again, they "caused" it after all.
127 warn "installation failed - $err\n";
128 log_error
("installation failed: $err");
129 Proxmox
::UI
::finished
(0, $err);
132 send_reboot_ui_message
();
134 } elsif ($cmd eq 'start-session-test') {
135 Proxmox
::UI
::init_stdio
({}, $env);
136 read_and_merge_config
();
138 my $res = Proxmox
::UI
::prompt
("Reply anything?") ?
'ok' : 'not ok';
139 Proxmox
::UI
::message
("Test Message - got $res");
141 for (my $i = 1; $i <= 1000; $i += 3) {
142 Proxmox
::UI
::progress
($i/100000, 0, 100, "foo $i");
143 if ($i > 500 && $i < 600) {
150 send_reboot_ui_message
();