Wednesday, December 14, 2011

OpenSUSE Changelogs for Recent Updates

Here is a short python script that shows recent portions of the changelogs for recently installed packages. This script is indented for extracting a summary of what has changed after updating my OS to latest packages. Usage is as follows:
% python zyppHist.py -h
Usage: zyppHist.py [options]

Report change log entries for recent installs (zypper/rpm).

Options:
  -h, --help            show this help message and exit
  -i INSTALLDAYS, --installed-since=INSTALLDAYS
                        Include anything installed up to INSTALLDAYS days ago.
  -c CHANGEDAYS, --changedSince=CHANGEDAYS
                        Report change log entries from up to CHANGEDAYS days
                        ago.


Sample output:
python zyppHist.py -i 1 -c 30
==================================================
+Package:  2011-12-14 21:11:12 glibc
------------------------------
* Wed Nov 30 2011 aj@suse.de
- Do not install INSTALL file.

* Wed Nov 30 2011 rcoe@wi.rr.com
- fix printf with many args and printf arg specifiers (bnc#733140)

* Fri Nov 25 2011 aj@suse.de
- Updated glibc-ports-2.14.1.tar.bz2 from ftp.gnu.org.

* Fri Nov 25 2011 aj@suse.com
- Create glibc-devel-static baselibs (bnc#732349).

* Fri Nov 18 2011 aj@suse.de
- Remove duplicated locales from glibc-2.3.locales.diff.bz2

==================================================
+Package:  2011-12-14 21:11:21 splashy
------------------------------
* Thu Dec 08 2011 hmacht@suse.de
- update artwork for openSUSE 12.1 (bnc#730050)

==================================================
+Package:  2011-12-14 21:11:23 libqt4
------------------------------
* Wed Nov 23 2011 llunak@suse.com
- do not assert on QPixmap usage in non-GUI threads
  if XInitThreads() has been called (bnc#731455)

==================================================
+Package:  2011-12-14 21:11:23 libcolord1
------------------------------
* Wed Dec 07 2011 vuntz@opensuse.org
- Update to version 0.1.15:
  + This release fixes an important security bug: CVE-2011-4349.
  + New Features:
  - Add a native driver for the Hughski ColorHug hardware
  - Export cd-math as three projects are now using it
  + Bugfixes:
  - Documentation fixes and improvements
  - Do not crash the daemon if adding the device to the db failed
  - Do not match any sensor device with a kernel driver
  - Don't be obscure when the user passes a device-id to colormgr
  - Fix a memory leak when getting properties from a device
  - Fix colormgr device-get-default-profile

...

The script produces a summary by extracting a list of recent installs from /var/log/zypp/history. For each recent install the script issues an rpm changelog query to obtain each package's changelog. Each changelog is written out line by line and the output is truncated when a date is encountered that is more than the specified number of days in the past.

The code


#!/usr/bin/env python
#
# zypphist.py 
#
# Copyright (C) 2011: Michael Hamilton
# The code is GPL 3.0(GNU General Public License) ( http://www.gnu.org/copyleft/gpl.html )
#
import csv
import subprocess
from datetime import date, datetime,  timedelta
from optparse import OptionParser

zyppHistFilename = '/var/log/zypp/history'

optParser = OptionParser(description='Report change log entries for recent installs (zypper/rpm).')
optParser.add_option('-i',  '--installed-since',  dest='INSTALLDAYS', type='int', default=1,  help='Include anything installed up to INSTALLDAYS days ago.')
optParser.add_option('-c',  '--changedSince',  dest='CHANGEDAYS', type='int', default=60,  help='Report change log entries from up to CHANGEDAYS days ago.')
(options, args) = optParser.parse_args()

installedSince = datetime.now() - timedelta(days=options.INSTALLDAYS)
changedSince = datetime.now() - timedelta(days=options.CHANGEDAYS)

zyppHistReader = csv.reader(open(zyppHistFilename, 'rb'), delimiter='|')
for historyRec in zyppHistReader:
    if historyRec[0][0] != '#' and historyRec[1] == 'install':
        installDate = datetime.strptime(historyRec[0], '%Y-%m-%d %H:%M:%S')
        if installDate >= installedSince:
            packageName = historyRec[2]
            print '=================================================='
            print '+Package: ',  installDate, packageName
            print '------------------------------'
            rpmProcess = subprocess.Popen(['rpm', '-q', '--changelog',  packageName], shell=False, stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True)
            rpmProcess.wait()
            if rpmProcess.returncode != 0:
                print '*** ERROR (return code was ', rpmProcess.returncode,  ')'
            for line in rpmProcess.stderr:
                print line, 
            for line in rpmProcess.stdout:
                try:
                    if line[0] == '*' and line[1] == ' ' and len(line) > 17:
                        changeDate = datetime.strptime(line[6:17], '%b %d %Y')
                        if changeDate < changedSince:
                            break
                except ValueError:
                    pass # not a date - move on
                print line, 
            rpmProcess.stdout.close()
            rpmProcess.stderr.close()

No comments:

Post a Comment