use strict;
use warnings;
use IO::File;
+use Net::IP;
+use File::Path;
+use PVE::Tools qw(run_command);
+use PVE::ProcFSTools;
use PVE::Storage::Plugin;
use PVE::JSONSchema qw(get_standard_option);
# NFS helper functions
-sub read_proc_mounts {
-
- local $/; # enable slurp mode
-
- my $data = "";
- if (my $fd = IO::File->new("/proc/mounts", "r")) {
- $data = <$fd>;
- close ($fd);
- }
-
- return $data;
-}
-
sub nfs_is_mounted {
my ($server, $export, $mountpoint, $mountdata) = @_;
+ $server = "[$server]" if Net::IP::ip_is_ipv6($server);
my $source = "$server:$export";
- $mountdata = read_proc_mounts() if !$mountdata;
-
- if ($mountdata =~ m|^$source/?\s$mountpoint\snfs|m) {
- return $mountpoint;
- }
-
+ $mountdata = PVE::ProcFSTools::parse_proc_mounts() if !$mountdata;
+ return $mountpoint if grep {
+ $_->[2] =~ /^nfs/ &&
+ $_->[0] =~ m|^\Q$source\E/?$| &&
+ $_->[1] eq $mountpoint
+ } @$mountdata;
return undef;
}
sub nfs_mount {
my ($server, $export, $mountpoint, $options) = @_;
+ $server = "[$server]" if Net::IP::ip_is_ipv6($server);
my $source = "$server:$export";
my $cmd = ['/bin/mount', '-t', 'nfs', $source, $mountpoint];
sub status {
my ($class, $storeid, $scfg, $cache) = @_;
- $cache->{mountdata} = read_proc_mounts() if !$cache->{mountdata};
+ $cache->{mountdata} = PVE::ProcFSTools::parse_proc_mounts()
+ if !$cache->{mountdata};
my $path = $scfg->{path};
my $server = $scfg->{server};
sub activate_storage {
my ($class, $storeid, $scfg, $cache) = @_;
- $cache->{mountdata} = read_proc_mounts() if !$cache->{mountdata};
+ $cache->{mountdata} = PVE::ProcFSTools::parse_proc_mounts()
+ if !$cache->{mountdata};
my $path = $scfg->{path};
my $server = $scfg->{server};
sub deactivate_storage {
my ($class, $storeid, $scfg, $cache) = @_;
- $cache->{mountdata} = read_proc_mounts() if !$cache->{mountdata};
+ $cache->{mountdata} = PVE::ProcFSTools::parse_proc_mounts()
+ if !$cache->{mountdata};
my $path = $scfg->{path};
my $server = $scfg->{server};
}
}
+sub check_connection {
+ my ($class, $storeid, $scfg) = @_;
+
+ my $server = $scfg->{server};
+
+ my $cmd = ['/sbin/showmount', '--no-headers', '--exports', $server];
+
+ eval {
+ run_command($cmd, timeout => 2, outfunc => sub {}, errfunc => sub {});
+ };
+ if (my $err = $@) {
+ return 0;
+ }
+
+ return 1;
+}
+
1;