SoftwareSnapshot

From XPUB & Lens-Based wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Software Snapshot

This script uses python-apt to manipulate the packages that are installed on a machine. This way you can back-up and transfer your software. Potentially it also gives a nice overview of which packages get used on the course.

There are three options.

  • With -f FILE --snapshot you save all currently installed packages in FILE. This includes all packages from Ubuntu not only the ones you installed manually!
  • With --install FILE you install all packages that are listed in FILE
  • With -f OUT --diff FILE1 FILE2 FILE3 ... you save all packages from FILE1 which are not in FILE2 or FILE3 etc. in OUT. This is useful to filter out all packages that get installed by Ubuntu.

YOU'LL HAVE TO INSTALL THE PACKAGE PYTHON-APT!

#! /usr/bin/python
import apt

def loadpkgs(f):
    print "loading file: " + f
    fp = open(f, 'r')
    rsl = fp.read().splitlines()
    fp.close()
    return rsl

def savepkgs(f, debs):
    print "saving file: " + f
    fp = open(f, 'w')
    rsl = fp.write('\n'.join(debs))
    fp.close()
    return rsl

def cbdiff(option, opt_str, value, parser):
    print "calculating difference between: " + ', '.join(parser.rargs)
    main = loadpkgs(parser.rargs.pop(0))
    for f in parser.rargs:
        sub = loadpkgs(f)
        main = [pkg for pkg in main if pkg not in sub]
    savepkgs(parser.values.filename, main)

def cbsnapshot(option, opt_str, value, parser):
    print "creating a snapshot"
    cache = apt.Cache()
    debinst = []
    for deb in cache:
        if deb.is_installed:
            debinst.append(deb.name)
    print "saving file: " + parser.values.filename
    savepkgs(parser.values.filename, debinst)

def cbinstall(option, opt_str, value, parser):
    print "marking packages for installation"
    pkgs = loadpkgs(value)
    cache = apt.Cache()
    notincache = []
    try:
        for pkg in pkgs:
            if pkg not in cache:
                notincache.append(pkg)
                continue
            deb = cache[pkg]
            deb.mark_install()
        cache.commit()
    except apt.cache.LockFailedException:
        print "LockFailedException: are you root??"
        exit()
    except SystemError:
        print "SystemErrorException: package manager running??"
        exit()
    print "packages installed"
    if notincache: print "missing packages on system: " + ', '.join(notincache)

from optparse import OptionParser

parser = OptionParser()
parser.add_option("-f", "--file", action="store", dest="filename",  default="out.sss", help="Specify an output file. Default is out.sss")
parser.add_option("-s", "--snapshot", action="callback", callback=cbsnapshot, help="Make a snapshot of all installed packages.")
parser.add_option("-i", "--install", action="callback", callback=cbinstall, type="string", help="Install all packages in a file.")
parser.add_option("-d", "--diff", action="callback", callback=cbdiff, help="Compute the difference between two or more snapshots. List all snapshot files as arguments. Start with largest file.")

(options, args) = parser.parse_args()

I've uploaded the list of packages that I installed with this script after I completely deleted 10.04 and started fresh with 11.04. You can find it here

To make it work save the script (as script.py) and save the packages list (as packages.txt) in the same folder. Install python-apt and run this in the terminal: python script.py -i packages.txt

It takes a while but it will work :)