summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/init.cc1
-rw-r--r--debian/apt.dirs1
-rw-r--r--doc/examples/configure-index7
-rw-r--r--methods/mirror.cc56
-rw-r--r--methods/mirror.h1
-rw-r--r--po/apt-all.pot4
6 files changed, 57 insertions, 13 deletions
diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc
index b47378d4a..fe085a75e 100644
--- a/apt-pkg/init.cc
+++ b/apt-pkg/init.cc
@@ -54,6 +54,7 @@ bool pkgInitConfig(Configuration &Cnf)
Cnf.Set("Dir::State::lists","lists/");
Cnf.Set("Dir::State::cdroms","cdroms.list");
+ Cnf.Set("Dir::State::mirrors","mirrors/");
// Cache
Cnf.Set("Dir::Cache","var/cache/apt/");
diff --git a/debian/apt.dirs b/debian/apt.dirs
index e1cb738fa..b81878baa 100644
--- a/debian/apt.dirs
+++ b/debian/apt.dirs
@@ -5,5 +5,6 @@ etc/apt
etc/apt/sources.list.d
var/cache/apt/archives/partial
var/lib/apt/lists/partial
+var/lib/apt/mirrors/partial
var/lib/apt/periodic
usr/share/bug/apt
diff --git a/doc/examples/configure-index b/doc/examples/configure-index
index 0f0abc30c..cb20d767b 100644
--- a/doc/examples/configure-index
+++ b/doc/examples/configure-index
@@ -160,6 +160,11 @@ Acquire
{
Options {"--ignore-time-conflict";} // not very usefull on a normal system
};
+
+ mirror
+ {
+ RefreshInterval "360"; // refresh interval in minutes
+ };
};
// Directory layout
@@ -258,9 +263,9 @@ Debug
Acquire::Ftp "false"; // Show ftp command traffic
Acquire::Http "false"; // Show http command traffic
Acquire::gpgv "false"; // Show the gpgv traffic
+ Acquire::Mirror "false"; // Show debugging of the mirror method
aptcdrom "false"; // Show found package files
IdentCdrom "false";
-
}
/* Whatever you do, do not use this configuration file!! Take out ONLY
diff --git a/methods/mirror.cc b/methods/mirror.cc
index 4de981522..e70a40f55 100644
--- a/methods/mirror.cc
+++ b/methods/mirror.cc
@@ -18,6 +18,7 @@
#include <fstream>
#include <iostream>
#include <stdarg.h>
+#include <sys/stat.h>
using namespace std;
@@ -28,11 +29,16 @@ using namespace std;
/*
* TODO:
+ * - send expected checksum to the mirror method so that
+ some checking/falling back can be done here already
+ * - keep the mirror file around in /var/lib/apt/mirrors
+ * can't be put into lists/ because of the listclearer
+ * cleanup by time (mtime relative to the other mtimes)
+ * - use a TTL time the mirror file is fetched again (6h?)
+ * - deal with runing as non-root because we can't write to the lists
+ dir then -> use the cached mirror file
* - better method to download than having a pkgAcquire interface here
- * - support keeping the mirror file around (evil listclearer strikes again)
- * -> /var/lib/apt/mirrors dir? how to cleanup? by time?
- * - provide some TTL time until the mirror file is get again (1h? 6h?)
- * - deal with runing as non-root (we can't write to the lists dir then)
+ * - magicmarker is (a bit) evil
* - testing :)
*/
@@ -60,6 +66,12 @@ bool MirrorMethod::Configuration(string Message)
}
/*}}}*/
+// clean the mirrors dir based on ttl information
+bool MirrorMethod::Clean(string dir)
+{
+
+}
+
bool MirrorMethod::GetMirrorFile(string uri)
{
@@ -69,7 +81,7 @@ bool MirrorMethod::GetMirrorFile(string uri)
string fetch = BaseUri;
fetch.replace(0,strlen("mirror://"),"http://");
- MirrorFile = _config->FindDir("Dir::State::lists") + URItoFileName(BaseUri);
+ MirrorFile = _config->FindDir("Dir::State::mirrors") + URItoFileName(BaseUri);
if(Debug)
{
@@ -77,19 +89,43 @@ bool MirrorMethod::GetMirrorFile(string uri)
cerr << "mirror-file: " << MirrorFile << endl;
}
- // FIXME: fetch it with curl
+ // check the file, if it is not older than RefreshInterval just use it
+ // otherwise try to get a new one
+ if(FileExists(MirrorFile))
+ {
+ struct stat buf;
+ time_t t,now,refresh;
+ if(stat(MirrorFile.c_str(), &buf) != 0)
+ return false;
+ t = std::max(buf.st_mtime, buf.st_ctime);
+ now = time(NULL);
+ refresh = 60*_config->FindI("Acquire::Mirror::RefreshInterval",360);
+ if(t + refresh > now)
+ {
+ if(Debug)
+ clog << "Mirror file is in RefreshInterval" << endl;
+ HasMirrorFile = true;
+ return true;
+ }
+ if(Debug)
+ clog << "Mirror file " << MirrorFile << " older than " << refresh << ", re-download it" << endl;
+ }
+
+ // not that great to use pkgAcquire here, but we do not have
+ // any other way right now
pkgAcquire Fetcher;
new pkgAcqFile(&Fetcher, fetch, "", 0, "", "", "", MirrorFile);
bool res = (Fetcher.Run() == pkgAcquire::Continue);
-
- if(res)
+ if(res)
HasMirrorFile = true;
Fetcher.Shutdown();
- return true;
+ return res;
}
bool MirrorMethod::SelectMirror()
{
+ // FIXME: make the mirror selection more clever, do not
+ // just use the first one!
ifstream in(MirrorFile.c_str());
getline(in, Mirror);
if(Debug)
@@ -103,7 +139,7 @@ bool MirrorMethod::SelectMirror()
depth. */
bool MirrorMethod::Fetch(FetchItem *Itm)
{
- // get mirror information
+ // select mirror only once per session
if(!HasMirrorFile)
{
GetMirrorFile(Itm->Uri);
diff --git a/methods/mirror.h b/methods/mirror.h
index a47b8fbf1..798f5a9b5 100644
--- a/methods/mirror.h
+++ b/methods/mirror.h
@@ -34,6 +34,7 @@ class MirrorMethod : public HttpMethod
protected:
bool GetMirrorFile(string uri);
bool SelectMirror();
+ bool Clean(string dir);
// we need to overwrite those to transform the url back
virtual void Fail(string Why, bool Transient = false);
diff --git a/po/apt-all.pot b/po/apt-all.pot
index b3da2ba9a..42c43fe8d 100644
--- a/po/apt-all.pot
+++ b/po/apt-all.pot
@@ -2238,12 +2238,12 @@ msgstr ""
msgid "Please insert the disc labeled: '%s' in the drive '%s' and press enter."
msgstr ""
-#: apt-pkg/init.cc:120
+#: apt-pkg/init.cc:121
#, c-format
msgid "Packaging system '%s' is not supported"
msgstr ""
-#: apt-pkg/init.cc:136
+#: apt-pkg/init.cc:137
msgid "Unable to determine a suitable packaging system type"
msgstr ""