]>
git.proxmox.com Git - pve-storage.git/blob - PVE/CLI/pvesr.pm
1 package PVE
::CLI
::pvesr
;
5 use POSIX
qw(strftime);
7 use PVE
::JSONSchema
qw(get_standard_option);
9 use PVE
::RPCEnvironment
;
10 use PVE
::Tools
qw(extract_param);
14 use PVE
::API2
::Storage
::Replication
;
16 use base
qw(PVE::CLIHandler);
18 my $nodename = PVE
::INotify
::nodename
();
20 sub setup_environment
{
21 PVE
::RPCEnvironment-
>setup_default_cli_env();
24 my $print_job_list = sub {
27 printf("%-10s%-20s%-20s%-5s%-10s%-5s\n",
28 "VMID", "DEST", "LAST SYNC","IVAL", "STATE", "FAIL");
30 foreach my $job (sort { $a->{vmid
} <=> $b->{vmid
} } @$list) {
32 my $timestr = strftime
("%Y-%m-%d_%H:%M:%S", localtime($job->{lastsync
}));
34 printf("%-9s ", $job->{vmid
});
35 printf("%-19s ", $job->{tnode
});
36 printf("%-19s ", $timestr);
37 printf("%-4s ", $job->{interval
});
38 printf("%-9s ", $job->{state});
39 printf("%-9s\n", $job->{fail
});
44 my ($list, $synctime, $vmid) = @_;
46 if (defined($list->{$synctime})) {
47 $list = set_list
($list,$synctime+1, $vmid);
49 $list->{$synctime} = $vmid;
54 my $get_replica_list = sub {
56 my $jobs = PVE
::ReplicationTools
::read_state
();
59 foreach my $vmid (keys %$jobs) {
60 my $job = $jobs->{$vmid};
61 my $lastsync = $job->{lastsync
};
64 my $interval = $job->{interval
};
66 my $fail = $job->{fail
};
68 my $synctime = $lastsync + $interval * 60;
70 if ($now >= $synctime && $job->{state} eq 'ok') {
71 $list = set_list
($list, $synctime, $vmid);
72 } elsif ($job->{state} eq 'sync') {
74 my $synctime += $interval * ($job->{fail
}+1);
75 $list = set_list
($list, $synctime, $vmid)
76 if ($now >= $synctime);
84 my $replicate_vms = sub {
87 my @sorted_times = reverse sort keys %$list;
89 foreach my $synctime (@sorted_times) {
91 PVE
::ReplicationTools
::sync_guest
($list->{$synctime});
94 syslog
('err', $err );
99 __PACKAGE__-
>register_method ({
103 description
=> "This method will run by the systemd-timer and sync all jobs",
106 additionalProperties
=> 0,
110 returns
=> { type
=> 'null' },
113 my $list = &$get_replica_list();
114 &$replicate_vms($list);
120 jobs
=> [ 'PVE::API2::Storage::Replication', 'jobs' , [],
121 {node
=> $nodename}, $print_job_list ],
123 destroyjob
=> [ 'PVE::API2::Storage::Replication', 'destroy_job' , ['vmid']],
125 run
=> [ __PACKAGE__
, 'run'],