Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package MirrorCache for openSUSE:Factory checked in at 2023-11-02 20:22:14 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/MirrorCache (Old) and /work/SRC/openSUSE:Factory/.MirrorCache.new.17445 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "MirrorCache" Thu Nov 2 20:22:14 2023 rev:34 rq:1122191 version:1.067 Changes: -------- --- /work/SRC/openSUSE:Factory/MirrorCache/MirrorCache.changes 2023-10-05 20:06:32.238048591 +0200 +++ /work/SRC/openSUSE:Factory/.MirrorCache.new.17445/MirrorCache.changes 2023-11-02 20:22:28.702062105 +0100 @@ -1,0 +2,14 @@ +Thu Oct 26 07:56:51 UTC 2023 - Andrii Nikitin <andrii.niki...@suse.com> + +- Update to version 1.067: + * fix handling combinations of metalink / zsync / mirrorlist / symlinks (#421) + +------------------------------------------------------------------- +Thu Oct 19 11:37:00 UTC 2023 - Andrii Nikitin <andrii.niki...@suse.com> + +- Update to version 1.066: + * Centalized mirror management (#417) + * Fix surepfluous .zsync in symlink redirect (#419) + * t: Move container tests to from leap 15.4 to 15.5 + +------------------------------------------------------------------- Old: ---- MirrorCache-1.065.obscpio New: ---- MirrorCache-1.067.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ MirrorCache.spec ++++++ --- /var/tmp/diff_new_pack.F8aQQx/_old 2023-11-02 20:22:29.466090218 +0100 +++ /var/tmp/diff_new_pack.F8aQQx/_new 2023-11-02 20:22:29.466090218 +0100 @@ -22,7 +22,7 @@ %define main_requires %{assetpack_requires} perl(Carp) perl(DBD::Pg) >= 3.7.4 perl(DBI) >= 1.632 perl(DBIx::Class) >= 0.082801 perl(DBIx::Class::DynamicDefault) perl(DateTime) perl(Encode) perl(Time::Piece) perl(Time::Seconds) perl(Time::ParseDate) perl(DateTime::Format::Pg) perl(Exporter) perl(File::Basename) perl(LWP::UserAgent) perl(Mojo::Base) perl(Mojo::ByteStream) perl(Mojo::IOLoop) perl(Mojo::JSON) perl(Mojo::Pg) perl(Mojo::URL) perl(Mojo::Util) perl(Mojolicious::Commands) perl(Mojolicious::Plugin) perl(Mojolicious::Plugin::RenderFile) perl(Mojolicious::Static) perl(Net::OpenID::Consumer) perl(POSIX) perl(Sort::Versions) perl(URI::Escape) perl(XML::Writer) perl(base) perl(constant) perl(diagnostics) perl(strict) perl(warnings) shadow rubygem(sass) perl(Net::DNS) perl(LWP::Protocol::https) perl(Digest::SHA) perl(Config::IniFiles) %define build_requires %{assetpack_requires} rubygem(sass) tidy sysuser-shadow sysuser-tools Name: MirrorCache -Version: 1.065 +Version: 1.067 Release: 0 Summary: WebApp to redirect and manage mirrors License: GPL-2.0-or-later ++++++ MirrorCache-1.065.obscpio -> MirrorCache-1.067.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/assets/javascripts/admintable.js new/MirrorCache-1.067/assets/javascripts/admintable.js --- old/MirrorCache-1.065/assets/javascripts/admintable.js 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/assets/javascripts/admintable.js 2023-10-26 09:53:30.000000000 +0200 @@ -325,7 +325,11 @@ return ''; } var url = $("#admintable_api_url").val(); - res = '<button type="submit" class="btn" alt="Edit" title="Edit" onclick="setEditingAdminTableRow(this.parentElement, true, false);"><i class="far fa-edit"></i></button>'; + var noActions = document.getElementById("regionmirrorproviderpanel"); + var res = ''; + if (! noActions ) { + res = '<button type="submit" class="btn" alt="Edit" title="Edit" onclick="setEditingAdminTableRow(this.parentElement, true, false);"><i class="far fa-edit"></i></button>'; + } if (url == '/rest/server' && data) { return res + '<button type="submit" class="btn" alt="UpdateLocation" title="Update Location" onclick="submitServerLocationRow(this.parentElement, ' + data + ');"><i class="far fa-bookmark"></i></button>'; } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/lib/MirrorCache/Config.pm new/MirrorCache-1.067/lib/MirrorCache/Config.pm --- old/MirrorCache-1.065/lib/MirrorCache/Config.pm 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/lib/MirrorCache/Config.pm 2023-10-26 09:53:30.000000000 +0200 @@ -48,6 +48,7 @@ has plugin_status => $ENV{MIRRORCACHE_PLUGIN_STATUS}; +has regions => $ENV{MIRRORCACHE_REGIONS}; has mirror_provider => $ENV{MIRRORCACHE_MIRROR_PROVIDER}; has db_provider => undef; @@ -64,7 +65,7 @@ my $cfg; $cfg = Config::IniFiles->new(-file => $cfgfile, -fallback => 'default') if $cfgfile; if ($cfg) { - for my $k (qw/root root_nfs redirect redirect_huge huge_file_size small_file_size city_mmdb ip2location top_folders mirror_provider browser_agent_mask custom_footer_message country_image_dir/) { + for my $k (qw/root root_nfs redirect redirect_huge huge_file_size small_file_size city_mmdb ip2location top_folders regions mirror_provider browser_agent_mask custom_footer_message country_image_dir/) { if (my $v = $cfg->val('default', $k)) { $self->$k($v); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/lib/MirrorCache/Datamodule.pm new/MirrorCache-1.067/lib/MirrorCache/Datamodule.pm --- old/MirrorCache-1.065/lib/MirrorCache/Datamodule.pm 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/lib/MirrorCache/Datamodule.pm 2023-10-26 09:53:30.000000000 +0200 @@ -23,6 +23,8 @@ use Mojolicious::Types; use MirrorCache::Utils 'region_for_country'; +my $MCDEBUG = $ENV{MCDEBUG_DATAMODULE} // $ENV{MCDEBUG_ALL} // 0; + has c => undef, weak => 1; my @ROUTES = ( '/browse', '/download' ); @@ -327,13 +329,18 @@ return $self->_is_head; } -sub redirect($self, $url) { +sub redirect($self, $url, $skip_xtra = undef) { my $xtra = ''; - if ($self->_original_path =~ m/(\.metalink|\.meta4|\.zsync|\.mirrorlist|\.torrent|\.magnet|\.btih)$/) { + + my $c = $self->c; + my $param = $c->req->params; + if (!$skip_xtra && $self->_original_path =~ m/(\.metalink|\.meta4|\.zsync|\.mirrorlist|\.torrent|\.magnet|\.btih)$/) { $xtra = $1; + $xtra = substr($xtra, 1); + $param->append($xtra => 1); } - - return $self->c->redirect_to($url . $xtra . $self->query1); + return $c->redirect_to($url) unless $param->to_hash; + return $c->redirect_to($url . '?' . $param->to_string); } sub accept($self) { @@ -344,6 +351,7 @@ $self->_agent(''); $self->_browser(''); my $headers = $self->c->req->headers; + $self->c->log->error($self->c->dumper("DATAMODULE HEADERS", $headers)) if $MCDEBUG; return unless $headers; if (my $agent = $headers->user_agent) { $self->_agent($agent); @@ -378,17 +386,18 @@ $self->_country($country) if $country; $self->_region($region) if $region; + $self->c->log->error($self->c->dumper("DATAMODULE HEADERS ACCEPT", $headers->accept)) if $MCDEBUG; return unless $headers->accept; - $self->metalink(1) if $headers->accept =~ m/\bapplication\/metalink/; - $self->meta4(1) if $headers->accept =~ m/\bapplication\/metalink4/; - $self->zsync(1) if $headers->accept =~ m/\bapplication\/x-zsync/; - - $self->accept_metalink(1) if $headers->accept =~ m/\bapplication\/metalink/; - $self->accept_meta4(1) if $headers->accept =~ m/\bapplication\/metalink4/; - $self->accept_zsync(1) if $headers->accept =~ m/\bapplication\/x-zsync/; + $self->metalink(1) if $headers->accept =~ m/\bapplication\/metalink/i; + $self->meta4(1) if $headers->accept =~ m/\bapplication\/metalink4/i; + $self->zsync(1) if $headers->accept =~ m/\bapplication\/x-zsync/i; + + $self->accept_metalink(1) if $headers->accept =~ m/\bapplication\/metalink/i; + $self->accept_meta4(1) if $headers->accept =~ m/\bapplication\/metalink4/i; + $self->accept_zsync(1) if $headers->accept =~ m/\bapplication\/x-zsync/i; - $self->accept_all(1) if $headers->accept =~ m/\*\/\*/ && ($self->_original_path !~ m/(\.metalink|\.meta4|\.zsync|\.mirrorlist|\.torrent|\.magnet|\.btih)$/); + $self->accept_all(1) if scalar($headers->accept =~ m/\*\/\*/) && scalar($headers->accept ne '*/*'); } sub _init_req($self) { @@ -492,6 +501,8 @@ $self->_query($query); $self->_query1('?' . $query_string); $self->mirrorlist(1) if defined $query->param('mirrorlist'); + $self->meta4(1) if defined $query->param('meta4'); + $self->metalink(1) if defined $query->param('metalink'); $self->zsync(1) if defined $query->param('zsync'); $self->torrent(1) if defined $query->param('torrent'); $self->magnet(1) if defined $query->param('magnet'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/lib/MirrorCache/Schema/ResultSet/Server.pm new/MirrorCache-1.067/lib/MirrorCache/Schema/ResultSet/Server.pm --- old/MirrorCache-1.065/lib/MirrorCache/Schema/ResultSet/Server.pm 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/lib/MirrorCache/Schema/ResultSet/Server.pm 2023-10-26 09:53:30.000000000 +0200 @@ -94,6 +94,7 @@ $limit1 = $limit + $limit if $limit > 10; my $join_server_project = ""; + my $condition_our_regions = $schema->condition_our_regions; my $condition_server_project = ""; if ($project_id) { $join_server_project = "left join server_project sp on (project_id,sp.server_id) = ($project_id,s.id) and state < 1"; @@ -145,7 +146,7 @@ from folder_diff fd join file fl on $join_file_cond join folder_diff_server fds on fd.id = fds.folder_diff_id and date_trunc('second', fl.dt) <= fds.dt - join server s on fds.server_id = s.id and s.enabled $country_condition + join server s on fds.server_id = s.id and s.enabled $country_condition $condition_our_regions left join server_capability_declaration scd on s.id = scd.server_id and scd.capability = 'country' left join folder_diff_file fdf on fdf.file_id = fl.id and fdf.folder_diff_id = fd.id $join_server_project @@ -200,8 +201,9 @@ my $rsource = $self->result_source; my $schema = $rsource->schema; my $dbh = $schema->storage->dbh; + my $condition_our_regions = $schema->condition_our_regions; - my $sql = <<'END_SQL'; + my $sql = <<"END_SQL"; select s.id as server_id, concat( case @@ -227,6 +229,7 @@ (fds.folder_diff_id IS NOT DISTINCT FROM fd.id OR fds.server_id is null) AND (cap_fhttp.server_id IS NULL or cap_fhttps.server_id IS NULL) AND (sp.server_id IS NULL) +$condition_our_regions group by s.id, s.hostname, s.urldir, f.path, cap_http.server_id, cap_fhttp.server_id, cap_hasall.capability order by s.id END_SQL @@ -246,8 +249,9 @@ my $rsource = $self->result_source; my $schema = $rsource->schema; my $dbh = $schema->storage->dbh; + my $condition_our_regions = $schema->condition_our_regions; - my $sql = <<'END_SQL'; + my $sql = <<"END_SQL"; select concat(s.id, '::', p.id) as _key, s.id as server_id, p.id as project_id, @@ -258,7 +262,7 @@ join server s on s.enabled left join server_project sp on sp.server_id = s.id and sp.project_id = p.id where - coalesce(sp.state,0) > -1 + coalesce(sp.state,0) > -1 $condition_our_regions END_SQL return $dbh->selectall_hashref($sql, '_key', {}); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/lib/MirrorCache/Schema/ResultSet/ServerCapabilityDeclaration.pm new/MirrorCache-1.067/lib/MirrorCache/Schema/ResultSet/ServerCapabilityDeclaration.pm --- old/MirrorCache-1.065/lib/MirrorCache/Schema/ResultSet/ServerCapabilityDeclaration.pm 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/lib/MirrorCache/Schema/ResultSet/ServerCapabilityDeclaration.pm 2023-10-26 09:53:30.000000000 +0200 @@ -26,11 +26,14 @@ my $schema = $rsource->schema; my $dbh = $schema->storage->dbh; - my $sql = <<'END_SQL'; + my $condition_our_regions = $schema->condition_our_regions; + + my $sql = <<"END_SQL"; select concat(CASE WHEN length(s.hostname_vpn)>0 THEN s.hostname_vpn ELSE s.hostname END,s.urldir,'/') as uri, CASE WHEN length(s.hostname_vpn)>0 THEN s.hostname_vpn ELSE s.hostname END as hostname, s.id as id, - -- server has capability enabled when two conditions are true: + -- server has capability enabled when following conditions are true: -- 1. server_id is not mentioned in server_capability_force -- 2. there is no entry in server_capability_declaration which has enabled='F' for the server_id. + -- 3. additional string as provided by schema->condition_our_regions; COALESCE(fhttp.server_id = 0, COALESCE(http.enabled,'t')) as http, COALESCE(fhttps.server_id = 0, COALESCE(https.enabled,'t')) as https, COALESCE(fipv4.server_id = 0, COALESCE(ipv4.enabled,'t')) as ipv4, @@ -71,7 +74,7 @@ where (fhttp.server_id IS NULL or fhttps.server_id IS NULL) -- do not show servers which have both http and https force disabled AND (fipv4.server_id IS NULL or fipv6.server_id IS NULL) -- do not show servers which have both ipv4 and ipv6 force disabled - AND s.enabled + AND s.enabled $condition_our_regions END_SQL unless ($dbh->{Driver}->{Name} eq 'Pg') { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/lib/MirrorCache/Schema.pm new/MirrorCache-1.067/lib/MirrorCache/Schema.pm --- old/MirrorCache-1.065/lib/MirrorCache/Schema.pm 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/lib/MirrorCache/Schema.pm 2023-10-26 09:53:30.000000000 +0200 @@ -16,6 +16,8 @@ my $PROVIDER; +my $OUR_REGIONS; + sub pg { return 1 if $PROVIDER eq 'Pg'; return 0; @@ -26,7 +28,7 @@ } sub connect_db { - my ($self, $provider, $dsn, $user, $pass) = @_; + my ($self, $provider, $dsn, $user, $pass, $our_regions) = @_; $PROVIDER = $provider; @@ -38,6 +40,13 @@ } $SINGLETON = __PACKAGE__->connect($dsn, $user, $pass); + + if ($our_regions) { + my @regions = split ',', $our_regions; + my $in = join ', ', map "'$_'", @regions; + + $OUR_REGIONS = "and (s.region in ($in) or (select enabled from server_capability_declaration where server_id = s.id and capability = 'region' and extra in ($in)))" + } } return $SINGLETON; @@ -103,4 +112,10 @@ my $db = $conn->db; # this will do migration } +sub condition_our_regions { + return '' unless $OUR_REGIONS; + + return $OUR_REGIONS; +} + 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/lib/MirrorCache/WebAPI/Controller/App/Myserver.pm new/MirrorCache-1.067/lib/MirrorCache/WebAPI/Controller/App/Myserver.pm --- old/MirrorCache-1.065/lib/MirrorCache/WebAPI/Controller/App/Myserver.pm 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/lib/MirrorCache/WebAPI/Controller/App/Myserver.pm 2023-10-26 09:53:30.000000000 +0200 @@ -17,7 +17,17 @@ use Mojo::Base 'MirrorCache::WebAPI::Controller::App::Table'; sub index { - shift->SUPER::admintable('myserver'); + my $c = shift; + my $mirror_provider = $c->mcconfig->mirror_provider; + if (my $url = $c->mcconfig->mirror_provider) { + $url =~ s!^https?://(?:www\.)?!!i; + $url =~ s!/.*!!; + $url =~ s/[\?\#\:].*//; + my $mirror_provider_url = 'https://' . $url . '/app/server'; + $c->stash( mirror_provider_url => $mirror_provider_url ); + } + + $c->SUPER::admintable('myserver'); } sub update { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/lib/MirrorCache/WebAPI/Controller/App/Server.pm new/MirrorCache-1.067/lib/MirrorCache/WebAPI/Controller/App/Server.pm --- old/MirrorCache-1.065/lib/MirrorCache/WebAPI/Controller/App/Server.pm 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/lib/MirrorCache/WebAPI/Controller/App/Server.pm 2023-10-26 09:53:30.000000000 +0200 @@ -17,7 +17,17 @@ use Mojo::Base 'MirrorCache::WebAPI::Controller::App::Table'; sub index { - shift->SUPER::admintable('server'); + my $c = shift; + my $mirror_provider = $c->mcconfig->mirror_provider; + if (my $url = $c->mcconfig->mirror_provider) { + $url =~ s!^https?://(?:www\.)?!!i; + $url =~ s!/.*!!; + $url =~ s/[\?\#\:].*//; + my $mirror_provider_url = 'https://' . $url . '/app/server'; + $c->stash( mirror_provider_url => $mirror_provider_url ); + } + + $c->SUPER::admintable('server'); } sub update { @@ -49,12 +59,26 @@ if ($self->is_operator) { $admin_email = $self->schema->storage->dbh->selectrow_array("SELECT msg FROM server_note WHERE hostname = ? AND kind = 'Email' ORDER BY dt DESC LIMIT 1", undef, $hostname); } + my $subsidiary; + if (my $regions = $self->mcconfig->regions) { + if ($f->region && -1 == CORE::index($regions, $f->region)) { + $subsidiary = $self->subsidiary->url($f->region); + } + } + my $provider; + if ($provider = $self->mcconfig->mirror_provider) { + $provider =~ s!^https?://(?:www\.)?!!i; + $provider =~ s!/.*!!; + $provider =~ s/[\?\#\:].*//; + } my $server = { id => $f->id, hostname => $f->hostname, public_notes => $f->public_notes, admin_email => $admin_email, + subsidiary => $subsidiary, + provider => $provider, }; return $self->render('app/server/show', server => $server); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/lib/MirrorCache/WebAPI/Plugin/Dir.pm new/MirrorCache-1.067/lib/MirrorCache/WebAPI/Plugin/Dir.pm --- old/MirrorCache-1.065/lib/MirrorCache/WebAPI/Plugin/Dir.pm 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/lib/MirrorCache/WebAPI/Plugin/Dir.pm 2023-10-26 09:53:30.000000000 +0200 @@ -227,13 +227,18 @@ } $c->log->error('pedantic: ' . ($dm->pedantic // 'undef')) if $MCDEBUG; - if ($path =~ m/(GNOME_.*|.*(Media|Current|Next))\.iso(\.sha256(\.asc)?)?/ && $dm->pedantic) { - my $ln = $root->detect_ln_in_the_same_folder($path); + if ($path =~ m/(GNOME_.*|.*(Media|[C|c]urrent|Next))\.iso(\.sha256(\.asc)?)?/ && $dm->pedantic) { + my $ln = $root->detect_ln_in_the_same_folder($dm->original_path); + my $extra = 1; + unless ($ln) { + $ln = $root->detect_ln_in_the_same_folder($path); + $extra = 0; + } $c->log->error("ln for $path : " . ($ln // 'null')) if $MCDEBUG; if ($ln) { # redirect to the symlink - $c->log->error('redirect detected: ' . $ln) if $MCDEBUG; - $dm->redirect($dm->route . $ln); + $c->log->error('redirect detected: ' . $ln . ": " . $c->dumper($dm->accept_all, $dm->accept)) if $MCDEBUG; + $dm->redirect($dm->route . $ln, $extra && ($dm->accept_all || !$dm->accept)); return 1; } } @@ -255,12 +260,17 @@ sub _redirect_normalized { my $dm = shift; - return undef if $dm->accept; + return undef if $dm->accept || $dm->btih || $dm->torrent || $dm->magnet; my ($path, $trailing_slash, $original_path) = $dm->path; return undef if $path eq '/'; - $path = $path . '.metalink' if $dm->metalink; - $path = $path . '.meta4' if $dm->meta4; - return $dm->c->redirect_to($dm->route . $path . $trailing_slash . $dm->query1) unless $original_path eq $path || ($dm->extra && !$dm->metalink && !$dm->meta4); + my $path1 = $path; + $path1 = $path1 . '.zsync' if $dm->zsync; + $path1 = $path1 . '.metalink' if $dm->metalink; + $path1 = $path1 . '.meta4' if $dm->meta4; + $path1 = $path1 . '.mirrorlist' if $dm->mirrorlist; + $dm->c->log->error('DIR::redirect_normalized', $path, $path1, $original_path, $dm->original_path, $dm->_original_path) if $MCDEBUG; + return $dm->c->redirect_to($dm->route . $path . $trailing_slash . $dm->query1) unless $original_path eq $path || $original_path eq $path1 || ($dm->accept); + $dm->c->log->error('DIR::redirect_normalized2') if $MCDEBUG; return undef; } @@ -321,14 +331,21 @@ sub _local_render { my $dm = shift; my $accept = shift; - return undef if $dm->extra && (!$accept || !$dm->accept_all); + my $c = $dm->c; + $c->log->error($c->dumper('local_render : ', $dm->extra, $accept, $dm->accept_all)) if $MCDEBUG; + return undef if $dm->extra && (!$accept || $dm->accept); + $c->log->error($c->dumper('local_render2: ')) if $MCDEBUG; my ($path, $trailing_slash) = $dm->path; # we can just render top folders return _render_top_folders($dm) if @top_folders && $path eq '/'; - return $root->render_file_if_nfs($dm, $path) if $root->is_remote; + my $original_path = $dm->original_path; + + return $root->render_file_if_nfs($dm, $path) if $root->is_remote && ($original_path eq $path || (!$dm->extra && !$dm->accept)); + return undef if $root->is_remote; + $c->log->error($c->dumper('local_render3: ')) if $MCDEBUG; # root is only local now - if (defined($dm->c->param('realpath'))) { + if (defined($c->param('realpath'))) { my $realpath = $root->realpath($path); return $dm->redirect($dm->route . $realpath . '/') if $realpath; } @@ -336,8 +353,27 @@ return $dm->redirect($dm->route . $path . '/') if !$trailing_slash && $path ne '/'; return _render_dir($dm, $path); } - $dm->c->mirrorcache->render_file($path, $dm) if !$trailing_slash && $root->is_file($path); - return 1; + if (!$trailing_slash) { + if ($original_path ne $path && $root->is_file($original_path) && !$dm->accept) { + $c->log->error($c->dumper('local_render4 : ', $dm->extra)) if $MCDEBUG; + if ($accept) { + $root->render_file($dm, $original_path); + } else { + $c->mirrorcache->render_file($original_path, $dm); + } + return 1; + } elsif ($root->is_file($path) && !$dm->extra) { + $c->log->error($c->dumper('local_render5 : ', $dm->extra)) if $MCDEBUG; + if ($accept) { + $root->render_file($dm, $path); + } else { + $c->mirrorcache->render_file($path, $dm); + } + return 1; + } + } + $c->log->error($c->dumper('local_render6: ', $c->res->code)) if $MCDEBUG; + return $c->res->code; } sub _render_from_db { @@ -359,7 +395,7 @@ $dirname = $dm->root_subtree . ($folder_or_pattern? $path : $f->dirname) unless $dirname; $c->log->error($c->dumper('dirname:', $dirname, 'path:', $path, 'trail:', $trailing_slash)) if $MCDEBUG; if (my $folder = $rsFolder->find_folder_or_redirect($dirname)) { - $c->log->error("found redirect : $dirname -> ", $folder->{pathto}) if $MCDEBUG && $folder->{pathto}; + $c->log->error($c->dumper("found redirect : $dirname -> ", $folder->{pathto})) if $MCDEBUG && $folder->{pathto}; # return $dm->redirect($folder->{pathto} . $trailing_slash) if $folder->{pathto}; my $folder_path = $folder->{pathto} ? $folder->{pathto} : $folder->{path}; return $c->render(status => 404, text => "path {$path} not found!!") unless $folder_path; @@ -369,7 +405,7 @@ } else { $realpath_subtree = $root->realpath($dm->root_subtree . ($folder_or_pattern? $path : $f->dirname)) // $dirname; } - $c->log->error('RENDER - REALPATH_SUBTREE : ', $realpath_subtree) if $MCDEBUG; + $c->log->error('RENDER - REALPATH_SUBTREE : ' . $realpath_subtree) if $MCDEBUG; if ($dirname eq $realpath_subtree) { if ($dirname eq $f->dirname || $folder_or_pattern) { $dm->folder_id($folder->{id}); @@ -404,14 +440,14 @@ my $filename = $file->{name} if $file; if ($dm->zsync && !$dm->accept_zsync && $file && $filename && '.zsync' eq substr $filename, -length('.zsync')) { $dm->zsync(0); - $dm->accept_all(1); + # $dm->accept_all(1); $dm->_path($dm->path . '.zsync'); $path = $path . '.zsync'; } if ($file->{target}) { # redirect to the symlink - $dm->redirect($dm->route . $dirname . '/' . $file->{target}); + $dm->redirect($dm->route . $dirname . '/' . $file->{target}, ($dm->accept_all || !$dm->accept)); } else { $dm->file_id($file->{id}); # find a mirror for it @@ -429,16 +465,22 @@ my $c = $dm->c; my $tx = $c->render_later->tx; my ($path, $trailing_slash) = $dm->path; + $c->log->error('guess what to render: ' . $path) if $MCDEBUG; if ($dm->extra) { - $c->log->error('guess what to render extra : ', $dm->extra) if $MCDEBUG; - return $root->render_file($dm, $path) if $dm->accept_all && !$trailing_slash; + $c->log->error($c->dumper('guess what to render extra : ', $dm->extra, $dm->accept_all)) if $MCDEBUG; + return $root->render_file($dm, $dm->original_path) if $dm->accept_all && !$trailing_slash && $dm->accept; + + if (!$root->is_remote && $dm->accept_all) { # for local we can check if it is the file we requested + return $root->render_file($dm, $dm->original_path) if $root->is_file($dm->original_path); + } # the file is unknown, we cannot show generate meither mirrorlist or metalink my $res = $c->render(status => 425, text => "The file is unknown, retry later"); # log miss here even thoough we haven't rendered anything $c->stat->redirect_to_root($dm, 0); return $res; } + return $c->render(status => 404, text => "Not found") unless $root->is_remote; my $rootlocation = $root->location; my $url = $rootlocation . $path; @@ -656,19 +698,26 @@ my $dm = shift; my $root_nfs = $mc_config->root_nfs; my $small_file_size = $mc_config->small_file_size; - return undef unless $small_file_size && ($root_nfs || !$root->is_remote ); + my $c=$dm->c; + $c->log->error('DIR::render_small1') if $MCDEBUG; + return undef unless ($small_file_size && ($root_nfs || !$root->is_remote)); $dm->_init_path; - return undef if ($dm->metalink && !$dm->accept_all) || ($dm->meta4 && !$dm->accept_all) || $dm->mirrorlist || $dm->zsync; + $c->log->error('DIR::render_small2') if $MCDEBUG; + return undef if ($dm->metalink && $dm->accept) || ($dm->meta4 && $dm->accept) || $dm->mirrorlist || $dm->zsync; + $c->log->error('DIR::render_small3') if $MCDEBUG; my ($path, undef) = $dm->path; my $full; - return $root->render_file_if_small($dm, $path, $small_file_size) unless $root_nfs; + return $root->render_file_if_small($dm, $path, $small_file_size) unless $root->is_remote; + $c->log->error('DIR::render_small4') if $MCDEBUG; + my $original_path = $dm->path; + return undef if $original_path ne $path || $dm->extra; + $c->log->error($c->dumper('DIR::render_small5', $original_path, $path, $dm->extra)) if $MCDEBUG; $full = $root_nfs . $path; my $size; eval { $size = -s $full if -f $full; }; return undef unless (defined $size) && $size <= $small_file_size; - my $c = $dm->c; - $c->render_file(filepath => $full, content_type => $dm->mime); - return 1; + $c->log->error('DIR::render_small6') if $MCDEBUG; + return $root->render_file($dm, $path, 1, 1); } # if we don't render file directly - we set max-age to short value, because redirect or metalink may change diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/lib/MirrorCache/WebAPI/Plugin/RenderFileFromMirror.pm new/MirrorCache-1.067/lib/MirrorCache/WebAPI/Plugin/RenderFileFromMirror.pm --- old/MirrorCache-1.065/lib/MirrorCache/WebAPI/Plugin/RenderFileFromMirror.pm 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/lib/MirrorCache/WebAPI/Plugin/RenderFileFromMirror.pm 2023-10-26 09:53:30.000000000 +0200 @@ -150,10 +150,10 @@ } if (!$file) { - return $c->render(status => 404, text => "File not found"); + return undef; } $c->log->error($c->dumper('RENDER FILE_ID', $file->{id})) if $MCDEBUG; - $c->res->headers->vary('Accept, COUNTRY'); + $c->res->headers->vary('Accept, COUNTRY, X-COUNTRY'); my $baseurl; # just hostname + eventual urldir (without folder and file) my $fullurl; # baseurl with path and filename if ($dm->metalink || $dm->meta4 || $dm->torrent || $dm->zsync || $dm->magnet) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/lib/MirrorCache/WebAPI/Plugin/RootRemote.pm new/MirrorCache-1.067/lib/MirrorCache/WebAPI/Plugin/RootRemote.pm --- old/MirrorCache-1.065/lib/MirrorCache/WebAPI/Plugin/RootRemote.pm 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/lib/MirrorCache/WebAPI/Plugin/RootRemote.pm 2023-10-26 09:53:30.000000000 +0200 @@ -141,10 +141,10 @@ } sub render_file { - my ($self, $dm, $filepath, $not_miss) = @_; + my ($self, $dm, $filepath, $not_miss, $from_nfs) = @_; my $c = $dm->c; my $nfs = $self->rootnfs; - if ($nfs && $dm->must_render_from_root && -f $nfs . $filepath) { + if ($nfs && ($dm->must_render_from_root || $from_nfs) && -f ($nfs . $filepath)) { $c->render_file(filepath => $nfs . $filepath, content_type => $dm->mime, content_disposition => 'inline'); $c->stat->redirect_to_root($dm, $not_miss); return 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/lib/MirrorCache/WebAPI.pm new/MirrorCache-1.067/lib/MirrorCache/WebAPI.pm --- old/MirrorCache-1.065/lib/MirrorCache/WebAPI.pm 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/lib/MirrorCache/WebAPI.pm 2023-10-26 09:53:30.000000000 +0200 @@ -76,7 +76,7 @@ my $db_provider = $mcconfig->db_provider; eval { - MirrorCache::Schema->connect_db ($mcconfig->db_provider, $mcconfig->dsn, $mcconfig->dbuser, $mcconfig->dbpass); + MirrorCache::Schema->connect_db ($mcconfig->db_provider, $mcconfig->dsn, $mcconfig->dbuser, $mcconfig->dbpass, $mcconfig->regions); MirrorCache::Schema->connect_replica($mcconfig->db_provider, $mcconfig->dsn_replica, $mcconfig->dbuser, $mcconfig->dbpass) if $mcconfig->dsn_replica; 1; } or warn("Database connect failed: $@"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/environ/01-smoke-mirror-provider.sh new/MirrorCache-1.067/t/environ/01-smoke-mirror-provider.sh --- old/MirrorCache-1.065/t/environ/01-smoke-mirror-provider.sh 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/environ/01-smoke-mirror-provider.sh 2023-10-26 09:53:30.000000000 +0200 @@ -8,9 +8,6 @@ ap8=$(environ ap8) ap7=$(environ ap7) -$mcmirror/gen_env MIRRORCACHE_MODE=mirror_provider - - $mcmirror/start $mcmirror/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap7/print_address)','','t','us','na'" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/environ/02-files-hashes.sh new/MirrorCache-1.067/t/environ/02-files-hashes.sh --- old/MirrorCache-1.065/t/environ/02-files-hashes.sh 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/environ/02-files-hashes.sh 2023-10-26 09:53:30.000000000 +0200 @@ -17,8 +17,18 @@ echo 1111111111 > $x/dt/folder1/file1.1.dat echo 1111111111 > $x/dt/folder1/file2.1.dat echo 2345 > $x/dt/folder1/file2.1.dat.zsync + echo 2345 > $x/dt/folder1/fileX.dat.zsync done +$mc/curl -I /download/folder1/file2.1.dat.zsync | grep '200 OK' +$mc/curl -I /download/folder1/fileX.dat.zsync | grep '200 OK' +$mc/curl -I /download/folder1/file2.1.dat.meta4 | grep '425' +$mc/curl -H 'Accept: Application/x-zsync' -I /download/folder1/file2.1.dat | grep '425' +$mc/curl -H 'Accept: Application/metalink+xml' -I /download/folder1/file2.1.dat | grep '425' +$mc/curl -H 'Accept: Application/metalink+xml, */*' -I /download/folder1/file2.1.dat | grep '200 OK' +$mc/curl -H 'Accept: Application/metalink+xml, Application/x-zsync' -I /download/folder1/file2.1.dat | grep '425' +$mc/curl -H 'Accept: Application/metalink+xml, Application/x-zsync, */*' -I /download/folder1/file2.1.dat | grep '200 OK' + # force scan $mc/backstage/job -e folder_sync -a '["/folder1"]' $mc/backstage/shoot diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/environ/03-headquarter-subsidiaries-hashes.sh new/MirrorCache-1.067/t/environ/03-headquarter-subsidiaries-hashes.sh --- old/MirrorCache-1.065/t/environ/03-headquarter-subsidiaries-hashes.sh 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/environ/03-headquarter-subsidiaries-hashes.sh 2023-10-26 09:53:30.000000000 +0200 @@ -66,6 +66,7 @@ for i in 9 6 7 8; do echo 1111111112 > mc$i/dt/folder1/file1.1.dat echo 1111111112 > mc$i/dt/folder1/file4.1.dat + echo 13 > mc$i/dt/folder1/file4.1.dat.zsync mc$i/backstage/job -e folder_sync -a '["/folder1"]' mc$i/backstage/shoot mc$i/backstage/shoot -q hashes @@ -76,12 +77,18 @@ echo Step 3. Add media symlinks and make sure they are imported properly for i in 9 6 7 8; do ( cd mc$i/dt/folder1/ && ln -s file4.1.dat file-Media.iso ) + ( cd mc$i/dt/folder1/ && ln -s file4.1.dat xcurr.dat ) + ( cd mc$i/dt/folder1/ && ln -s file4.1.dat.zsync xcurr.dat.zsync ) mc$i/backstage/job -e folder_sync -a '["/folder1"]' mc$i/backstage/shoot mc$i/backstage/shoot -q hashes mc$i/sql_test file4.1.dat == "select hash.target from hash join file on id = file_id where name='file-Media.iso'" - for x in '' .metalink .mirrorlist; do - mc$i/curl -I /folder1/file-Media.iso$x | grep -C 10 302 | grep /folder1/file4.1.dat$x | grep -v /download/folder1/file4.1.dat$x + for x in '' metalink mirrorlist; do + ext="" + par="" + [ -z "$x"] || ext=.$x + [ -z "$x"] || par=?$x + mc$i/curl -I /folder1/file-Media.iso$ext | grep -C 10 302 | grep /folder1/file4.1.dat$par | grep -v /download/folder1/file4.1.dat done done @@ -97,21 +104,39 @@ mc$i/backstage/shoot MIRRORCACHE_HASHES_IMPORT_RETRY_DELAY=$DELAY mc$i/backstage/shoot -q hashes if test $i != 9; then - test -z $(mc$i/sql "select md5 from hash where file_id=5") - test -z $(mc$i/sql "select md5 from hash where file_id=6") + test -z $(mc$i/sql "select md5 from hash where file_id=8") + test -z $(mc$i/sql "select md5 from hash where file_id=9") else - test $(mc$i/sql "select md5 from hash where file_id=5") == $(mc$i/sql 'select md5 from hash where file_id=6') - test $(mc$i/sql "select md5 from hash where file_id=3") != $(mc$i/sql 'select md5 from hash where file_id=6') + test $(mc$i/sql "select md5 from hash where file_id=8") == $(mc$i/sql 'select md5 from hash where file_id=9') + test $(mc$i/sql "select md5 from hash where file_id=3") != $(mc$i/sql 'select md5 from hash where file_id=8') fi done sleep $DELAY +mc9/curl -I /download/folder1/file-Media.iso | grep 'Location: /download/folder1/file4.1.dat' +mc9/curl -I /download/folder1/file-Media.iso.metalink | grep 'Location: /download/folder1/file4.1.dat?metalink=1' +mc9/curl -I /download/folder1/file-Media.iso.mirrorlist | grep 'Location: /download/folder1/file4.1.dat?mirrorlist=1' + +mc9/curl -I /download/folder1/xcurr.dat | grep "Location: http://$na_address/download/folder1/xcurr.dat" +mc9/curl -I /download/folder1/xcurr.dat.metalink | grep "Location: http://$na_address/download/folder1/xcurr.dat.metalink" +mc9/curl -I /download/folder1/xcurr.dat?meta4 | grep "Location: http://$na_address/download/folder1/xcurr.dat.meta4" +mc9/curl -I /download/folder1/xcurr.dat.mirrorlist | grep '200 OK' + +mc9/curl -I /download/folder1/xcurr.dat.zsync.mirrorlist | grep '200 OK' + +mc6/curl -IL /download/folder1/xcurr.dat | grep "200 OK" +mc6/curl -IL /download/folder1/xcurr.dat.metalink | grep "200 OK" +mc6/curl -IL /download/folder1/xcurr.dat?meta4 | grep "200 OK" +mc6/curl -IL /download/folder1/xcurr.dat.mirrorlist | grep '200 OK' + + + # now the hashes on subsidiaries should be retried and match the headquarter for i in 6 7 8; do mc$i/backstage/shoot -q hashes - test $(mc$i/sql "select md5 from hash where file_id=5") == $(mc9/sql 'select md5 from hash where file_id=6') - test $(mc$i/sql "select md5 from hash where file_id=6") == $(mc9/sql 'select md5 from hash where file_id=6') + test $(mc$i/sql "select md5 from hash where file_id=8") == $(mc9/sql 'select md5 from hash where file_id=9') + test $(mc$i/sql "select md5 from hash where file_id=3") != $(mc9/sql 'select md5 from hash where file_id=9') done echo success diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/environ/03-headquarter-subsidiaries.sh new/MirrorCache-1.067/t/environ/03-headquarter-subsidiaries.sh --- old/MirrorCache-1.065/t/environ/03-headquarter-subsidiaries.sh 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/environ/03-headquarter-subsidiaries.sh 2023-10-26 09:53:30.000000000 +0200 @@ -9,7 +9,8 @@ SMALL_FILE_SIZE=3 HUGE_FILE_SIZE=9 -FAKEURL="notexists${RANDOM}.com" +FAKEURL1="notexists${RANDOM}.com" +FAKEURL2="notexists${RANDOM}.com" for i in 6 7 8 9; do x=$(environ mc$i $(pwd)) @@ -18,6 +19,8 @@ echo -n 123 > $x/dt/folder1/filesmall1.1.dat echo -n 123456789 > $x/dt/folder1/filehuge1.1.dat echo '[]' > $x/dt/folder1/file.json + mkdir $x/dt/folder1/media.1 + echo 1 > $x/dt/folder1/media.1/media eval mc$i=$x done @@ -33,7 +36,9 @@ # deploy db $mc9/gen_env MIRRORCACHE_TOP_FOLDERS='folder1 folder2 folder3' \ MIRRORCACHE_HUGE_FILE_SIZE=$HUGE_FILE_SIZE \ - MIRRORCACHE_REDIRECT_HUGE=$FAKEURL \ + MIRRORCACHE_REDIRECT=$FAKEURL1 \ + MIRRORCACHE_REDIRECT_HUGE=$FAKEURL2 \ + MIRRORCACHE_ROOT_NFS="$mc9/dt" \ MIRRORCACHE_SMALL_FILE_SIZE=$SMALL_FILE_SIZE $mc9/backstage/shoot @@ -43,15 +48,13 @@ $mc9/db/sql "insert into subsidiary(hostname,region) select '$as_address','as'" $mc9/start -$mc6/gen_env MIRRORCACHE_REGION=na $mc6/start -$mc7/gen_env MIRRORCACHE_REGION=eu $mc7/start -$mc8/gen_env MIRRORCACHE_REGION=as $mc8/start echo the root folder is not redirected curl --interface $eu_interface -Is http://$hq_address/ | grep '200 OK' +curl --interface $eu_interface -Is http://$hq_address/download/folder1/media.1/media | grep '200 OK' echo check redirection from headquarter curl --interface $na_interface -Is http://$hq_address/download/folder1/filebig1.1.dat | grep "Location: http://$na_address/download/folder1/filebig1.1.dat" @@ -81,8 +84,8 @@ curl --interface $na_interface -Is http://$hq_address/download/folder1/filebig1.1.dat | grep "Location: http://$na_address/download/folder1/filebig1.1.dat" curl --interface $na_interface -Is http://$hq_address/download/folder1/filesmall1.1.dat | grep "200 OK" -echo check huge files are redirected to FAKEURL -curl --interface $hq_interface -Is http://$hq_address/download/folder1/filehuge1.1.dat | grep "Location: http://$FAKEURL/folder1/filehuge1.1.dat" +echo check huge files are redirected to FAKEURL2 +curl --interface $hq_interface -Is http://$hq_address/download/folder1/filehuge1.1.dat | grep "Location: http://$FAKEURL2/folder1/filehuge1.1.dat" echo test cache-control curl --interface $na_interface -Is http://$hq_address/download/folder1/filebig1.1.dat | grep -i 'cache-control' @@ -114,11 +117,11 @@ echo unless /download is asked explicitly $mc9/curl -H 'User-Agent: Chromium/xyz' /download/folder1/ | grep file.json -echo check metalink/mirrorlist for huge files reference FAKEURL, but need to scan them first +echo check metalink/mirrorlist for huge files reference FAKEURL2, but need to scan them first $mc9/backstage/job -e folder_sync_schedule_from_misses $mc9/backstage/job -e folder_sync_schedule $mc9/backstage/shoot -curl --interface $hq_interface -s http://$hq_address/download/folder1/filehuge1.1.dat.metalink | grep "http://$FAKEURL/folder1/filehuge1.1.dat" -curl --interface $hq_interface -s http://$hq_address/download/folder1/filehuge1.1.dat.mirrorlist | grep "http://$FAKEURL/folder1/filehuge1.1.dat" +curl --interface $hq_interface -s http://$hq_address/download/folder1/filehuge1.1.dat.metalink | grep "http://$FAKEURL2/folder1/filehuge1.1.dat" +curl --interface $hq_interface -s http://$hq_address/download/folder1/filehuge1.1.dat.mirrorlist | grep "http://$FAKEURL2/folder1/filehuge1.1.dat" echo success diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/environ/04-remote-current.sh new/MirrorCache-1.067/t/environ/04-remote-current.sh --- old/MirrorCache-1.065/t/environ/04-remote-current.sh 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/environ/04-remote-current.sh 2023-10-26 09:53:30.000000000 +0200 @@ -18,8 +18,10 @@ echo $x/dt/{folder1,folder2,folder3}/{file1.1,file2.1}-Media.iso | xargs -n 1 touch sha256sum $x/dt/folder1/file1.1-Media.iso > $x/dt/folder1/file1.1-Media.iso.sha256 echo 111112 > $x/dt/folder1/file2.1-Media.iso + echo 111113 > $x/dt/folder1/file2.1-Media.iso.zsync sha256sum $x/dt/folder1/file2.1-Media.iso > $x/dt/folder1/file2.1-Media.iso.sha256 ( cd $x/dt/folder1 && ln -s file1.1-Media.iso file-Media.iso && ln -s file1.1-Media.iso.sha256 file-Media.iso.sha256 ) + ( cd $x/dt/folder1 && ln -s file2.1-Media.iso.zsync file-Media.iso.zsync ) done for x in $ap7 $ap8 $ap9; do @@ -45,6 +47,9 @@ $mc/curl -I /download/folder1/file-Media.iso.sha256 | grep -C 10 302 | grep /download/folder1/file1.1-Media.iso.sha256 $mc/curl -L /download/folder1/file-Media.iso.sha256 | grep -q "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 " +$mc/curl -I /download/folder1/file2.1-Media.iso.zsync | grep --color=never -P 'Location: http://127.0.0.1:1324/folder1/file2.1-Media.iso.zsync\r$' +$mc/curl -I /download/folder1/file-Media.iso.zsync | grep --color=never -P 'file2.1-Media.iso.zsync\r$' + echo now change the symlink and make sure redirect changes ( cd $ap9/dt/folder1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/environ/04-remote-nfs.sh new/MirrorCache-1.067/t/environ/04-remote-nfs.sh --- old/MirrorCache-1.065/t/environ/04-remote-nfs.sh 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/environ/04-remote-nfs.sh 2023-10-26 09:53:30.000000000 +0200 @@ -26,6 +26,9 @@ for x in $ap7 $ap8 $ap9 $mc1 $mc2; do mkdir -p $x/dt/{folder1,folder2,folder3} echo $x/dt/{folder1,folder2,folder3}/{file1.1,file2.1}.dat | xargs -n 1 touch + echo 111112 > $x/dt/folder1/file2.1-Media.iso + echo 111113 > $x/dt/folder1/file2.1-Media.iso.zsync + ( cd $x/dt/folder1 && ln -s file2.1-Media.iso.zsync file-Media.iso.zsync ) mkdir -p $x/dt/updates/tool ( @@ -77,4 +80,13 @@ echo now we learned about all 3 folders $mc2/sql_test 3 == 'select count(*) from folder' +$mc2/curl -H 'Accept: Application/x-zsync' -IL /download/folder1/file-Media.iso.zsync | grep '404 Not Found' +$mc2/curl -H 'Accept: Application/x-zsync' -I /download/folder1/file2.1-Media.iso.zsync | grep '404 Not Found' # we don't have zhashes for this file +$mc2/curl -H 'Accept: Application/x-zsync' -I /download/folder1/file2.1-Media.iso | grep '404 Not Found' # we don't have zhashes for this file +$mc2/curl -H 'Accept: Application/metalink+xml' -I /download/folder1/file2.1-Media.iso | grep '200 OK' +$mc2/curl -H 'Accept: Application/metalink+xml, */*' -I /download/folder1/file2.1-Media.iso | grep '200 OK' +$mc2/curl -H 'Accept: Application/metalink+xml, */*' -I /download/folder1/file-Media.iso.zsync | grep --color=never -P '/download/folder1/file2.1-Media.iso.zsync\r$' + +$mc2/curl -I /download/folder1/file-Media.iso.zsync | grep --color=never -P '/download/folder1/file2.1-Media.iso.zsync\r$' + echo success diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/environ/09-stability-force2.sh new/MirrorCache-1.067/t/environ/09-stability-force2.sh --- old/MirrorCache-1.065/t/environ/09-stability-force2.sh 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/environ/09-stability-force2.sh 2023-10-26 09:53:30.000000000 +0200 @@ -3,13 +3,16 @@ mc=$(environ mc $(pwd)) +$mc/gen_env MIRRORCACHE_REGIONS=sa,us-west # when REGIONS is specified - ap9 mirror from another region will be ignored + $mc/start $mc/status +ap9=$(environ ap9) ap8=$(environ ap8) ap7=$(environ ap7) -for x in $mc $ap7 $ap8; do +for x in $mc $ap7 $ap8 $ap9; do mkdir -p $x/dt/{folder1,folder2,folder3} echo $x/dt/{folder1,folder2,folder3}/{file1.1,file2.1}.dat | xargs -n 1 touch done @@ -20,28 +23,40 @@ $ap8/start $ap8/curl /folder1/ | grep file1.1.dat -$mc/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap7/print_address)','','t','us','na'" +$ap9/start +$ap9/curl /folder1/ | grep file1.1.dat + +$mc/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap7/print_address)','','t','br','sa'" $mc/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap8/print_address)','','t','us','na'" +$mc/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap9/print_address)','','t','de','eu'" + +$mc/sql "insert into server_capability_declaration(server_id, capability, enabled, extra) select '2','region','t','us-west'" $mc/curl -I /download/folder1/file1.1.dat -$mc/backstage/job -e mirror_probe -a '["us"]' +$mc/backstage/job -e mirror_probe $mc/backstage/job folder_sync_schedule_from_misses $mc/backstage/job folder_sync_schedule $mc/backstage/shoot $mc/backstage/job mirror_scan_schedule $mc/backstage/shoot -# check redirection works +echo check redirection works $mc/curl -I /download/folder1/file1.1.dat | grep 302 +echo no eu mirror in metalink +rc=0 +$mc/curl /download/folder1/file1.1.dat.meta4 | grep $($ap9/print_address) || rc=$? +test $rc -gt 0 # now shut down ap7 and do probe $ap7/stop -$mc/backstage/job -e mirror_probe -a '["us"]' +$mc/backstage/job -e mirror_probe $mc/backstage/shoot # check that ap7 is marked correspondingly in server_capability_check -test 1 == $($mc/db/sql "select count(*) from server_capability_check where server_id=1 and capability='http'") +$mc/sql_test 1 == "select count(*) from server_capability_check where server_id=1 and capability='http'" +# echo ap9 is from europe so will not be checked +$mc/sql_test 0 == "select count(*) from server_capability_check where server_id=3" # add 4 more failures from the past into DB $mc/sql "insert into server_capability_check(server_id, capability, dt) select 1, 'http', min(dt) - interval '15 minute' from server_capability_check" @@ -51,9 +66,9 @@ $mc/sql "insert into server_capability_check(server_id, capability, dt) select 1, 'https', min(dt) - interval '15 minute' from server_capability_check" $mc/sql "insert into server_capability_check(server_id, capability, dt) select 1, 'https', min(dt) - interval '15 minute' from server_capability_check" -# make sure we added properly +echo make sure we added properly test 5 == $($mc/db/sql "select count(*) from server_capability_check where server_id=1 and capability='http'") -# we have inserted 2, plus 2 from manual runs of 'mirror_probe' job, plus 1 'mirror_probe' was scheduled from 'mirror_scan' +echo we have inserted 2, plus 2 from manual runs of 'mirror_probe' job, plus 1 'mirror_probe' was scheduled from 'mirror_scan' test 5 == $($mc/db/sql "select count(*) from server_capability_check where server_id=1 and capability='https'") $mc/backstage/job -e mirror_force_downs @@ -62,23 +77,30 @@ test 1 == $($mc/db/sql "select count(*) from server_capability_force where server_id=1 and capability='https'") test 1 == $($mc/db/sql "select count(*) from server_capability_force where server_id=1 and capability='http'") -# age entry, so next job will consider it +echo age entry, so next job will consider it $mc/sql "update server_capability_force set dt = dt - interval '3 hour'" -# now start back ap7 and shut down ap8 but ap7 is not redirected, because it is force disabled +echo now start back ap7 and shut down ap8 but ap7 is not redirected, because it is force disabled $ap7/start $ap8/stop -$mc/backstage/job -e mirror_probe -a '["us"]' +$mc/backstage/job -e mirror_probe $mc/backstage/shoot rc=0 -$mc/curl -I /download/folder1/file1.1.dat | grep $($ap7/print_address) || rc=$? +$mc/curl -I /download/folder1/file1.1.dat?COUNTRY=br | grep $($ap7/print_address) || rc=$? test $rc -gt 0 -# now scan those mirrors which were force disabled +echo now scan those mirrors which were force disabled $mc/backstage/job -e mirror_force_ups -$mc/backstage/job -e mirror_probe -a '["us"]' +$mc/backstage/job -e mirror_probe $mc/backstage/shoot -# ap7 now should serve the request -$mc/curl -I /download/folder1/file1.1.dat | grep $($ap7/print_address) +echo ap7 now should serve the request +$mc/curl -I /download/folder1/file1.1.dat?COUNTRY=br | grep $($ap7/print_address) + +echo still no eu mirror in metalink +rc=0 +$mc/curl /download/folder1/file1.1.dat.meta4 | grep $($ap9/print_address) || rc=$? +test $rc -gt 0 + +echo success diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/environ/14-project-hq-regions.sh new/MirrorCache-1.067/t/environ/14-project-hq-regions.sh --- old/MirrorCache-1.065/t/environ/14-project-hq-regions.sh 1970-01-01 01:00:00.000000000 +0100 +++ new/MirrorCache-1.067/t/environ/14-project-hq-regions.sh 2023-10-26 09:53:30.000000000 +0200 @@ -0,0 +1,169 @@ +#!lib/test-in-container-environ.sh +set -ex + +# environ by number: +# 9 - headquarter with REGIONS=eu,sa,af +# 6 - NA subsidiary +# 7 - EU subsidiary (same DB as hq) +# 8 - ASIA subsidiary + +# all mirrors are centralized in hq and imported by subsidiaries with MIRROR_PROVIDER +# hq mirrors: ap1 ap2 +# na mirrors: ap3 ap4 +# eu mirrors: ap5 ap6 +# as mirrors: ap7 ap8 + +for i in 6 7 8 9; do + x=$(environ mc$i $(pwd)) + mkdir -p $x/dt/{project1,project2}/{folder1,folder2,folder3} + echo $x/dt/{project1,project2}/{folder1,folder2,folder3}/{file1.1,file2.1}.dat | xargs -n 1 touch + eval mc$i=$x +done + +for i in 1 2 3 4 5 6 7 8; do + x=$(environ ap$i) + mkdir -p $x/dt/{project1,project2}/{folder1,folder2,folder3} + echo $x/dt/{project1,project2}/{folder1,folder2,folder3}/{file1.1,file2.1}.dat | xargs -n 1 touch + $x/start + eval ap$i=$x +done + +hq_address=$($mc9/print_address) +na_address=$($mc6/print_address) +na_interface=127.0.0.2 +eu_address=$($mc7/print_address) +eu_interface=127.0.0.3 +as_address=$($mc8/print_address) +as_interface=127.0.0.4 + +# deploy db +$mc9/gen_env MIRRORCACHE_REGIONS=eu,sa,af +$mc9/backstage/shoot + +$mc9/sql "insert into subsidiary(hostname,region) select '$na_address','na'" +$mc9/sql "insert into subsidiary(hostname,region,local) select '$eu_address','eu','t'" +$mc9/sql "insert into subsidiary(hostname,region) select '$as_address','as'" +$mc9/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap1/print_address)','','t','br','sa'" +$mc9/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap2/print_address)','','t','br','sa'" +$mc9/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap5/print_address)','','t','de','eu'" +$mc9/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap6/print_address)','','t','dk','eu'" +$mc9/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap3/print_address)','','t','us','na'" +$mc9/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap4/print_address)','','t','ca','na'" +$mc9/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap7/print_address)','','t','jp','as'" +$mc9/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap8/print_address)','','t','jp','as'" + +$mc9/start + +$mc6/gen_env MIRRORCACHE_MIRROR_PROVIDER=$($mc9/print_address)/rest/server_location?region=na +$mc6/start +$mc6/backstage/shoot +echo test mirrors imported to mc6 +$mc6/sql_test 2 == "select count(*) from server" + +$mc7/gen_env +rm -r $mc7/db +ln -s $mc9/db $mc7/db +$mc7/start + +$mc8/gen_env MIRRORCACHE_MIRROR_PROVIDER=$($mc9/print_address)/rest/server_location?region=as +$mc8/start +$mc8/backstage/shoot +echo test mirrors imported to mc8 +$mc8/sql_test 2 == "select count(*) from server" + + + +for i in 6 8 9; do + mc$i/sql "insert into project(name,path,etalon) select 'proj1','/project1', min(id) from server" + mc$i/sql "insert into project(name,path,etalon) select 'proj 2','/project2', min(id) from server" + mc$i/backstage/job -e folder_sync -a '["/project1/folder1"]' + mc$i/backstage/job -e mirror_scan -a '["/project1/folder1"]' + mc$i/backstage/job -e folder_sync -a '["/project1/folder2"]' + mc$i/backstage/job -e mirror_scan -a '["/project1/folder2"]' + mc$i/backstage/job -e folder_sync -a '["/project2/folder1"]' + mc$i/backstage/job -e mirror_scan -a '["/project2/folder1"]' + mc$i/backstage/shoot + mc$i/backstage/job -e report -a '["once"]' + mc$i/backstage/shoot +done + +echo project1 to eu if we contacted hq from na +$mc9/sql "update project set redirect = 'na:$eu_address/download' where id = 1" +echo project2 to na even if we contacted hq from as or eu +$mc9/sql "update project set redirect = 'as:$na_address/download;eu:$na_address/download' where id = 2" +echo test project1 redirects +$mc9/curl --interface $na_interface -I /download/project1/folder1/file1.1.dat | grep "$eu_address" +$mc9/curl --interface $eu_interface -I /download/project1/folder1/file1.1.dat | grep "$eu_address" + +echo test project2 redirects +$mc9/curl --interface $eu_interface -I /download/project2/folder1/file1.1.dat | grep "$na_address" +$mc9/curl --interface $as_interface -I /download/project2/folder1/file1.1.dat | grep "$na_address" +$mc9/curl --interface $as_interface -IL /download/project2/folder1/file1.1.dat | grep -E "$($ap3/print_address)|$($ap4/print_address)" +$mc9/curl --interface $na_interface -I /download/project2/folder1/file1.1.dat | grep "$na_address" + +echo "Let's pretend proj 2 has no good mirrors in as and we redirect all requests from it to na subsidiary" +$mc8/sql "update project set redirect = '$na_address/download' where id = 2" + +echo project1 redirects to regular mirror +$mc8/curl -I /download/project1/folder1/file1.1.dat | grep -E "$($ap7/print_address)|$($ap8/print_address)" + +echo project2 redirects to na +$mc8/curl -I /download/project2/folder1/file1.1.dat | grep $na_address/download/project2/folder1/file1.1.dat +$mc8/curl -IL /download/project2/folder1/file1.1.dat | grep -E "$($ap3/print_address)|$($ap4/print_address)" + + +# all countries present in report +$mc9/curl /rest/repmirror \ + | grep '"country":"br"' \ + | grep '"country":"de"' \ + | grep '"country":"dk"' \ + | grep '"country":"ca"' \ + | grep '"country":"us"' \ + | grep '"country":"jp"' \ + | grep -F '"region":"na (http:\/\/127.0.0.1:3160)"' + +allmirrorspattern="$(ap1/print_address)" +for i in {2..8}; do + x=ap$i + allmirrorspattern="$allmirrorspattern|$($x/print_address)" +done + +# all mirrors are mentioned in html report +test 8 == $($mc9/curl -i /report/mirrors | grep -A500 '200 OK' | grep -Eo $allmirrorspattern | sort | uniq | wc -l) + +echo collect report when one of the instances is down +$mc6/stop + +$mc9/backstage/job -e report -a '["once"]' +$mc9/backstage/shoot + +$mc9/curl /rest/repmirror \ + | grep '"country":"br"' \ + | grep '"country":"de"' \ + | grep '"country":"dk"' \ + | grep '"country":"ca"' \ + | grep '"country":"us"' \ + | grep '"country":"jp"' \ + | grep -F '"region":"na (http:\/\/127.0.0.1:3160)"' + +# all mirrors are mentioned in html report +test 8 == $($mc9/curl -i /report/mirrors | grep -A500 '200 OK' | grep -Eo $allmirrorspattern | sort | uniq | wc -l) + +echo also when the main db is down +$mc9/db/stop + +$mc9/curl /rest/repmirror \ + | grep '"country":"br"' \ + | grep '"country":"de"' \ + | grep '"country":"dk"' \ + | grep '"country":"ca"' \ + | grep '"country":"us"' \ + | grep '"country":"jp"' \ + | grep -F '"region":"na (http:\/\/127.0.0.1:3160)"' + +# all mirrors are mentioned in html report +test 8 == $($mc9/curl -i /report/mirrors | grep -A500 '200 OK' | grep -Eo $allmirrorspattern | sort | uniq | wc -l) + +$mc9/db/start + +echo success diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/environ/14-project-hq.sh new/MirrorCache-1.067/t/environ/14-project-hq.sh --- old/MirrorCache-1.065/t/environ/14-project-hq.sh 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/environ/14-project-hq.sh 2023-10-26 09:53:30.000000000 +0200 @@ -48,17 +48,14 @@ $mc9/start -$mc6/gen_env MIRRORCACHE_REGION=na MIRRORCACHE_HEADQUARTER=$hq_address $mc6/start $mc6/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap3/print_address)','','t','us','na'" $mc6/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap4/print_address)','','t','ca','na'" -$mc7/gen_env MIRRORCACHE_REGION=eu MIRRORCACHE_HEADQUARTER=$hq_address rm -r $mc7/db ln -s $mc9/db $mc7/db $mc7/start -$mc8/gen_env MIRRORCACHE_REGION=as MIRRORCACHE_HEADQUARTER=$hq_address $mc8/start $mc8/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap7/print_address)','','t','jp','as'" $mc8/sql "insert into server(hostname,urldir,enabled,country,region) select '$($ap8/print_address)','','t','jp','as'" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/lib/Dockerfile.environ.mariadb new/MirrorCache-1.067/t/lib/Dockerfile.environ.mariadb --- old/MirrorCache-1.065/t/lib/Dockerfile.environ.mariadb 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/lib/Dockerfile.environ.mariadb 2023-10-26 09:53:30.000000000 +0200 @@ -1,11 +1,11 @@ -FROM opensuse/leap:15.4 +FROM opensuse/leap:15.5 ENV container docker ENV LANG en_US.UTF-8 RUN sed -i 's,http://download.opensuse.org,http://mirrorcache.opensuse.org/download,g' /etc/zypp/repos.d/*repo -RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.4 mc -RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/devel:/languages:/perl/15.4 perl +RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.5 mc +RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/devel:/languages:/perl/15.5 perl RUN zypper --gpg-auto-import-keys ref # install MirrorCache here to fetch all dependencies diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/lib/Dockerfile.environ.mariadb.experimental new/MirrorCache-1.067/t/lib/Dockerfile.environ.mariadb.experimental --- old/MirrorCache-1.065/t/lib/Dockerfile.environ.mariadb.experimental 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/lib/Dockerfile.environ.mariadb.experimental 2023-10-26 09:53:30.000000000 +0200 @@ -1,12 +1,12 @@ -FROM opensuse/leap:15.4 +FROM opensuse/leap:15.5 ENV container docker ENV LANG en_US.UTF-8 -RUN sed -i 's,http://download.opensuse.org,http://mirrorcache.opensuse.org/download,g' /etc/zypp/repos.d/*repo -RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.4 mc -RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/devel:/languages:/perl/15.4 perl -RUN zypper ar -f https://mirror.mariadb.org/yum/11.0.1/sles/15.4/x86_64 mariadb +RUN zypper -n in curl # rpm --import needs curl atm +RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.5 mc +RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/devel:/languages:/perl/15.5 perl +RUN zypper ar -f https://mirror.mariadb.org/yum/11.2.1/sles/15/x86_64 mariadb RUN rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB RUN zypper --gpg-auto-import-keys ref diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/lib/Dockerfile.environ.postgresql new/MirrorCache-1.067/t/lib/Dockerfile.environ.postgresql --- old/MirrorCache-1.065/t/lib/Dockerfile.environ.postgresql 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/lib/Dockerfile.environ.postgresql 2023-10-26 09:53:30.000000000 +0200 @@ -1,10 +1,10 @@ -FROM opensuse/leap:15.4 +FROM opensuse/leap:15.5 ENV container docker ENV LANG en_US.UTF-8 RUN sed -i 's,http://download.opensuse.org,http://mirrorcache.opensuse.org/download,g' /etc/zypp/repos.d/*repo -RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.4 mc +RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.5 mc RUN zypper --gpg-auto-import-keys ref # install MirrorCache here to fetch all dependencies diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/lib/Dockerfile.systemd.mariadb new/MirrorCache-1.067/t/lib/Dockerfile.systemd.mariadb --- old/MirrorCache-1.065/t/lib/Dockerfile.systemd.mariadb 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/lib/Dockerfile.systemd.mariadb 2023-10-26 09:53:30.000000000 +0200 @@ -1,9 +1,9 @@ -FROM registry.opensuse.org/opensuse/leap:15.4 +FROM registry.opensuse.org/opensuse/leap:15.5 ENV container podman ENV LANG en_US.UTF-8 -RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.4 mc +RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.5 mc RUN zypper --gpg-auto-import-keys ref RUN zypper -vvvn install systemd curl sudo iputils vi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/t/lib/Dockerfile.systemd.postgresql new/MirrorCache-1.067/t/lib/Dockerfile.systemd.postgresql --- old/MirrorCache-1.065/t/lib/Dockerfile.systemd.postgresql 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/t/lib/Dockerfile.systemd.postgresql 2023-10-26 09:53:30.000000000 +0200 @@ -1,9 +1,9 @@ -FROM registry.opensuse.org/opensuse/leap:15.4 +FROM registry.opensuse.org/opensuse/leap:15.5 ENV container podman ENV LANG en_US.UTF-8 -RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.4 mc +RUN zypper ar -f http://mirrorcache.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.5 mc RUN zypper --gpg-auto-import-keys ref RUN zypper -vvvn install systemd curl sudo iputils vi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/templates/app/myserver/index.html.ep new/MirrorCache-1.067/templates/app/myserver/index.html.ep --- old/MirrorCache-1.065/templates/app/myserver/index.html.ep 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/templates/app/myserver/index.html.ep 2023-10-26 09:53:30.000000000 +0200 @@ -17,6 +17,11 @@ </div> %= include 'layouts/info' + % if (eval ('$mirror_provider_url')) { + <div id="regionmirrorproviderpanel" class="card"> + <span>This view is readonly, it is imported from <a href=<%= eval('$mirror_provider_url') %>>mirror provider</a></span> + </div> + % } <table id="myservers" class="admintable table table-striped"> <thead> @@ -38,7 +43,7 @@ <tbody> </tbody> </table> - % if (current_user) { + % if (current_user && !eval('$mirror_provider_url')) { <div class="text-center"> <input value="New mirror" onclick="addAdminTableRow();" type="button" class="btn btn-default"/> </div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/templates/app/server/index.html.ep new/MirrorCache-1.067/templates/app/server/index.html.ep --- old/MirrorCache-1.065/templates/app/server/index.html.ep 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/templates/app/server/index.html.ep 2023-10-26 09:53:30.000000000 +0200 @@ -17,6 +17,11 @@ </div> %= include 'layouts/info' + % if (eval ('$mirror_provider_url')) { + <div id="regionmirrorproviderpanel" class="card"> + <span>This view is readonly, it is imported from <a href=<%= eval('$mirror_provider_url') %>>mirror provider</a></span> + </div> + % } <table id="servers" class="admintable table table-striped"> <thead> @@ -38,7 +43,7 @@ <tbody> </tbody> </table> - % if (is_admin) { + % if (is_admin && !eval('$mirror_provider_url')) { <div class="text-center"> <input value="New mirror" onclick="addAdminTableRow();" type="button" class="btn btn-default"/> </div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/MirrorCache-1.065/templates/app/server/show.html.ep new/MirrorCache-1.067/templates/app/server/show.html.ep --- old/MirrorCache-1.065/templates/app/server/show.html.ep 2023-09-28 12:08:56.000000000 +0200 +++ new/MirrorCache-1.067/templates/app/server/show.html.ep 2023-10-26 09:53:30.000000000 +0200 @@ -3,12 +3,18 @@ % content_for 'ready_function' => begin is_operator = <%= (is_operator) ? 'true' : 'false' %>; - server_id = <%= $server->{id} %>; + server_id = <%= $server->{id} %>; + subsidiary = "<%= $server->{subsidiary} %>"; + provider = "<%= $server->{provider} %>"; if (is_operator) { hostname = "<%= $server->{hostname} %>"; - setupServerNote(hostname); + if (!provider) { + setupServerNote(hostname); + } + } + if (!subsidiary) { + setupServerIncident(server_id); } - setupServerIncident(server_id); % end <div class="row"> @@ -33,6 +39,11 @@ % if (is_operator) { <h3>Private notes</h3> +% if ($server->{provider}) { + <div> + Can be found at <a href="https://<%= $server->{provider} . "/app/server/" . $server->{hostname} %>"><%= $server->{provider} %></a> + </div> +% } else { <table id="server_note" class="table table-striped"> <thead> <th>Date</th> @@ -52,9 +63,15 @@ <input type="text" id="new-note-text" name="new-note-text" onkeyup="addServerNoteButtonStatus()"> <input value="add" id="new-note-submit" onclick="addServerNote(hostname, document.getElementById('new-note-select').value, document.getElementById('new-note-text').value);" type="button" class="btn btn-default" disabled/> </div> +% } % } <h3>Checks last two weeks</h3> +% if ($server->{subsidiary}) { + <div> + Can be found at <a href="<%= $server->{subsidiary} . "/app/server/" . $server->{hostname} %>"><%= $server->{subsidiary} %></a> + </div> +% } else { <table id="server_incident" class="table table-striped"> <thead> <th>Date</th> @@ -62,6 +79,7 @@ <th>Error</th> </thead> </table> +% } </div> </div> ++++++ MirrorCache.obsinfo ++++++ --- /var/tmp/diff_new_pack.F8aQQx/_old 2023-11-02 20:22:29.770101404 +0100 +++ /var/tmp/diff_new_pack.F8aQQx/_new 2023-11-02 20:22:29.774101552 +0100 @@ -1,5 +1,5 @@ name: MirrorCache -version: 1.065 -mtime: 1695895736 -commit: e5837a4b182eb631487b5c86d4226642fd7d2f9d +version: 1.067 +mtime: 1698306810 +commit: 83c5ff67696a9c7783f798d8a14b816bc445ce20