Discussion:
[pve-devel] [PATCH v3 installer] implement prev button and ack screen
Oguz Bektas
2018-12-06 09:44:19 UTC
Permalink
* adds a previous button
* adds an acknowledgement screen before the last install step
* implements some structure into the script which will be later used
to make it more modular in the long run

Signed-off-by: Oguz Bektas <***@proxmox.com>
---
debian/control | 4 +-
html-common/ipconf.htm | 4 +-
proxinstall | 205 +++++++++++++++++++++++++++++++++++++++++++++----
3 files changed, 195 insertions(+), 18 deletions(-)

diff --git a/debian/control b/debian/control
index 7ab4515..8833cb1 100644
--- a/debian/control
+++ b/debian/control
@@ -12,12 +12,12 @@ Homepage: https://www.proxmox.com

Package: pve-installer
Architecture: all
-Depends: geoip-bin, libgtk3-webkit-perl, squashfs-tools
+Depends: geoip-bin, libgtk3-webkit-perl, libgtk3-simplelist-perl, squashfs-tools
Description: Proxmox VE Installer
This package contains the graphical installer for Proxmox VE.

Package: pmg-installer
Architecture: all
-Depends: geoip-bin, libgtk3-webkit-perl, squashfs-tools
+Depends: geoip-bin, libgtk3-webkit-perl, libgtk3-simplelist-perl, squashfs-tools
Description: Proxmox Mail Gateway Installer
This package contains the graphical installer for Proxmox Mail Gateway.
diff --git a/html-common/ipconf.htm b/html-common/ipconf.htm
index ba699ed..2aefa90 100644
--- a/html-common/ipconf.htm
+++ b/html-common/ipconf.htm
@@ -19,8 +19,8 @@
the displayed network configuration. You will need a valid network
configuration to access the management interface after installation.
<br><br>
- Afterwards press the <b>Install</b> button to start the installation. The
- installer will then partition your hard disk and start copying packages.
+ Afterwards press the Next button. You will be displayed a list of the options
+ that you chose during the previous steps.
</td></tr>
</tbody></table>
</p></td>
diff --git a/proxinstall b/proxinstall
index 9945dd1..e40900e 100755
--- a/proxinstall
+++ b/proxinstall
@@ -14,6 +14,7 @@ use IO::Select;
use Cwd 'abs_path';
use Gtk3 '-init';
use Gtk3::WebKit;
+use Gtk3::SimpleList;
use Encode;
use String::ShellQuote;
use Data::Dumper;
@@ -190,9 +191,62 @@ my $ipv4_reverse_mask = [
'255.255.255.255',
];

+my $stack_number = 0; # Init number for global function list
+
+my @function_list = (
+
+ # Description: Global array list for functions
+
+ 'intro',
+ 'hdsel',
+ 'country',
+ 'password',
+ 'ipconf',
+ 'ack',
+ 'extract',
+);
+
+my $function_options = {
+
+ # Description: Custom options for functions
+
+ intro => {
+ html => 'license.htm',
+ button => 'I a_gree',
+ function => \&create_intro_view,
+ },
+ hdsel => {
+ html => 'page1.htm',
+ function => \&create_hdsel_view,
+ },
+ country => {
+ html => 'country.htm',
+ function => \&create_country_view,
+ },
+ password => {
+ html => 'passwd.htm',
+ function => \&create_password_view,
+ },
+ ipconf => {
+ html => 'ipconf.htm',
+ function => \&create_ipconf_view,
+ },
+ ack => {
+ next_button => '_Install',
+ function => \&create_ack_view,
+ },
+ extract => {
+ next_button => '_Reboot',
+ function => \&create_extract_view,
+ },
+};
+
+# GUI global variables
my ($window, $cmdbox, $inbox, $htmlview);
+my $prev;
my ($next, $next_fctn, $target_hd);
my ($progress, $progress_status);
+
my ($ipversion, $ipaddress, $ipconf_entry_addr);
my ($netmask, $ipconf_entry_mask);
my ($gateway, $ipconf_entry_gw);
@@ -203,11 +257,37 @@ my $cmdline = file_read_firstline("/proc/cmdline");
my $ipconf;
my $country;
my $timezone = 'Europe/Vienna';
-my $password;
-my $mailto;
my $keymap = 'en-us';
+my $password;
+my $mailto = '***@example.invalid';
my $cmap;

+my $global_configuration = {
+
+ # Description: Hash to hold global configuration
+ # options for future use
+
+ # Format: screen/function name => settings for that screen
+
+ # TODO: add all the user-provided options during the install
+ # to be able to call them back if necessary
+
+ hdsel => {},
+ country => {
+ country => $country,
+ timezone => $timezone,
+ keymap => $keymap,
+ },
+ password => {
+ password => $password,
+ mailto => $mailto,
+ },
+ ipconf => {
+ hostname => $hostname,
+ domain => $domain,
+ },
+};
+
# parse command line args

my $config_options = {};
@@ -1682,11 +1762,28 @@ sub display_html {
$last_display_change = time();
}

+sub prev_function {
+
+ # Description: Calls the last function
+
+ my ($text, $fctn) = @_;
+
+ $fctn = $stack_number if !$fctn;
+ $text = "_Previous" if !$text;
+ $prev->set_label ($text);
+
+ $stack_number--;
+ $function_options->{$function_list[$stack_number]}->{function}();
+
+ $prev->grab_focus ();
+}
+
sub set_next {
my ($text, $fctn) = @_;

$next_fctn = $fctn;
- $text = "_Next" if !$text;
+ my $step = $function_list[$stack_number];
+ $text //= $function_options->{$step}->{next_button} // '_Next';
$next->set_label ($text);

$next->grab_focus ();
@@ -1721,6 +1818,13 @@ sub create_main_window {
$next = Gtk3::Button->new ('_Next');
$next->signal_connect (clicked => sub { $last_display_change = 0; &$next_fctn (); });
$cmdbox->pack_end ($next, 0, 0, 10);
+
+
+ $prev = Gtk3::Button->new ('_Previous');
+ $prev->signal_connect (clicked => sub { $last_display_change = 0; &prev_function (); });
+ $cmdbox->pack_end ($prev, 0, 0, 10);
+
+
my $abort = Gtk3::Button->new ('_Abort');
$abort->set_can_focus (0);
$cmdbox->pack_start ($abort, 0, 0, 10);
@@ -1900,7 +2004,7 @@ my $ipconf_first_view = 1;
sub create_ipconf_view {

cleanup_view ();
- display_html ("ipconf.htm");
+ display_html ($function_options->{ipconf}->{html});

my $vbox = Gtk3::VBox->new (0, 0);
$inbox->pack_start ($vbox, 1, 0, 0);
@@ -1991,7 +2095,7 @@ sub create_ipconf_view {
$vbox2->pack_start ($dnsbox, 0, 0, 0);

$inbox->show_all;
- set_next ('_Install', sub {
+ set_next (undef, sub {

# verify hostname

@@ -2077,12 +2181,75 @@ sub create_ipconf_view {

#print "TEST $ipaddress $netmask $gateway $dnsserver\n";

- create_extract_view ();
+ $stack_number++;
+ create_ack_view ();
});

$hostentry->grab_focus();
}

+sub create_ack_view {
+
+ # Description: Function for showing the user a list of
+ # the previously chosen options during install
+
+ cleanup_view ();
+
+ display_info ();
+
+ #display_html ($function_options->{ack}->{html}); # TODO: show fitting html file
+
+ my $grid = Gtk3::Grid->new();
+ $grid->set_visible(1);
+ $grid->set_column_spacing(10);
+ $grid->set_row_spacing(10);
+ $grid->set_hexpand(1);
+
+ $grid->set_margin_start(7);
+ $grid->set_margin_end(7);
+ $grid->set_margin_top(7);
+ $grid->set_margin_bottom(7);
+
+
+ # acknowledge the following configs:
+ # a. target disk
+ # b. network configuration
+ # c. timezone/keyboard layout
+ # d. email
+
+ # TODO: use libtemplate-perl instead of libgtk3-simplelist-perl
+
+ my $ack_list = Gtk3::SimpleList->new (
+ 'Option' => 'text',
+ 'Value' => 'text',
+ );
+
+ @{$ack_list->{data}} = (
+ [ 'disk', $target_hd ],
+ [ 'country' ,$country ],
+ [ 'timezone' ,$timezone ],
+ [ 'keymap' ,$keymap ],
+ [ 'mailto' ,$mailto ],
+ [ 'interface', $ipconf->{ifaces}->{$ipconf->{selected}}->{name} ],
+ [ 'hostname' ,$hostname ],
+ [ 'ip' ,$ipaddress ],
+ [ 'netmask' ,$netmask ],
+ [ 'gateway' ,$gateway ],
+ [ 'dnsserver' ,$dnsserver ],
+ );
+
+ $grid->add($ack_list);
+
+ $inbox->pack_start($grid, 1, 0, 0);
+ $inbox->show_all ();
+
+ set_next (undef, sub {
+ $stack_number++;
+ create_extract_view ();
+ });
+
+}
+
sub get_device_desc {
my ($devname, $size, $model) = @_;

@@ -2199,7 +2366,7 @@ sub create_password_view {
$hbox3->pack_start ($label, 0, 0, 10);
my $eme = Gtk3::Entry->new ();
$eme->set_size_request (200, -1);
- $eme->set_text('***@example.invalid');
+ $eme->set_text($mailto);
$hbox3->pack_start ($eme, 0, 0, 0);


@@ -2209,7 +2376,7 @@ sub create_password_view {

$inbox->show_all;

- display_html ("passwd.htm");
+ display_html ($function_options->{password}->{html});

set_next (undef, sub {

@@ -2245,6 +2412,7 @@ sub create_password_view {
$password = $t1;
$mailto = $t3;

+ $stack_number++;
create_ipconf_view();
});

@@ -2389,13 +2557,14 @@ sub create_country_view {

$inbox->show_all;

- display_html ("country.htm");
+ display_html ($function_options->{country}->{html});
set_next (undef, sub {

my $text = $w->get_text;

if (my $cc = $countryhash->{lc($text)}) {
$country = $cc;
+ $stack_number++;
create_password_view();
return;
} else {
@@ -2886,6 +3055,8 @@ sub get_btrfs_raid_setup {

sub create_hdsel_view {

+ $prev->set_sensitive(1); # enable previous button at this point
+
cleanup_view ();

my $vbox = Gtk3::VBox->new (0, 0);
@@ -2922,7 +3093,7 @@ sub create_hdsel_view {

$inbox->show_all;

- display_html ("page1.htm");
+ display_html($function_options->{hdsel}->{html});

set_next (undef, sub {

@@ -2932,6 +3103,7 @@ sub create_hdsel_view {
display_message ("Warning: $err\n" .
"Please fix ZFS setup first.");
} else {
+ $stack_number++;
create_country_view();
}
} elsif ($config_options->{filesys} =~ m/btrfs/) {
@@ -2940,9 +3112,11 @@ sub create_hdsel_view {
display_message ("Warning: $err\n" .
"Please fix BTRFS setup first.");
} else {
+ $stack_number++;
create_country_view();
}
} else {
+ $stack_number++;
create_country_view();
}
});
@@ -2954,7 +3128,7 @@ sub create_extract_view {

display_info();

- $next->set_sensitive (0);
+ $next->set_sensitive(0);

my $vbox = Gtk3::VBox->new (0, 0);
$inbox->pack_start ($vbox, 1, 0, 0);
@@ -2973,7 +3147,7 @@ sub create_extract_view {

$vbox2->pack_start ($progress, 0, 0, 0);

- $inbox->show_all;
+ $inbox->show_all();

my $tdir = $opt_testmode ? "target" : "/target";
mkdir $tdir;
@@ -2982,7 +3156,7 @@ sub create_extract_view {
eval { extract_data ($base, $tdir); };
my $err = $@;

- $next->set_sensitive (1);
+ $next->set_sensitive(1);

set_next ("_Reboot", sub { exit (0); } );

@@ -2997,6 +3171,8 @@ sub create_extract_view {

sub create_intro_view {

+ $prev->set_sensitive(0);
+
cleanup_view ();

if ($setup->{product} eq 'pve') {
@@ -3009,8 +3185,9 @@ sub create_intro_view {
};
}

- display_html ("license.htm");
+ display_html ($function_options->{intro}->{html});

+ $stack_number++;
set_next ("I a_gree", \&create_hdsel_view);
}
--
2.11.0
Loading...