Current File : //usr/share/webmin/dfsadmin/save_share.cgi |
#!/usr/bin/perl
# save_share.cgi
# Save changes to a shared directory
require './dfs-lib.pl';
&error_setup($text{'save_err'});
use Socket;
&ReadParse();
@shlist = &list_shares();
if ($in{'delete'}) {
# Redirect to deletion CGI
&redirect("delete_share.cgi?idx=$in{'idx'}");
exit;
}
# check inputs
if ($in{directory} !~ /^\/.*/) {
&error(&text('save_edirectory', $in{'directory'}));
}
if (!(-d $in{directory})) {
&error(&text('save_edirectory2', $in{'directory'}));
}
@rolist = split(/\s+/, $in{rolist}); &check_hosts(@rolist);
@rwlist = split(/\s+/, $in{rwlist}); &check_hosts(@rwlist);
@rtlist = split(/\s+/, $in{rtlist}); &check_hosts(@rtlist);
if ($in{readwrite} == 2 && !@rwlist) {
&error($text{'save_erw'});
}
if ($in{readonly} == 2 && !@rolist) {
&error($text{'save_ero'});
}
if ($in{root} == 2 && !@rtlist) {
&error($text{'save_eroot'});
}
# Remove from the read-only list any hosts shared read-write as well
if ($in{readwrite} == 1) {
$in{readonly} = 0;
}
elsif ($in{readwrite} == 2) {
foreach $rwh (@rwlist) {
if (($idx = &indexof($rwh, @rolist)) != -1) {
splice(@rolist, $idx, 1);
}
}
if (@rolist == 0 && $in{readonly} == 2) {
$in{readonly} = 0;
}
}
&lock_file($config{dfstab_file});
foreach $s (@shlist) {
$taken = $s if ($s->{'dir'} eq $in{directory});
}
if (defined($in{'idx'})) {
$share = $shlist[$in{'idx'}];
$olddir = $share->{'dir'};
}
$share->{'dir'} = $in{'directory'};
$share->{'desc'} = $in{'desc'};
$share->{'type'} = 'nfs';
if (defined($in{'idx'})) {
# Changing an existing share
if ($taken && $taken->{'index'} != $in{'idx'}) {
&error(&text('save_ealready', $in{'directory'}));
}
&parse_options($share->{'opts'});
&set_options();
$share->{'opts'} = &join_options();
&modify_share($share);
}
else {
# Creating a new share
if ($taken) {
&error(&text('save_ealready', $in{'directory'}));
}
&set_options();
$share->{'opts'} = &join_options();
&create_share($share);
}
&unlock_file($config{dfstab_file});
if (defined($in{'idx'})) {
&webmin_log('modify', 'share', $olddir, \%in);
}
else {
&webmin_log('create', 'share', $share->{'dir'}, \%in);
}
&redirect("");
# set_options()
# Fill in the options associative array
sub set_options
{
if ($in{readonly} == 0) { delete($options{"ro"}); }
elsif ($in{readonly} == 1) { $options{"ro"} = ""; }
elsif ($in{readonly} == 2) { $options{"ro"} = join(':', @rolist); }
if ($in{readwrite} == 0) { delete($options{"rw"}); }
elsif ($in{readwrite} == 1) { $options{"rw"} = ""; }
elsif ($in{readwrite} == 2) { $options{"rw"} = join(':', @rwlist); }
if ($in{root} == 0) { delete($options{"root"}); }
elsif ($in{root} == 2) { $options{"root"} = join(':', @rtlist); }
if (!$access{'simple'}) {
if ($in{nosub}) { $options{"nosub"} = ""; }
else { delete($options{"nosub"}); }
if ($in{nosuid}) { $options{"nosuid"} = ""; }
else { delete($options{"nosuid"}); }
if ($in{secure}) { $options{"secure"} = ""; }
else { delete($options{"secure"}); }
if ($in{kerberos}) { $options{"kerberos"} = ""; }
else { delete($options{"kerberos"}); }
if ($in{'anon_m'} == 0) { delete($options{"anon"}); }
elsif ($in{'anon_m'} == 1) { $options{"anon"} = -1; }
else { $options{"anon"} = getpwnam($in{"anon"}); }
if ($in{aclok}) { $options{"aclok"} = ""; }
else { delete($options{"aclok"}); }
if ($gconfig{'os_version'} >= 7) {
if ($in{'public'}) { $options{'public'} = ""; }
else { delete($options{'public'}); }
if (!$in{'index_def'}) { $options{'index'} = $in{'index'}; }
else { delete($options{'index'}); }
}
}
}
# check_hosts(host, host, ...)
# Die if any of the listed hosts does not exist
sub check_hosts
{
local $h;
if ($gconfig{'os_version'} < 7) {
foreach $h (@_) {
&to_ipaddress($h) || &to_ip6address($h) ||
&error(&text('save_ehost', $h));
}
}
}