summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
authorJulian Andres Klode <julian.klode@canonical.com>2023-05-17 17:18:33 +0200
committerJulian Andres Klode <julian.klode@canonical.com>2023-05-24 11:22:44 +0200
commit48cbc5413fb2a0e490c2282b9df65da96ad7a9f2 (patch)
tree9ba6675fcf15bf32e830a419b189840fa12836ca /apt-pkg
parent9da15d149f97e0f26cf5b7e32405512a5e63523c (diff)
Seed snapshot servers for well-known hosts
This will attempt to fallback to a per-server setting if we could not determine a value from the release file.
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/deb/debmetaindex.cc40
-rw-r--r--apt-pkg/init.cc7
2 files changed, 38 insertions, 9 deletions
diff --git a/apt-pkg/deb/debmetaindex.cc b/apt-pkg/deb/debmetaindex.cc
index 4133540ab..ddc246349 100644
--- a/apt-pkg/deb/debmetaindex.cc
+++ b/apt-pkg/deb/debmetaindex.cc
@@ -1295,20 +1295,42 @@ class APT_HIDDEN debSLTypeDebian : public pkgSourceList::Type /*{{{*/
Options.emplace("SHADOWED", "true");
+ ::URI ArchiveURI(URI);
+ // Trim trailing and leading / from the path because we don't want them when calculating snapshot url
+ if (not ArchiveURI.Path.empty() && ArchiveURI.Path[ArchiveURI.Path.length() - 1] == '/')
+ ArchiveURI.Path.erase(ArchiveURI.Path.length() - 1);
+ if (not ArchiveURI.Path.empty() && ArchiveURI.Path[0] == '/')
+ ArchiveURI.Path.erase(0, 1);
+ std::string Server;
+
auto const Deb = GetDebReleaseIndexBy(List, URI, Dist, Options);
std::string filename;
- if (not ReleaseFileName(Deb, filename))
- return _error->Error("Cannot identify snapshot server for %s %s - run update without snapshot id first", URI.c_str(), Dist.c_str());
- auto OldDeb = dynamic_cast<debReleaseIndex *>(Deb->UnloadedClone());
- if (not OldDeb->Load(filename, nullptr))
- return _error->Error("Cannot identify snapshot server for %s %s - run update without snapshot id first", URI.c_str(), Dist.c_str());
- auto Server = SnapshotServer(OldDeb);
- delete OldDeb;
+ // The Release file and config based on that should be the ultimate source of truth.
+ if (ReleaseFileName(Deb, filename))
+ {
+ auto OldDeb = dynamic_cast<debReleaseIndex *>(Deb->UnloadedClone());
+ if (not OldDeb->Load(filename, nullptr))
+ return _error->Error("Cannot identify snapshot server for %s %s - run update without snapshot id first", URI.c_str(), Dist.c_str());
+ Server = SnapshotServer(OldDeb);
+ delete OldDeb;
+ }
if (Server.empty())
+ {
+ // We did not find a server based on the release file.
+ // Lookup a fallback based on the host. For a.b.c, this will try a.b.c, .b.c, and .c to allow generalization for cc.archive.ubuntu.com
+ for (std::string Host = ArchiveURI.Host; not Host.empty() && Server.empty(); Host = Host.find(".", 1) != Host.npos ? Host.substr(Host.find(".", 1)) : "")
+ Server = _config->Find("Acquire::Snapshots::URI::Host::" + Host);
+ if (Server == "no")
+ Server = "";
+ }
+ if (Server.empty())
+ {
+ if (filename.empty())
+ return _error->Error("Cannot identify snapshot server for %s %s - run update without snapshot id first", URI.c_str(), Dist.c_str());
return _error->Error("Snapshots not supported for %s %s", URI.c_str(), Dist.c_str());
-
- auto SnapshotURI = SubstVar(Server, "@SNAPSHOTID@", Snapshot);
+ }
+ auto SnapshotURI = SubstVar(SubstVar(Server, "@SNAPSHOTID@", Snapshot), "@PATH@", ArchiveURI.Path);
if (not CreateItemInternalOne(List, SnapshotURI, Dist, Section, IsSrc, SnapshotOptions))
return false;
diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc
index f70dbf308..3990a1f39 100644
--- a/apt-pkg/init.cc
+++ b/apt-pkg/init.cc
@@ -212,6 +212,13 @@ bool pkgInitConfig(Configuration &Cnf)
Cnf.CndSet("Acquire::Snapshots::URI::Origin::Debian", "https://snapshot.debian.org/archive/debian/@SNAPSHOTID@/");
Cnf.CndSet("Acquire::Snapshots::URI::Override::Label::Debian-Security", "https://snapshot.debian.org/archive/debian-security/@SNAPSHOTID@/");
Cnf.CndSet("Acquire::Snapshots::URI::Origin::Ubuntu", "https://snapshot.ubuntu.com/ubuntu/@SNAPSHOTID@/");
+ // Preseeds by host
+ Cnf.CndSet("Acquire::Snapshots::URI::Host::archive.ubuntu.com", "https://snapshot.ubuntu.com/@PATH@/@SNAPSHOTID@/");
+ Cnf.CndSet("Acquire::Snapshots::URI::Host::deb.debian.org", "https://snapshot.debian.org/archive/@PATH@/@SNAPSHOTID@/");
+ Cnf.CndSet("Acquire::Snapshots::URI::Host::.archive.ubuntu.com", "https://snapshot.ubuntu.com/@PATH@/@SNAPSHOTID@/");
+ Cnf.CndSet("Acquire::Snapshots::URI::Host::security.ubuntu.com", "https://snapshot.ubuntu.com/@PATH@/@SNAPSHOTID@/");
+ Cnf.CndSet("Acquire::Snapshots::URI::Host::ppa.launchpadcontent.net", "https://snapshot.ppa.launchpadcontent.net/@PATH@/@SNAPSHOTID@/");
+ Cnf.CndSet("Acquire::Snapshots::URI::Host::ppa.launchpad.net", "https://snapshot.ppa.launchpadcontent.net/@PATH@/@SNAPSHOTID@/");
Cnf.CndSet("DPkg::Path", "/usr/sbin:/usr/bin:/sbin:/bin");