diff options
Diffstat (limited to 'cmdline')
-rw-r--r-- | cmdline/acqprogress.cc | 2 | ||||
-rw-r--r-- | cmdline/apt-cache.cc | 2 | ||||
-rw-r--r-- | cmdline/apt-cdrom.cc | 71 | ||||
-rw-r--r-- | cmdline/apt-get.cc | 275 | ||||
-rwxr-xr-x | cmdline/apt-key | 65 | ||||
-rwxr-xr-x | cmdline/apt-mark | 9 |
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) |