sub cifs_cred_file_name {
my ($storeid) = @_;
+ return "/etc/pve/priv/storage/${storeid}.pw";
+}
+
+sub cifs_delete_credentials {
+ my ($storeid) = @_;
- return "/etc/pve/priv/${storeid}.cred";
+ if (my $cred_file = get_cred_file($storeid)) {
+ unlink($cred_file) or warn "removing cifs credientials '$cred_file' failed: $!\n";
+ }
}
sub cifs_set_credentials {
my ($password, $storeid) = @_;
my $cred_file = cifs_cred_file_name($storeid);
+ mkdir "/etc/pve/priv/storage";
PVE::Tools::file_set_contents($cred_file, "password=$password\n");
my $cred_file = cifs_cred_file_name($storeid);
- return -e $cred_file ? $cred_file : undef;
+ if (-e $cred_file) {
+ return $cred_file;
+ }
+ return undef;
}
sub cifs_mount {
sub plugindata {
return {
content => [ { images => 1, rootdir => 1, vztmpl => 1, iso => 1,
- backup => 1}, { images => 1 }],
+ backup => 1, snippets => 1}, { images => 1 }],
format => [ { raw => 1, qcow2 => 1, vmdk => 1 } , 'raw' ],
};
}
type => 'string',
},
password => {
- description => "Password for CIFS share.",
+ description => "Password for accessing the share/datastore.",
type => 'string',
maxLength => 256,
},
nodes => { optional => 1 },
disable => { optional => 1 },
maxfiles => { optional => 1 },
+ 'prune-backups' => { optional => 1 },
content => { optional => 1 },
format => { optional => 1 },
username => { optional => 1 },
password => { optional => 1},
domain => { optional => 1},
smbversion => { optional => 1},
+ mkdir => { optional => 1 },
+ bwlimit => { optional => 1 },
};
}
# Storage implementation
+sub on_add_hook {
+ my ($class, $storeid, $scfg, %param) = @_;
+
+ if (defined($param{password})) {
+ cifs_set_credentials($param{password}, $storeid);
+ if (!exists($scfg->{username})) {
+ warn "ignoring password parameter\n";
+ }
+ } else {
+ cifs_delete_credentials($storeid);
+ }
+
+ return;
+}
+
+sub on_update_hook {
+ my ($class, $storeid, $scfg, %param) = @_;
+
+ return if !exists($param{password});
+
+ if (defined($param{password})) {
+ cifs_set_credentials($param{password}, $storeid);
+ if (!exists($scfg->{username})) {
+ warn "ignoring password parameter\n";
+ }
+ } else {
+ cifs_delete_credentials($storeid);
+ }
+
+ return;
+}
+
+sub on_delete_hook {
+ my ($class, $storeid, $scfg) = @_;
+
+ cifs_delete_credentials($storeid);
+
+ return;
+}
+
sub status {
my ($class, $storeid, $scfg, $cache) = @_;
if (!cifs_is_mounted($server, $share, $path, $cache->{mountdata})) {
- mkpath $path;
+ mkpath $path if !(defined($scfg->{mkdir}) && !$scfg->{mkdir});
die "unable to activate storage '$storeid' - " .
"directory '$path' does not exist\n" if ! -d $path;
} else {
push @$cmd, '-U', 'Guest','-N';
}
-
push @$cmd, '-c', 'echo 1 0';
my $out_str;
- eval {
- run_command($cmd, timeout => 2, outfunc => sub {$out_str .= shift;},
- errfunc => sub {});
- };
+ my $out = sub { $out_str .= shift };
+
+ eval { run_command($cmd, timeout => 10, outfunc => $out, errfunc => sub {}) };
if (my $err = $@) {
die "$out_str\n" if defined($out_str) &&
return 1;
}
+sub get_volume_notes {
+ my $class = shift;
+ PVE::Storage::DirPlugin::get_volume_notes($class, @_);
+}
+sub update_volume_notes {
+ my $class = shift;
+ PVE::Storage::DirPlugin::update_volume_notes($class, @_);
+}
+
1;