Current File : //usr/share/webmin/exports/edit_export.cgi |
#!/usr/bin/perl
# edit_export.cgi
# Allow editing of one export to a client
use strict;
use warnings;
no warnings 'redefine';
no warnings 'uninitialized';
require './exports-lib.pl';
our (%text, %in, %gconfig);
&ReadParse();
my $nfsv = $in{'ver'} || &nfs_max_version("localhost");
my ($exp, %opts);
if ($in{'new'}) {
&ui_print_header(undef, $text{'create_title'}, "", "create_export");
if ($nfsv >= 4) {
$exp->{"pfs"} = "/export";
}
$exp->{'active'} = 1;
}
else {
&ui_print_header(undef, $text{'edit_title'}, "", "edit_export");
my @exps = &list_exports();
$exp = $exps[$in{'idx'}];
%opts = %{$exp->{'options'}};
if ($nfsv == 4) {
# If no NFSv4 options are in use, use NFSv3 form
if (!$exp->{'pfs'} && $exp->{'host'} !~ /^gss/ &&
!$opts{'sec'}) {
$nfsv = 3;
}
}
}
# WebNFS doesn't exist on Linux
my $linux = ($gconfig{'os_type'} =~ /linux/i) ? 1 : 0;
print &ui_form_start("save_export.cgi", "post");
print &ui_hidden("new", $in{'new'});
print &ui_hidden("idx", $in{'idx'});
print &ui_hidden("ver", $in{'ver'});
print &ui_table_start($text{'edit_details'}, "width=100%", 2);
# Show directory input
print &ui_table_row(&hlink($text{'edit_dir'}, "dir"),
&ui_textbox("dir", $exp->{'dir'}, 60)." ".
&file_chooser_button("dir", 1));
# Show PFS directory
if ($nfsv == 4 && $in{'new'}) {
print &ui_table_row(&hlink($text{'edit_pfs'}, "pfs"),
&ui_opt_textbox("pfs", $exp->{'pfs'}, 60, $text{'edit_none'})." ".
&file_chooser_button("dir", 1));
}
elsif ($exp->{'pfs'}) {
print &ui_table_row(&hlink($text{'edit_pfs'}, "pfs"),
"<tt>".&html_escape($exp->{'pfs'})."</tt>");
}
# Show active input
print &ui_table_row(&hlink($text{'edit_active'}, "active"),
&ui_yesno_radio("active", $exp->{'active'}));
# Work out export destination
my $h = $exp->{'host'};
my ($mode, $host, $netgroup, $network, $netmask, $network6, $netmask6, $sec);
if ($h eq "=public") {
$mode = 0;
}
elsif ($h =~ /^gss\/(.*)/) {
# To all clients, but with security required
$mode = 3;
$sec = $1;
}
elsif ($h =~ /^\@(.*)/) {
$mode = 1;
$netgroup = $1;
}
elsif ($h =~ /^([0-9\.]+)\/([0-9\.]+)$/) {
$mode = 2;
$network = $1;
$netmask = $2;
}
elsif ($h =~ /^([a-f0-9:]+)\/([0-9]+)$/i) {
$mode = 6;
$network6 = $1;
$netmask6 = $2;
}
elsif ($h eq "") {
$mode = 3;
}
else {
$mode = 4;
$host = $h;
}
# Allowed hosts table
my @table;
push(@table, [ 3, $text{'edit_all'} ]);
push(@table, [ 4, $text{'edit_host'},
&ui_textbox("host", $host, 40) ]);
if (!$linux) {
push(@table, [ 0, $text{'edit_webnfs'} ]);
}
push(@table, [ 1, $text{'edit_netgroup'},
&ui_textbox("netgroup", $netgroup, 20) ]);
push(@table, [ 2, $text{'edit_network4'},
&ui_textbox("network", $network, 15)." ".
$text{'edit_netmask'}." ".
&ui_textbox("netmask", $netmask, 15) ]);
push(@table, [ 6, $text{'edit_network6'},
&ui_textbox("network6", $network6, 40)."/".
&ui_textbox("netmask6", $netmask6, 6) ]);
print &ui_table_row(&hlink($text{'edit_to'}, "client"),
&ui_radio_table("mode", $mode, \@table));
if ($nfsv >= 4) {
# Show security level list
$sec ||= $opts{'sec'};
$sec ||= 'sys';
print &ui_table_row(&hlink($text{'edit_secs'}, "secs"),
&ui_multi_select("sec",
[ map { [ $_, $text{'edit_sec_'.$_} ] }
split(/:/, $sec) ],
[ [ 'sys', $text{'edit_sec_sys'} ],
[ 'krb5', $text{'edit_sec_krb5'} ],
[ 'krb5i', $text{'edit_sec_krb5i'} ],
[ 'krb5p', $text{'edit_sec_krb5p'} ],
[ 'lipkey', $text{'edit_sec_lipkey'} ],
[ 'spkm', $text{'edit_sec_spkm'} ] ],
6, 1, 0));
}
print &ui_table_end();
print &ui_table_start($text{'edit_security'}, "width=100%", 4);
# Show read-only input
print &ui_table_row(&hlink($text{'edit_ro'}, "ro"),
&ui_yesno_radio("ro", defined($opts{'rw'}) ? 0 : 1));
# Show input for secure port
print &ui_table_row(&hlink($text{'edit_insecure'}, "insecure"),
&ui_yesno_radio("insecure", defined($opts{'insecure'}) ? 1 : 0, 0, 1));
# Show subtree check input
print &ui_table_row(&hlink($text{'edit_subtree_check'}, "subtree_check"),
&ui_yesno_radio("no_subtree_check",defined($opts{'no_subtree_check'})));
# Show nohide check input
print &ui_table_row(&hlink($text{'edit_hide'}, "hide"),
&ui_yesno_radio("nohide", defined($opts{'nohide'}) ? 1 : 0, 0, 1));
# Show sync input
my $sync = defined($opts{'sync'}) ? 1 : defined($opts{'async'}) ? 2 : 0;
print &ui_table_row(&hlink($text{'edit_sync'}, "sync"),
&ui_radio("sync", $sync,
[ map { [ $_, $text{'edit_sync'.$_} ] } (1, 2, 0) ]));
# Show root trust input
my $squash = defined($opts{'no_root_squash'}) ? 0 :
defined($opts{'all_squash'}) ? 2 : 1;
print &ui_table_row(&hlink($text{'edit_squash'}, "squash"),
&ui_radio("squash", $squash,
[ [ 0, $text{'edit_everyone'} ],
[ 1, $text{'edit_except'} ],
[ 2, $text{'edit_nobody'} ] ]));
# Show untrusted user input
my $anonuid;
if (defined($opts{'anonuid'})) {
$anonuid = getpwuid($opts{'anonuid'}) || $opts{'anonuid'};
}
print &ui_table_row(&hlink($text{'edit_anonuid'}, "anonuid"),
&ui_opt_textbox("anonuid", $anonuid, 20, $text{'edit_default'})." ".
&user_chooser_button("anonuid", 0));
# Show untrusted group input
my $anongid;
if (defined($opts{'anongid'})) {
$anongid = getgrgid($opts{'anongid'}) || $opts{'anongid'};
}
print &ui_table_row(&hlink($text{'edit_anongid'}, "anongid"),
&ui_opt_textbox("anongid", $anongid, 20, $text{'edit_default'})." ".
&group_chooser_button("anongid", 0));
# Show input for relative symlinks
print &ui_table_row(&hlink($text{'edit_relative'}, "link_relative"),
&ui_yesno_radio("link_relative", defined($opts{'link_relative'})));
# Show deny access input
print &ui_table_row(&hlink($text{'edit_noaccess'}, "noaccess"),
&ui_yesno_radio("noaccess", defined($opts{'noaccess'})));
# Show untrusted UIDs input
print &ui_table_row(&hlink($text{'edit_uids'}, "squash_uids"),
&ui_opt_textbox("squash_uids", $opts{'squash_uids'}, 20,
$text{'edit_none'}));
# Show untrusted GIDs input
print &ui_table_row(&hlink($text{'edit_gids'}, "squash_gids"),
&ui_opt_textbox("squash_gids", $opts{'squash_gids'}, 20,
$text{'edit_none'}));
print &ui_table_end();
if (!$in{'new'}) {
print &ui_form_end([ [ undef, $text{'save'} ],
[ 'delete', $text{'delete'} ] ]);
}
else {
print &ui_form_end([ [ undef, $text{'create'} ] ]);
}
&ui_print_footer("", $text{'index_return'});