summaryrefslogtreecommitdiff
path: root/cmdline
diff options
context:
space:
mode:
Diffstat (limited to 'cmdline')
-rw-r--r--cmdline/acqprogress.cc2
-rw-r--r--cmdline/apt-cache.cc2
-rw-r--r--cmdline/apt-cdrom.cc71
-rw-r--r--cmdline/apt-get.cc275
-rwxr-xr-xcmdline/apt-key65
-rwxr-xr-xcmdline/apt-mark9
6 files changed, 279 insertions, 145 deletions
diff --git a/cmdline/acqprogress.cc b/cmdline/acqprogress.cc
index b3ded4142..32e8243bf 100644
--- a/cmdline/acqprogress.cc
+++ b/cmdline/acqprogress.cc
@@ -150,7 +150,7 @@ bool AcqTextStatus::Pulse(pkgAcquire *Owner)
if (Quiet > 0)
return true;
- enum {Long = 0,Medium,Short} Mode = Long;
+ enum {Long = 0,Medium,Short} Mode = Medium;
char Buffer[sizeof(BlankLine)];
char *End = Buffer + sizeof(Buffer);
diff --git a/cmdline/apt-cache.cc b/cmdline/apt-cache.cc
index 275daa187..8323a740e 100644
--- a/cmdline/apt-cache.cc
+++ b/cmdline/apt-cache.cc
@@ -1637,7 +1637,7 @@ bool Policy(CommandLine &CmdL)
if (SrcList->FindIndex(VF.File(),Indx) == false &&
_system->FindIndex(VF.File(),Indx) == false)
return _error->Error(_("Cache is out of sync, can't x-ref a package file"));
- printf(_(" %4i %s\n"),Plcy.GetPriority(VF.File()),
+ printf(" %4i %s\n",Plcy.GetPriority(VF.File()),
Indx->Describe(true).c_str());
}
}
diff --git a/cmdline/apt-cdrom.cc b/cmdline/apt-cdrom.cc
index d804c55e5..0c9aab28c 100644
--- a/cmdline/apt-cdrom.cc
+++ b/cmdline/apt-cdrom.cc
@@ -98,6 +98,42 @@ OpProgress* pkgCdromTextStatus::GetOpProgress()
return &Progress;
};
/*}}}*/
+// SetupAutoDetect /*{{{*/
+bool AutoDetectCdrom(pkgUdevCdromDevices &UdevCdroms, unsigned int &i)
+{
+ bool Debug = _config->FindB("Debug::Acquire::cdrom", false);
+
+ vector<struct CdromDevice> v = UdevCdroms.Scan();
+ if (i >= v.size())
+ return false;
+
+ if (Debug)
+ clog << "Looking at devce " << i
+ << " DeviveName: " << v[i].DeviceName
+ << " IsMounted: '" << v[i].Mounted << "'"
+ << " MountPoint: '" << v[i].MountPath << "'"
+ << endl;
+
+ if (v[i].Mounted)
+ {
+ // set the right options
+ _config->Set("Acquire::cdrom::mount", v[i].MountPath);
+ _config->Set("APT::CDROM::NoMount", true);
+ } else {
+ string AptMountPoint = _config->FindDir("Dir::Media::MountPath");
+ if (!FileExists(AptMountPoint))
+ 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.c_str());
+ _config->Set("Acquire::cdrom::mount", AptMountPoint);
+ _config->Set("APT::CDROM::NoMount", true);
+ }
+ i++;
+
+ return true;
+}
+ /*}}}*/
+
// DoAdd - Add a new CDROM /*{{{*/
// ---------------------------------------------------------------------
/* This does the main add bit.. We show some status and things. The
@@ -106,12 +142,25 @@ OpProgress* pkgCdromTextStatus::GetOpProgress()
verify them. Then rewrite the database files */
bool DoAdd(CommandLine &)
{
- bool res = false;
+ pkgUdevCdromDevices UdevCdroms;
pkgCdromTextStatus log;
pkgCdrom cdrom;
- res = cdrom.Add(&log);
+ bool res = true;
+
+ bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect");
+ unsigned int count = 0;
+
+ if (AutoDetect && UdevCdroms.Dlopen())
+ {
+ while (AutoDetectCdrom(UdevCdroms, count))
+ res &= cdrom.Add(&log);
+ } else {
+ res = cdrom.Add(&log);
+ }
+
if(res)
cout << _("Repeat this process for the rest of the CDs in your set.") << endl;
+
return res;
}
/*}}}*/
@@ -120,10 +169,24 @@ bool DoAdd(CommandLine &)
/* */
bool DoIdent(CommandLine &)
{
+ pkgUdevCdromDevices UdevCdroms;
string ident;
pkgCdromTextStatus log;
pkgCdrom cdrom;
- return cdrom.Ident(ident, &log);
+ bool res = true;
+
+ bool AutoDetect = _config->FindB("Acquire::cdrom::AutoDetect");
+ unsigned int count = 0;
+
+ if (AutoDetect && UdevCdroms.Dlopen())
+ {
+ while (AutoDetectCdrom(UdevCdroms, count))
+ res &= cdrom.Ident(ident, &log);
+ } else {
+ return cdrom.Ident(ident, &log);
+ }
+
+ return res;
}
/*}}}*/
// ShowHelp - Show the help screen /*{{{*/
@@ -154,6 +217,7 @@ int ShowHelp()
" -m No mounting\n"
" -f Fast mode, don't check package files\n"
" -a Thorough scan mode\n"
+ " --auto-detect Auto detect drive and mount point\n"
" -c=? Read this configuration file\n"
" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
"See fstab(5)\n";
@@ -164,6 +228,7 @@ int main(int argc,const char *argv[]) /*{{{*/
{
CommandLine::Args Args[] = {
{'h',"help","help",0},
+ { 0,"auto-detect","Acquire::cdrom::AutoDetect",0},
{'v',"version","version",0},
{'d',"cdrom","Acquire::cdrom::mount",CommandLine::HasArg},
{'r',"rename","APT::CDROM::Rename",0},
diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 343226bc3..5ef5533e2 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -1269,131 +1269,153 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
pkgSrcRecords &SrcRecs,string &Src,
pkgDepCache &Cache)
{
- string VerTag;
- string DefRel = _config->Find("APT::Default-Release");
- string TmpSrc = Name;
- const size_t found = TmpSrc.find_last_of("/=");
-
- // extract the version/release from the pkgname
- if (found != string::npos) {
- if (TmpSrc[found] == '/')
- DefRel = TmpSrc.substr(found+1);
- else
- VerTag = TmpSrc.substr(found+1);
- TmpSrc = TmpSrc.substr(0,found);
- }
-
- /* Lookup the version of the package we would install if we were to
- install a version and determine the source package name, then look
- in the archive for a source package of the same name. */
- bool MatchSrcOnly = _config->FindB("APT::Get::Only-Source");
- const pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc);
- if (MatchSrcOnly == false && Pkg.end() == false) {
- if(VerTag.empty() == false || DefRel.empty() == false) {
- // we have a default release, try to locate the pkg. we do it like
- // this because GetCandidateVer() will not "downgrade", that means
- // "apt-get source -t stable apt" won't work on a unstable system
- for (pkgCache::VerIterator Ver = Pkg.VersionList();
- Ver.end() == false; Ver++) {
- for (pkgCache::VerFileIterator VF = Ver.FileList();
- VF.end() == false; VF++) {
- /* If this is the status file, and the current version is not the
- version in the status file (ie it is not installed, or somesuch)
- then it is not a candidate for installation, ever. This weeds
- out bogus entries that may be due to config-file states, or
- other. */
- if ((VF.File()->Flags & pkgCache::Flag::NotSource) ==
- pkgCache::Flag::NotSource && Pkg.CurrentVer() != Ver)
- continue;
-
- // We match against a concrete version (or a part of this version)
- if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.VerStr(), VerTag.size()) != 0)
- continue;
-
- // or we match against a release
- if(VerTag.empty() == false ||
- (VF.File().Archive() != 0 && VF.File().Archive() == DefRel) ||
- (VF.File().Codename() != 0 && VF.File().Codename() == DefRel)) {
- pkgRecords::Parser &Parse = Recs.Lookup(VF);
- Src = Parse.SourcePkg();
- if (VerTag.empty() == true)
- VerTag = Parse.SourceVer();
- break;
- }
- }
- }
- if (Src.empty() == true) {
- if (VerTag.empty() == false)
- _error->Warning(_("Ignore unavailable version '%s' of package '%s'"), VerTag.c_str(), TmpSrc.c_str());
- else
- _error->Warning(_("Ignore unavailable target release '%s' of package '%s'"), DefRel.c_str(), TmpSrc.c_str());
- VerTag.clear();
- DefRel.clear();
- }
- }
- if (VerTag.empty() == true && DefRel.empty() == true) {
- // if we don't have a version or default release, use the CandidateVer to find the Source
- pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg);
- if (Ver.end() == false) {
- pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList());
- Src = Parse.SourcePkg();
- VerTag = Parse.SourceVer();
- }
- }
- }
-
- if (Src.empty() == true)
- Src = TmpSrc;
- else {
- /* if we have a source pkg name, make sure to only search
- for srcpkg names, otherwise apt gets confused if there
- is a binary package "pkg1" and a source package "pkg1"
- with the same name but that comes from different packages */
- MatchSrcOnly = true;
- if (Src != TmpSrc) {
- ioprintf(c1out, _("Picking '%s' as source package instead of '%s'\n"), Src.c_str(), TmpSrc.c_str());
- }
- }
-
- // The best hit
- pkgSrcRecords::Parser *Last = 0;
- unsigned long Offset = 0;
- string Version;
-
- /* Iterate over all of the hits, which includes the resulting
- binary packages in the search */
- pkgSrcRecords::Parser *Parse;
- while (true) {
- SrcRecs.Restart();
- while ((Parse = SrcRecs.Find(Src.c_str(), MatchSrcOnly)) != 0) {
- const string Ver = Parse->Version();
-
- // Ignore all versions which doesn't fit
- if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.c_str(), VerTag.size()) != 0)
- continue;
-
- // Newer version or an exact match? Save the hit
- if (Last == 0 || Cache.VS().CmpVersion(Version,Ver) < 0) {
- Last = Parse;
- Offset = Parse->Offset();
- Version = Ver;
- }
-
- // was the version check above an exact match? If so, we don't need to look further
- if (VerTag.empty() == false && VerTag.size() == Ver.size())
- break;
- }
- if (Last != 0 || VerTag.empty() == true)
- break;
- //if (VerTag.empty() == false && Last == 0)
- _error->Warning(_("Ignore unavailable version '%s' of package '%s'"), VerTag.c_str(), TmpSrc.c_str());
- VerTag.clear();
- }
-
- if (Last == 0 || Last->Jump(Offset) == false)
- return 0;
-
- return Last;
+ string VerTag;
+ string DefRel = _config->Find("APT::Default-Release");
+ string TmpSrc = Name;
+
+ // extract the version/release from the pkgname
+ const size_t found = TmpSrc.find_last_of("/=");
+ if (found != string::npos) {
+ if (TmpSrc[found] == '/')
+ DefRel = TmpSrc.substr(found+1);
+ else
+ VerTag = TmpSrc.substr(found+1);
+ TmpSrc = TmpSrc.substr(0,found);
+ }
+
+ /* Lookup the version of the package we would install if we were to
+ install a version and determine the source package name, then look
+ in the archive for a source package of the same name. */
+ bool MatchSrcOnly = _config->FindB("APT::Get::Only-Source");
+ const pkgCache::PkgIterator Pkg = Cache.FindPkg(TmpSrc);
+ if (MatchSrcOnly == false && Pkg.end() == false)
+ {
+ if(VerTag.empty() == false || DefRel.empty() == false)
+ {
+ // we have a default release, try to locate the pkg. we do it like
+ // this because GetCandidateVer() will not "downgrade", that means
+ // "apt-get source -t stable apt" won't work on a unstable system
+ for (pkgCache::VerIterator Ver = Pkg.VersionList();
+ Ver.end() == false; Ver++)
+ {
+ for (pkgCache::VerFileIterator VF = Ver.FileList();
+ VF.end() == false; VF++)
+ {
+ /* If this is the status file, and the current version is not the
+ version in the status file (ie it is not installed, or somesuch)
+ then it is not a candidate for installation, ever. This weeds
+ out bogus entries that may be due to config-file states, or
+ other. */
+ if ((VF.File()->Flags & pkgCache::Flag::NotSource) ==
+ pkgCache::Flag::NotSource && Pkg.CurrentVer() != Ver)
+ continue;
+
+ // We match against a concrete version (or a part of this version)
+ if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.VerStr(), VerTag.size()) != 0)
+ continue;
+
+ // or we match against a release
+ if(VerTag.empty() == false ||
+ (VF.File().Archive() != 0 && VF.File().Archive() == DefRel) ||
+ (VF.File().Codename() != 0 && VF.File().Codename() == DefRel))
+ {
+ pkgRecords::Parser &Parse = Recs.Lookup(VF);
+ Src = Parse.SourcePkg();
+ // no SourcePkg name, so it is the "binary" name
+ if (Src.empty() == true)
+ Src = TmpSrc;
+ // no Version, so we try the Version of the SourcePkg -
+ // and after that the version of the binary package
+ if (VerTag.empty() == true)
+ VerTag = Parse.SourceVer();
+ if (VerTag.empty() == true)
+ VerTag = Ver.VerStr();
+ break;
+ }
+ }
+ if (Src.empty() == false)
+ break;
+ }
+ if (Src.empty() == true)
+ {
+ // Sources files have no codename information
+ if (VerTag.empty() == true && DefRel.empty() == false)
+ _error->Warning(_("Ignore unavailable target release '%s' of package '%s'"), DefRel.c_str(), TmpSrc.c_str());
+ DefRel.clear();
+ }
+ }
+ if (Src.empty() == true)
+ {
+ // if we don't have found a fitting package yet so we will
+ // choose a good candidate and proceed with that.
+ // Maybe we will find a source later on with the right VerTag
+ pkgCache::VerIterator Ver = Cache.GetCandidateVer(Pkg);
+ if (Ver.end() == false)
+ {
+ pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList());
+ Src = Parse.SourcePkg();
+ if (VerTag.empty() == true)
+ VerTag = Parse.SourceVer();
+ }
+ }
+ }
+
+ if (Src.empty() == true)
+ Src = TmpSrc;
+ else
+ {
+ /* if we have a source pkg name, make sure to only search
+ for srcpkg names, otherwise apt gets confused if there
+ is a binary package "pkg1" and a source package "pkg1"
+ with the same name but that comes from different packages */
+ MatchSrcOnly = true;
+ if (Src != TmpSrc)
+ {
+ ioprintf(c1out, _("Picking '%s' as source package instead of '%s'\n"), Src.c_str(), TmpSrc.c_str());
+ }
+ }
+
+ // The best hit
+ pkgSrcRecords::Parser *Last = 0;
+ unsigned long Offset = 0;
+ string Version;
+
+ /* Iterate over all of the hits, which includes the resulting
+ binary packages in the search */
+ pkgSrcRecords::Parser *Parse;
+ while (true)
+ {
+ SrcRecs.Restart();
+ while ((Parse = SrcRecs.Find(Src.c_str(), MatchSrcOnly)) != 0)
+ {
+ const string Ver = Parse->Version();
+
+ // Ignore all versions which doesn't fit
+ if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.c_str(), VerTag.size()) != 0)
+ continue;
+
+ // Newer version or an exact match? Save the hit
+ if (Last == 0 || Cache.VS().CmpVersion(Version,Ver) < 0) {
+ Last = Parse;
+ Offset = Parse->Offset();
+ Version = Ver;
+ }
+
+ // was the version check above an exact match? If so, we don't need to look further
+ if (VerTag.empty() == false && VerTag.size() == Ver.size())
+ break;
+ }
+ if (Last != 0 || VerTag.empty() == true)
+ break;
+ //if (VerTag.empty() == false && Last == 0)
+ _error->Warning(_("Ignore unavailable version '%s' of package '%s'"), VerTag.c_str(), TmpSrc.c_str());
+ VerTag.clear();
+ }
+
+ if (Last == 0 || Last->Jump(Offset) == false)
+ return 0;
+
+ return Last;
}
/*}}}*/
// DoUpdate - Update the package lists /*{{{*/
@@ -1776,7 +1798,8 @@ bool DoInstall(CommandLine &CmdL)
if(!Remove &&
Cache[Pkg].Install() == false &&
(Cache[Pkg].Flags & pkgCache::Flag::Auto) &&
- _config->FindB("APT::Get::ReInstall",false) == false)
+ _config->FindB("APT::Get::ReInstall",false) == false &&
+ _config->FindB("APT::Get::Download-Only",false) == false)
{
ioprintf(c1out,_("%s set to manually installed.\n"),
Pkg.Name());
diff --git a/cmdline/apt-key b/cmdline/apt-key
index 7bb30240e..e45468fd4 100755
--- a/cmdline/apt-key
+++ b/cmdline/apt-key
@@ -5,10 +5,8 @@ unset GREP_OPTIONS
# We don't use a secret keyring, of course, but gpg panics and
# implodes if there isn't one available
-
GPG_CMD="gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /etc/apt/secring.gpg --trustdb-name /etc/apt/trustdb.gpg"
-GPG="$GPG_CMD --keyring /etc/apt/trusted.gpg"
-
+GPG="$GPG_CMD"
MASTER_KEYRING=""
ARCHIVE_KEYRING_URI=""
@@ -56,7 +54,14 @@ add_keys_with_verify_against_master_keyring() {
# (otherwise it does not make sense from a security POV)
net_update() {
if [ -z "$ARCHIVE_KEYRING_URI" ]; then
- echo "ERROR: no location for the archive-keyring given"
+ echo "ERROR: no location for the archive-keyring given"
+ exit 1
+ fi
+ # in theory we would need to depend on wget for this, but this feature
+ # isn't useable in debian anyway as we have no keyring uri nor a master key
+ if ! which wget >/dev/null 2>&1; then
+ echo "ERROR: an installed wget is required for a network-based update"
+ exit 1
fi
if [ ! -d /var/lib/apt/keyrings ]; then
mkdir -p /var/lib/apt/keyrings
@@ -93,18 +98,22 @@ update() {
# add any security. we *need* this check on net-update though
$GPG_CMD --quiet --batch --keyring $ARCHIVE_KEYRING --export | $GPG --import
- # remove no-longer supported/used keys
- keys=`$GPG_CMD --keyring $REMOVED_KEYS --with-colons --list-keys | grep ^pub | cut -d: -f5`
- for key in $keys; do
- if $GPG --list-keys --with-colons | grep ^pub | cut -d: -f5 | grep -q $key; then
- $GPG --quiet --batch --delete-key --yes ${key}
- fi
- done
+ if [ -r "$REMOVED_KEYS" ]; then
+ # remove no-longer supported/used keys
+ keys=`$GPG_CMD --keyring $REMOVED_KEYS --with-colons --list-keys | grep ^pub | cut -d: -f5`
+ for key in $keys; do
+ if $GPG --list-keys --with-colons | grep ^pub | cut -d: -f5 | grep -q $key; then
+ $GPG --quiet --batch --delete-key --yes ${key}
+ fi
+ done
+ else
+ echo "Warning: removed keys keyring $REMOVED_KEYS missing or not readable" >&2
+ fi
}
usage() {
- echo "Usage: apt-key [command] [arguments]"
+ echo "Usage: apt-key [--keyring file] [command] [arguments]"
echo
echo "Manage apt's list of trusted keys"
echo
@@ -118,8 +127,40 @@ usage() {
echo " apt-key finger - list fingerprints"
echo " apt-key adv - pass advanced options to gpg (download key)"
echo
+ echo "If no specific keyring file is given the command applies to all keyring files."
}
+# Determine on which keyring we want to work
+if [ "$1" = "--keyring" ]; then
+ #echo "keyfile given"
+ shift
+ TRUSTEDFILE="$1"
+ if [ -r "$TRUSTEDFILE" ]; then
+ GPG="$GPG --keyring $TRUSTEDFILE --primary-keyring $TRUSTEDFILE"
+ else
+ echo >&2 "Error: The specified keyring »$TRUSTEDFILE« is missing or not readable"
+ exit 1
+ fi
+ shift
+# otherwise use the default
+else
+ #echo "generate list"
+ TRUSTEDFILE="/etc/apt/trusted.gpg"
+ if [ -r "$TRUSTEDFILE" ]; then
+ GPG="$GPG --keyring $TRUSTEDFILE"
+ fi
+ GPG="$GPG --primary-keyring $TRUSTEDFILE"
+ TRUSTEDPARTS="/etc/apt/trusted.gpg.d"
+ if [ -d "$TRUSTEDPARTS" ]; then
+ #echo "parts active"
+ for trusted in $(run-parts --list $TRUSTEDPARTS --regex '^.*\.gpg$'); do
+ #echo "part -> $trusted"
+ GPG="$GPG --keyring $trusted"
+ done
+ fi
+fi
+#echo "COMMAND: $GPG"
+
command="$1"
if [ -z "$command" ]; then
usage
diff --git a/cmdline/apt-mark b/cmdline/apt-mark
index 3a818a3db..2326ece38 100755
--- a/cmdline/apt-mark
+++ b/cmdline/apt-mark
@@ -46,11 +46,16 @@ def mark_unmark_automatic(filename, action, pkgs):
print "changing %s to %s" % (pkgname,action)
newsec = apt_pkg.RewriteSection(tagfile.Section,
[],
- [ ("Auto-Installed",str(action)) ]
- )
+ [ ("Auto-Installed",str(action)) ])
+ pkgs.remove(pkgname)
outfile.write(newsec+"\n")
else:
outfile.write(str(tagfile.Section)+"\n")
+ if action == 1:
+ for pkgname in pkgs:
+ if options.verbose:
+ print "changing %s to %s" % (pkgname,action)
+ outfile.write("Package: %s\nAuto-Installed: %d\n\n" % (pkgname, action))
# all done, rename the tmpfile
os.chmod(outfile.name, 0644)
os.rename(outfile.name, STATE_FILE)