> > I am trying to make apt always run debsums_gen on the just-installed > > packages. I think it should be possible, but the apt.conf manpage is > > terrible :( Can anyone give me an example of a setup where some > > nontrivial shell code runs that way?
Matt> Neither is a shell script, but take a look at dpkg-preconfigure Matt> for a simple example, or apt-listchanges for a more complex one. Michael> If you glean some useful information from them, can you Michael> please send in patches to the manpage? About the manpage: I don't know if it can be patched, more like rewritten. I will have a stab at it someday. The two general problems are: it doesn't document the format precisely (it is certainly NOT perl, with // comments) and the part about how apt actually calls it is hardly comprehensible at least to an outsider (what's the difference between Pre-Install-Pkgs and Pre-Invoke, for example?) Another thing is that debsums_gen is broken by itself, so I had to roll my own. Colin: your code is probably better and faster, but I really wanted to fix md5sums rather than introduce a new mechanism. Here's what I ended up doing: in /etc/apt/apt.conf.d/80/80md5sums // Massage packages that omit a md5sums file. // If you don't like it, comment it out. DPkg::Pre-Install-Pkgs {"xargs /usr/local/sbin/md5sums_deb";}; and this is /usr/local/sbin/md5sums_deb: #! /usr/bin/perl use Digest::MD5; use FileHandle; use File::Temp qw(tempdir); use File::Find; our %conffiles = (); sub wanted { $File::Find::prune = 1 if ($File::Find::name eq "$debdir/etc" or $File::Find::name eq "$debdir/DEBIAN"); return unless (-f $File::Find::name); my $relname = $File::Find::name; $relname =~ s{^\Q$debdir/}{}; return if $conffiles{$relname}; my $debfile = FileHandle->new; $debfile->open("<$File::Find::name") or die "$File::Find::name: $! \n"; my $md5_ctx = Digest::MD5->new; $md5_ctx->addfile($debfile); my $md5_hash = $md5_ctx->hexdigest(); $debfile->close(); $md5sums->printf("%s %s\n", $md5_hash, $relname); } exit 0 if ($#ARGV < 0); DEB: foreach my $deb (@ARGV) { local $debdir = tempdir( CLEANUP => 1 ); $debdir or die "$! \n"; system("dpkg-deb --extract $deb $debdir") == 0 or die "dpkg-deb exited with status $? \n"; system("dpkg-deb --control $deb $debdir/DEBIAN") == 0 or die "dpkg-deb exited with status $? \n"; next DEB if (-f "$debdir/DEBIAN/md5sums"); printf("%s missing md5sums, generating...", $deb); if (-f "$debdir/DEBIAN/conffiles") { my $conffiles = FileHandle->new; $conffiles->open("<$debdir/DEBIAN/conffiles") or die "$debdir/DEBIAN/conffiles: $! \n"; foreach my $conffile ($conffiles->getlines()) { $conffile =~ s{^/(.*)}{$1}; $conffiles{$conffile} = 1; } $conffiles->close(); } local $md5sums = FileHandle->new; $md5sums->open(">$debdir/DEBIAN/md5sums") or die "$debdir/DEBIAN/md5sums: $! \n"; File::Find::find(\&wanted, $debdir) ; $md5sums->close(); printf("done.\n"); system("dpkg-deb --build $debdir $deb") == 0 or die "dpkg-deb exited with status $? \n"; } -- Ian Zimmerman, Oakland, California, U.S.A. GPG: 433BA087 9C0F 194F 203A 63F7 B1B8 6E5A 8CA3 27DB 433B A087 EngSoc adopts market economy: cheap is wasteful, efficient is expensive.