mirror of
https://github.com/webmin/webmin.git
synced 2025-07-20 16:48:46 +00:00
99 lines
2.5 KiB
Perl
Executable File
99 lines
2.5 KiB
Perl
Executable File
#!/usr/local/bin/perl
|
|
# Update the list of TCP ports Sendmail uses
|
|
|
|
require './sendmail-lib.pl';
|
|
require './features-lib.pl';
|
|
|
|
&ReadParse();
|
|
&error_setup($text{'ports_err'});
|
|
$access{'ports'} || &error($text{'ports_ecannot'});
|
|
|
|
# Parse and validate inputs
|
|
@ports = ( );
|
|
if (!$in{'ports_def'}) {
|
|
for($i=0; defined($name=$in{"name_$i"}); $i++) {
|
|
# Port name
|
|
next if (!$name);
|
|
$name =~ /^[a-z0-9\_]+$/i || &error(&text('ports_ename', $i+1));
|
|
$done{$name}++ && &error(&text('ports_eclash', $i+1));
|
|
@opts = ( "Name=$name" );
|
|
|
|
# IP address
|
|
if (!$in{"addr_${i}_def"}) {
|
|
&check_ipaddress($in{"addr_$i"}) ||
|
|
&check_ip6address($in{"addr_$i"}) ||
|
|
&error(&text('ports_eaddr', $i+1));
|
|
push(@opts, "Address=".$in{"addr_$i"});
|
|
}
|
|
|
|
# Family
|
|
if ($in{"family_${i}"}) {
|
|
push(@opts, "Family=".$in{"family_${i}"});
|
|
}
|
|
|
|
# TCP port
|
|
if (!$in{"port_${i}_def"}) {
|
|
$in{"port_$i"} =~ /^\d+$/ && $in{"port_$i"} > 0 &&
|
|
$in{"port_$i"} < 65536 ||
|
|
getservbyname($in{"port_$i"}, "tcp") ||
|
|
&error(&text('ports_eport', $i+1));
|
|
push(@opts, "Port=".$in{"port_$i"});
|
|
}
|
|
|
|
# Modifiers
|
|
@mods = split(/\0/, $in{"mod_$i"});
|
|
if (@mods) {
|
|
push(@opts, "Modifiers=".join("", @mods));
|
|
}
|
|
|
|
# Other options
|
|
push(@opts, split(/,/, $in{"other_$i"}));
|
|
push(@ports, join(",", @opts));
|
|
}
|
|
}
|
|
|
|
# Update sendmail.cf
|
|
&lock_file($config{'sendmail_cf'});
|
|
$conf = &get_sendmailcf();
|
|
@oldlist = map { $_->[0] } &find_options("DaemonPortOptions", $conf);
|
|
@newlist = map { { 'type' => 'O',
|
|
'values' => [ " DaemonPortOptions=$_" ] } } @ports;
|
|
&save_directives($conf, \@oldlist, \@newlist);
|
|
&flush_file_lines($config{'sendmail_cf'});
|
|
&unlock_file($config{'sendmail_cf'});
|
|
|
|
# Update .mc file too, if we have one
|
|
if ($features_access) {
|
|
@features = &list_features();
|
|
if (@features) {
|
|
&lock_file($config{'sendmail_mc'});
|
|
@dpa = grep { $_->{'type'} == 0 &&
|
|
$_->{'text'} =~ /^DAEMON_OPTIONS/ } @features;
|
|
for($i=0; $i<@dpa || $i<@ports; $i++) {
|
|
if ($dpa[$i] && $ports[$i]) {
|
|
# Modify
|
|
$dpa[$i]->{'text'} =
|
|
"DAEMON_OPTIONS(`$ports[$i]')";
|
|
&modify_feature($dpa[$i]);
|
|
}
|
|
elsif ($dpa[$i] && !$ports[$i]) {
|
|
# No longer needed .. delete
|
|
&delete_feature($dpa[$i]);
|
|
}
|
|
elsif (!$dpa[$i] && $ports[$i]) {
|
|
# Add new feature
|
|
$f = { 'type' => 0,
|
|
'text' => "DAEMON_OPTIONS(`$ports[$i]')" };
|
|
&create_feature($f);
|
|
}
|
|
}
|
|
&unlock_file($config{'sendmail_mc'});
|
|
}
|
|
}
|
|
|
|
# Restart Sendmail
|
|
&restart_sendmail();
|
|
&webmin_log("ports");
|
|
&redirect("");
|
|
|