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

Bug#37999: [PROPOSED]: A pre-install required space checking mechanism for Debian packages



Package: debian-policy
Version: 2.5.0.0

Hi,

        At several times during the last year or so, there have been
 proposals about making it possible to do a preinstall space
 check. This proposal includes a mechanism for doing just that. 

        This requires that we include size information; either in the
 package .deb file or in ftp.debian.org/debian/indices/, or both, that
 contain the du -S information for each package.  I think that putting
 the information into the Packages file is a bad idea -- especially
 for large packages. We need a line per directory and there is no
 reason to inflate the packages files for packages we ain't even
 updating.

        I personally tend to lean towards putting in a du file in each
 package; since we only need a line per dir in the package, this file
 should not be too big at all.

        Any sheme, which calculates whether there is enough space at
 hand, shall need information about each package; since we do not know
 mount schemes a priori [my /usr/lib/ is a separate partition from
 /usr]; we need information about each dir (since the a mount point is
 a dir). a compressed du -S format is about as compact as the
 information can get. So, I think, from what I remember about my info
 theory casses, this scheme is as optimal as we can reasonably
 expect. (embedding the information in packages files. downloaded over
 and over by apt, seems a horrible waste of bandwidth; at least, apt
 only downloades packages we are going to install).

        The following script, to be run by the likes of apt on the
 target system, looks at the du -S output for the package, and assigns
 each dir to the correct device_no -- VOILA, no matter how you have
 partitioned stuff, checkdu can tell exactly how much space is needed
 on each partion.  There were some comments about patitions mounted
 via exotic methods may not be visible in /etc/mtab; in which case we
 can make the checkdu script additionally read /etc/apt/extra-partitions
 or something foe sites that use such partitions, and still work
 automagically for the most common case of simpler sites (which use
 local disks and NFS).

 
        I can even make checkdu warn if there is not enough space; all
 that is needed for this functionality is that the package maintainer
 provide the du -S data.

        This requires no retooling of dpkg, which I think is critical
 for any scheme ;-). This method seems to be simple enough, and I
 think meets our requirements.


        I think this is important enough to warrant that the data be
 collected; we can easily write dh_sizeinfo or whatever to create the
 properly formatted du -S file;

        manoj

----------------------------------------------------------------------
#! /usr/bin/perl -w

package Check_DU;

use strict;
use diagnostics;
use Carp;
require 5.001;

sub check_du {
  my %data;
  
  # find out the mount points of the devices
  open DF, "df |" or die "Could not run df:$!" ;
  while (<DF>) {
    m!/dev.*\s(/\S*)! or next;
    my $device_no = (stat($1))[0];
    $data{$device_no}{'Name'} = $1;
  }
  close DF or die "Could not close pipe from df:$!" ;
  
  # read all the du -S files given on the command line
  while (<>) {
    my ($size, $dir_name) = split /\s+/, $_;
    my $device_no = (stat("/$dir_name"))[0];
    $data{$device_no}{'Size'} += $size;
  }
  return \%data;
}

sub print_du {
  my %params = @_;
  croak("Need argument 'Size Data'") unless defined $params{'Size Data'};
  
  
  for (sort keys %{$params{'Size Data'}}) {
    next unless $params{'Size Data'}{$_}{'Size'};
    printf "%10d %s\n", $params{'Size Data'}{$_}{'Size'}, 
                        $params{'Size Data'}{$_}{'Name'};
  }
}

sub test_du {
  my $data = &check_du();
  &print_du('Size Data' => $data);
}

{ # Execute simple test if run as a script
  package main; no strict;
  eval join('',<main::DATA>) || die "$@ $main::DATA" unless caller();
}


1;

__END__

# Test the library
&Check_DU::test_du();

1;
----------------------------------------------------------------------

-- 
 Visit[1] the beautiful Smoky Mountains!  [1] visit, v.: Come for a
 week, spend too much money and pay lots of hidden taxes, then leave.
 We'll be happy to see your money again next year. You can save time
 by simply sending the money, if you're too busy.
Manoj Srivastava   <srivasta@debian.org>  <http://www.debian.org/%7Esrivasta/>
Key C7261095 fingerprint = CB D9 F4 12 68 07 E4 05  CC 2D 27 12 1D F5 E8 6E


Reply to: