Viewing file: wuftpd-lib.pl (2.95 KB) -rwxr-xr-x Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# 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;
|