more used commands, more conflicts
Thomas Schwinge <[email protected]> Mon, 5 Apr 2004 17:04:55 +0200
| Newsgroups | gmane.comp.djb.package |
|---|---|
| Message-ID | <[email protected]> |
--zYM0uCDKw75PZbzx
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Hello!
I wrote the attached perl script 'check-command_names' to create a list
of used command names.
I'd like to hear comments on the parts labeled with 'TODO'.
The script furthermore yielded these conflicts:
#v+
'/usr/bin/build' (Debian package 'devscripts') uses the command name 'build', registered for the package 'prog/build'.
'/usr/bin/gpsd' (Debian package 'gpsdrive') uses the command name 'gpsd', registered for the package 'map/gpsd'.
'/usr/bin/import' (Debian package 'imagemagick') uses the command name 'import', registered for the package 'admin/execline'.
'/usr/sbin/memtest' (Debian package 'sysutils') uses the command name 'memtest', registered for the package 'admin/memtest'.
#v-
The attached list of commands was extracted from a Debian based
Knoppix-3.4 system and another Debian system.
Regards,
Thomas
--zYM0uCDKw75PZbzx
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=check-command_names
#!/usr/bin/perl -w
use strict;
# TODO: Some - but not all - of the commands from
# <URL:http://cr.yp.to/slashcommand/list.html> are also listed in
# <URL:http://cr.yp.to/slashcommand/used>.
# TODO: Some commands are listed multiple times in 'used'.
# Return an array of absolute filenames.
# The last element is the fully resolved path.
# TODO: Is more work to be done here? Relative symbolic links?
sub linknames ($) {
my @result;
push (@result, $_[0]);
while (defined (my $target = readlink ($result[@result - 1]))) {
if (grep (/^\Q$target\E$/, @result)) {
warn ("Symbolic link '$result[@result - 1]' is looping.\n");
last;
}
push (@result, $target);
}
return (@result);
}
# Is there a $SP_ROOT/package hierarchy?
my $have_slashpackage = 'n';
unless (defined ($ENV{'SP_ROOT'})) {
$ENV{'SP_ROOT'} = '';
}
if (-d ($ENV{'SP_ROOT'} . '/package/.')) {
$have_slashpackage = 'y';
}
# Is this a Debian system?
chomp (my $have_dpkg = `dpkg --version &> /dev/null && echo y || echo n`);
# get_description ('/bin/ls') returns the package '/bin/ls' belongs to.
sub get_description ($) {
my $path = $_[0];
my $executable = $_[0];
$executable =~ s|^.*/||;
# Is this file stored in a /package hierarchy?
if ($have_slashpackage eq 'y') {
foreach my $description (linknames ($path)) {
# $SP_ROOT/package/admin/runit/command/runit: admin/runit
if ($description =~ /\Q$ENV{'SP_ROOT'}\E\/package\/(.*)\/(bin|command|sbin)\/\Q$executable\E$/) {
$description = $1;
# TODO: $SP_ROOT/package/misc/spf/grep/bin/grep: misc/spf/grep or just grep?
# $description =~ s|^misc/spf/||;
return ($description);
}
}
}
# Maybe dpkg knows something about the file?
# TODO: Call dpkg-query instead of dpkg?
if ($have_dpkg eq 'y') {
my $description = $path;
my $description_new;
do {
# dpkg could be called with multiple files as arguments, but then
# it would be harder to parse the results than it is now.
$description_new = `LC_ALL=C dpkg -S "$description" 2> /dev/null | head -1`;
unless ($description_new eq '') {
$description = (split (':', $description_new))[0];
# $ dpkg -S /usr/bin/gdialog
# diversion by zenity from: /usr/bin/gdialog
# diversion by zenity to: /usr/bin/gdialog.real
# zenity: /usr/bin/gdialog
$description =~ s|^diversion by ||;
$description =~ s| from$||;
$description =~ s| to$||;
return ("Debian package '$description'");
}
# /bin/csh -> /etc/alternatives/csh -> /bin/bsd-csh; Only the last one
# is known by dpkg.
# TODO: So '/bin/bsd-csh' is used to get the package '/bin/csh' is
# belonging to. Hmmm... Is this the right thing to do?
$description_new = readlink ($description);
# Handle relative symlinks.
# /usr/bin/man -> ../lib/man-db/man
if (defined ($description_new) && $description_new =~ /^[^\/]/) {
$description =~ s|[^/]+$|$description_new|;
# Replace any '/something/../' or '/./' with '/'.
while ($description =~ s|/[^/]+/\.\./|/| || $description =~ s|/\./|/|) {}
} else {
$description = $description_new;
}
} while (defined ($description));
}
# TODO: RPM, Mandrake, Gentoo, *BSD et al.
# Nobody knows...
# TODO: Return nothing or return '/usr/bin/env: unknown package' as description?
warn ("Could not find a description for '$path'.\n");
return (undef);
# return ($path . ': unknown package');
}
# Before wgetting <URL:http://cr.yp.to/slashcommand/used> try to use the file
# 'cr.yp.to/slashcommand/used' instead.
# Executables pending to be added to 'used' will be read from 'used_pending*'
# so that they won't be submitted again.
sub get_known_commands {
my @known_commands;
unless (open (USED, 'cr.yp.to/slashcommand/used')) {
warn ("Could not open 'cr.yp.to/slashcommand/used': $!.\n");
open (USED, 'wget -q -O - http://cr.yp.to/slashcommand/used |') ||
die ("Could not get list of known commands from <URL:http://cr.yp.to/slashcommand/used>: $!.\n");
}
while (defined ($_ = <USED>)) {
# command[ package]
/([^ \n]+)/;
push (@known_commands, $1);
}
close (USED) || die ("Could not close file descriptor 'USED': $!.");
foreach (glob ("used_pending*")) {
open (USED, $_) ||
die ("Could not get list of known commands from '$_': $!\n.");
while (defined ($_ = <USED>)) {
# command[ package]
/([^ \n]+)/;
push (@known_commands, $1);
}
close (USED) || die ("Could not close file descriptor 'USED': $!.");
}
return (sort @known_commands);
}
# Before wgetting <URL:http://cr.yp.to/slashcommand/list.html> try to use the
# file 'cr.yp.to/slashcommand/list.html' instead.
sub get_registered_commands {
# $registered_commands{'svc'} = 'admin/daemontools'
my %registered_commands;
unless (open (USED, 'cr.yp.to/slashcommand/list.html')) {
warn ("Could not open 'cr.yp.to/slashcommand/list.html': $!.\n");
open (USED, 'wget -q -O - http://cr.yp.to/slashcommand/list.html |') ||
die ("Could not get list of known commands from <URL:http://cr.yp.to/slashcommand/list.html>: $!.\n");
}
while (defined ($_ = <USED>)) {
# <li>command:package[ description]
next unless /^<li>/;
/^<li>([^:]+):([^ \n]+)/;
$registered_commands{$1} = $2;
}
close (USED) || die ("Could not close file descriptor 'USED': $!.");
return (%registered_commands);
}
sub get_directories($) {
my @directories;
foreach (split (':', $_[0])) {
s|/*$||;
unless (-d) {
warn ("'$_' will not be evaluated as it isn't a directory.\n");
next;
}
push (@directories, $_);
}
return @directories;
}
sub get_executables (@) {
my @known_commands = get_known_commands;
my %registered_commands = get_registered_commands;
# The key is the executable's name, the value is the full path.
my %executables;
foreach my $directory (@_) {
opendir (DIR, $directory) || die ("Could not open directory '$directory': $!.\n");
foreach my $file (readdir (DIR)) {
my $path = $directory . '/' . $file;
# Skip '.' and '..'.
next if ($file =~ /^\.\.?$/);
# Is this a registered name?
if (grep (/^\Q$file\E$/, keys (%registered_commands))) {
if (grep (/\/package\/\Q$registered_commands{$file}\E\/(bin|command|sbin)\/\Q$file\E$/, linknames ($path))) {
next;
} else {
my $description = get_description ($path);
my $warning = "'$path' ";
$warning .= "($description) " if defined ($description);
warn ($warning . "uses the command name '$file', registered for the package '$registered_commands{$file}'.\n");
}
}
# Do we already know this executable?
# TODO: Should it be added nevertheless (maybe with a different package name)?
next if (grep (/^\Q$file\E$/, @known_commands));
my $mode;
unless ($mode = (lstat $path)[2]) {
warn ("'$path' is skipped: lstat failed: $!.\n");
next;
}
if (-d $path) {
warn ("'$path' is skipped as it is a directory.\n");
next;
}
unless ($mode & 0111) {
warn ("'$path' is skipped as it is not executable by anyone.\n");
next;
}
if (defined ($executables{$file})) {
warn ("'$file' ('$path') is skipped as it is already known: '$executables{$file}'.\n");
next;
}
$executables{$file} = $path;
}
close (DIR);
}
return (%executables);
}
my %executables = get_executables (get_directories($ARGV[0] || $ENV{'PATH'}));
foreach my $executable (sort (keys (%executables))) {
my $description = get_description ($executables{$executable});
print ("$executable");
print (" $description") if defined ($description);
print ("\n");
}
--zYM0uCDKw75PZbzx
Content-Type: application/x-gunzip
Content-Disposition: attachment; filename="used.add.gz"
Content-Transfer-Encoding: base64
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
gTpKZVT9wsC/PRv8P30ULsqklAEA
--zYM0uCDKw75PZbzx--