]>
git.proxmox.com Git - pmg-api.git/blob - src/PMG/PBSSchedule.pm
92de542e6d865c75c287ea9836e6926e1848ea33
1 package PMG
::PBSSchedule
;
6 use PVE
::Tools
qw(run_command file_set_contents file_get_contents trim dir_glob_foreach);
9 # note: not exactly cheap...
10 my sub next_calendar_event
{
16 ['systemd-analyze', 'calendar', $spec],
20 if ($line =~ /^\s*Next elapse:\s*(.+)$/) {
29 # systemd timer, filter optionally by a $remote
31 my ($filter_remote) = @_;
35 my $systemd_dir = '/etc/systemd/system';
37 dir_glob_foreach
($systemd_dir, '^pmg-pbsbackup@.+\.timer$', sub {
40 if ($filename =~ /^pmg-pbsbackup\@(.+)\.timer$/) {
41 $remote = PVE
::Systemd
::unescape_unit
($1);
43 die "Unrecognized timer name!\n";
46 if (defined($filter_remote) && $filter_remote ne $remote) {
50 my $unitfile = "$systemd_dir/$filename";
51 my $unit = PVE
::Systemd
::read_ini
($unitfile);
52 my $timer = $unit->{'Timer'};
55 unitfile
=> $unitfile,
57 schedule
=> $timer->{'OnCalendar'},
58 delay
=> $timer->{'RandomizedDelaySec'},
59 'next-run' => next_calendar_event
($timer->{'OnCalendar'}),
68 my ($remote, $schedule, $delay) = @_;
70 my $unit_name = 'pmg-pbsbackup@' . PVE
::Systemd
::escape_unit
($remote);
71 #my $service_unit = $unit_name . '.service';
72 my $timer_unit = $unit_name . '.timer';
73 my $timer_unit_path = "/etc/systemd/system/$timer_unit";
75 # create systemd timer
77 ['systemd-analyze', 'calendar', $schedule],
78 errmsg
=> "Invalid schedule specification",
82 ['systemd-analyze', 'timespan', $delay],
83 errmsg
=> "Invalid delay specification",
88 'Description' => "Timer for PBS Backup to remote $remote",
91 'OnCalendar' => $schedule,
92 'RandomizedDelaySec' => $delay,
95 'WantedBy' => 'timers.target',
100 PVE
::Systemd
::write_ini
($timer, $timer_unit_path);
101 run_command
(['systemctl', 'daemon-reload']);
102 run_command
(['systemctl', 'enable', $timer_unit]);
103 run_command
(['systemctl', 'start', $timer_unit]);
107 die "Creating backup schedule for $remote failed: $err\n";
113 sub delete_schedule
{
116 my $schedules = get_schedules
($remote);
118 die "Schedule for $remote not found!\n" if scalar(@$schedules) < 1;
120 my $unit_name = 'pmg-pbsbackup@' . PVE
::Systemd
::escape_unit
($remote);
121 my $service_unit = $unit_name . '.service';
122 my $timer_unit = $unit_name . '.timer';
123 my $timer_unit_path = "/etc/systemd/system/$timer_unit";
126 run_command
(['systemctl', 'disable', $timer_unit]);
127 unlink($timer_unit_path) || die "delete '$timer_unit_path' failed - $!\n";
128 run_command
(['systemctl', 'daemon-reload']);
132 die "Removing backup schedule for $remote failed: $err\n";