8 use File
::Path
qw(make_path);
11 use Time
::HiRes
qw(usleep);
16 'test-mode|t' => \
$test_mode
17 ) or die "usage error\n";
19 # FIXME: use cleaner approach for setting tet mode?
20 Proxmox
::Install
::ISOEnv
::set_test_image
('/dev/null') if $test_mode;
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);
57 if (!$cmd || $cmd eq 'help' || !exists($commands->{$cmd})) {
61 Proxmox
::Log
::init
("/tmp/install-low-level-${cmd}.log");
63 my $env = Proxmox
::Install
::ISOEnv
::setup
();
64 if ($cmd eq 'dump-env') {
66 my $out_dir = $env->{locations
}->{run
};
68 die "failed to create output directory '$out_dir'\n" if !-d
$out_dir;
70 my $locales_serialized = to_json
($env->{locales
}, {canonical
=> 1, utf8
=> 1}) ."\n";
71 file_write_all
("$out_dir/locales.json", $locales_serialized);
74 'iso-info' => $env->{iso
},
75 'product' => $env->{product
},
76 'product-cfg' => $env->{cfg
},
77 'locations' => $env->{locations
},
79 my $iso_serialized = to_json
($iso_info, {canonical
=> 1, utf8
=> 1}) ."\n";
80 file_write_all
("$out_dir/iso-info.json", $iso_serialized);
82 my $run_env = Proxmox
::Install
::RunEnv
::query_installation_environment
();
83 my $run_env_serialized = to_json
($run_env, {canonical
=> 1, utf8
=> 1}) ."\n";
84 file_write_all
("$out_dir/run-env-info.json", $run_env_serialized);
85 } elsif ($cmd eq 'start-session') {
86 Proxmox
::UI
::init_stdio
({}, $env);
89 while (my $line = <>) {
90 if ($line =~ /^\s*\{/) {
95 my $config = eval { from_json
($config_raw, { utf8
=> 1 }) };
96 die "failed to parse config from stdin - $@\n" if $@;
98 Proxmox
::Install
::Config
::merge
($config);
99 log_info
("got installation config: ". to_json
(Proxmox
::Install
::Config
::get
(), { utf8
=> 1, canonical
=> 1 }) ."\n");
101 eval { Proxmox
::Install
::extract_data
() };
103 # suppress "empty" error as we got some case where the user choose to abort on a prompt,
104 # there it doesn't make sense to show them an error again, they "caused" it after all.
106 warn "installation failed - $err\n";
107 log_error
("installation failed: $err");
108 Proxmox
::UI
::finished
(0, $err);
111 if (Proxmox
::Install
::Config
::get_autoreboot
()) {
112 Proxmox
::UI
::finished
(1, "Installation finished - auto-rebooting in ~ 5 seconds");
114 Proxmox
::UI
::finished
(1, "Installation complete - reboot now?");
118 } elsif ($cmd eq 'start-session-test') {
119 Proxmox
::UI
::init_stdio
({}, $env);
122 while (my $line = <>) {
123 if ($line =~ /^\s*\{/) {
128 my $config = eval { from_json
($config_raw, { utf8
=> 1 }) };
129 die "failed to parse config from stdin - $@\n" if $@;
131 Proxmox
::Install
::Config
::merge
($config);
133 print STDERR
"got config: ". to_json
(Proxmox
::Install
::Config
::get
(), { utf8
=> 1, canonical
=> 1 }) ."\n";
135 my $res = Proxmox
::UI
::prompt
("Reply anything?") ?
'ok' : 'not ok';
136 Proxmox
::UI
::message
("Test Message - got $res");
138 for (my $i = 1; $i <= 1000; $i += 3) {
139 Proxmox
::UI
::progress
($i/1000, 0, 100, "foo $i");
140 if ($i > 500 && $i < 600) {
147 # Proxmox::Install::extract_data(); # TODO