mirror of
https://github.com/webmin/webmin.git
synced 2025-07-20 16:48:46 +00:00
202 lines
4.2 KiB
Perl
Executable File
202 lines
4.2 KiB
Perl
Executable File
# features-lib.pl
|
|
|
|
# list_features()
|
|
# Returns a list of entries in the sendmail.mc file, each of which may be a
|
|
# feature or some other unrecognized line
|
|
sub list_features
|
|
{
|
|
local (@rv, $lnum = 0);
|
|
open(MC, "<".$config{'sendmail_mc'});
|
|
while(<MC>) {
|
|
s/\r|\n//g;
|
|
local $f;
|
|
if (/^FEATURE\((.*)\)/i) {
|
|
local ($name, @v) = &split_m4_params($1);
|
|
$f = { 'type' => 1,
|
|
'name' => $name,
|
|
'values' => \@v };
|
|
}
|
|
elsif (/^(define|undefine)\((.*)\)/i) {
|
|
local @v = &split_m4_params($2);
|
|
$f = { 'type' => ($1 eq 'define' ? 2 : 3),
|
|
'name' => $v[0],
|
|
'value' => $v[1] };
|
|
}
|
|
elsif (/^MAILER\((.*)\)/i) {
|
|
local ($mailer) = &split_m4_params($1);
|
|
$f = { 'type' => 4,
|
|
'mailer' => $mailer };
|
|
}
|
|
elsif (/^OSTYPE\((.*)\)/i) {
|
|
local ($ostype) = &split_m4_params($1);
|
|
$f = { 'type' => 5,
|
|
'line' => $lnum,
|
|
'index' => scalar(@rv),
|
|
'ostype' => $ostype };
|
|
}
|
|
else {
|
|
# Unrecognized line
|
|
$f = { 'type' => 0 };
|
|
}
|
|
if ($f) {
|
|
$f->{'line'} = $lnum;
|
|
$f->{'index'} = scalar(@rv);
|
|
$f->{'text'} = $_;
|
|
push(@rv, $f);
|
|
}
|
|
$lnum++;
|
|
}
|
|
close(MC);
|
|
return @rv;
|
|
}
|
|
|
|
# split_m4_params(string)
|
|
sub split_m4_params
|
|
{
|
|
local @p;
|
|
local $str = $_[0];
|
|
while($str =~ /^`([^']*)'\s*,?\s*(.*)$/ ||
|
|
$str =~ /^([^\s,]+)\s*,?\s*(.*)$/) {
|
|
push(@p, $1);
|
|
$str = $2;
|
|
}
|
|
return @p;
|
|
}
|
|
|
|
# list_feature_types()
|
|
sub list_feature_types
|
|
{
|
|
local (@rv, $f);
|
|
opendir(DIR, "$config{'sendmail_features'}/feature");
|
|
while($f = readdir(DIR)) {
|
|
if ($f =~ /^(\S+)\.m4$/) {
|
|
local $t = $text{'feat_'.lc($1)};
|
|
push(@rv, [ $1, $t ? "$1 ($t)" : $1 ] );
|
|
}
|
|
}
|
|
close(DIR);
|
|
return @rv;
|
|
}
|
|
|
|
# list_define_types()
|
|
# Returns a list of known define types. Some (but not all) will have human-
|
|
# readable descriptions
|
|
sub list_define_types
|
|
{
|
|
local (@rv, $d);
|
|
open(DEFINES, "<$module_root_directory/defines");
|
|
while($d = <DEFINES>) {
|
|
$d =~ s/\r|\n//g;
|
|
local $t = $text{'def_'.lc($d)};
|
|
push(@rv, [ $d, $t ? "$d ($t)" : $d ]);
|
|
}
|
|
close(DEFINES);
|
|
return @rv;
|
|
}
|
|
|
|
# list_mailer_types()
|
|
sub list_mailer_types
|
|
{
|
|
local (@rv, $f);
|
|
opendir(DIR, "$config{'sendmail_features'}/mailer");
|
|
while($f = readdir(DIR)) {
|
|
if ($f =~ /^(\S+)\.m4$/) {
|
|
local $t = $text{'mailer_'.lc($1)};
|
|
push(@rv, [ $1, $t ? "$1 ($t)" : $1 ] );
|
|
}
|
|
}
|
|
close(DIR);
|
|
return @rv;
|
|
}
|
|
|
|
# list_ostype_types()
|
|
sub list_ostype_types
|
|
{
|
|
local (@rv, $f);
|
|
opendir(DIR, "$config{'sendmail_features'}/ostype");
|
|
while($f = readdir(DIR)) {
|
|
if ($f =~ /^(\S+)\.m4$/) {
|
|
local $t = $text{'ostype_'.lc($1)};
|
|
push(@rv, [ $1, $t ? "$1 ($t)" : $1 ] );
|
|
}
|
|
}
|
|
close(DIR);
|
|
return @rv;
|
|
}
|
|
|
|
# create_feature(&feature)
|
|
# Adds an entry to the end of the M4 config file
|
|
sub create_feature
|
|
{
|
|
&open_tempfile(MC, ">>$config{'sendmail_mc'}");
|
|
&print_tempfile(MC, &feature_line($_[0]),"\n");
|
|
&close_tempfile(MC);
|
|
$_[0]->{'text'} = &feature_line($_[0]);
|
|
}
|
|
|
|
# delete_feature(&feature)
|
|
# Deletes one entry from the M4 config file
|
|
sub delete_feature
|
|
{
|
|
local $lref = &read_file_lines($config{'sendmail_mc'});
|
|
splice(@$lref, $_[0]->{'line'}, 1);
|
|
&flush_file_lines();
|
|
}
|
|
|
|
# modify_feature(&feature)
|
|
# Updates an entry in the M4 config file
|
|
sub modify_feature
|
|
{
|
|
local $lref = &read_file_lines($config{'sendmail_mc'});
|
|
splice(@$lref, $_[0]->{'line'}, 1, &feature_line($_[0]));
|
|
&flush_file_lines();
|
|
$_[0]->{'text'} = &feature_line($_[0]);
|
|
}
|
|
|
|
# swap_features(&feature1, &feature2)
|
|
sub swap_features
|
|
{
|
|
local $lref = &read_file_lines($config{'sendmail_mc'});
|
|
splice(@$lref, $_[0]->{'line'}, 1, $_[1]->{'text'});
|
|
splice(@$lref, $_[1]->{'line'}, 1, $_[0]->{'text'});
|
|
&flush_file_lines();
|
|
}
|
|
|
|
# feature_line(&feature)
|
|
sub feature_line
|
|
{
|
|
if ($_[0]->{'type'} == 0) {
|
|
return $_[0]->{'text'};
|
|
}
|
|
elsif ($_[0]->{'type'} == 1) {
|
|
return "FEATURE(".join_m4_params($_[0]->{'name'}, @{$_[0]->{'values'}}).")";
|
|
}
|
|
elsif ($_[0]->{'type'} == 2) {
|
|
if ($_[0]->{'value'} eq '') {
|
|
return "define(".join_m4_params($_[0]->{'name'}).")";
|
|
}
|
|
else {
|
|
return "define(".join_m4_params($_[0]->{'name'},
|
|
$_[0]->{'value'}).")";
|
|
}
|
|
}
|
|
elsif ($_[0]->{'type'} == 3) {
|
|
return "undefine(".join_m4_params($_[0]->{'name'}).")";
|
|
}
|
|
elsif ($_[0]->{'type'} == 4) {
|
|
return "MAILER(".join_m4_params($_[0]->{'mailer'}).")";
|
|
}
|
|
elsif ($_[0]->{'type'} == 5) {
|
|
return "OSTYPE(".join_m4_params($_[0]->{'ostype'}).")";
|
|
}
|
|
}
|
|
|
|
sub join_m4_params
|
|
{
|
|
local @rv = map { $_ =~ /^\d+$/ ? $_ : "`$_'" } @_;
|
|
return join(",", @rv);
|
|
}
|
|
|
|
1;
|
|
|