dpkgbuf_pos = dpkgbuf+dpkgbuf_pos-p;
}
/*}}}*/
+ // DPkgPM::WriteHistoryTag /*{{{*/
+ void pkgDPkgPM::WriteHistoryTag(string tag, string value)
+ {
+ if (value.size() > 0)
+ {
+ // poor mans rstrip(", ")
+ if (value[value.size()-2] == ',' && value[value.size()-1] == ' ')
+ value.erase(value.size() - 2, 2);
+ fprintf(history_out, "%s: %s\n", tag.c_str(), value.c_str());
+ }
+ } /*}}}*/
// DPkgPM::OpenLog /*{{{*/
bool pkgDPkgPM::OpenLog()
{
string logdir = _config->FindDir("Dir::Log");
if(not FileExists(logdir))
return _error->Error(_("Directory '%s' missing"), logdir.c_str());
+
+ // get current time
+ char timestr[200];
+ time_t t = time(NULL);
+ struct tm *tmp = localtime(&t);
+ strftime(timestr, sizeof(timestr), "%F %T", tmp);
+
+ // open terminal log
string logfile_name = flCombine(logdir,
_config->Find("Dir::Log::Terminal"));
if (!logfile_name.empty())
{
term_out = fopen(logfile_name.c_str(),"a");
chmod(logfile_name.c_str(), 0600);
- // output current time
- char outstr[200];
- time_t t = time(NULL);
- struct tm *tmp = localtime(&t);
- strftime(outstr, sizeof(outstr), "%F %T", tmp);
- fprintf(term_out, "\nLog started: ");
- fprintf(term_out, "%s", outstr);
+ fprintf(term_out, "\n\nLog started: ");
+ fprintf(term_out, "%s", timestr);
fprintf(term_out, "\n");
}
+
+ // write
+ string history_name = flCombine(logdir,
+ _config->Find("Dir::Log::History"));
+ if (!history_name.empty())
+ {
+ history_out = fopen(history_name.c_str(),"a");
+ chmod(history_name.c_str(), 0644);
+ fprintf(history_out, "\nStart-Date: %s\n", timestr);
+ string remove, purge, install, upgrade, downgrade;
+ for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
+ {
+ if (Cache[I].NewInstall())
+ install += I.Name() + string(" (") + Cache[I].CandVersion + string("), ");
+ else if (Cache[I].Upgrade())
+ upgrade += I.Name() + string(" (") + Cache[I].CurVersion + string(", ") + Cache[I].CandVersion + string("), ");
+ else if (Cache[I].Downgrade())
+ downgrade += I.Name() + string(" (") + Cache[I].CurVersion + string(", ") + Cache[I].CandVersion + string("), ");
+ else if (Cache[I].Delete())
+ {
+ if ((Cache[I].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge)
+ purge += I.Name() + string(" (") + Cache[I].CurVersion + string("), ");
+ else
+ remove += I.Name() + string(" (") + Cache[I].CurVersion + string("), ");
+ }
+ }
+ WriteHistoryTag("Install", install);
+ WriteHistoryTag("Upgrade", upgrade);
+ WriteHistoryTag("Downgrade",downgrade);
+ WriteHistoryTag("Remove",remove);
+ WriteHistoryTag("Purge",purge);
+ fflush(history_out);
+ }
+
return true;
}
/*}}}*/
// DPkg::CloseLog /*{{{*/
bool pkgDPkgPM::CloseLog()
{
+ char timestr[200];
+ time_t t = time(NULL);
+ struct tm *tmp = localtime(&t);
+ strftime(timestr, sizeof(timestr), "%F %T", tmp);
+
if(term_out)
{
- char outstr[200];
- time_t t = time(NULL);
- struct tm *tmp = localtime(&t);
- strftime(outstr, sizeof(outstr), "%F %T", tmp);
fprintf(term_out, "Log ended: ");
- fprintf(term_out, "%s", outstr);
+ fprintf(term_out, "%s", timestr);
fprintf(term_out, "\n");
fclose(term_out);
}
term_out = NULL;
+
+ if(history_out)
+ {
+ if (dpkg_error.size() > 0)
+ fprintf(history_out, "Error: %s\n", dpkg_error.c_str());
+ fprintf(history_out, "End-Date: %s\n", timestr);
+ fclose(history_out);
+ }
+
return true;
}
/*}}}*/
const char *s = _("Can not write log, openpty() "
"failed (/dev/pts not mounted?)\n");
fprintf(stderr, "%s",s);
- fprintf(term_out, "%s",s);
+ if(term_out)
+ fprintf(term_out, "%s",s);
master = slave = -1;
} else {
struct termios rtt;
RunScripts("DPkg::Post-Invoke");
if (WIFSIGNALED(Status) != 0 && WTERMSIG(Status) == SIGSEGV)
- _error->Error("Sub-process %s received a segmentation fault.",Args[0]);
+ strprintf(dpkg_error, "Sub-process %s received a segmentation fault.",Args[0]);
else if (WIFEXITED(Status) != 0)
- _error->Error("Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status));
+ strprintf(dpkg_error, "Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status));
else
- _error->Error("Sub-process %s exited unexpectedly",Args[0]);
+ strprintf(dpkg_error, "Sub-process %s exited unexpectedly",Args[0]);
+
+ if(dpkg_error.size() > 0)
+ _error->Error(dpkg_error.c_str());
if(stopOnError)
{
-apt (0.7.25) UNRELEASED; urgency=low
++apt (0.7.25.1) UNRELEASED; urgency=low
++
++ * merged lp:~mvo/apt/history
++ - this writes a /var/log/apt/history tagfile that contains details
++ from the transaction (complements term.log)
++
++ -- Michael Vogt <michael.vogt@ubuntu.com> Fri, 18 Dec 2009 16:54:18 +0100
++
+apt (0.7.25) unstable; urgency=low
[ Christian Perrier ]
* Fix apt-ftparchive(1) wrt description of the "-o" option.
Closes: #548571
* German translation update by Holger Wansing
Closes: #551534
- * German translation of manpages by Chris Leick
- Closes: #552606
* Italian translation update by Milo Casagrande
Closes: #555797
* Simplified Chinese translation update by Aron Xu
(thanks also to Jussi Hakala and Julian Andres Klode)
* apt-pkg/deb/dpkgpm.cc:
- add "purge" to list of known actions
+ * apt-pkg/init.h:
+ - add compatibility with old ABI name until the next ABI break
+ * merge segfault fix from Mario Sanchez Prada, many thanks
+ (closes: #561109)
[ Brian Murray ]
* apt-pkg/depcache.cc, apt-pkg/indexcopy.cc:
* doc/po4a.conf: activate translation of guide.sgml and offline.sgml
* doc/apt.conf.5.xml:
- provide a few more details about APT::Immediate-Configure
+ - briefly document the behaviour of the new https options
* doc/sources.list.5.xml:
- add note about additional apt-transport-methods
* doc/apt-mark.8.xml:
- correct showauto synopsis, thanks Andrew Schulman (Closes: #551440)
* cmdline/apt-get.cc:
- - source should displays his final pkg pick (Closes: #249383, #550952)
+ - source should display his final pkg pick (Closes: #249383, #550952)
- source doesn't need the complete version for match (Closes: #245250)
- source ignores versions/releases if not available (Closes: #377424)
- only warn if (free) space overflows (Closes: #522238)
- add --debian-only as alias for --diff-only
* methods/connect.cc:
- display also strerror of "wicked" getaddrinfo errors
+ - add AI_ADDRCONFIG to ai_flags as suggested by Aurelien Jarno
+ in response to Bernhard R. Link, thanks! (Closes: #505020)
* buildlib/configure.mak, buildlib/config.{sub,guess}:
- remove (outdated) config.{sub,guess} and use the ones provided
by the new added build-dependency autotools-dev instead
- bump policy to 3.8.3 as we have no outdated manpages anymore
* debian/NEWS:
- fix a typo in 0.7.24: Allready -> Already (Closes: #557674)
- * cmdline/apt-mark:
- - print an error if a new state file can't be created,
- thanks Carl Chenet! (Closes: #521289)
- - print an error and exit if python-apt is not installed,
- thanks Carl Chenet! (Closes: #521284)
* ftparchive/writer.{cc,h}:
- add APT::FTPArchive::LongDescription to be able to disable them
* apt-pkg/deb/debsrcrecords.cc:
- use "diff" filetype for .debian.tar.* files (Closes: #554898)
+ * methods/rred.cc:
+ - rewrite to be able to handle even big patch files
+ - adopt optional mmap+iovec patch from Morten Hustveit
+ (Closes: #463354) which should speed up a bit. Thanks!
+ * methods/http{,s}.cc
+ - add config setting for User-Agent to the Acquire group,
+ thanks Timothy J. Miller! (Closes: #355782)
+ - add https options which default to http ones (Closes: #557085)
+ * debian/apt.cron.daily:
+ - check cache size even if we do nothing else otherwise, thanks
+ Francesco Poli for patch(s) and patience! (Closes: #459344)
+ * ftparchive/*:
+ - fix a few typos in strings, comments and manpage,
+ thanks Karl Goetz! (Closes: #558757)
+
+ [ Carl Chenet ]
+ * cmdline/apt-mark:
+ - print an error if a new state file can't be created
+ (Closes: #521289) and
+ - exit nicely if python-apt is not installed (Closes: #521284)
[ Chris Leick ]
+ * doc/de: German translation of manpages (Closes: #552606)
* doc/ various manpages:
- correct various errors, typos and oddities (Closes: #552535)
* doc/apt-secure.8.xml:
- replace literal with emphasis tags in Archive configuration
+ * doc/apt-ftparchive.1.xml:
+ - remove informalexample tag which hides the programlisting
+ * doc/apt-get.8.xml:
+ - change equivalent "for" to "to the" (purge command)
+ - clarify --fix-broken sentence about specifying packages
[ Eugene V. Lyubimkin ]
* apt-pkg/contib/strutl.h
* debian/apt.conf.autoremove:
- Add kfreebsd-image-* to the list (Closes: #558803)
- -- Michael Vogt <michael.vogt@ubuntu.com> Tue, 29 Sep 2009 15:51:34 +0200
+ -- Michael Vogt <mvo@debian.org> Tue, 15 Dec 2009 09:21:55 +0100
apt (0.7.24) unstable; urgency=low
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
+ User-Agent "Debian APT-HTTP/1.3";
};
- // HTTPS method configuration:
- // - uses the http proxy config
- // - uses the http cache-control values
- // - uses the http Dl-Limit values
- https
+
+
+ // HTTPS method configuration: uses the http
+ // - proxy config
+ // - cache-control values
+ // - Dl-Limit, Timout, ... values
+ // if not set explicit for https
+ //
+ // see /usr/share/doc/apt/examples/apt-https-method-example.conf.gz
+ // for more examples
+ https
{
Verify-Peer "false";
SslCert "/etc/apt/some.pem";
- CaPath "/etc/ssl/certs";
- Verify-Host" "true";
- AllowRedirect "true";
+ CaPath "/etc/ssl/certs";
+ Verify-Host" "true";
+ AllowRedirect "true";
+
+ Timeout "120";
+ AllowRedirect "true";
+
+ // 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
+
+ User-Agent "Debian APT-CURL/1.0";
};
ftp
// Location of the logfile
Log "var/log/apt" {
Terminal "term.log";
+ History "history.log";
};
};