From 0fea5b9078d1849db85cea417b5176a265d55b0d Mon Sep 17 00:00:00 2001 From: Jamie Cameron Date: Sat, 9 Mar 2019 23:14:30 -0800 Subject: [PATCH] Work on repo management --- package-updates/index.cgi | 1 + package-updates/lang/en | 10 +++++++ package-updates/save_repos.cgi | 52 ++++++++++++++++++++++++++++++++++ software/yum-lib.pl | 37 +++++++++++++++++++++++- 4 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 package-updates/save_repos.cgi diff --git a/package-updates/index.cgi b/package-updates/index.cgi index 59343163e..102a77ba9 100755 --- a/package-updates/index.cgi +++ b/package-updates/index.cgi @@ -255,6 +255,7 @@ if ($has_repos) { } # Form to add a repo + # XXX print &ui_tabs_end_tab("tab", "repos"); } diff --git a/package-updates/lang/en b/package-updates/lang/en index 87a21f00f..ec62a6e13 100644 --- a/package-updates/lang/en +++ b/package-updates/lang/en @@ -129,4 +129,14 @@ system_csw=CSW (Blastwave) system_webmin=Webmin module system_usermin=Usermin module system_tgz=Webmin or Usermin tar.gz + +repos_err_disable=Failed to disable repositories +repos_err_enable=Failed to enable repositories +repos_err_delete=Failed to delete repositories +repos_ebutton=No button clicked! +repos_enone=None selected +repos_title=Delete Repositories +repos_rusure=Are you sure you want to delete the $1 selected package repositories? Packages installed from them will still be available, but may not be updatable. +repos_ok=Delete Now + __norefs=1 diff --git a/package-updates/save_repos.cgi b/package-updates/save_repos.cgi new file mode 100644 index 000000000..64acbc19d --- /dev/null +++ b/package-updates/save_repos.cgi @@ -0,0 +1,52 @@ +#!/usr/local/bin/perl +# Delete, enable or disable repositories + +require './package-updates-lib.pl'; +&ReadParse(); +$mode = $in{'disable'} ? 'disable' : + $in{'enable'} ? 'enable' : + $in{'delete'} ? 'delete' : undef; +$mode || &error($text{'repos_ebutton'}); +&error_setup($text{'repos_err_'.$mode}); +%d = map { $_, 1 } split(/\0/, $in{'d'}); + +# Get the repos being updated +@repos = &software::list_package_repos(); +@delrepos = grep { $d{$_->{'id'}} } @repos; +@delrepos || &error($text{'repos_enone'}); +@delrepos = sort { $b->{'line'} <=> $a->{'line'} } @delrepos; + +if ($mode eq 'enable' || $mode eq 'disable') { + # Enable or disable + foreach my $repo (@delrepos) { + &software::enable_package_repo($repo, $mode eq 'enable'); + } + &webmin_log($mode, 'repos', scalar(@delrepos)); + &redirect("index.cgi?tab=repos"); + } +else { + # Delete, but ask first + if ($in{'confirm'}) { + foreach my $repo (@delrepos) { + &software::delete_package_repo($repo); + } + &webmin_log('delete', 'repos', scalar(@delrepos)); + &redirect("index.cgi?tab=repos"); + } + else { + &ui_print_header(undef, $text{'repos_title'}, ""); + + print &ui_confirmation_form( + "save_repos.cgi", + &text('repos_rusure', scalar(@delrepos)), + [ [ 'delete', 1 ], + map { [ 'd', $_->{'id'} ] } @delrepos, + ], + [ [ 'confirm', $text{'repos_ok'} ] ], + ); + + print &ui_form_end("index.cgi?tab=repos", + $text{'index_return'}); + } + } + diff --git a/software/yum-lib.pl b/software/yum-lib.pl index 7f2721f26..b5b255ad7 100755 --- a/software/yum-lib.pl +++ b/software/yum-lib.pl @@ -389,7 +389,8 @@ foreach my $repo (@rv) { $name =~ s/\s*\$[a-z0-9]+//gi; $repo->{'name'} = $repo->{'id'}." (".$name.")"; $repo->{'url'} = $repo->{'raw'}->{'baseurl'}; - $repo->{'enabled'} = $repo->{'raw'}->{'enabled'}; + $repo->{'enabled'} = defined($repo->{'raw'}->{'enabled'}) ? + $repo->{'raw'}->{'enabled'} : 1; } return @rv; @@ -399,8 +400,42 @@ sub create_package_repo { } +# delete_package_repo(&repo) +# Delete a repository from it's config file. Does not delete the file even if +# empty, to prevent it from being re-created if it came from an RPM package. sub delete_package_repo { +my ($repo) = @_; +&lock_file($repo->{'file'}); +my $lref = &read_file_lines($repo->{'file'}); +splice(@$lref, $repo->{'line'}, $repo->{'eline'}-$repo->{'line'}+1); +&flush_file_lines($repo->{'file'}); +&unlock_file($repo->{'file'}); +} + +# enable_package_repo(&repo, enable?) +# Enable or disable a repository +sub enable_package_repo +{ +my ($repo, $enable) = @_; +&lock_file($repo->{'file'}); +my $lref = &read_file_lines($repo->{'file'}); +my $e = "enabled=".($enable ? 1 : 0); +if (defined($repo->{'raw'}->{'enabled'})) { + # There's a line to update already + for(my $i=$repo->{'line'}; $i<=$repo->{'eline'}; $i++) { + if ($lref->[$i] =~ /^enabled=/) { + $lref->[$i] = $e; + last; + } + } + } +else { + # Need to add a line + splice(@$lref, $repo->{'eline'}, 0, $e); + } +&flush_file_lines($repo->{'file'}); +&unlock_file($repo->{'file'}); } 1;