]> git.proxmox.com Git - pve-storage.git/commitdiff
api: add wipedisk call
authorFabian Ebner <f.ebner@proxmox.com>
Fri, 23 Apr 2021 10:14:55 +0000 (12:14 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 2 Jun 2021 09:56:51 +0000 (11:56 +0200)
Try to detect active mounts and holders early, because it's cheap. The wipefs
command in the worker will detect even more situations where wiping alone is
not enough for the device to show up as unused, or could otherwise be
problematic.

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
PVE/API2/Disks.pm

index 33bca7655b54f874e5a730ff88d665e05b8d3905..6c20931d5d4cecca85c937005c076e50f9779981 100644 (file)
@@ -3,6 +3,7 @@ package PVE::API2::Disks;
 use strict;
 use warnings;
 
+use File::Basename;
 use HTTP::Status qw(:constants);
 
 use PVE::Diskmanage;
@@ -68,6 +69,7 @@ __PACKAGE__->register_method ({
            { name => 'lvm' },
            { name => 'lvmthin' },
            { name => 'directory' },
+           { name => 'wipedisk' },
            { name => 'zfs' },
        ];
 
@@ -267,4 +269,44 @@ __PACKAGE__->register_method ({
        return $rpcenv->fork_worker('diskinit', $diskid, $authuser, $worker);
     }});
 
+__PACKAGE__->register_method ({
+    name => 'wipe_disk',
+    path => 'wipedisk',
+    method => 'PUT',
+    description => "Wipe a disk or partition.",
+    proxyto => 'node',
+    protected => 1,
+    parameters => {
+       additionalProperties => 0,
+       properties => {
+           node => get_standard_option('pve-node'),
+           disk => {
+               type => 'string',
+               description => "Block device name",
+               pattern => '^/dev/[a-zA-Z0-9\/]+$',
+           },
+       },
+    },
+    returns => { type => 'string' },
+    code => sub {
+       my ($param) = @_;
+
+       my $disk = PVE::Diskmanage::verify_blockdev_path($param->{disk});
+
+       my $mounted = PVE::Diskmanage::is_mounted($disk);
+       die "disk/partition '${mounted}' is mounted\n" if $mounted;
+
+       my $held = PVE::Diskmanage::has_holder($disk);
+       die "disk/partition '${held}' has a holder\n" if $held;
+
+       my $rpcenv = PVE::RPCEnvironment::get();
+       my $authuser = $rpcenv->get_user();
+
+       my $worker = sub { PVE::Diskmanage::wipe_blockdev($disk); };
+
+       my $basename = basename($disk); # avoid '/' in the ID
+
+       return $rpcenv->fork_worker('wipedisk', $basename, $authuser, $worker);
+    }});
+
 1;