Confirmation page for package updates
authorJamie Cameron <jcameron@webmin.com>
Fri, 2 Oct 2009 21:47:50 +0000 (14:47 -0700)
committerJamie Cameron <jcameron@webmin.com>
Fri, 2 Oct 2009 21:47:50 +0000 (14:47 -0700)
makedist.pl
package-updates/index.cgi
package-updates/lang/en
package-updates/package-updates-lib.pl
package-updates/update.cgi
package-updates/view.cgi

index 068019d..7e0ef0d 100755 (executable)
@@ -71,6 +71,7 @@ else {
          "tunnel", "zones", "cluster-usermin", "dovecot", "syslog-ng",
          "mailcap", "blue-theme", "ldap-client", "phpini", "filter",
          "bacula-backup", "ldap-server", "exim", "tcpwrappers",
+         "package-updates",
          );
        }
 @dirlist = ( "Webmin" );
index 3a0e14b..6e34e38 100755 (executable)
@@ -31,7 +31,9 @@ foreach $m ('all', 'updates', 'new', 'both',
 push(@grid, $text{'index_mode'}, &ui_links_row(\@mlinks));
 
 # Show all selector
-if (&show_all_option()) {
+$showall = &show_all_option();
+if ($showall == 1) {
+       # Can show all, or just virtualmin
        $in{'all'} ||= 0;
        foreach $a (0, 1) {
                $amsg = $text{'index_all_'.$a};
@@ -46,13 +48,17 @@ if (&show_all_option()) {
                }
        push(@grid, $text{'index_allsel'}, &ui_links_row(\@alinks));
        }
+elsif ($showall == 2) {
+       # Always showing all
+       $in{'all'} = 2;
+       }
 
 # Show search box
 push(@grid, $text{'index_search'}, &ui_textbox("search", $in{'search'}, 30)." ".
                                   &ui_submit($text{'index_searchok'}));
 
 print &ui_form_start("index.cgi");
-print &ui_hidden("all", &show_all_option() ? 1 : 0);
+print &ui_hidden("all", $showall ? 1 : 0);
 print &ui_hidden("mode", $in{'mode'});
 print &ui_grid_table(\@grid, 2),"<p>\n";
 print &ui_form_end();
@@ -128,7 +134,8 @@ foreach $p (sort { $a->{'name'} cmp $b->{'name'} } (@current, @avail)) {
                  'checked' => $need },
                "<a href='view.cgi?all=$in{'all'}&mode=$in{'mode'}&name=".
                  &urlize($p->{'name'})."&system=".
-                 &urlize($p->{'system'})."'>$p->{'name'}</a>",
+                 &urlize($p->{'system'})."&search=".
+                 &urlize($in{'search'})."'>$p->{'name'}</a>",
                $p->{'desc'},
                $msg,
                $source ? ( $source ) : $anysource ? ( "") : ( ),
index 663045e..bf9d40a 100644 (file)
@@ -71,6 +71,11 @@ update_tgzuntardone=.. done
 update_tgzsetup=Running setup script ..
 update_tgzsetupdone=.. upgrade complete
 update_etgzsetup=.. upgrade failed! See the error message above for the reason why
+update_rusure=Are you sure you wish to install the $1 packages listed below? This may include dependencies of packages that you selected.
+update_oldver=Current version
+update_newver=New version
+update_confirm=Install Now
+update_none=None
 
 sched_title=Scheduled Update
 sched_yes=Scheduled checking for updates is now active.
index ea5bbaa..763de28 100644 (file)
@@ -2,8 +2,9 @@
 # update system.
 #
 # XXX cron job to collect .. actually use webmin module collector
-# XXX confirmation form, showing all dependencies
+#      XXX re-check after package update
 # XXX test automatic notification
+# XXX test on debian
 
 BEGIN { push(@INC, ".."); };
 eval "use WebminCore;";
@@ -475,6 +476,21 @@ unlink($current_all_cache_file);
 return @rv;
 }
 
+# list_package_operations(package, system)
+# Given a package, returns a list of all dependencies that will be installed
+sub list_package_operations
+{
+my ($name, $system) = @_;
+if (defined(&software::update_system_operations)) {
+       my @rv = &software::update_system_operations($name);
+       foreach my $p (@rv) {
+               $p->{'system'} = $system;
+               }
+       return @rv;
+       }
+return ( );
+}
+
 # list_possible_updates([nocache])
 # Returns a list of updates that are available. Each element in the array
 # is a hash ref containing a name, version, description and severity flag.
@@ -832,11 +848,13 @@ if ($pkg->{'system'} eq 'yum') {
 return undef;
 }
 
-# Returns 1 if an option should be shown to list all packages. Only true for
-# YUM and APT at the moment
+# Returns 1 if an option should be shown to list all packages, 2 if all
+# packages is the only option, or 0 if only virtualmin.
 sub show_all_option
 {
-return $software::update_system eq 'apt' || $software::update_system eq 'yum';
+return !&foreign_check("virtual-server") ? 2 :
+       $software::update_system eq 'apt' ||
+       $software::update_system eq 'yum' ? 1 : 0;
 }
 
 sub flush_package_caches
index 7c67e55..5c0c2cb 100755 (executable)
@@ -29,29 +29,77 @@ else {
        @pkgs || &error($text{'update_enone'});
        &ui_print_unbuffered_header(undef, $text{'update_title'}, "");
 
-       foreach my $ps (@pkgs) {
-               ($p, $s) = split(/\//, $ps);
-               print &text('update_pkg', "<tt>$p</tt>"),"<br>\n";
-               print "<ul>\n";
-               push(@got, &package_install($p, $s, $in{'all'}));
-               print "</ul><br>\n";
+       # Work out what will be done, if possible
+       @ops = ( );
+       if (!$in{'confirm'}) {
+               foreach my $ps (@pkgs) {
+                       ($p, $s) = split(/\//, $ps);
+                       push(@ops, &list_package_operations($p, $s));
+                       }
                }
-       if (@got) {
-               print &text('update_ok', scalar(@got)),"<p>\n";
+
+       if (@ops) {
+               # Ask first
+               print &ui_form_start("update.cgi", "post");
+               print &ui_hidden("all", $in{'all'});
+               print &ui_hidden("mode", $in{'mode'});
+               print &ui_hidden("search", $in{'search'});
+               foreach $ps (@pkgs) {
+                       print &ui_hidden("u", $ps);
+                       }
+               print &text('update_rusure', scalar(@ops)),"<p>\n";
+               print &ui_form_end([ [ "confirm", $text{'update_confirm'} ] ]);
+
+               # Show table of all depends
+               @current = $in{'all'} ? &list_all_current(1)
+                                     : &list_current(1);
+               print &ui_columns_start([ $text{'index_name'},
+                                         $text{'update_oldver'},
+                                         $text{'update_newver'},
+                                         $text{'index_desc'},
+                                       ], 100);
+               foreach $p (@ops) {
+                       ($c) = grep { $_->{'name'} eq $p->{'name'} &&
+                                   $_->{'system'} eq $p->{'system'} } @current;
+                       if (!$c && !@avail) {
+                               # Only get available if needed
+                               @avail = &list_available(0, $in{'all'});
+                               }
+                       ($a) = grep { $_->{'name'} eq $p->{'name'} &&
+                                   $_->{'system'} eq $p->{'system'} } @avail;
+                       print &ui_columns_row([
+                               $p->{'name'},
+                               $c ? $c->{'version'}
+                                  : "<i>$text{'update_none'}</i>",
+                               $p->{'version'},
+                               $c ? $c->{'desc'} :
+                                 $a ? $a->{'desc'} : '',
+                               ]);
+                       }
+               print &ui_columns_end();
                }
        else {
-               print $text{'update_failed'},"<p>\n";
-               }
-
-       # Refresh collected package info
-       if (&foreign_check("virtual-server") && @got) {
-               &foreign_require("virtual-server", "virtual-server-lib.pl");
-               if (defined(&virtual_server::refresh_possible_packages)) {
-                       &virtual_server::refresh_possible_packages(\@got);
+               # Do it
+               foreach my $ps (@pkgs) {
+                       ($p, $s) = split(/\//, $ps);
+                       print &text('update_pkg', "<tt>$p</tt>"),"<br>\n";
+                       print "<ul>\n";
+                       push(@got, &package_install($p, $s, $in{'all'}));
+                       print "</ul><br>\n";
+                       }
+               if (@got) {
+                       print &text('update_ok', scalar(@got)),"<p>\n";
+                       }
+               else {
+                       print $text{'update_failed'},"<p>\n";
                        }
+
+               # Refresh collected package info
+               # XXX call webmin
+
+               &webmin_log("update", "packages", scalar(@got),
+                           { 'got' => \@got });
                }
 
-       &webmin_log("update", "packages", scalar(@got),
-                   { 'got' => \@got });
        &ui_print_footer($redir, $text{'index_return'});
        }
index d8869ac..f63ae67 100644 (file)
@@ -73,6 +73,7 @@ elsif ($a && !$c) {
        }
 print &ui_form_end(\@buts);
 
-&ui_print_footer("index.cgi?all=$in{'all'}&mode=$in{'mode'}",
+&ui_print_footer("index.cgi?all=$in{'all'}&mode=$in{'mode'}&search=".
+                 &urlize($in{'search'}),
                 $text{'index_return'});