[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Getting wide ``dpkg -l'' output in scripts and pipes.



Adam Funk wrote:
> On Tuesday 18 May 2004 10:40, Bob Proulx wrote:
> 
> > I would backup /var/backups.  That directory includes a copy of the
> 
> I already back up /etc.  Where do the /var/backups/dpkg.status.* files
> come from?

The come from:

  /var/lib/dpkg/status

> > dpkg status file and a few other tidbits from the system.  From that
> > you can recreate your system.  I use my own script to parse the data.
> > I can post that if there is interest.
> 
> Yes, I'm interested.

It is a simple little ruby script from before I learned about
dpkg-ruby or any of the other parsing routines.  The copyright
statement is bigger than the entire code.  It is really a trivial
little script.  But in any case it should give you a hint of what is
possible.

Bob

#!/usr/bin/env ruby
#
# Process a Debian status file and print out installed package names.
#
# Examples:
#   dpkg.status.print-installed /var/lib/dpkg/status
#   dpkg.status.print-installed /var/backups/dpkg.status.0
#   zcat /var/backups/dpkg.status.1.gz | dpkg.status.print-installed
#   dpkg.status.print-installed <(zcat /var/backups/dpkg.status.1.gz)
#
# The one-liner which is way too long but very useful.
#
# diff <(dpkg.status.print-installed /var/lib/dpkg/status | sort) \
#   <(dpkg.status.print-installed <(zcat /var/backups/dpkg.status.1.gz) | sort)
#
################################################################
#
# Copyright (C) 2003 Bob Proulx <bob@proulx.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
################################################################

# Lines look like this:
#   Package: telnet
#   Status: install ok installed
#   Package: wdiff
#   Status: purge ok not-installed

packagename = ""

ARGF.each do |line|  # Walk each line of all input files.

  line.chomp!  # Remove the newline from the end of the line.

  if line =~ /^Package: +/
    # Keep track of the current package name.
    packagename = line.sub(/^Package: +/,'')
  end

  if line =~ /^Status: /

    # Remove the header.  Split the line into the three fields.
    desired, status, state = line.sub(/^Status: +/,'').split

    if status == "ok" && state == "installed"
      # If the pkg was okay and installed then print the package name.
      puts packagename
    end

  end

end

Attachment: pgpqPqQXw9Oeo.pgp
Description: PGP signature


Reply to: