]> git.proxmox.com Git - pve-installer.git/blame - proxmox-low-level-installer
common: add ZFS `arc_max` installer setup option
[pve-installer.git] / proxmox-low-level-installer
CommitLineData
989191f0
TL
1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use lib '.'; # FIXME
7
8use File::Path qw(make_path);
9use Getopt::Long;
10use JSON;
5c3d53f5 11use Time::HiRes qw(usleep);
989191f0
TL
12
13{
14 my $test_mode;
15 GetOptions(
16 'test-mode|t' => \$test_mode
17 ) or die "usage error\n";
18
19 # FIXME: use cleaner approach for setting tet mode?
026620be 20 Proxmox::Install::ISOEnv::set_test_image('/dev/null') if $test_mode;
989191f0 21}
5c3d53f5
TL
22use Proxmox::Install::ISOEnv;
23use Proxmox::Install::RunEnv;
24
25use Proxmox::Sys::File qw(file_write_all);
26
27use Proxmox::Log;
140f3f40 28use Proxmox::Install;
5c3d53f5
TL
29use Proxmox::Install::Config;
30use Proxmox::UI;
989191f0
TL
31
32my $commands = {
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',
140f3f40 35 'start-session-test' => 'Start an installation TEST session, with command and result transmitted via stdin/out',
989191f0
TL
36 'help' => 'Output this usage help.',
37};
38
39sub usage {
40 my ($cmd) = @_;
41
42 if (!$cmd) {
43 printf("ERROR: missing command\n\n");
44 } elsif (!exists($commands->{$cmd})) {
45 printf("ERROR: unknown command '$cmd'\n\n");
46 }
47
48 print "USAGE: $0 <cmd>\n";
49 for my $cmd (sort keys $commands->%*) {
50 printf(" %-20s - %s\n", $cmd, $commands->{$cmd});
51 }
52
53 exit($cmd ne 'help' ? 1 : 0);
54}
55
56my $cmd = shift;
57if (!$cmd || $cmd eq 'help' || !exists($commands->{$cmd})) {
58 usage($cmd // '');
59}
60
92c7b5c9
TL
61Proxmox::Log::init("/tmp/install-low-level-${cmd}.log");
62
11fd703f 63my $env = Proxmox::Install::ISOEnv::get();
989191f0 64if ($cmd eq 'dump-env') {
989191f0
TL
65
66 my $out_dir = $env->{locations}->{run};
67 make_path($out_dir);
68 die "failed to create output directory '$out_dir'\n" if !-d $out_dir;
69
70 my $locales_serialized = to_json($env->{locales}, {canonical => 1, utf8 => 1}) ."\n";
71 file_write_all("$out_dir/locales.json", $locales_serialized);
72
73 my $iso_info = {
74 'iso-info' => $env->{iso},
75 'product' => $env->{product},
76 'product-cfg' => $env->{cfg},
11fd703f 77 'run-env-cache-file' => $env->{'run-env-cache-file'},
989191f0
TL
78 'locations' => $env->{locations},
79 };
80 my $iso_serialized = to_json($iso_info, {canonical => 1, utf8 => 1}) ."\n";
81 file_write_all("$out_dir/iso-info.json", $iso_serialized);
82
11fd703f
TL
83 my $run_env_file = Proxmox::Install::ISOEnv::get('run-env-cache-file');
84
db97dbac
TL
85 my $run_env = Proxmox::Install::RunEnv::query_installation_environment();
86 my $run_env_serialized = to_json($run_env, {canonical => 1, utf8 => 1}) ."\n";
11fd703f 87 file_write_all($run_env_file, $run_env_serialized);
8b39b0aa
TL
88} elsif ($cmd eq 'start-session') {
89 Proxmox::UI::init_stdio({}, $env);
5c3d53f5
TL
90
91 my $config_raw;
140f3f40
TL
92 while (my $line = <>) {
93 if ($line =~ /^\s*\{/) {
94 $config_raw = $line;
95 last;
96 }
97 }
98 my $config = eval { from_json($config_raw, { utf8 => 1 }) };
99 die "failed to parse config from stdin - $@\n" if $@;
100
101 Proxmox::Install::Config::merge($config);
102 log_info("got installation config: ". to_json(Proxmox::Install::Config::get(), { utf8 => 1, canonical => 1 }) ."\n");
103
b6e671a6
TL
104 eval { Proxmox::Install::extract_data() };
105 if (my $err = $@) {
106 # suppress "empty" error as we got some case where the user choose to abort on a prompt,
107 # there it doesn't make sense to show them an error again, they "caused" it after all.
a8fbe0ff
TL
108 if ($err ne "\n") {
109 warn "installation failed - $err\n";
110 log_error("installation failed: $err");
111 Proxmox::UI::finished(0, $err);
112 }
b6e671a6
TL
113 } else {
114 if (Proxmox::Install::Config::get_autoreboot()) {
a8fbe0ff 115 Proxmox::UI::finished(1, "Installation finished - auto-rebooting in ~ 5 seconds");
b6e671a6 116 } else {
a8fbe0ff 117 Proxmox::UI::finished(1, "Installation complete - reboot now?");
b6e671a6
TL
118 }
119 }
140f3f40
TL
120} elsif ($cmd eq 'start-session-test') {
121 Proxmox::UI::init_stdio({}, $env);
122
123 my $config_raw;
124 while (my $line = <>) {
125 if ($line =~ /^\s*\{/) {
5c3d53f5
TL
126 $config_raw = $line;
127 last;
128 }
129 }
130 my $config = eval { from_json($config_raw, { utf8 => 1 }) };
131 die "failed to parse config from stdin - $@\n" if $@;
132
133 Proxmox::Install::Config::merge($config);
134
135 print STDERR "got config: ". to_json(Proxmox::Install::Config::get(), { utf8 => 1, canonical => 1 }) ."\n";
136
137 my $res = Proxmox::UI::prompt("Reply anything?") ? 'ok' : 'not ok';
138 Proxmox::UI::message("Test Message - got $res");
139
140 for (my $i = 1; $i <= 1000; $i += 3) {
5ab640a1 141 Proxmox::UI::progress($i/100000, 0, 100, "foo $i");
5c3d53f5
TL
142 if ($i > 500 && $i < 600) {
143 usleep(50 * 1000);
144 } else {
145 usleep(10 * 1000);
146 }
147 }
148
ac5522a1
CH
149 if (Proxmox::Install::Config::get_autoreboot()) {
150 Proxmox::UI::finished(1, "Installation finished - auto-rebooting in ~ 5 seconds");
151 } else {
152 Proxmox::UI::finished(1, "Installation complete - reboot now?");
153 }
989191f0
TL
154}
155
156exit(0);