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
 

Reply via email to