]> git.proxmox.com Git - pmg-api.git/blob - src/PMG/PBSSchedule.pm
46d0b18b69487b603d92028464456d9c72f0b3c5
[pmg-api.git] / src / PMG / PBSSchedule.pm
1 package PMG::PBSSchedule;
2
3 use strict;
4 use warnings;
5
6 use PVE::Tools qw(run_command file_set_contents file_get_contents trim dir_glob_foreach);
7 use PVE::Systemd;
8
9 # systemd timer
10 sub get_schedules {
11 my ($filter_remote) = @_;
12
13 my $result = [];
14
15 my $systemd_dir = '/etc/systemd/system';
16
17 dir_glob_foreach($systemd_dir, '^pmg-pbsbackup@.+\.timer$', sub {
18 my ($filename) = @_;
19 my $remote;
20 if ($filename =~ /^pmg-pbsbackup\@(.+)\.timer$/) {
21 $remote = PVE::Systemd::unescape_unit($1);
22 } else {
23 die "Unrecognized timer name!\n";
24 }
25
26 if (defined($filter_remote) && $filter_remote ne $remote) {
27 return; # next
28 }
29
30 my $unitfile = "$systemd_dir/$filename";
31 my $unit = PVE::Systemd::read_ini($unitfile);
32
33 push @$result, {
34 unitfile => $unitfile,
35 remote => $remote,
36 schedule => $unit->{'Timer'}->{'OnCalendar'},
37 delay => $unit->{'Timer'}->{'RandomizedDelaySec'},
38 };
39 });
40
41 return $result;
42
43 }
44
45 sub create_schedule {
46 my ($remote, $schedule, $delay) = @_;
47
48 my $unit_name = 'pmg-pbsbackup@' . PVE::Systemd::escape_unit($remote);
49 #my $service_unit = $unit_name . '.service';
50 my $timer_unit = $unit_name . '.timer';
51 my $timer_unit_path = "/etc/systemd/system/$timer_unit";
52
53 # create systemd timer
54 run_command(['systemd-analyze', 'calendar', $schedule], errmsg => "Invalid schedule specification", outfunc => sub {});
55 run_command(['systemd-analyze', 'timespan', $delay], errmsg => "Invalid delay specification", outfunc => sub {});
56 my $timer = {
57 'Unit' => {
58 'Description' => "Timer for PBS Backup to remote $remote",
59 },
60 'Timer' => {
61 'OnCalendar' => $schedule,
62 'RandomizedDelaySec' => $delay,
63 },
64 'Install' => {
65 'WantedBy' => 'timers.target',
66 },
67 };
68
69 eval {
70 PVE::Systemd::write_ini($timer, $timer_unit_path);
71 run_command(['systemctl', 'daemon-reload']);
72 run_command(['systemctl', 'enable', $timer_unit]);
73 run_command(['systemctl', 'start', $timer_unit]);
74
75 };
76 if (my $err = $@) {
77 die "Creating backup schedule for $remote failed: $err\n";
78 }
79
80 return;
81 }
82
83 sub delete_schedule {
84 my ($remote) = @_;
85
86 my $schedules = get_schedules($remote);
87
88 die "Schedule for $remote not found!\n" if scalar(@$schedules) < 1;
89
90 my $unit_name = 'pmg-pbsbackup@' . PVE::Systemd::escape_unit($remote);
91 my $service_unit = $unit_name . '.service';
92 my $timer_unit = $unit_name . '.timer';
93 my $timer_unit_path = "/etc/systemd/system/$timer_unit";
94
95 eval {
96 run_command(['systemctl', 'disable', $timer_unit]);
97 unlink($timer_unit_path) || die "delete '$timer_unit_path' failed - $!\n";
98 run_command(['systemctl', 'daemon-reload']);
99
100 };
101 if (my $err = $@) {
102 die "Removing backup schedule for $remote failed: $err\n";
103 }
104
105 return;
106 }
107
108 1;