From bf783d9044cb5c9e851fbf10c9bb7e6192b13afd Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 22 Jan 2010 21:21:30 +0100 Subject: * methods/cdrom.cc: - fixes in multi cdrom setup code --- methods/cdrom.cc | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) (limited to 'methods') diff --git a/methods/cdrom.cc b/methods/cdrom.cc index 9802eb46c..763547013 100644 --- a/methods/cdrom.cc +++ b/methods/cdrom.cc @@ -37,8 +37,8 @@ class CDROMMethod : public pkgAcqMethod bool MountedByApt; pkgUdevCdromDevices UdevCdroms; - bool IsCorrectCD(URI want, string MountPath); - bool AutoDetectAndMount(URI); + bool IsCorrectCD(URI want, string MountPath, string& NewID); + bool AutoDetectAndMount(URI, string &NewID); virtual bool Fetch(FetchItem *Itm); string GetID(string Name); virtual void Exit(); @@ -92,7 +92,7 @@ string CDROMMethod::GetID(string Name) // CDROMMethod::AutoDetectAndMount /*{{{*/ // --------------------------------------------------------------------- /* Modifies class varaiable CDROM to the mountpoint */ -bool CDROMMethod::AutoDetectAndMount(URI Get) +bool CDROMMethod::AutoDetectAndMount(URI Get, string NewID) { vector v = UdevCdroms.Scan(); @@ -103,7 +103,7 @@ bool CDROMMethod::AutoDetectAndMount(URI Get) { if (Debug) clog << "Checking mounted cdrom device " << v[i].DeviceName << endl; - if (IsCorrectCD(Get, v[i].MountPath)) + if (IsCorrectCD(Get, v[i].MountPath, NewID)) { CDROM = v[i].MountPath; return true; @@ -126,7 +126,7 @@ bool CDROMMethod::AutoDetectAndMount(URI Get) { if(MountCdrom("/media/apt", v[i].DeviceName)) { - if (IsCorrectCD(Get, "/media/apt")) + if (IsCorrectCD(Get, "/media/apt", NewID)) { MountedByApt = true; CDROM = "/media/apt"; @@ -144,10 +144,8 @@ bool CDROMMethod::AutoDetectAndMount(URI Get) // CDROMMethod::IsCorrectCD /*{{{*/ // --------------------------------------------------------------------- /* */ -bool CDROMMethod::IsCorrectCD(URI want, string MountPath) +bool CDROMMethod::IsCorrectCD(URI want, string MountPath, string& NewID) { - string NewID; - for (unsigned int Version = 2; Version != 0; Version--) { if (IdentCdrom(MountPath,NewID,Version) == false) @@ -226,17 +224,17 @@ bool CDROMMethod::Fetch(FetchItem *Itm) if (CDROM[0] == '.') CDROM= SafeGetCWD() + '/' + CDROM; - string NewID; + string NewID; while (CurrentID.empty() == true) { if (CDROM == "apt-udev-auto/") - AutoDetectAndMount(Get); + AutoDetectAndMount(Get, NewID); if(!IsMounted(CDROM)) MountedByApt = MountCdrom(CDROM); - if (IsCorrectCD(Get, CDROM)) + if (IsCorrectCD(Get, CDROM, NewID)) break; // I suppose this should prompt somehow? -- cgit v1.2.3-70-g09d2 From ff1e4b0626d8ce567492ccadbd30dfc32d4c15f1 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 26 Jan 2010 11:27:58 +0100 Subject: add new "Acquire::cdrom::AutoDetect" variable that enables/disables the dlopen of libudev for automatic cdrom detection --- debian/changelog | 2 ++ doc/examples/configure-index | 4 ++++ methods/cdrom.cc | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) (limited to 'methods') diff --git a/debian/changelog b/debian/changelog index b499d7298..7e38cda99 100644 --- a/debian/changelog +++ b/debian/changelog @@ -10,6 +10,8 @@ apt (0.7.25.1) UNRELEASED; urgency=low the umount again * methods/cdrom.cc: - fixes in multi cdrom setup code + - add new "Acquire::cdrom::AutoDetect" variable that enables/disables + the dlopen of libudev for automatic cdrom detection -- Michael Vogt Fri, 18 Dec 2009 16:54:18 +0100 diff --git a/doc/examples/configure-index b/doc/examples/configure-index index 1e9946e1b..317acddf6 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -250,6 +250,10 @@ Acquire cdrom { + // do auto detection of the cdrom mountpoint + AutoDetect "true"; + + // cdrom mountpoint (needs to be defined in fstab if AutoDetect is not used) mount "/cdrom"; // You need the trailing slash! diff --git a/methods/cdrom.cc b/methods/cdrom.cc index 763547013..87794b052 100644 --- a/methods/cdrom.cc +++ b/methods/cdrom.cc @@ -218,6 +218,7 @@ bool CDROMMethod::Fetch(FetchItem *Itm) return true; } + bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect", true); CDROM = _config->FindDir("Acquire::cdrom::mount","/cdrom/"); if (Debug) clog << "Looking for CDROM at " << CDROM << endl; @@ -228,7 +229,7 @@ bool CDROMMethod::Fetch(FetchItem *Itm) string NewID; while (CurrentID.empty() == true) { - if (CDROM == "apt-udev-auto/") + if (AutoDetect) AutoDetectAndMount(Get, NewID); if(!IsMounted(CDROM)) -- cgit v1.2.3-70-g09d2 From c1f168f54be5b4babeb9b91cd7145441ea2489ad Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 26 Jan 2010 13:37:25 +0100 Subject: methods/cdrom.cc: fix compilication error --- methods/cdrom.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'methods') diff --git a/methods/cdrom.cc b/methods/cdrom.cc index 87794b052..0e78851ff 100644 --- a/methods/cdrom.cc +++ b/methods/cdrom.cc @@ -92,7 +92,7 @@ string CDROMMethod::GetID(string Name) // CDROMMethod::AutoDetectAndMount /*{{{*/ // --------------------------------------------------------------------- /* Modifies class varaiable CDROM to the mountpoint */ -bool CDROMMethod::AutoDetectAndMount(URI Get, string NewID) +bool CDROMMethod::AutoDetectAndMount(URI Get, string &NewID) { vector v = UdevCdroms.Scan(); -- cgit v1.2.3-70-g09d2 From fb503892e3e05132bb7db369440402ff81ea5f8d Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 26 Jan 2010 20:36:13 +0100 Subject: * cmdline/apt-cdrom.cc: - fixed signed/unsigned warning - create /media mount point if needed - fix initialization for res in DoAdd() * methods/cdrom.cc: - make AptMountPoint a variable --- apt-pkg/cdrom.cc | 2 -- cmdline/apt-cdrom.cc | 17 ++++++++++------- methods/cdrom.cc | 13 +++++++------ 3 files changed, 17 insertions(+), 15 deletions(-) (limited to 'methods') diff --git a/apt-pkg/cdrom.cc b/apt-pkg/cdrom.cc index 3467f49d7..96d4e9c91 100644 --- a/apt-pkg/cdrom.cc +++ b/apt-pkg/cdrom.cc @@ -829,8 +829,6 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/ } } - - // Unmount and finish if (_config->FindB("APT::CDROM::NoMount",false) == false) { log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST); diff --git a/cmdline/apt-cdrom.cc b/cmdline/apt-cdrom.cc index fc949ce7b..494a7d8df 100644 --- a/cmdline/apt-cdrom.cc +++ b/cmdline/apt-cdrom.cc @@ -99,7 +99,7 @@ OpProgress* pkgCdromTextStatus::GetOpProgress() }; /*}}}*/ // SetupAutoDetect /*{{{*/ -bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, int &i) +bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i) { bool Debug = _config->FindB("Debug::Acquire::cdrom", false); @@ -120,9 +120,12 @@ bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, int &i) _config->Set("Acquire::cdrom::mount", v[i].MountPath); _config->Set("APT::CDROM::NoMount", true); } else { - MountCdrom("/var/lib/apt/media", v[i].DeviceName); - MountCdrom("/var/lib/apt/media", v[i].DeviceName); - _config->Set("Acquire::cdrom::mount", "/var/lib/apt/media"); + const char* AptMountPoint = "/media/apt"; + if (!FileExists(AptMountPoint)) + mkdir(AptMountPoint, 0750); + if(MountCdrom(AptMountPoint, v[i].DeviceName) == false) + _error->Warning(_("Failed to mount '%s' to '%s'"), v[i].DeviceName.c_str(), AptMountPoint); + _config->Set("Acquire::cdrom::mount", AptMountPoint); _config->Set("APT::CDROM::NoMount", true); } i++; @@ -142,10 +145,10 @@ bool DoAdd(CommandLine &) pkgUdevCdromDevices UdevCdroms; pkgCdromTextStatus log; pkgCdrom cdrom; - bool res = false; + bool res = true; bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect"); - int count = 0; + unsigned int count = 0; if (AutoDetect && UdevCdroms.Dlopen()) { @@ -173,7 +176,7 @@ bool DoIdent(CommandLine &) bool res = true; bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect"); - int count = 0; + unsigned int count = 0; if (AutoDetect && UdevCdroms.Dlopen()) { diff --git a/methods/cdrom.cc b/methods/cdrom.cc index 0e78851ff..c8ec322ee 100644 --- a/methods/cdrom.cc +++ b/methods/cdrom.cc @@ -116,23 +116,24 @@ bool CDROMMethod::AutoDetectAndMount(URI Get, string &NewID) return false; // check if we have the mount point - if (!FileExists("/media/apt")) - mkdir("/media/apt", 0755); + const char* AptMountPoint = "/media/apt"; + if (!FileExists(AptMountPoint)) + mkdir(AptMountPoint, 0750); // now try mounting for (unsigned int i=0; i < v.size(); i++) { if (!v[i].Mounted) { - if(MountCdrom("/media/apt", v[i].DeviceName)) + if(MountCdrom(AptMountPoint, v[i].DeviceName)) { - if (IsCorrectCD(Get, "/media/apt", NewID)) + if (IsCorrectCD(Get, AptMountPoint, NewID)) { MountedByApt = true; - CDROM = "/media/apt"; + CDROM = AptMountPoint; return true; } else { - UnmountCdrom("/media/apt"); + UnmountCdrom(AptMountPoint); } } } -- cgit v1.2.3-70-g09d2 From ffee221b8d1df28768d30762d72a11289ae747dc Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 26 Jan 2010 21:08:41 +0100 Subject: add Dir::Media::MountPath config option --- apt-pkg/init.cc | 3 ++- cmdline/apt-cdrom.cc | 6 +++--- doc/examples/configure-index | 7 +++++++ methods/cdrom.cc | 4 ++-- 4 files changed, 14 insertions(+), 6 deletions(-) (limited to 'methods') diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc index 2544b8025..6310aff11 100644 --- a/apt-pkg/init.cc +++ b/apt-pkg/init.cc @@ -65,11 +65,12 @@ bool pkgInitConfig(Configuration &Cnf) Cnf.Set("Dir::Etc::vendorlist","vendors.list"); Cnf.Set("Dir::Etc::vendorparts","vendors.list.d"); Cnf.Set("Dir::Etc::main","apt.conf"); - Cnf.Set("Dir::ETc::netrc", "auth.conf"); + Cnf.Set("Dir::Etc::netrc", "auth.conf"); Cnf.Set("Dir::Etc::parts","apt.conf.d"); Cnf.Set("Dir::Etc::preferences","preferences"); Cnf.Set("Dir::Etc::preferencesparts","preferences.d"); Cnf.Set("Dir::Bin::methods","/usr/lib/apt/methods"); + Cnf.Set("Dir::Media::MountPath","/media/apt"); // State Cnf.Set("Dir::Log","var/log/apt"); diff --git a/cmdline/apt-cdrom.cc b/cmdline/apt-cdrom.cc index 494a7d8df..988a58f20 100644 --- a/cmdline/apt-cdrom.cc +++ b/cmdline/apt-cdrom.cc @@ -120,11 +120,11 @@ bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i) _config->Set("Acquire::cdrom::mount", v[i].MountPath); _config->Set("APT::CDROM::NoMount", true); } else { - const char* AptMountPoint = "/media/apt"; + string AptMountPoint = _config->FindDir("Dir::Media::MountPath"); if (!FileExists(AptMountPoint)) - mkdir(AptMountPoint, 0750); + mkdir(AptMountPoint.c_str(), 0750); if(MountCdrom(AptMountPoint, v[i].DeviceName) == false) - _error->Warning(_("Failed to mount '%s' to '%s'"), v[i].DeviceName.c_str(), AptMountPoint); + _error->Warning(_("Failed to mount '%s' to '%s'"), v[i].DeviceName.c_str(), AptMountPoint.c_str()); _config->Set("Acquire::cdrom::mount", AptMountPoint); _config->Set("APT::CDROM::NoMount", true); } diff --git a/doc/examples/configure-index b/doc/examples/configure-index index 317acddf6..0b0025fca 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -331,6 +331,13 @@ Dir "/" Terminal "term.log"; History "history.log"; }; + + // Media + Media + { + // Media AutoDetect mount path + MountPath "/media/apt"; + }; }; // Things that effect the APT dselect method diff --git a/methods/cdrom.cc b/methods/cdrom.cc index c8ec322ee..4bbc01c2c 100644 --- a/methods/cdrom.cc +++ b/methods/cdrom.cc @@ -116,9 +116,9 @@ bool CDROMMethod::AutoDetectAndMount(URI Get, string &NewID) return false; // check if we have the mount point - const char* AptMountPoint = "/media/apt"; + string AptMountPoint = _config->FindDir("Dir::Media::MountPath"); if (!FileExists(AptMountPoint)) - mkdir(AptMountPoint, 0750); + mkdir(AptMountPoint.c_str(), 0750); // now try mounting for (unsigned int i=0; i < v.size(); i++) -- cgit v1.2.3-70-g09d2 From c9cd3b70f3290071c79d7ef85ed87bd709a06bc6 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Wed, 3 Feb 2010 10:00:54 -0800 Subject: * methods/http.cc: - add cache-control headers even if no cache is given to allow adding options for intercepting proxies --- debian/changelog | 3 +++ methods/http.cc | 30 ++++++++++++++++-------------- 2 files changed, 19 insertions(+), 14 deletions(-) (limited to 'methods') diff --git a/debian/changelog b/debian/changelog index a150197b1..03936a31b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -17,6 +17,9 @@ apt (0.7.25.1) UNRELEASED; urgency=low * cmdline/apt-cdrom.cc: - add new --auto-detect option that uses libudev to figure out the cdrom/mount-point + * methods/http.cc: + - add cache-control headers even if no cache is given to allow + adding options for intercepting proxies -- Michael Vogt Fri, 18 Dec 2009 16:54:18 +0100 diff --git a/methods/http.cc b/methods/http.cc index 2dae87a02..2bd57024b 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -682,23 +682,25 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out) and a no-store directive for archives. */ sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\n", Itm->Uri.c_str(),ProperHost.c_str()); - // only generate a cache control header if we actually want to - // use a cache - if (_config->FindB("Acquire::http::No-Cache",false) == false) + } + // generate a cache control header (if needed) + if (_config->FindB("Acquire::http::No-Cache",false) == true) + { + strcat(Buf,"Cache-Control: no-cache\r\nPragma: no-cache\r\n"); + } + else + { + if (Itm->IndexFile == true) { - if (Itm->IndexFile == true) - sprintf(Buf+strlen(Buf),"Cache-Control: max-age=%u\r\n", - _config->FindI("Acquire::http::Max-Age",0)); - else - { - if (_config->FindB("Acquire::http::No-Store",false) == true) - strcat(Buf,"Cache-Control: no-store\r\n"); - } + sprintf(Buf+strlen(Buf),"Cache-Control: max-age=%u\r\n", + _config->FindI("Acquire::http::Max-Age",0)); + } + else + { + if (_config->FindB("Acquire::http::No-Store",false) == true) + strcat(Buf,"Cache-Control: no-store\r\n"); } } - // generate a no-cache header if needed - if (_config->FindB("Acquire::http::No-Cache",false) == true) - strcat(Buf,"Cache-Control: no-cache\r\nPragma: no-cache\r\n"); string Req = Buf; -- cgit v1.2.3-70-g09d2 From bd49b02c03f09f9e7e76da8055f1364943b9dc57 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 5 Feb 2010 18:34:27 -0800 Subject: add Acquire::http::ProxyAutoDetect configuration that can be used to call a external helper to figure out the proxy configuration and return it to apt via stdout --- debian/changelog | 3 +++ methods/http.cc | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- methods/http.h | 2 ++ 3 files changed, 53 insertions(+), 1 deletion(-) (limited to 'methods') diff --git a/debian/changelog b/debian/changelog index 03936a31b..329ea29b5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -20,6 +20,9 @@ apt (0.7.25.1) UNRELEASED; urgency=low * methods/http.cc: - add cache-control headers even if no cache is given to allow adding options for intercepting proxies + - add Acquire::http::ProxyAutoDetect configuration that + can be used to call a external helper to figure out the + proxy configuration and return it to apt via stdout -- Michael Vogt Fri, 18 Dec 2009 16:54:18 +0100 diff --git a/methods/http.cc b/methods/http.cc index 2bd57024b..b05444691 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -1073,7 +1073,11 @@ bool HttpMethod::Configuration(string Message) PipelineDepth = _config->FindI("Acquire::http::Pipeline-Depth", PipelineDepth); Debug = _config->FindB("Debug::Acquire::http",false); - + AutoDetectProxyCmd = _config->Find("Acquire::http::ProxyAutoDetect"); + + // Get the proxy to use + AutoDetectProxy(); + return true; } /*}}}*/ @@ -1323,6 +1327,49 @@ int HttpMethod::Loop() return 0; } /*}}}*/ +// HttpMethod::AutoDetectProxy - auto detect proxy /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool HttpMethod::AutoDetectProxy() +{ + if (AutoDetectProxyCmd.empty()) + return true; + + if (Debug) + clog << "Using auto proxy detect command: " << AutoDetectProxyCmd << endl; + + int Pipes[2] = {-1,-1}; + if (pipe(Pipes) != 0) + return _error->Errno("pipe", "Failed to create Pipe"); + + pid_t Process = ExecFork(); + if (Process == 0) + { + dup2(Pipes[1],STDOUT_FILENO); + SetCloseExec(STDOUT_FILENO,false); + + const char *Args[2]; + Args[0] = AutoDetectProxyCmd.c_str(); + Args[1] = 0; + execv(Args[0],(char **)Args); + cerr << "Failed to exec method " << Args[0] << endl; + _exit(100); + } + char buf[512]; + int InFd = Pipes[0]; + if (read(InFd, buf, sizeof(buf)) < 0) + return _error->Errno("read", "Failed to read"); + ExecWait(Process, "ProxyAutoDetect"); + + if (Debug) + clog << "auto detect command returned: '" << buf << "'" << endl; + + if (strstr(buf, "http://") == buf) + _config->Set("Acquire::http::proxy", _strstrip(buf)); + + return true; +} + /*}}}*/ int main() { diff --git a/methods/http.h b/methods/http.h index 13f02ec77..ceee36cbe 100644 --- a/methods/http.h +++ b/methods/http.h @@ -134,6 +134,7 @@ class HttpMethod : public pkgAcqMethod bool Flush(ServerState *Srv); bool ServerDie(ServerState *Srv); int DealWithHeaders(FetchResult &Res,ServerState *Srv); + bool AutoDetectProxy(); virtual bool Fetch(FetchItem *); virtual bool Configuration(string Message); @@ -145,6 +146,7 @@ class HttpMethod : public pkgAcqMethod static void SigTerm(int); string NextURI; + string AutoDetectProxyCmd; public: friend class ServerState; -- cgit v1.2.3-70-g09d2