linuxOS_AP05/debian/test/usr/sbin/update-rcconf-guide
2025-09-26 09:40:02 +08:00

233 lines
5.6 KiB
Perl
Executable File

#!/usr/bin/perl -w
# update-rcconf-guide
# Copyright (c) 2004-2009 kamop@debian.org
#
=head1 NAME
update-rcconf-guide - Create default guide file for rcconf
=head1 SYNOPSIS
B<update-rcconf-guide>
=head1 DESCRIPTION
B<Update-rcconf-guide> creates the default guide file which B<rcconf> uses.
B<Update-rcconf-guide> searches the package names corresponding to each
service file in /etc/init.d directory from dpkg info
files(/var/lib/dpkg/info/*.list) and get the description of these packages
using apt-cache. B<Update-rcconf-guide> uses Short-Description in priority
to the description if service files has Short-Description field.
B<Update-rcconf-guide> writes those results to /var/lib/rcconf/guide.default
file.
You can write your own guide in user guide file(/var/lib/rcconf/guide) by hand.
B<Rcconf> refers Guides in /var/lib/rcconf/guide before those in
/var/lib/rcconf/guide.default.
If you install some packages after executed B<update-rcconf-guide>,
you need to re-create this file using B<update-rcconf-guide> so as to refresh
guide.default that includes new guides for installed new services.
Notice: B<update-rcconf-guide> was not executed when you installed B<rcconf>
package.
=head1 FILE
=over 8
=item /var/lib/rcconf/guide.default
Guide File update-rcconf-guide generates.
=item /var/lib/rcconf/guide
Guide File user(Administrator) can define.
=back
=head1 SEE ALSO
rcconf(8)
=head1 AUTHOR
Atsushi KAMOSHIDA <kamop@debian.org>
=cut
use strict;
use FileHandle;
use DirHandle;
my @unselects = ("\^\\\.\$", "\^\\\.\\\.\$", "\^rc\$", "\^rcS\$", "\^README\$",
"\^skeleton\$", ".*\\\.dpkg-dist\$", ".*\\\.dpkg-old\$",
".*\\\.dpkg-bak\$", ".*\\\.sh\$");
my $APTCACHE_BIN = "/usr/bin/apt-cache";
my $GREP_BIN = "/bin/grep";
my $RCCONF_DIR = "/var/lib/rcconf";
my $GUIDE_FILE = $RCCONF_DIR."/guide.default";
my $INITD_DIR = "/etc/init.d";
if ( ! -d $RCCONF_DIR ) {
die "Can't file rcconf dir($RCCONF_DIR).\n";
}
print "Reading $INITD_DIR and getting package description ...\n";
my $initd_files_array = &read_initd_dir($INITD_DIR);
my $filepath_hash = &create_dpkg_installed_filepath();
print "Writing package default guide to $GUIDE_FILE ...\n";
my $fh = FileHandle->new(">".$GUIDE_FILE);
if ( ! defined($fh) ) {
die "Can't open file: $GUIDE_FILE .\n";
}
my $path;
my $description_header;
foreach my $initd_file ( @{$initd_files_array} ) {
# print $initd_file."\n";
next if ( &check_unselect($initd_file, \@unselects) == 1 );
# print $initd_file."\n";
$path = $INITD_DIR."/".$initd_file;
next if ( ! exists($filepath_hash->{$path}) );
$description_header = &get_description_header($filepath_hash->{$path}, $path);
if ( $description_header ne "" ) {
print $fh $initd_file." ".$description_header."\n";
}
}
undef $fh;
print "Done.\n";
exit;
#######################################################################
## MODULE: get_description_header
## DESC:
## IN:
## OUT:
## OP:
## STATUS:
## END:
sub get_description_header {
my ($package, $path) = @_;
##
if ( $package eq "" ) {
die "arg(package) is null.\n";
}
## First, try to get Short-Description
my $line = `$GREP_BIN '^\# Short-Description:' $path`;
if ( $line ne "" ) {
$line =~ /^\# Short-Description:\s*(.*)/;
return $1;
}
if ( $package eq "tinyproxy" ) {
printf "%s %s %s\n", $package, $path, $line;
exit 1;
}
$line = `$APTCACHE_BIN show $package | $GREP_BIN '^Description:'`;
$line =~ /^Description:\s*(.*)/;
return $1;
} ## get_description_header
#######################################################################
## MODULE: check_unselect
## DESC: Check if 'file' exists in unselects array.
## IN:
## OUT: results 0 := file is not in the array.
## 1 := file exists in the array.
## OP:
## STATUS:
## END:
sub check_unselect{
my ($file, $unselects) = @_;
##
return 1 if ( ! -x $INITD_DIR . "/" . $file );
my $unselect;
foreach $unselect ( @{$unselects} ) {
return 1 if ( $file =~ /$unselect/ );
}
return 0;
} ## check_unselect
#######################################################################
## MODULE: read_initd_dir
## DESC: Collect files in init.d/ directory.
## IN:
## OUT:
## OP:
## STATUS:
## END:
sub read_initd_dir{
my ($initd_dir) = @_;
##
if ( ( $initd_dir eq "" ) || ( ! -d $initd_dir ) ) {
die "No such directory: $initd_dir .\n";
}
my $dh = DirHandle->new($initd_dir);
if ( ! defined($dh) ) {
die "No such directory: $initd_dir .\n";
}
my $file;
my @dirs = ();
while ( defined($file = $dh->read()) ) {
push(@dirs, $file);
}
undef $dh;
return(\@dirs);
} ## read_initd_dir
#######################################################################
## MODULE: read_initd_dir
## DESC: Collect files in inet.d/ directory.
## IN:
## OUT:
## OP:
## STATUS:
## END:
sub create_dpkg_installed_filepath {
my $pid = open(my $fd, '-|', q{dpkg-query -S '/etc/init.d/*'})
// die(qq{fork+exec of "dpkg-query -S '/etc/init.d/*'" failed: $!});
my %filepath_hash;
while (my $line = <$fd>) {
my ($package, $file);
chomp($line);
($package, $file) = split(m/: /, $line, 2);
$filepath_hash{$file} = $package;
}
if (!close($fd)) {
die("close of dpkg-query's stdout failed: $!") if $!;
my $exit_code = ($? >> 8) & 0xff;
my $signal = $? & 0x7f;
if ($signal) {
die(qq{dpkg-query -S '/etc/init.d/*' was killed by signal ${signal}});
} else {
die(qq{dpkg-query -S '/etc/init.d/*' failed with exit code ${exit_code}});
}
}
return(\%filepath_hash);
} ## create_dpkg_installed_filepath