From 9169c8714c7f6f7126a8d87265897d510e5422f3 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 18 Dec 2009 10:25:34 +0100 Subject: add /var/log/apt/history.log file --- apt-pkg/deb/dpkgpm.cc | 84 ++++++++++++++++++++++++++++++++++++++++++--------- apt-pkg/deb/dpkgpm.h | 4 ++- apt-pkg/init.cc | 1 + 3 files changed, 73 insertions(+), 16 deletions(-) diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 6eb3b40ac..480ffd169 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -556,39 +556,90 @@ 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].Install()) + install += I.Name() + 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(") "); + } + 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(") "); + } + if (install.size() > 0) + fprintf(history_out, "Install: %s\n", install.c_str()); + if (upgrade.size() > 0) + fprintf(history_out, "Upgrade: %s\n", upgrade.c_str()); + if (downgrade.size() > 0) + fprintf(history_out, "Downgrade: %s\n", downgrade.c_str()); + if (remove.size() > 0) + fprintf(history_out, "Remove: %s\n", remove.c_str()); + if (purge.size() > 0) + fprintf(history_out, "Purge: %s\n", purge.c_str()); + } + 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; } /*}}}*/ @@ -1057,11 +1108,14 @@ bool pkgDPkgPM::Go(int OutStatusFd) 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) { diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h index 43e5c7d45..67f1430be 100644 --- a/apt-pkg/deb/dpkgpm.h +++ b/apt-pkg/deb/dpkgpm.h @@ -29,7 +29,9 @@ class pkgDPkgPM : public pkgPackageManager char dpkgbuf[1024]; int dpkgbuf_pos; FILE *term_out; - + FILE *history_out; + string dpkg_error; + protected: // progress reporting diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc index a54c09a36..2544b8025 100644 --- a/apt-pkg/init.cc +++ b/apt-pkg/init.cc @@ -74,6 +74,7 @@ bool pkgInitConfig(Configuration &Cnf) // State Cnf.Set("Dir::Log","var/log/apt"); Cnf.Set("Dir::Log::Terminal","term.log"); + Cnf.Set("Dir::Log::History","history.log"); // Translation Cnf.Set("APT::Acquire::Translation", "environment"); -- cgit v1.2.3 From 9c59aadaae0b6c1286608ad87b468e7463adf8d9 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 18 Dec 2009 10:45:24 +0100 Subject: fix order of upgrade, install check because for a upgrade "Install()" returns True as well --- apt-pkg/deb/dpkgpm.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 480ffd169..6984c64c1 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -586,7 +586,11 @@ bool pkgDPkgPM::OpenLog() string remove, purge, install, upgrade, downgrade; for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) { - if (Cache[I].Install()) + 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].Install()) install += I.Name() + string(" (") + Cache[I].CandVersion + string(") "); else if (Cache[I].Delete()) { @@ -595,10 +599,6 @@ bool pkgDPkgPM::OpenLog() else remove += I.Name() + string(" (") + Cache[I].CurVersion + 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(") "); } if (install.size() > 0) fprintf(history_out, "Install: %s\n", install.c_str()); -- cgit v1.2.3 From 06d5520f0787f5fdb3fe0def435709054a26dbda Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 18 Dec 2009 10:58:07 +0100 Subject: apt-pkg/deb/dpkgpm.cc: fflush early --- apt-pkg/deb/dpkgpm.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 6984c64c1..8162405c7 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -610,6 +610,7 @@ bool pkgDPkgPM::OpenLog() fprintf(history_out, "Remove: %s\n", remove.c_str()); if (purge.size() > 0) fprintf(history_out, "Purge: %s\n", purge.c_str()); + fflush(history_out); } return true; -- cgit v1.2.3 From 068636516ff7e7686159de478eff7b4e1036f5dc Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 18 Dec 2009 11:30:22 +0100 Subject: * debian/apt.logrotate: - add to logratation * doc/examples/configure-index: - add as example --- debian/apt.logrotate | 8 ++++++++ doc/examples/configure-index | 1 + 2 files changed, 9 insertions(+) diff --git a/debian/apt.logrotate b/debian/apt.logrotate index 3e924d383..dfb06db2e 100644 --- a/debian/apt.logrotate +++ b/debian/apt.logrotate @@ -6,3 +6,11 @@ notifempty } +/var/log/apt/history.log { + rotate 6 + monthly + compress + missingok + notifempty +} + diff --git a/doc/examples/configure-index b/doc/examples/configure-index index f5f996460..eaea6511c 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -307,6 +307,7 @@ Dir "/" // Location of the logfile Log "var/log/apt" { Terminal "term.log"; + History "history.log"; }; }; -- cgit v1.2.3 From 71422c78826cbf9513976a2b1e7e16ff987f1254 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 18 Dec 2009 11:51:01 +0100 Subject: debian/apt.logrotate: keep histories for 12 month --- debian/apt.logrotate | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/apt.logrotate b/debian/apt.logrotate index dfb06db2e..9a6e5d155 100644 --- a/debian/apt.logrotate +++ b/debian/apt.logrotate @@ -1,5 +1,5 @@ /var/log/apt/term.log { - rotate 6 + rotate 12 monthly compress missingok @@ -7,7 +7,7 @@ } /var/log/apt/history.log { - rotate 6 + rotate 12 monthly compress missingok -- cgit v1.2.3 From d7a4ffd6525524000b6e529afa6e3ca63bd76c01 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 18 Dec 2009 15:43:49 +0100 Subject: apt-pkg/deb/dpkgpm.{cc,h}: refactor writing of the history tag, add "," --- apt-pkg/deb/dpkgpm.cc | 40 +++++++++++++++++++++++----------------- apt-pkg/deb/dpkgpm.h | 1 + 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 8162405c7..4b118bc14 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -550,6 +550,17 @@ void pkgDPkgPM::DoDpkgStatusFd(int statusfd, int OutStatusFd) 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() { @@ -586,30 +597,25 @@ bool pkgDPkgPM::OpenLog() string remove, purge, install, upgrade, downgrade; for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) { - if (Cache[I].Upgrade()) - upgrade += I.Name() + string(" (") + Cache[I].CurVersion + string(", ") + Cache[I].CandVersion + string(") "); + 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].Install()) - install += I.Name() + string(" (") + Cache[I].CandVersion + string(") "); + 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(") "); + purge += I.Name() + string(" (") + Cache[I].CurVersion + string("), "); else - remove += I.Name() + string(" (") + Cache[I].CurVersion + string(") "); + remove += I.Name() + string(" (") + Cache[I].CurVersion + string("), "); } } - if (install.size() > 0) - fprintf(history_out, "Install: %s\n", install.c_str()); - if (upgrade.size() > 0) - fprintf(history_out, "Upgrade: %s\n", upgrade.c_str()); - if (downgrade.size() > 0) - fprintf(history_out, "Downgrade: %s\n", downgrade.c_str()); - if (remove.size() > 0) - fprintf(history_out, "Remove: %s\n", remove.c_str()); - if (purge.size() > 0) - fprintf(history_out, "Purge: %s\n", purge.c_str()); + WriteHistoryTag("Install", install); + WriteHistoryTag("Upgrade", upgrade); + WriteHistoryTag("Downgrade",downgrade); + WriteHistoryTag("Remove",remove); + WriteHistoryTag("Purge",purge); fflush(history_out); } diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h index 67f1430be..330c788a2 100644 --- a/apt-pkg/deb/dpkgpm.h +++ b/apt-pkg/deb/dpkgpm.h @@ -68,6 +68,7 @@ class pkgDPkgPM : public pkgPackageManager // Helpers bool RunScriptsWithPkgs(const char *Cnf); bool SendV2Pkgs(FILE *F); + void WriteHistoryTag(string tag, string value); // dpkg log bool OpenLog(); -- cgit v1.2.3