From 1fb3bfa6ef92a4fc231ec203a5e2fb7e75ec9c58 Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Sat, 5 Aug 2023 12:28:06 -0700 Subject: [PATCH] Update webmin from repository if a package is available --- webmin/edit_upgrade.cgi | 4 ++++ webmin/lang/en | 1 + webmin/upgrade.cgi | 22 +++++++++++++++++----- webmin/webmin-lib.pl | 30 +++++++++++++++++++++++++----- 4 files changed, 47 insertions(+), 10 deletions(-) diff --git a/webmin/edit_upgrade.cgi b/webmin/edit_upgrade.cgi index 47e64aea6..c5682f851 100755 --- a/webmin/edit_upgrade.cgi +++ b/webmin/edit_upgrade.cgi @@ -56,6 +56,10 @@ if (!$skip_upgrade) { elsif ($mode ne "sun-pkg") { push(@opts, [ 2, $text{'upgrade_ftp'} ]); } + ($repotype, $repover) = &get_webmin_repo_version(); + if ($repotype) { + push(@opts, [ 6, &text('upgrade_repo', uc($repotype)) ]); + } print &ui_table_row($text{'upgrade_src'}, &ui_radio_table("source", $opts[$#opts]->[0], \@opts)); diff --git a/webmin/lang/en b/webmin/lang/en index d0c2e487d..7a9220f3c 100644 --- a/webmin/lang/en +++ b/webmin/lang/en @@ -481,6 +481,7 @@ upgrade_ftp=Latest version from www.webmin.com upgrade_cup=Latest version from Caldera's cupdate tool upgrade_emerge=Latest version from Emerge repository upgrade_delete=Delete old version's directory after upgrade? +upgrade_repo=Latest version from $1 repository upgrade_ok=Upgrade Webmin upgrade_err1=Failed to upgrade from $1 upgrade_err2=Failed to upgrade from uploaded file diff --git a/webmin/upgrade.cgi b/webmin/upgrade.cgi index ad02ec338..32eaa010b 100755 --- a/webmin/upgrade.cgi +++ b/webmin/upgrade.cgi @@ -5,7 +5,23 @@ require './webmin-lib.pl'; &foreign_require("proc", "proc-lib.pl"); &foreign_require("acl", "acl-lib.pl"); -&ReadParseMime(); +if ($ENV{'REQUEST_METHOD'} eq 'GET') { + &ReadParse(); + } +else { + &ReadParseMime(); + } + +if ($in{'source'} == 3) { + # Get the latest version from Caldera with cupdate + &redirect("/cupdate/"); + return; + } +elsif ($in{'source'} == 6) { + # Upgrade from package repository + &redirect("/package-updates/update.cgi?u=webmin"); + return; + } $| = 1; $theme_no_table = 1; @@ -137,10 +153,6 @@ elsif ($in{'source'} == 5) { $full = $version.($release ? "-$release" : ""); } } -elsif ($in{'source'} == 3) { - # Get the latest version from Caldera with cupdate - &redirect("/cupdate/"); - } elsif ($in{'source'} == 4) { # Just run the command emerge webmin &error_setup(&text('upgrade_err4')); diff --git a/webmin/webmin-lib.pl b/webmin/webmin-lib.pl index 4755beddc..eb4021438 100755 --- a/webmin/webmin-lib.pl +++ b/webmin/webmin-lib.pl @@ -1288,8 +1288,15 @@ if (&foreign_available($module_name) && !$gconfig{'nowebminup'} && $config{'last_version_release'} && $config{'last_version_release'} >= 2; my $full = &get_webmin_full_version(); - if ($config{'last_version_full'} && - &compare_version_numbers($config{'last_version_full'}, $full) > 0) { + my $compver = $config{'last_version_full'}; + my ($repotype, $repover) = &get_webmin_repo_version(); + my $source = 2; + if ($repotype) { + $compver = $repover; + $source = 6; + } + if ($compver && + &compare_version_numbers($compver, $full) > 0) { # New version is out there .. offer to upgrade my $mode = &get_install_type(); my $checksig = 0; @@ -1306,9 +1313,8 @@ if (&foreign_available($module_name) && !$gconfig{'nowebminup'} && 'target="_blank" data-link-external="after"')."."; # $release_notes_link = "" if ($minor_release); push(@notifs, - &ui_form_start("@{[&get_webprefix()]}/webmin/upgrade.cgi", - "form-data"). - &ui_hidden("source", 2). + &ui_form_start("@{[&get_webprefix()]}/webmin/upgrade.cgi"). + &ui_hidden("source", $source). &ui_hidden("sig", $checksig). &ui_hidden("mode", $mode). &text('notif_upgrade', $config{'last_version_full'}, $full). @@ -2716,4 +2722,18 @@ if ($os =~ /rocky/i && $basever >= 8) { return ". $link" if ($link); } +# get_webmin_repo_version() +# If Webmin was installed from a repository like APT or YUM, return the repo +# type and the new version number +sub get_webmin_repo_version +{ +return () if (!&foreign_check("package-updates")); +&foreign_require("package-updates"); +return () if (!&package_updates::supports_updates_available()); +my @updates = &package_updates::updates_available(); +my ($wpkg) = grep { $_->{'name'} eq 'webmin' } @updates; +return () if (!$wpkg); +return ($wpkg->{'system'}, $wpkg->{'version'}); +} + 1;