diff --git a/make-automaps/make-automaps b/make-automaps/make-automaps index 7cb1168..01d0d57 100755 --- a/make-automaps/make-automaps +++ b/make-automaps/make-automaps @@ -5,6 +5,28 @@ use warnings; chomp (my $hostname=`uname -n`);$hostname=~s/\..*//; +{ + my %SERVER_CAN_41; + sub server_vers_opt { + my ($servername)=@_; + unless (exists $SERVER_CAN_41{$servername}) { + my $pid=fork; + if (defined $pid) { + unless ($pid) { + open STDERR,'>','/dev/null'; + exec 'hostconfig','--host',$servername,'nfsd41'; + die "exec failed: $!\n"; + } + wait; + $SERVER_CAN_41{$servername} = $? ? 0 : 1; + } else { + $SERVER_CAN_41{$servername} = 0; + } + } + return $SERVER_CAN_41{$servername} ? () : ('-vers=4.0'); + } +} + sub convert_map { my ($amd,$auto,$parse_line)=@_; open IN,'<',$amd or die "$amd: $!\n"; @@ -22,13 +44,13 @@ sub convert_map { sub parse_jbod_line { my ($in,$source)=@_; if ($in=~m"^(X\d+)\s+host==([^;]+);type:=link;fs:=/amd/\2/X/\1 host!=\2;type:=nfs;rhost:=\2;fs:=/amd/\2/x/\1;rfs:=/amd/\2/X/\1$") { - return "$1 -vers=4.0 $2:/amd/$2/X/$1"; + return join(' ',$1,server_vers_opt($2),"$2:/amd/$2/X/$1"); } elsif ($in=~m"^(C\d+)\s+host==([^;]+);type:=link;fs:=/amd/\2/C/\1 host!=\2;type:=nfs;rhost:=\2;fs:=/amd/\2/c/\1;rfs:=/amd/\2/C/\1$") { - return "$1 -vers=4.0 $2:/amd/$2/C/$1"; + return join(' ',$1,server_vers_opt($2),"$2:/amd/$2/C/$1"); } elsif ($in=~m"^(M\d+)\s+host==([^;]+);type:=link;fs:=/amd/\2/M/\1 host!=\2;type:=nfs;rhost:=\2;fs:=/amd/\2/m/\1;rfs:=/amd/\2/M/\1$") { - return "$1 -vers=4.0 $2:/amd/$2/M/$1"; + return join(' ',$1,server_vers_opt($2),"$2:/amd/$2/M/$1"); } elsif ($in=~m"^(X\d+)\s+-fs:=/amd/([^/]+)/X/\1 host==\2;type:=link host!=\2;type:=nfs;rhost:=\2") { - return "$1 -vers=4.0 $2:/amd/$2/X/$1"; + return join(' ',$1,server_vers_opt($2),"$2:/amd/$2/X/$1"); } else { warn "?? $source : $_ ??"; } @@ -68,8 +90,8 @@ sub parse_map_line { return (); } -sub parse_subkey_line { my ($key,$host,$fs)=parse_map_line(@_); return $key ? "$key -vers=4.0 $host:$fs/$key" : undef; } -sub parse_nosubkey_line { my ($key,$host,$fs)=parse_map_line(@_); return $key ? "$key -vers=4.0 $host:$fs" : undef; } +sub parse_subkey_line { my ($key,$host,$fs)=parse_map_line(@_); return $key ? join(' ',$key,server_vers_opt($host),"$host:$fs/$key") : undef; } +sub parse_nosubkey_line { my ($key,$host,$fs)=parse_map_line(@_); return $key ? join(' ',$key,server_vers_opt($host),"$host:$fs") : undef; } sub create_pkg_map { my $cache; @@ -82,10 +104,16 @@ sub create_pkg_map { /\S/ or next; my ($pkg,$flags)=split ' '; my $local="/var/pkg/$pkg"; - my $rw = $flags eq 'BUILD' ? ' -vers=4.0,rw' : ' -vers=4.0'; + my $rw; if (-d $local) { + $rw = $flags eq 'BUILD' ? ' -rw' : ''; print $out "$pkg$rw :$local\n"; } else { + if (server_vers_opt('ex')) { + $rw = $flags eq 'BUILD' ? ' -vers=4.0,rw' : ' -vers=4.0'; + } else{ + $rw = $flags eq 'BUILD' ? ' -rw' : ''; + } print $out "$pkg$rw ex:/amd/ex/X/X2008/package/pkg/$pkg\n"; } }