File: //sbin/update-inetd
#!/usr/bin/perl
#
# update-inetd: a utility to add entries to the /etc/inetd.conf file
#
# Copyright © 1995 Peter Tobias <tobias@et-inf.fho-emden.de>
# Copyright © 2009-2012 Serafeim Zanikolas <sez@debian.org>
# Copyright © 2018 Guillem Jover <guillem@debian.org>
#
# 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, see <https://www.gnu.org/licenses/>.
use 5.000;
use strict;
use warnings;
use DebianNet ();
# We need to preserve the original @ARGV, otherwise when the Debconf module
# tries to reexecute us after it has started the backend it would miss
# arguments.
@DebianNet::DEBCONF_ARGV = @ARGV;
$| = 1;
$0 =~ s{.*/}{};
my $version = '4.51';
my $debug;
my $mode;
my $modearg;
my $pattern;
my $group;
while ($ARGV[0] =~ m/^-/) {
$_ = shift @ARGV;
if (/--help$/) {
usage();
} elsif (/--version$/) {
version();
} elsif (/--add$/) {
$mode = 'add';
} elsif (/--remove$/) {
$mode = 'remove';
} elsif (/--enable$/) {
$mode = 'enable';
} elsif (/--disable$/) {
$mode = 'disable';
} elsif (/--multi$/) {
$DebianNet::MULTI = 'true';
} elsif (/--verbose$/) {
$DebianNet::VERBOSE = 'true';
} elsif (/--debug$/) {
$debug = 'true';
} elsif (/--file$/) {
my $file = shift @ARGV;
error("option '--file' requires an argument")
if not $file or $file =~ m/^--/;
$DebianNet::INETD_CONF = $file;
} elsif (/--group$/) {
$group = shift @ARGV;
error("option '--group' requires an argument")
if not $group or $group =~ m/^--/;
} elsif (/--comment-chars$/) {
my $sep = shift @ARGV;
error("option '--comment-chars' requires an argument") unless $sep;
error("the comment characters do not start with a '#'") unless $sep =~ /^#/;
$DebianNet::SEP = $sep;
} elsif (/--pattern$/) {
$pattern = shift @ARGV;
error("option '--pattern' requires an argument")
if not $pattern or $pattern =~ m/^--/;
} else {
warning("unknown option: $_");
warning("try '$0 --help' for more information.");
exit 1;
}
}
usage() unless $mode;
if (defined $group and $mode ne 'add') {
warning('--group is only relevant with --add');
}
$group //= 'OTHER';
if (defined $pattern and $mode eq 'add') {
warning('--pattern is not relevant with --add');
}
$pattern //= '';
# die "You must be root to run this script.\n" if ($> != 0);
if ($#ARGV > 0) {
warning('too many arguments');
} elsif ($#ARGV == -1) {
warning('too few arguments');
} else {
$modearg = $ARGV[0];
error('the service name may not include whitespace characters')
if ($mode eq 'enable' or $mode eq 'disable') and ($modearg =~ /\s+|\\t/);
error('the entry definition does not contain any whitespace characters')
if $mode eq 'add' and not ($modearg =~ /\s+|\\t/);
}
warn "Processing $DebianNet::INETD_CONF\n" if defined $DebianNet::VERBOSE;
debug("Using mode \"$mode\", group \"$group\", pattern \"$pattern\" and seperator \"$DebianNet::SEP\"");
debug("Multiple remove/disable: $DebianNet::MULTI") if defined $DebianNet::MULTI;
debug("ARGUMENT: $modearg");
if ($mode eq 'add') {
DebianNet::add_service($modearg, $group);
} elsif ($mode eq 'remove') {
DebianNet::remove_service($modearg, $pattern);
} elsif ($mode eq 'enable') {
foreach my $service (split /,/, $modearg) {
DebianNet::enable_service($service, $pattern);
}
} elsif ($mode eq 'disable') {
foreach my $service (split /,/, $modearg) {
DebianNet::disable_service($service, $pattern);
}
} else {
die "Mode = '$modearg'? This should not happen!\n";
}
sub debug {
my $msg = shift;
warn "$msg\n" if $debug;
}
sub warning {
my $msg = shift;
warn "$0: warning: $msg\n";
}
sub error {
my $msg = shift;
die "$0: error: $msg\n";
}
sub version {
warn "$0 $version\n";
warn "DebianNet module $DebianNet::VERSION\n";
exit 0;
}
sub usage {
warn <<"EOF";
Usage: $0 [<option>...] <command> <argument>
Commands:
--add <entry-line> add <entry-line>
--remove <entry-regex> remove <entry-regex>
--enable <service>[,...] enable <service> (comma-separated list)
--disable <service>[,...] disable <service> (comma-separated list)
Options:
--group <group-name> add entry to section <group-name>
--pattern <pattern> use <pattern> to select a service
--comment-chars <characters> use <characters> as comment characters
--multi allow multiple removes/disables
--file <filename> use <filename> instead of /etc/inetd.conf
--verbose explain what is being done
--debug enables debugging mode
--help display this help and exit
--version output version information and exit
In order to prevent the shell from changing your <entry-line> definition you
have to quote the <entry-line> using single or double quotes. You can use tabs
(tab character or \\t) and spaces to separate the fields of the <entry-line>.
Note: users must use --comment-chars '#' to disable a service for that setting
to survive upgrades. Package maintainer scripts should use the default
--comment-chars. See update-inetd(8) for details.
EOF
exit 0;
}