]>
git.proxmox.com Git - pmg-api.git/blob - src/PMG/API2/Backup.pm
1 package PMG
::API2
::Backup
;
10 use PVE
::JSONSchema
qw(get_standard_option);
14 use PMG
::RESTEnvironment
;
18 use base
qw(PVE::RESTHandler);
20 my $backup_dir = "/var/lib/pmg/backup";
21 my $backup_filename_pattern = 'pmg-backup_[0-9A-Za-z_-]+\.tgz';
23 my $backup_filename_property = {
24 description
=> "The backup file name.",
26 pattern
=> $backup_filename_pattern,
31 __PACKAGE__-
>register_method ({
35 description
=> "List all stored backups (files named proxmox-backup_{DATE}.tgz).",
36 permissions
=> { check
=> [ 'admin', 'audit' ] },
40 additionalProperties
=> 0,
42 node
=> get_standard_option
('pve-node'),
50 filename
=> $backup_filename_property,
52 description
=> "Size of backup file in bytes.",
56 description
=> "Backup timestamp (Unix epoch).",
61 links
=> [ { rel
=> 'child', href
=> "{filename}" } ],
68 PVE
::Tools
::dir_glob_foreach
(
70 $backup_filename_pattern,
74 my $path = "$backup_dir/$filename";
77 my $timestamp = $sa[9] // 0; # mtime
78 my $size = $sa[7] // 0; # size
80 # prefer timestamp from filename
81 if ($filename =~ m/.*_([0-9A-F]+)\.tgz/) {
86 filename
=> $filename,
88 timestamp
=> $timestamp,
95 __PACKAGE__-
>register_method ({
99 description
=> "Backup the system configuration.",
100 permissions
=> { check
=> [ 'admin' ] },
104 additionalProperties
=> 0,
106 node
=> get_standard_option
('pve-node'),
108 description
=> "Backup statistic databases.",
114 description
=> "Specify when to notify via e-mail",
116 enum
=> [ 'always', 'error', 'never' ],
122 returns
=> { type
=> "string" },
126 my $rpcenv = PMG
::RESTEnvironment-
>get();
127 my $authuser = $rpcenv->get_user();
129 $param->{statistic
} //= 1;
132 my (undef, undef, undef, $mday, $mon, $year) = localtime($ctime);
133 my $bkfile = sprintf("pmg-backup_%04d_%02d_%02d_%08X.tgz", $year + 1900, $mon + 1, $mday, $ctime);
134 my $filename = "${backup_dir}/$bkfile";
140 my $log = sub { print "$_[0]\n"; $full_log .= "$_[0]\n"; };
142 $log->("starting backup to: $filename");
144 eval { PMG
::Backup
::pmg_backup_pack
($filename, $param->{statistic
}) };
147 PMG
::Backup
::send_backup_notification
($param->{notify
}, undef, $full_log, $err);
148 die "backup failed: $err\n";
151 $log->("backup finished");
153 PMG
::Backup
::send_backup_notification
($param->{notify
}, undef, $full_log, undef);
158 return $rpcenv->fork_worker('backup', undef, $authuser, $worker);
161 __PACKAGE__-
>register_method ({
163 path
=> '{filename}',
165 description
=> "Download a backup file.",
166 permissions
=> { check
=> [ 'admin' ] },
170 additionalProperties
=> 0,
172 node
=> get_standard_option
('pve-node'),
173 filename
=> $backup_filename_property,
177 returns
=> { type
=> "string" },
181 my $filename = "${backup_dir}/$param->{filename}";
186 __PACKAGE__-
>register_method ({
188 path
=> '{filename}',
190 description
=> "Delete a backup file.",
191 permissions
=> { check
=> [ 'admin' ] },
195 additionalProperties
=> 0,
197 node
=> get_standard_option
('pve-node'),
198 filename
=> $backup_filename_property,
201 returns
=> { type
=> "null" },
205 my $filename = "${backup_dir}/$param->{filename}";
206 unlink($filename) || die "delete backup file '$filename' failed - $!\n";
211 __PACKAGE__-
>register_method ({
213 path
=> '{filename}',
215 description
=> "Restore the system configuration.",
216 permissions
=> { check
=> [ 'admin' ] },
220 additionalProperties
=> 0,
222 PMG
::Backup
::get_restore_options
(),
223 node
=> get_standard_option
('pve-node'),
224 filename
=> $backup_filename_property,
227 returns
=> { type
=> "string" },
231 my $rpcenv = PMG
::RESTEnvironment-
>get();
232 my $authuser = $rpcenv->get_user();
234 my $filename = "${backup_dir}/$param->{filename}";
235 -f
$filename || die "backup file '$filename' does not exist - $!\n";
237 $param->{database
} //= 1;
239 die "nothing selected - please select what you want to restore (config or database?)\n"
240 if !($param->{database
} || $param->{config
});
242 return $rpcenv->fork_worker('restore', undef, $authuser, sub {
243 print "starting restore: $filename\n";
244 PMG
::Backup
::pmg_restore
($filename, $param->{database
}, $param->{config
}, $param->{statistic
});
245 print "restore finished\n";