mirror of
https://github.com/webmin/webmin.git
synced 2026-02-07 07:52:13 +00:00
144 lines
3.0 KiB
Perl
Executable File
144 lines
3.0 KiB
Perl
Executable File
# wuftpd-lib.pl
|
|
# Functions for configuring wuftpd
|
|
|
|
BEGIN { push(@INC, ".."); };
|
|
use WebminCore;
|
|
&init_config();
|
|
|
|
# get_ftpaccess()
|
|
# Returns a list of wuftpd config options
|
|
sub get_ftpaccess
|
|
{
|
|
local @rv;
|
|
local $lnum = 0;
|
|
open(FTP, "<".$config{'ftpaccess'});
|
|
while(<FTP>) {
|
|
s/\r|\n//g;
|
|
s/#.*$//;
|
|
local @v = split(/\s+/, $_);
|
|
if (@v) {
|
|
push(@rv, { 'name' => shift(@v),
|
|
'values' => \@v,
|
|
'index' => scalar(@rv),
|
|
'line' => $lnum });
|
|
}
|
|
$lnum++;
|
|
}
|
|
close(FTP);
|
|
return \@rv;
|
|
}
|
|
|
|
# find(name, &config)
|
|
sub find
|
|
{
|
|
local (@rv, $c);
|
|
foreach $c (@{$_[1]}) {
|
|
push(@rv, $c) if ($c->{'name'} eq $_[0]);
|
|
}
|
|
return wantarray ? @rv :
|
|
@rv ? $rv[0] : undef;
|
|
}
|
|
|
|
# find_value(name, &config)
|
|
sub find_value
|
|
{
|
|
local (@rv, $c);
|
|
foreach $c (@{$_[1]}) {
|
|
push(@rv, $c->{'values'}) if ($c->{'name'} eq $_[0]);
|
|
}
|
|
return wantarray ? @rv :
|
|
@rv ? $rv[0] : undef;
|
|
}
|
|
|
|
# save_directive(&config, name, &new)
|
|
sub save_directive
|
|
{
|
|
local @old = &find($_[1], $_[0]);
|
|
local @new = @{$_[2]};
|
|
local $lref = &read_file_lines($config{'ftpaccess'});
|
|
local ($i, $change);
|
|
for($i=0; $i<@old || $i<@new; $i++) {
|
|
if ($i >= @old) {
|
|
if ($change) {
|
|
# Adding a new directive after one of the same
|
|
splice(@$lref, $change->{'line'}+1, 0,
|
|
&directive_line($new[$i]));
|
|
$new[$i]->{'line'} = $change->{'line'}+1;
|
|
&renumber($_[0], $change->{'line'}, 1);
|
|
push(@{$_[0]}, $new[$i]);
|
|
}
|
|
else {
|
|
# Adding a new directive at the end
|
|
push(@$lref, &directive_line($new[$i]));
|
|
$new[$i]->{'line'} = scalar(@$lref);
|
|
push(@{$_[0]}, $new[$i]);
|
|
}
|
|
$change = $new[$i];
|
|
}
|
|
elsif ($i >= @new) {
|
|
# Removing a directive
|
|
splice(@$lref, $old[$i]->{'line'}, 1);
|
|
splice(@{$_[0]}, &indexof($old[$i], @{$_[0]}), 1);
|
|
&renumber($_[0], $old[$i]->{'line'}, -1);
|
|
}
|
|
else {
|
|
# Changing a directive
|
|
$lref->[$old[$i]->{'line'}] = &directive_line($new[$i]);
|
|
$new[$i]->{'line'} = $old[$i]->{'line'};
|
|
$_[0]->[&indexof($old[$i], @{$_[0]})] = $new[$i];
|
|
$change = $new[$i];
|
|
}
|
|
}
|
|
}
|
|
|
|
# renumber(&config, line, offset)
|
|
sub renumber
|
|
{
|
|
foreach $d (@{$_[0]}) {
|
|
if ($d->{'line'} > $_[1]) { $d->{'line'} += $_[2]; }
|
|
}
|
|
}
|
|
|
|
sub directive_line
|
|
{
|
|
return join("\t", $_[0]->{'name'}, @{$_[0]->{'values'}});
|
|
}
|
|
|
|
# running_under_inetd()
|
|
# Returns the inetd/xinetd object and program if WUFTP is running under one
|
|
sub running_under_inetd
|
|
{
|
|
local ($inet, $inet_mod);
|
|
if (&foreign_check('inetd')) {
|
|
# Check if ftpd is in inetd
|
|
&foreign_require('inetd', 'inetd-lib.pl');
|
|
foreach $i (&foreign_call('inetd', 'list_inets')) {
|
|
if ($i->[1] && $i->[3] eq 'ftp') {
|
|
$inet = $i;
|
|
last;
|
|
}
|
|
}
|
|
$inet_mod = 'inetd';
|
|
}
|
|
elsif (&foreign_check('xinetd')) {
|
|
# Check if ftpd is in xinetd
|
|
&foreign_require('xinetd', 'xinetd-lib.pl');
|
|
foreach $xi (&foreign_call("xinetd", "get_xinetd_config")) {
|
|
if ($xi->{'quick'}->{'disable'}->[0] ne 'yes' &&
|
|
$xi->{'value'} eq 'ftp') {
|
|
$inet = $xi;
|
|
last;
|
|
}
|
|
}
|
|
$inet_mod = 'xinetd';
|
|
}
|
|
else {
|
|
# Not supported on this OS .. assume so
|
|
$inet = 1;
|
|
}
|
|
return ($inet, $inet_mod);
|
|
}
|
|
|
|
1;
|
|
|