]> git.saurik.com Git - apt.git/commitdiff
* methods/mirror.cc:
authorMichael Vogt <michael.vogt@ubuntu.com>
Mon, 8 Jan 2007 10:38:55 +0000 (11:38 +0100)
committerMichael Vogt <michael.vogt@ubuntu.com>
Mon, 8 Jan 2007 10:38:55 +0000 (11:38 +0100)
  - implemented simple Clean() implementation based on the time of
    the last access for a mirror file

doc/examples/configure-index
methods/mirror.cc
po/apt-all.pot

index cb20d767b2ef7a0e30f35de7208dc741e9d67154..81bb6b3b056e9c2ac0ae06dd4d8b111a37eda565 100644 (file)
@@ -164,6 +164,8 @@ Acquire
   mirror
   {
    RefreshInterval "360"; // refresh interval in minutes
+   MaxAge "90";           // max age for a mirror file in days before 
+                          // it gets deleted
   };
 };
 
index e70a40f55bf6c2bd8d35ae33399ea822f7947944..425a2f7f57d919b05ea0b18ba879b45a7cf6e620 100644 (file)
 #include <iostream>
 #include <stdarg.h>
 #include <sys/stat.h>
+#include <sys/types.h>
+#include <dirent.h>
 
 using namespace std;
 
 #include "mirror.h"
 #include "http.h"
-
+#include "apti18n.h"
                                                                        /*}}}*/
 
 /* 
@@ -67,9 +69,54 @@ bool MirrorMethod::Configuration(string Message)
                                                                        /*}}}*/
 
 // clean the mirrors dir based on ttl information
-bool MirrorMethod::Clean(string dir)
+bool MirrorMethod::Clean(string Dir)
 {
+   // FIXME: it would better to have a global idea of the mirrors
+   //        in the sources.list and use this instead of this time
+   //        based approach. currently apt does not support this :/
+
+   DIR *D = opendir(Dir.c_str());   
+   if (D == 0)
+      return _error->Errno("opendir",_("Unable to read %s"),Dir.c_str());
+   
+   string StartDir = SafeGetCWD();
+   if (chdir(Dir.c_str()) != 0)
+   {
+      closedir(D);
+      return _error->Errno("chdir",_("Unable to change to %s"),Dir.c_str());
+   }
+   
+   for (struct dirent *Dir = readdir(D); Dir != 0; Dir = readdir(D))
+   {
+      // Skip some files..
+      if (strcmp(Dir->d_name,"lock") == 0 ||
+         strcmp(Dir->d_name,"partial") == 0 ||
+         strcmp(Dir->d_name,".") == 0 ||
+         strcmp(Dir->d_name,"..") == 0)
+        continue;
+      
+      // Del everything not touched for MaxAge days
+      time_t t,now,max;
+      struct stat buf;
+      if(stat(Dir->d_name, &buf) != 0) 
+      {
+        cerr << "Can't stat '" << Dir->d_name << "'" << endl;
+        continue;
+      }
+      t = std::max(buf.st_mtime, buf.st_ctime);
+      now = time(NULL);
+      max = 24*60*60*_config->FindI("Acquire::Mirror::MaxAge",90);
+      if(t + max < now)
+      {
+        if(Debug)
+           clog << "Mirror file is older than MaxAge days, deleting" << endl;
+        unlink(Dir->d_name);
+      }
+   };
    
+   chdir(StartDir.c_str());
+   closedir(D);
+   return true;   
 }
 
 
@@ -81,6 +128,7 @@ bool MirrorMethod::GetMirrorFile(string uri)
    string fetch = BaseUri;
    fetch.replace(0,strlen("mirror://"),"http://");
 
+   // get new file
    MirrorFile = _config->FindDir("Dir::State::mirrors") + URItoFileName(BaseUri);
 
    if(Debug) 
@@ -108,7 +156,7 @@ bool MirrorMethod::GetMirrorFile(string uri)
         return true;
       }
       if(Debug)
-        clog << "Mirror file " << MirrorFile << " older than " << refresh << ", re-download it" << endl;
+        clog << "Mirror file " << MirrorFile << " older than " << refresh << "min, re-download it" << endl;
    }
 
    // not that great to use pkgAcquire here, but we do not have 
@@ -142,6 +190,7 @@ bool MirrorMethod::Fetch(FetchItem *Itm)
    // select mirror only once per session
    if(!HasMirrorFile)
    {
+      Clean(_config->FindDir("Dir::State::mirrors"));
       GetMirrorFile(Itm->Uri);
       SelectMirror();
    }
index 42c43fe8d7c74f1afc424d223ea9967d0c667eeb..d1ce725032701d4e1d6accb43a8bb1fdf18fa74c 100644 (file)
@@ -1330,7 +1330,7 @@ msgstr ""
 
 #: apt-inst/extract.cc:467 apt-pkg/contrib/configuration.cc:750
 #: apt-pkg/contrib/cdromutl.cc:153 apt-pkg/sourcelist.cc:324
-#: apt-pkg/acquire.cc:421 apt-pkg/clean.cc:38
+#: apt-pkg/acquire.cc:421 apt-pkg/clean.cc:38 methods/mirror.cc:76
 #, c-format
 msgid "Unable to read %s"
 msgstr ""
@@ -1956,6 +1956,7 @@ msgid "Unable to stat the mount point %s"
 msgstr ""
 
 #: apt-pkg/contrib/cdromutl.cc:149 apt-pkg/acquire.cc:427 apt-pkg/clean.cc:44
+#: methods/mirror.cc:82
 #, c-format
 msgid "Unable to change to %s"
 msgstr ""