summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/contrib/configuration.cc161
-rw-r--r--apt-private/private-cmndline.cc7
-rw-r--r--doc/examples/configure-index766
-rw-r--r--test/integration/framework1
4 files changed, 688 insertions, 247 deletions
diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc
index 9007bf9ec..13d678539 100644
--- a/apt-pkg/contrib/configuration.cc
+++ b/apt-pkg/contrib/configuration.cc
@@ -31,10 +31,13 @@
#include <string.h>
#include <algorithm>
+#include <iterator>
#include <string>
#include <stack>
#include <vector>
#include <fstream>
+#include <sstream>
+#include <unordered_map>
#include <apti18n.h>
@@ -43,6 +46,150 @@ using namespace std;
Configuration *_config = new Configuration;
+/* TODO: This config verification shouldn't be using a static variable
+ but a Cnf-member – but that would need ABI breaks and stuff and for now
+ that really is an apt-dev-only tool, so it isn't that bad that it is
+ unusable and allaround a bit strange */
+enum class APT_HIDDEN ConfigType { UNDEFINED, INT, BOOL, STRING, STRING_OR_BOOL, STRING_OR_LIST, FILE, DIR, LIST, PROGRAM_PATH = FILE };
+APT_HIDDEN std::unordered_map<std::string, ConfigType> apt_known_config {};
+static std::string getConfigTypeString(ConfigType const type) /*{{{*/
+{
+ switch (type)
+ {
+ case ConfigType::UNDEFINED: return "UNDEFINED";
+ case ConfigType::INT: return "INT";
+ case ConfigType::BOOL: return "BOOL";
+ case ConfigType::STRING: return "STRING";
+ case ConfigType::STRING_OR_BOOL: return "STRING_OR_BOOL";
+ case ConfigType::FILE: return "FILE";
+ case ConfigType::DIR: return "DIR";
+ case ConfigType::LIST: return "LIST";
+ case ConfigType::STRING_OR_LIST: return "STRING_OR_LIST";
+ }
+ return "UNKNOWN";
+}
+ /*}}}*/
+static ConfigType getConfigType(std::string const &type) /*{{{*/
+{
+ if (type == "<INT>")
+ return ConfigType::INT;
+ else if (type == "<BOOL>")
+ return ConfigType::BOOL;
+ else if (type == "<STRING>")
+ return ConfigType::STRING;
+ else if (type == "<STRING_OR_BOOL>")
+ return ConfigType::STRING_OR_BOOL;
+ else if (type == "<FILE>")
+ return ConfigType::FILE;
+ else if (type == "<DIR>")
+ return ConfigType::DIR;
+ else if (type == "<LIST>")
+ return ConfigType::LIST;
+ else if (type == "<STRING_OR_LIST>")
+ return ConfigType::STRING_OR_LIST;
+ else if (type == "<PROGRAM_PATH>")
+ return ConfigType::PROGRAM_PATH;
+ return ConfigType::UNDEFINED;
+}
+ /*}}}*/
+static void checkFindConfigOptionType(std::string name, ConfigType const type)/*{{{*/
+{
+ if (apt_known_config.empty())
+ return;
+ std::transform(name.begin(), name.end(), name.begin(), ::tolower);
+ auto known = apt_known_config.find(name);
+ if (known == apt_known_config.cend())
+ {
+ auto const rcolon = name.rfind(':');
+ if (rcolon != std::string::npos)
+ {
+ known = apt_known_config.find(name.substr(0, rcolon) + ":*");
+ if (known == apt_known_config.cend())
+ {
+ auto const parts = StringSplit(name, "::");
+ size_t psize = parts.size();
+ if (psize > 1)
+ {
+ for (size_t max = psize; max != 1; --max)
+ {
+ std::ostringstream os;
+ std::copy(parts.begin(), parts.begin() + max, std::ostream_iterator<std::string>(os, "::"));
+ os << "**";
+ known = apt_known_config.find(os.str());
+ if (known != apt_known_config.cend() && known->second == ConfigType::UNDEFINED)
+ return;
+ }
+ for (size_t max = psize - 1; max != 1; --max)
+ {
+ std::ostringstream os;
+ std::copy(parts.begin(), parts.begin() + max - 1, std::ostream_iterator<std::string>(os, "::"));
+ os << "*::";
+ std::copy(parts.begin() + max + 1, parts.end() - 1, std::ostream_iterator<std::string>(os, "::"));
+ os << *(parts.end() - 1);
+ known = apt_known_config.find(os.str());
+ if (known != apt_known_config.cend())
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (known == apt_known_config.cend())
+ _error->Warning("Using unknown config option »%s« of type %s",
+ name.c_str(), getConfigTypeString(type).c_str());
+ else if (known->second != type)
+ {
+ if (known->second == ConfigType::DIR && type == ConfigType::FILE)
+ ; // implementation detail
+ else if (type == ConfigType::STRING && (known->second == ConfigType::FILE || known->second == ConfigType::DIR))
+ ; // TODO: that might be an error or not, we will figure this out later
+ else if (known->second == ConfigType::STRING_OR_BOOL && (type == ConfigType::BOOL || type == ConfigType::STRING))
+ ;
+ else if (known->second == ConfigType::STRING_OR_LIST && (type == ConfigType::LIST || type == ConfigType::STRING))
+ ;
+ else
+ _error->Warning("Using config option »%s« of type %s as a type %s",
+ name.c_str(), getConfigTypeString(known->second).c_str(), getConfigTypeString(type).c_str());
+ }
+}
+ /*}}}*/
+static bool LoadConfigurationIndex(std::string const &filename) /*{{{*/
+{
+ apt_known_config.clear();
+ if (filename.empty())
+ return true;
+ Configuration Idx;
+ if (ReadConfigFile(Idx, filename) == false)
+ return false;
+
+ Configuration::Item const * Top = Idx.Tree(nullptr);
+ if (unlikely(Top == nullptr))
+ return false;
+
+ do {
+ if (Top->Value.empty() == false)
+ {
+ std::string fulltag = Top->FullTag();
+ std::transform(fulltag.begin(), fulltag.end(), fulltag.begin(), ::tolower);
+ apt_known_config.emplace(std::move(fulltag), getConfigType(Top->Value));
+ }
+
+ if (Top->Child != nullptr)
+ {
+ Top = Top->Child;
+ continue;
+ }
+
+ while (Top != nullptr && Top->Next == nullptr)
+ Top = Top->Parent;
+ if (Top != nullptr)
+ Top = Top->Next;
+ } while (Top != nullptr);
+
+ return true;
+}
+ /*}}}*/
+
// Configuration::Configuration - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
@@ -160,6 +307,7 @@ Configuration::Item *Configuration::Lookup(const char *Name,bool const &Create)
/* */
string Configuration::Find(const char *Name,const char *Default) const
{
+ checkFindConfigOptionType(Name, ConfigType::STRING);
const Item *Itm = Lookup(Name);
if (Itm == 0 || Itm->Value.empty() == true)
{
@@ -179,6 +327,7 @@ string Configuration::Find(const char *Name,const char *Default) const
*/
string Configuration::FindFile(const char *Name,const char *Default) const
{
+ checkFindConfigOptionType(Name, ConfigType::FILE);
const Item *RootItem = Lookup("RootDir");
std::string result = (RootItem == 0) ? "" : RootItem->Value;
if(result.empty() == false && result[result.size() - 1] != '/')
@@ -233,6 +382,7 @@ string Configuration::FindFile(const char *Name,const char *Default) const
/* This is like findfile execept the result is terminated in a / */
string Configuration::FindDir(const char *Name,const char *Default) const
{
+ checkFindConfigOptionType(Name, ConfigType::DIR);
string Res = FindFile(Name,Default);
if (Res.end()[-1] != '/')
{
@@ -249,6 +399,7 @@ string Configuration::FindDir(const char *Name,const char *Default) const
/* Returns a vector of config values under the given item */
vector<string> Configuration::FindVector(const char *Name, std::string const &Default, bool const Keys) const
{
+ checkFindConfigOptionType(Name, ConfigType::LIST);
vector<string> Vec;
const Item *Top = Lookup(Name);
if (Top == NULL)
@@ -274,6 +425,7 @@ vector<string> Configuration::FindVector(const char *Name, std::string const &De
/* */
int Configuration::FindI(const char *Name,int const &Default) const
{
+ checkFindConfigOptionType(Name, ConfigType::INT);
const Item *Itm = Lookup(Name);
if (Itm == 0 || Itm->Value.empty() == true)
return Default;
@@ -291,6 +443,7 @@ int Configuration::FindI(const char *Name,int const &Default) const
/* */
bool Configuration::FindB(const char *Name,bool const &Default) const
{
+ checkFindConfigOptionType(Name, ConfigType::BOOL);
const Item *Itm = Lookup(Name);
if (Itm == 0 || Itm->Value.empty() == true)
return Default;
@@ -774,7 +927,8 @@ bool ReadConfigFile(Configuration &Conf,const string &FName,bool const &AsSectio
if ((*I == '/' && I + 1 != End && I[1] == '/') ||
(*I == '#' && strcmp(string(I,I+6).c_str(),"#clear") != 0 &&
- strcmp(string(I,I+8).c_str(),"#include") != 0))
+ strcmp(string(I,I+8).c_str(),"#include") != 0 &&
+ strcmp(string(I,I+strlen("#x-apt-configure-index")).c_str(), "#x-apt-configure-index") != 0))
{
End = I;
break;
@@ -939,6 +1093,11 @@ bool ReadConfigFile(Configuration &Conf,const string &FName,bool const &AsSectio
return _error->Error(_("Syntax error %s:%u: Included from here"),FName.c_str(),CurLine);
}
}
+ else if (Tag == "x-apt-configure-index")
+ {
+ if (LoadConfigurationIndex(Word) == false)
+ return _error->Warning("Loading the configure index %s in file %s:%u failed!", Word.c_str(), FName.c_str(), CurLine);
+ }
else
return _error->Error(_("Syntax error %s:%u: Unsupported directive '%s'"),FName.c_str(),CurLine,Tag.c_str());
}
diff --git a/apt-private/private-cmndline.cc b/apt-private/private-cmndline.cc
index dcd7e1bae..b8b29e9c8 100644
--- a/apt-private/private-cmndline.cc
+++ b/apt-private/private-cmndline.cc
@@ -501,9 +501,6 @@ std::vector<CommandLine::Dispatch> ParseCommandLine(CommandLine &CmdL, APT_CMD c
for (auto const& cmd : CmdsWithHelp)
Cmds.push_back({cmd.Match, cmd.Handler});
- // Args running out of scope invalidates the pointer stored in CmdL,
- // but we don't use the pointer after this function, so we ignore
- // this problem for now and figure something out if we have to.
char const * CmdCalled = nullptr;
if (Cmds.empty() == false && Cmds[0].Handler != nullptr)
CmdCalled = CommandLine::GetCommand(Cmds.data(), argc, argv);
@@ -511,6 +508,10 @@ std::vector<CommandLine::Dispatch> ParseCommandLine(CommandLine &CmdL, APT_CMD c
BinaryCommandSpecificConfiguration(argv[0], CmdCalled);
std::string const conf = "Binary::" + _config->Find("Binary");
_config->MoveSubTree(conf.c_str(), nullptr);
+
+ // Args running out of scope invalidates the pointer stored in CmdL,
+ // but we don't use the pointer after this function, so we ignore
+ // this problem for now and figure something out if we have to.
auto Args = getCommandArgs(Binary, CmdCalled);
CmdL = CommandLine(Args.data(), _config);
diff --git a/doc/examples/configure-index b/doc/examples/configure-index
index 2d0fb6c64..7ce5aef51 100644
--- a/doc/examples/configure-index
+++ b/doc/examples/configure-index
@@ -1,85 +1,140 @@
-/* This file is an index of all APT configuration directives. It should
- NOT actually be used as a real config file, though it is (except for the
- last line) a completely valid file. Most of the options have sane default
- values, unless you have specific needs you should NOT include arbitrary
+/* This file is an index of all APT configuration directives.
+ Instead of actual values the option has the type as value.
+ Additional explanations and possible values might be detailed in a comment.
+
+ Most of the options have sane default values,
+ unless you have specific needs you should NOT include arbitrary
items in a custom configuration.
-
+
In some instances involving filenames it is possible to set the default
directory when the path is evaluated. This means you can use relative
paths within the sub scope.
-
+
The configuration directives are specified in a tree with {} designating
a subscope relative to the tag before the {}. You can further specify
- a subscope using scope notation eg,
+ a subscope using scope notation e.g.,
APT::Architecture "i386";
This is prefixed with the current scope. Scope notation must be used
if an option is specified on the command line with -o.
+
+ The most complex type is perhaps <LIST>:
+ APT::Architectures "<LIST>";
+ In configuration files it usually appears as a subscope of its own like:
+ APT::Architectures { "amd64"; "i386"; };
+ but the same can be achieved with (needed for commandline)
+ APT::Architectures "amd64,i386";
+ which overrides the values in the scope notation.
+
+ See apt.conf manpage for a detailed description of many common options
+ and the syntax of configuration files and commandline options!
*/
-quiet "0";
-quiet::NoUpdate "true"; // never update progress information - included in -q=1
+quiet "<INT>";
+quiet::NoUpdate "<BOOL>"; // never update progress information - included in -q=1
+quiet::NoProgress "<BOOL>"; // disables the 0% → 100% progress on cache generation and stuff
+quiet::NoStatistic "<BOOL>"; // no "42 kB downloaded" stats in update
// Options for APT in general
-APT
+APT
{
- Architecture "i386";
- Architectures { "amd64"; "armel"; };
- Build-Essential "build-essential";
+ Architecture "<STRING>"; // debian architecture like amd64, i386, powerpc, armhf, mips, …
+ Architectures "<LIST>"; // a list of (foreign) debian architectures, defaults to: dpkg --print-foreign-architectures
- NeverAutoRemove { "linux-image.*"; }; // packages that should never
- // considered for autoRemove
+ Build-Essential "<LIST>"; // list of package names
+ Build-Profiles "<STRING_OR_LIST>";
+
+ NeverAutoRemove "<LIST>"; // list of package name regexes
// Options for apt-get
- Get
+ Get
{
- Host-Architecture "armel";
- Arch-Only "false";
- AllowUnauthenticated "false"; // packages from unauthenticated
- AutomaticRemove "false";
- HideAutoRemove "false";
- Download-Only "false";
- Simulate "false";
- Assume-Yes "false";
- Force-Yes "false"; // I would never set this.
- Fix-Broken "false";
- Fix-Missing "false";
- Show-Upgraded "false";
- Show-Versions "false";
- Upgrade "true";
- Print-URIs "false";
- Compile "false";
- Download "true";
- Purge "false";
- List-Cleanup "true";
- ReInstall "false";
- Trivial-Only "false";
- Remove "true";
- Only-Source "";
- Diff-Only "false";
- Tar-Only "false";
- Build-Dep-Automatic "true";
- Show-User-Simulation-Note "true";
+ // build-dep options:
+ Host-Architecture "<STRING>"; // debian architecture
+ Arch-Only "<BOOL>";
+ Indep-Only "<BOOL>";
+ Build-Dep-Automatic "<BOOL>";
+
+ // (non-)confirming options
+ Force-Yes "<BOOL>"; // allows downgrades, essential removal and eats children
+ Allow-Downgrades "<BOOL>";
+ Allow-Change-Held-Packages "<BOOL>";
+ Allow-Remove-Essential "<BOOL>";
+ Assume-Yes "<BOOL>"; // not as dangerous, but use with care still
+ Assume-No "<BOOL>";
+ Trivial-Only "<BOOL>";
+ Remove "<BOOL>";
+ AllowUnauthenticated "<BOOL>"; // skip security
+
+ AutomaticRemove "<BOOL>";
+ HideAutoRemove "<STRING_OR_BOOL>"; // yes, no, small
+
+ Simulate "<BOOL>";
+ Show-User-Simulation-Note "<BOOL>";
+ Fix-Broken "<BOOL>";
+ Fix-Policy-Broken "<BOOL>";
+
+ Download "<BOOL>";
+ Download-Only "<BOOL>";
+ Fix-Missing "<BOOL>";
+ Print-URIs "<BOOL>";
+ List-Cleanup "<BOOL>";
+
+ Show-Upgraded "<BOOL>";
+ Show-Versions "<BOOL>";
+ Upgrade "<BOOL>";
+ Only-Upgrade "<BOOL>";
+ Upgrade-Allow-New "<BOOL>";
+ Purge "<BOOL>";
+ ReInstall "<BOOL>";
+ Compile "<BOOL>";
+ Only-Source "<BOOL>";
+ Diff-Only "<BOOL>";
+ Tar-Only "<BOOL>";
+ Dsc-Only "<BOOL>";
+
+ Autosolving "<BOOL>";
+ CallResolver "<BOOL>";
+ IndexTargets::ReleaseInfo "<BOOL>";
+ IndexTargets::format "<STRING>";
};
- Cache
+ Cache
{
- Important "false";
- AllVersions "false";
- GivenOnly "false";
- RecurseDepends "false";
- ShowFull "false";
- Generate "true";
- NamesOnly "false";
- AllNames "false";
- Installed "false";
+ AllNames "<BOOL>";
+ AllVersions "<BOOL>";
+ Only-Source "<BOOL>";
+ GivenOnly "<BOOL>";
+ RecurseDepends "<BOOL>";
+ Installed "<BOOL>";
+ Important "<BOOL>";
+ ShowDependencyType "<BOOL>";
+ ShowVersion "<BOOL>";
+ ShowPre-Depends "<BOOL>";
+ ShowDepends "<BOOL>";
+ ShowRecommends "<BOOL>";
+ ShowSuggests "<BOOL>";
+ ShowReplaces "<BOOL>";
+ ShowConflicts "<BOOL>";
+ ShowBreaks "<BOOL>";
+ ShowEnhances "<BOOL>";
+ ShowOnlyFirstOr "<BOOL>";
+ ShowImplicit "<BOOL>";
+ ShowVirtuals "<BOOL>";
+ ShowFull "<BOOL>";
+ NamesOnly "<BOOL>";
+
+ show::version "<INT>";
+ search::version "<INT>";
};
- CDROM
+ CDROM
{
- Rename "false";
- NoMount "false";
- Fast "false";
- NoAct "false";
+ Rename "<BOOL>";
+ NoMount "<BOOL>";
+ Fast "<BOOL>";
+ NoAct "<BOOL>";
+ Thorough "<BOOL>";
+ DropTranslation "<BOOL>";
};
Update
@@ -88,8 +143,8 @@ APT
Post-Invoke {"touch /var/lib/apt/post-update-stamp"; };
};
- // define a new supported compressor on the fly
- APT::Compressor::rev {
+ /* define a new supported compressor on the fly
+ Compressor::rev {
Name "rev";
Extension ".reversed";
Binary "rev";
@@ -97,109 +152,75 @@ APT
UncompressArg {};
Cost "10";
};
+ */
+ Compressor "<LIST>";
+ Compressor::** "<UNDEFINED>";
Authentication
{
- TrustCDROM "false"; // consider the CD-ROM always trusted
+ TrustCDROM "false"; // consider the CD-ROM always trusted
};
+ Clean-Installed "<BOOL>";
+
// Some general options
- Ignore-Hold "false";
- Clean-Installed "true";
- Immediate-Configure "true"; // DO NOT turn this off, see the man page
- Force-LoopBreak "false"; // DO NOT turn this on, see the man page
- Cache-Start "20971520";
- Cache-Grow "1048576";
- Cache-Limit "0";
- Default-Release "";
-
- // consider Recommends, Suggests as important dependencies that should
+ Default-Release "<STRING>";
+ Ignore-Hold "<BOOL>";
+ Immediate-Configure "<BOOL>";
+ Immediate-Configure-All "<BOOL>";
+ Force-LoopBreak "<BOOL>";
+
+ Cache-Start "<INT>";
+ Cache-Grow "<INT>";
+ Cache-Limit "<INT>";
+ Cache-Fallback "<BOOL>";
+ Cache-HashTableSize "<INT>";
+
+ // consider Recommends/Suggests as important dependencies that should
// be installed by default
- Install-Recommends "true";
- Install-Suggests "false";
+ Install-Recommends "<BOOL>";
+ Install-Suggests "<BOOL>";
// reverse Recommends or Suggests prevent autoremoval
- AutoRemove::RecommendsImportant "true";
- AutoRemove::SuggestsImportant "true";
+ AutoRemove::RecommendsImportant "<BOOL>";
+ AutoRemove::SuggestsImportant "<BOOL>";
// consider dependencies of packages in this section manual
Never-MarkAuto-Sections {"metapackages"; "universe/metapackages"; };
// Write progress messages on this fd (for stuff like base-config)
- Status-Fd "-1";
+ Status-Fd "<INT>";
+ Status-deb822-Fd "<INT>";
// Keep the list of FDs open (normally apt closes all fds when it
// does a ExecFork)
Keep-Fds {};
- // control parameters for cron jobs by /etc/cron.daily/apt
- Periodic
- {
- BackupArchiveInterval "0";
- // - Backup after n-days if archive contents changed.(0=disable)
-
- BackupLevel "3";
- // - Backup level.(0=disable), 1 is invalid.
-
- // APT::Archives::MaxAge "0"; (old, deprecated)
- MaxAge "0"; // (new)
- // - Set maximum allowed age of a cache package file. If a cache
- // package file is older it is deleted (0=disable)
-
- // APT::Archives::MinAge "2"; (old, deprecated)
- MinAge "2"; // (new)
- // - Set minimum age of a package file. If a file is younger it
- // will not be deleted (0=disable). Useful to prevent races
- // and to keep backups of the packages for emergency.
-
- // APT::Archives::MaxSize "0"; (old, deprecated)
- MaxSize "0"; // (new)
- // - Set maximum size of the cache in MB (0=disable). If the cache
- // is bigger, cached package files are deleted until the size
- // requirement is met (the oldest packages will be deleted
- // first).
-
- Update-Package-Lists "0";
- // - Do "apt-get update" automatically every n-days (0=disable)
- //
- Download-Upgradeable-Packages "0";
- // - Do "apt-get upgrade --download-only" every n-days (0=disable)
- //
- Unattended-Upgrade "0";
- // - Run the "unattended-upgrade" security upgrade script
- // every n-days (0=disabled)
- // Requires the package "unattended-upgrades" and will write
- // a log in /var/log/unattended-upgrades
- //
- AutocleanInterval "0";
- // - Do "apt-get autoclean" every n-days (0=disable)
-
- Verbose "0";
- // - Send report mail to root
- // 0: no report (or null string)
- // 1: progress report (actually any string)
- // 2: + command outputs (remove -qq, remove 2>/dev/null, add -d)
- // 3: + trace on
- };
+ // control parameters for cron jobs by /etc/cron.daily/apt documented there
+ Periodic {};
};
// Options for the downloading routines
Acquire
{
- Queue-Mode "host"; // host|access
- Retries "0";
- Source-Symlinks "true";
- ForceHash "sha256"; // hashmethod used for expected hash: sha256, sha1 or md5sum
+ Queue-Mode "<STRING>"; // host or access
+ Retries "<INT>";
+ Source-Symlinks "<BOOL>";
+ ForceHash "<STRING>"; // hashmethod used for expected hash: sha256, sha1 or md5sum
+
+ PDiffs "<BOOL>"; // try to get the IndexFile diffs
+ PDiffs::FileLimit "<INT>"; // don't use diffs if we would need more than 4 diffs
+ PDiffs::SizeLimit "<INT>"; // don't use diffs if size of all patches excess X% of the size of the original file
+ PDiffs::Merge "<BOOL>";
- PDiffs "true"; // try to get the IndexFile diffs
- PDiffs::FileLimit "4"; // don't use diffs if we would need more than 4 diffs
- PDiffs::SizeLimit "50"; // don't use diffs if size of all patches excess
- // 50% of the size of the original file
+ Check-Valid-Until "<BOOL>";
+ Max-ValidTime "<INT>"; // time in seconds
+ Max-ValidTime::* "<INT>"; // repository label specific configuration
+ Min-ValidTime "<INT>"; // time in seconds
+ Min-ValidTime::* "<INT>"; // repository label specific configuration
- Check-Valid-Until "true";
- Max-ValidTime "864000"; // 10 days
- Max-ValidTime::Debian-Security "604800"; // 7 days, label specific configuration
+ SameMirrorForAllIndexes "<BOOL>"; // use the mirror serving the Release file for Packages & co
// HTTP method configuration
- http
+ http
{
Proxy "http://127.0.0.1:3128";
Proxy::http.us.debian.org "DIRECT"; // Specific per-host setting
@@ -210,13 +231,11 @@ Acquire
// Cache Control. Note these do not work with Squid 2.0.2
No-Cache "false";
Max-Age "86400"; // 1 Day age on index files
- No-Store "false"; // Prevent the cache from storing archives
- Dl-Limit "7"; // 7Kb/sec maximum download rate
+ No-Store "false"; // Prevent the cache from storing archives
+ Dl-Limit "<INT>"; // Kb/sec maximum download rate
User-Agent "Debian APT-HTTP/1.3";
};
-
-
// HTTPS method configuration: uses the http
// - proxy config
// - cache-control values
@@ -240,7 +259,7 @@ Acquire
No-Cache "false";
Max-Age "86400"; // 1 Day age on index files
No-Store "false"; // Prevent the cache from storing archives
- Dl-Limit "7"; // 7Kb/sec maximum download rate
+ Dl-Limit "<INT>"; // Kb/sec maximum download rate
User-Agent "Debian APT-CURL/1.0";
};
@@ -271,8 +290,7 @@ Acquire
cdrom
{
- // do auto detection of the cdrom mountpoint
- AutoDetect "true";
+ AutoDetect "<BOOL>"; // do auto detection of the cdrom mountpoint
// when auto-detecting, only look for cdrom/dvd. when this is false
// it will support any removable device as a "cdrom" source
CdromOnly "true";
@@ -293,99 +311,102 @@ Acquire
Options {"--ignore-time-conflict";} // not very useful on a normal system
};
- CompressionTypes
+ /* CompressionTypes
{
bz2 "bzip2";
lzma "lzma";
gz "gzip";
Order { "uncompressed"; "gz"; "lzma"; "bz2"; };
- };
+ }; */
+ CompressionTypes::Order "<LIST>";
+ CompressionTypes::* "<STRING>";
- Languages
- {
- "environment";
- "de";
- "en";
- "none";
- "fr";
- };
+ Languages "<LIST>"; // "environment,de,en,none,fr";
// Location of the changelogs with the placeholder @CHANGEPATH@ (e.g. "main/a/apt/apt_1.1")
- Changelogs::URI::Origin::Debian "http://metadata.ftp-master.debian.org/changelogs/@CHANGEPATH@_changelog";
+ Changelogs::URI
+ {
+ // Origin::Debian "http://metadata.ftp-master.debian.org/changelogs/@CHANGEPATH@_changelog";
+ Origin::* "<STRING>";
+ Label::* "<STRING>";
+ Override::Origin::* "<STRING>";
+ Override::Label::* "<STRING>";
+ };
+ Changelogs::AlwaysOnline "<BOOL>"; // even if the changelog file exists get it online (as the file is incomplete)
+ Changelogs::AlwaysOnline::Origin::* "<BOOL>";
};
// Directory layout
-Dir "/"
+Dir "<DIR>"
{
+ Ignore-Files-Silently "<LIST>"; // of regexes: "\.dpkg-[a-z]+$,\.bak$,~$";
+
// Location of the state dir
- State "var/lib/apt/"
+ State "<DIR>"
{
- Lists "lists/";
- status "/var/lib/dpkg/status";
- extended_states "extended_states";
- cdroms "cdroms.list";
+ Lists "<DIR>";
+ status "<FILE>";
+ extended_states "<FILE>";
+ cdroms "<FILE>";
};
-
+
// Location of the cache dir
- Cache "var/cache/apt/" {
- Archives "archives/";
- // backup directory created by /etc/cron.daily/apt
- Backup "backup/";
- srcpkgcache "srcpkgcache.bin";
- pkgcache "pkgcache.bin";
+ Cache "<DIR>" {
+ Archives "<DIR>";
+ Backup "backup/"; // backup directory created by /etc/cron.daily/apt
+ srcpkgcache "<FILE>";
+ pkgcache "<FILE>";
};
-
+
// Config files
- Etc "etc/apt/" {
- Main "apt.conf";
- Netrc "auth.conf";
- Parts "apt.conf.d/";
- Preferences "preferences";
- PreferencesParts "preferences.d";
- SourceList "sources.list";
- SourceParts "sources.list.d";
- VendorList "vendors.list";
- VendorParts "vendors.list.d";
- Trusted "trusted.gpg";
- TrustedParts "trusted.gpg.d";
+ Etc "<DIR>" {
+ Main "<FILE>";
+ Netrc "<FILE>";
+ Parts "<DIR>";
+ Preferences "<FILE>";
+ PreferencesParts "<DIR>";
+ SourceList "<FILE>";
+ SourceParts "<DIR>";
+ Trusted "<FILE>";
+ TrustedParts "<DIR>";
};
-
+
// Locations of binaries
Bin {
- methods "/usr/lib/apt/methods/";
- gzip "/bin/gzip";
+ methods "<DIR>";
+ methods::* "<FILE>";
gpg "/usr/bin/gpgv";
- dpkg "/usr/bin/dpkg";
- dpkg-source "/usr/bin/dpkg-source";
+ dpkg "<PROGRAM_PATH>";
+ dpkg-source "<PROGRAM_PATH>";
dpkg-buildpackage "/usr/bin/dpkg-buildpackage";
- apt-get "/usr/bin/apt-get";
- apt-cache "/usr/bin/apt-cache";
+ lz4 "<PROGRAM_PATH>";
+ gzip "<PROGRAM_PATH>";
+ xz "<PROGRAM_PATH>";
+ bzip2 "<PROGRAM_PATH>";
+ lzma "<PROGRAM_PATH>";
+ uncompressed "<PROGRAM_PATH>";
+
+ solvers "<LIST>"; // of directories
+ planners "<LIST>"; // of directories
};
- // Location of the logfile
- Log "var/log/apt" {
- Terminal "term.log";
- History "history.log";
+ // Location of the logfiles
+ Log "<DIR>" {
+ Terminal "<FILE>";
+ History "<FILE>";
+ Solver "<FILE>";
+ Planner "<FILE>";
};
- // Media
- Media
+ Media
{
- // Media AutoDetect mount path
- MountPath "/media/apt";
- };
-
- // Media
- Media
- {
- // Media AutoDetect mount path
- MountPath "/media/apt";
+ MountPath "/media/apt"; // Media AutoDetect mount path
};
};
// Things that effect the APT dselect method
-DSelect
+DSelect
{
Clean "auto"; // always|auto|prompt|never
Options "-f";
@@ -396,9 +417,9 @@ DSelect
DPkg
{
- // let apt aggressivly use dpkg triggers
- NoTriggers "true";
- ConfigurePending "true";
+ NoTriggers "<BOOL>";
+ ConfigurePending "<BOOL>";
+ TriggersPending "<BOOL>";
// Probably don't want to use force-downgrade..
Options {"--force-overwrite";"--force-downgrade";}
@@ -421,9 +442,15 @@ DPkg
// Flush the contents of stdin before forking dpkg.
FlushSTDIN "true";
- // Control the size of the command line passed to dpkg.
- MaxArgBytes 32768;
- MaxArgs 8192;
+ MaxArgBytes "<INT>"; // Control the size of the command line passed to dpkg.
+ Install::Recursive "<BOOL>" // avoid long commandlines by recursive install in a tmpdir
+ {
+ force "<BOOL>"; // not all dpkg versions support this, so autodetection is default
+ minimum "<INT>"; // don't bother if its just a few packages
+ numbered "<BOOL>"; // avoid M-A:same ordering bug in dpkg
+ };
+
+ UseIONice "<BOOL>";
// controls if apt will apport on the first dpkg error or if it
// tries to install as many packages as possible
@@ -434,40 +461,293 @@ DPkg
of classes in the source code */
Debug
{
- pkgProblemResolver "false";
- pkgProblemResolver::ShowScores "false";
- pkgDepCache::AutoInstall "false"; // what packages apt install to satify dependencies
- pkgDepCache::Marker "false";
- pkgCacheGen "false";
- pkgAcquire "false";
- pkgAcquire::Worker "false";
- pkgAcquire::Auth "false";
- pkgDPkgPM "false";
- pkgDPkgProgressReporting "false";
- pkgOrderList "false";
- pkgPackageManager "false"; // OrderList/Configure debugging
- pkgAutoRemove "false"; // show information about automatic removes
- BuildDeps "false";
- pkgInitialize "false"; // This one will dump the configuration space
- NoLocking "false";
- Acquire::Ftp "false"; // Show ftp command traffic
- Acquire::Http "false"; // Show http command traffic
- Acquire::Https "false"; // Show https debug
- Acquire::gpgv "false"; // Show the gpgv traffic
- Acquire::cdrom "false"; // Show cdrom debug output
- aptcdrom "false"; // Show found package files
- IdentCdrom "false";
- acquire::netrc "false"; // netrc parser
- RunScripts "false"; // debug invocation of external scripts
-}
+ pkgInitConfig "<BOOL>";
+ pkgProblemResolver "<BOOL>";
+ pkgProblemResolver::ShowScores "<BOOL>";
+ pkgDepCache::AutoInstall "<BOOL>"; // what packages apt install to satify dependencies
+ pkgDepCache::Marker "<BOOL>";
+ pkgCacheGen "<BOOL>";
+ pkgAcquire "<BOOL>";
+ pkgAcquire::Worker "<BOOL>";
+ pkgAcquire::Auth "<BOOL>";
+ pkgAcquire::Diffs "<BOOL>";
+ pkgDPkgPM "<BOOL>";
+ pkgDPkgProgressReporting "<BOOL>";
+ pkgOrderList "<BOOL>";
+ pkgPackageManager "<BOOL>"; // OrderList/Configure debugging
+ pkgAutoRemove "<BOOL>"; // show information about automatic removes
+ BuildDeps "<BOOL>";
+ pkgInitialize "<BOOL>"; // This one will dump the configuration space
+ NoLocking "<BOOL>";
+ Acquire::Ftp "<BOOL>"; // Show ftp command traffic
+ Acquire::Http "<BOOL>"; // Show http command traffic
+ Acquire::Https "<BOOL>"; // Show https debug
+ Acquire::gpgv "<BOOL>"; // Show the gpgv traffic
+ Acquire::cdrom "<BOOL>"; // Show cdrom debug output
+ Acquire::Transaction "<BOOL>";
+ Acquire::Progress "<BOOL>";
+ aptcdrom "<BOOL>"; // Show found package files
+ IdentCdrom "<BOOL>";
+ acquire::netrc "<BOOL>"; // netrc parser
+ RunScripts "<BOOL>"; // debug invocation of external scripts
+ pkgPolicy "<BOOL>";
+ GetListOfFilesInDir "<BOOL>";
+ pkgAcqArchive::NoQueue "<BOOL>";
+ Hashes "<BOOL>";
+ APT::FtpArchive::Clean "<BOOL>";
+ NoDropPrivs "<BOOL>";
+ EDSP::WriteSolution "<BOOL>";
+ InstallProgress::Fancy "<BOOL>";
+ APT::Progress::PackageManagerFd "<BOOL>";
+};
pkgCacheGen
{
- Essential "native"; // other modes: all, none, installed
- ForceEssential { "apt"; };
- ForceImportant "";
-}
+ Essential "<STRING>"; // native,all, none, installed
+ ForceEssential "<STRING_OR_LIST>"; // package names
+ ForceImportant "<LIST>"; // package names
+};
+
+// modify points awarded for various facts about packages while
+// resolving conflicts in the dependency resolution process
+pkgProblemResolver::Scores
+{
+ Required "<INT>";
+ Important "<INT>";
+ Standard "<INT>";
+ Optional "<INT>";
+ Extra "<INT>";
+ Essentials "<INT>";
+ NotObsolete "<INT>";
+ Depends "<INT>";
+ PreDepends "<INT>";
+ Suggests "<INT>";
+ Recommends "<INT>";
+ Conflicts "<INT>";
+ Replaces "<INT>";
+ Obsoletes "<INT>";
+ Breaks "<INT>";
+ Enhances "<INT>";
+ AddProtected "<INT>";
+ AddEssential "<INT>";
+};
+pkgProblemResolver::FixByInstall "<BOOL>";
+
+APT::FTPArchive::release
+{
+ Default-Patterns "<BOOL>";
+ NumericTimezone "<BOOL>";
+
+ // set specific fields in the generated Release file
+ Acquire-By-Hash "<BOOL>";
+ ButAutomaticUpgrades "<BOOL>";
+ NotAutomatic "<BOOL>";
+ MD5 "<BOOL>";
+ SHA1 "<BOOL>";
+ SHA256 "<BOOL>";
+ SHA512 "<BOOL>";
+ Architectures "<STRING>";
+ Codename "<STRING>";
+ Components "<STRING>";
+ Date "<STRING>";
+ Description "<STRING>";
+ Label "<STRING>";
+ Origin "<STRING>";
+ Signed-by "<STRING>";
+ Suite "<STRING>";
+ Version "<STRING>";
+};
-/* Whatever you do, do not use this configuration file!! Take out ONLY
- the portions you need! */
-This Is Not A Valid Config File
+// having both seems wrong
+dpkgpm::progress "<BOOL>";
+dpkg::progress "<BOOL>";
+apt::acquire::by-hash "<STRING>";
+acquire::by-hash "<STRING>";
+apt::acquire::*::by-hash "<STRING>";
+acquire::*::by-hash "<STRING>";
+
+// Unsorted options: Some of those are used only internally
+
+help "<BOOL>"; // true if the help message was requested via e.g. --help
+version "<BOOL>"; // true if the version number was requested via e.g. --version
+Binary "<STRING>"; // name of the program run like apt-get, apt-cache, …
+
+dir::locale "<DIR>";
+dir::bin::dpkg-source "<STRING>";
+
+pkgcachefile::generate "<BOOL>";
+packagemanager::unpackall "<BOOL>";
+packagemanager::configure "<STRING>";
+commandline::asstring "<STRING>";
+edsp::scenario "<STRING>";
+eipp::scenario "<STRING>";
+cd::* "<STRING>"; // added CDRoms are stored as config
+
+orderlist::score::delete "<INT>";
+orderlist::score::essential "<INT>";
+orderlist::score::immediate "<INT>";
+orderlist::score::predepends "<INT>";
+
+apt::sources::with "<LIST>";
+apt::moo::color "<BOOL>";
+apt::pkgpackagemanager::maxloopcount "<INT>";
+apt::hashes::*::untrusted "<BOOL>";
+apt::list-cleanup "<BOOL>";
+apt::authentication::trustcdrom "<BOOL>";
+apt::solver::strict-pinning "<BOOL>";
+apt::keep-downloaded-packages "<BOOL>";
+apt::solver "<STRING>";
+apt::planner "<STRING>";
+apt::system "<STRING>";
+apt::acquire::translation "<STRING>"; // deprecated in favor of Acquire::Languages
+apt::sandbox::user "<STRING>";
+apt::color::highlight "<STRING>";
+apt::color::neutral "<STRING>";
+
+dpkgpm::reporting-steps "<INT>";
+
+dpkg::chroot-directory "<DIR>";
+dpkg::tools::options::** "<UNDEFINED>";
+dpkg::source-options "<STRING>";
+dpkg::progress-fancy "<BOOL>";
+dpkg::selection::remove::approved "<BOOL>";
+dpkg::remove::crossgrade::implicit "<BOOL>";
+dpkg::selection::current::saveandrestore "<BOOL>";
+dpkg::use-pty "<BOOL>";
+
+apt::cmd::disable-script-warning "<BOOL>";
+apt::cmd::show-update-stats "<BOOL>";
+apt::cmd::use-format "<BOOL>";
+apt::cmd::manual-installed "<BOOL>";
+apt::cmd::upgradable "<BOOL>";
+apt::cmd::installed "<BOOL>";
+apt::cmd::list-include-summary "<BOOL>";
+apt::cmd::use-regexp "<BOOL>";
+apt::cmd::all-versions "<BOOL>";
+apt::cmd::format "<STRING>";
+
+apt::config::dump::emptyvalue "<BOOL>";
+apt::config::dump::format "<STRING>";
+
+apt::mark::simulate "<BOOL>";
+apt::markauto::verbose "<BOOL>";
+apt::sortpkgs::source "<BOOL>";
+apt::extracttemplates::tempdir "<STRING>";
+
+apt::key::archivekeyring "<STRING>";
+apt::key::removedkeys "<STRING>";
+apt::key::gpgvcommand "<STRING>";
+apt::key::gpgcommand "<STRING>";
+apt::key::masterkeyring "<STRING>";
+apt::key::archivekeyringuri "<STRING>";
+apt::key::net-update-enabled "<STRING>";
+
+apt::ftparchive::release::patterns "<LIST>";
+apt::ftparchive::release::validtime "<INT>";
+apt::ftparchive::by-hash-keep "<INT>";
+apt::ftparchive::delinkact "<BOOL>";
+apt::ftparchive::md5 "<BOOL>";
+apt::ftparchive::sha1 "<BOOL>";
+apt::ftparchive::sha256 "<BOOL>";
+apt::ftparchive::sha512 "<BOOL>";
+apt::ftparchive::dobyhash "<BOOL>";
+apt::ftparchive::showcachemisses "<BOOL>";
+apt::ftparchive::sources::md5 "<BOOL>";
+apt::ftparchive::sources::sha1 "<BOOL>";
+apt::ftparchive::sources::sha256 "<BOOL>";
+apt::ftparchive::sources::sha512 "<BOOL>";
+apt::ftparchive::packages::md5 "<BOOL>";
+apt::ftparchive::packages::sha1 "<BOOL>";
+apt::ftparchive::packages::sha256 "<BOOL>";
+apt::ftparchive::packages::sha512 "<BOOL>";
+apt::ftparchive::dobyhash "<BOOL>";
+apt::ftparchive::readonlydb "<BOOL>";
+apt::ftparchive::nooverridemsg "<BOOL>";
+apt::ftparchive::alwaysstat "<BOOL>";
+apt::ftparchive::contents "<BOOL>";
+apt::ftparchive::contentsonly "<BOOL>";
+apt::ftparchive::longdescription "<BOOL>";
+apt::ftparchive::includearchitectureall "<BOOL>";
+apt::ftparchive::architecture "<STRING>";
+apt::ftparchive::db "<STRING>";
+apt::ftparchive::sourceoverride "<STRING>";
+
+apt-helper::cat-file::compress "<STRING>";
+
+acquire::cdrom::mount "<DIR>";
+acquire::maxreleasefilesize "<INT>";
+acquire::queuehost::limit "<INT>";
+acquire::max-pipeline-depth "<INT>";
+acquire::allowinsecurerepositories "<BOOL>";
+acquire::allowweakrepositories "<BOOL>";
+acquire::allowdowngradetoinsecurerepositories "<BOOL>";
+acquire::progress::diffpercent "<BOOL>";
+acquire::gzipindexes "<BOOL>";
+acquire::indextargets::randomized "<BOOL>";
+acquire::indextargets::deb::** "<UNDEFINED>";
+acquire::indextargets::deb-src::** "<UNDEFINED>";
+acquire::progress::ignore::showerrortext "<BOOL>";
+acquire::*::dl-limit "<INT>"; // catches file: and co which do not have these
+methods::mirror::problemreporting "<STRING>";
+acquire::http::proxyautodetect "<STRING>";
+acquire::http::proxy-auto-detect "<STRING>";
+acquire::http::proxy::* "<STRING>";
+acquire::https::proxyautodetect "<STRING>";
+acquire::https::proxy-auto-detect "<STRING>";
+acquire::https::proxy::* "<STRING>";
+
+// Options used by apt-ftparchive
+dir::archivedir "<DIR>";
+dir::cachedir "<DIR>";
+dir::overridedir "<DIR>";
+filemode "<INT>";
+longdescription "<BOOL>";
+external-links "<BOOL>";
+default::contentsage "<INT>";
+default::maxcontentschange "<INT>";
+default::filemode "<INT>";
+default::longdescription "<BOOL>";
+default::translation::compress "<STRING>";
+default::contents::compress "<STRING>";
+default::sources::compress "<STRING>";
+default::packages::compress "<STRING>";
+default::sources::extensions "<STRING>";
+default::packages::extensions "<STRING>";
+treedefault::directory "<STRING>";
+treedefault::srcdirectory "<STRING>";
+treedefault::packages "<STRING>";
+treedefault::translation "<STRING>";
+treedefault::internalprefix "<STRING>";
+treedefault::contents "<STRING>";
+treedefault::contents::header "<STRING>";
+treedefault::bincachedb "<STRING>";
+treedefault::srccachedb "<STRING>";
+treedefault::sources "<STRING>";
+treedefault::filelist "<STRING>";
+treedefault::sourcefilelist "<STRING>";
+sections "<STRING>";
+architectures "<STRING>";
+binoverride "<STRING>";
+internalprefix "<STRING>";
+bincachedb "<STRING>";
+directory "<STRING>";
+packages "<STRING>";
+translation "<STRING>";
+contents "<STRING>";
+filelist "<STRING>";
+extraoverride "<STRING>";
+pathprefix "<STRING>";
+srcdirectory "<STRING>";
+sources "<STRING>";
+sourcefilelist "<STRING>";
+srcextraoverride "<STRING>";
+srccachedb "<STRING>";
+srcoverride "<STRING>";
+contents::header "<STRING>";
+packages::compress "<STRING>";
+sources::compress "<STRING>";
+contents::compress "<STRING>";
+translation::compress "<STRING>";
+sources::extensions "<STRING>";
+packages::extensions "<STRING>";
+dir::filelistdir "<STRING>";
diff --git a/test/integration/framework b/test/integration/framework
index a0e9e759c..256c90261 100644
--- a/test/integration/framework
+++ b/test/integration/framework
@@ -340,6 +340,7 @@ setupenvironment() {
# -----
cd "$TMPWORKINGDIRECTORY"
+ echo "#x-apt-configure-index \"${SOURCEDIRECTORY}/doc/examples/configure-index\";" > aptconfig.conf
mkdir rootdir aptarchive keys
cd rootdir
mkdir -p etc/apt/apt.conf.d etc/apt/sources.list.d etc/apt/trusted.gpg.d etc/apt/preferences.d