]>
git.proxmox.com Git - pve-manager.git/blob - PVE/API2/VZDump.pm
2eda973e59ce9c65bcae7efab5de53d4e93abedb
1 package PVE
:: API2
:: VZDump
;
5 use PVE
:: Exception
qw(raise_param_exc) ;
6 use PVE
:: Tools
qw(extract_param) ;
7 use PVE
:: Cluster
qw(cfs_register_file cfs_read_file) ;
9 use PVE
:: RPCEnvironment
;
10 use PVE
:: AccessControl
;
11 use PVE
:: JSONSchema
qw(get_standard_option) ;
14 use PVE
:: VZDump
:: Common
;
17 use Data
:: Dumper
; # fixme: remove
20 use base
qw(PVE::RESTHandler) ;
22 __PACKAGE__-
> register_method ({
26 description
=> "Create backup." ,
28 description
=> "The user needs 'VM.Backup' permissions on any VM, and 'Datastore.AllocateSpace' on the backup storage. The 'maxfiles', 'tmpdir', 'dumpdir', 'script', 'bwlimit' and 'ionice' parameters are restricted to the 'root\ @pam ' user." ,
34 additionalProperties
=> 0 ,
35 properties
=> PVE
:: VZDump
:: Common
:: json_config_properties
({
38 description
=> "Write tar to stdout, not to a file." ,
43 returns
=> { type
=> 'string' },
47 my $rpcenv = PVE
:: RPCEnvironment
:: get
();
49 my $user = $rpcenv -> get_user ();
51 my $nodename = PVE
:: INotify
:: nodename
();
53 if ( $rpcenv ->{ type
} ne 'cli' ) {
54 raise_param_exc
({ node
=> "option is only allowed on the command line interface." })
55 if $param ->{ node
} && $param ->{ node
} ne $nodename ;
57 raise_param_exc
({ stdout
=> "option is only allowed on the command line interface." })
61 foreach my $key ( qw(maxfiles tmpdir dumpdir script bwlimit ionice) ) {
62 raise_param_exc
({ $key => "Only root may set this option." })
63 if defined ( $param ->{ $key }) && ( $user ne 'root @pam ' );
66 PVE
:: VZDump
:: verify_vzdump_parameters
( $param, 1 );
68 # silent exit if we run on wrong node
69 return 'OK' if $param ->{ node
} && $param ->{ node
} ne $nodename ;
71 my $cmdline = PVE
:: VZDump
:: Common
:: command_line
( $param );
73 my $vmids_per_node = PVE
:: VZDump
:: get_included_guests
( $param );
75 my $local_vmids = delete $vmids_per_node ->{ $nodename } // [];
77 my $skiplist = [ map { @$_ } values $vmids_per_node -> %* ];
80 PVE
:: VZDump
:: stop_running_backups
();
81 return 'OK' if ! scalar (@{ $local_vmids });
84 # silent exit if specified VMs run on other nodes
85 return "OK" if ! scalar (@{ $local_vmids }) && ! $param ->{ all
};
87 # exclude-path list need to be 0 separated
88 if ( defined ( $param ->{ 'exclude-path' })) {
89 my @expaths = split ( /\0/ , $param ->{ 'exclude-path' } || '' );
90 $param ->{ 'exclude-path' } = [ @expaths ];
93 if ( defined ( $param ->{ mailto
})) {
94 my @mailto = PVE
:: Tools
:: split_list
( extract_param
( $param, 'mailto' ));
95 $param ->{ mailto
} = [ @mailto ];
98 die "you can only backup a single VM with option --stdout \n "
99 if $param ->{ stdout
} && scalar (@{ $local_vmids }) != 1 ;
101 $rpcenv -> check ( $user, "/storage/ $param ->{storage}" , [ 'Datastore.AllocateSpace' ])
102 if $param ->{ storage
};
107 $SIG { INT
} = $SIG { TERM
} = $SIG { QUIT
} = $SIG { HUP
} = $SIG { PIPE
} = sub {
108 die "interrupted by signal \n " ;
111 $param ->{ vmids
} = $local_vmids ;
112 my $vzdump = PVE
:: VZDump-
> new ( $cmdline, $param, $skiplist );
115 $vzdump -> getlock ( $upid ); # only one process allowed
118 $vzdump -> sendmail ([], 0 , $err );
122 if ( defined ( $param ->{ ionice
})) {
123 if ( $param ->{ ionice
} > 7 ) {
124 PVE
:: VZDump
:: run_command
( undef , "ionice -c3 -p $$ " );
126 PVE
:: VZDump
:: run_command
( undef , "ionice -c2 -n $param ->{ionice} -p $$ " );
129 $vzdump -> exec_backup ( $rpcenv, $user );
132 open STDOUT
, '>/dev/null' if $param ->{ quiet
} && ! $param ->{ stdout
};
133 open STDERR
, '>/dev/null' if $param ->{ quiet
};
135 if ( $rpcenv ->{ type
} eq 'cli' ) {
136 if ( $param ->{ stdout
}) {
138 open my $saved_stdout, ">&STDOUT"
139 || die "can't dup STDOUT: $!\n " ;
141 open STDOUT
, '>&STDERR' ||
142 die "unable to redirect STDOUT: $!\n " ;
144 $param ->{ stdout
} = $saved_stdout ;
149 $taskid = $local_vmids ->[ 0 ] if scalar (@{ $local_vmids }) == 1 ;
151 return $rpcenv -> fork_worker ( 'vzdump' , $taskid, $user, $worker );
154 __PACKAGE__-
> register_method ({
155 name
=> 'extractconfig' ,
156 path
=> 'extractconfig' ,
158 description
=> "Extract configuration from vzdump backup archive." ,
160 description
=> "The user needs 'VM.Backup' permissions on the backed up guest ID, and 'Datastore.AllocateSpace' on the backup storage." ,
166 additionalProperties
=> 0 ,
168 node
=> get_standard_option
( 'pve-node' ),
170 description
=> "Volume identifier" ,
172 completion
=> \
& PVE
:: Storage
:: complete_volume
,
176 returns
=> { type
=> 'string' },
180 my $volume = extract_param
( $param, 'volume' );
182 my $rpcenv = PVE
:: RPCEnvironment
:: get
();
183 my $authuser = $rpcenv -> get_user ();
185 my $storage_cfg = PVE
:: Storage
:: config
();
186 PVE
:: Storage
:: check_volume_access
( $rpcenv, $authuser, $storage_cfg, undef , $volume );
188 return PVE
:: Storage
:: extract_vzdump_config
( $storage_cfg, $volume );