]> git.proxmox.com Git - pve-storage.git/blob - PVE/CLI/pvesr.pm
do not install replication code
[pve-storage.git] / PVE / CLI / pvesr.pm
1 package PVE::CLI::pvesr;
2
3 use strict;
4 use warnings;
5 use POSIX qw(strftime);
6
7 use PVE::JSONSchema qw(get_standard_option);
8 use PVE::INotify;
9 use PVE::RPCEnvironment;
10 use PVE::Tools qw(extract_param);
11 use PVE::SafeSyslog;
12 use PVE::CLIHandler;
13
14 use PVE::API2::Storage::Replication;
15
16 use base qw(PVE::CLIHandler);
17
18 my $nodename = PVE::INotify::nodename();
19
20 sub setup_environment {
21 PVE::RPCEnvironment->setup_default_cli_env();
22 }
23
24 my $print_job_list = sub {
25 my ($list) = @_;
26
27 printf("%-10s%-20s%-20s%-5s%-10s%-5s\n",
28 "VMID", "DEST", "LAST SYNC","IVAL", "STATE", "FAIL");
29
30 foreach my $job (sort { $a->{vmid} <=> $b->{vmid} } @$list) {
31
32 my $timestr = strftime("%Y-%m-%d_%H:%M:%S", localtime($job->{lastsync}));
33
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});
40 }
41 };
42
43 sub set_list {
44 my ($list, $synctime, $vmid) = @_;
45
46 if (defined($list->{$synctime})) {
47 $list = set_list($list,$synctime+1, $vmid);
48 } else {
49 $list->{$synctime} = $vmid;
50 }
51 return $list;
52 }
53
54 my $get_replica_list = sub {
55
56 my $jobs = PVE::ReplicationTools::read_state();
57 my $list = {};
58
59 foreach my $vmid (keys %$jobs) {
60 my $job = $jobs->{$vmid};
61 my $lastsync = $job->{lastsync};
62
63 # interval in min
64 my $interval = $job->{interval};
65 my $now = time();
66 my $fail = $job->{fail};
67
68 my $synctime = $lastsync + $interval * 60;
69
70 if ($now >= $synctime && $job->{state} eq 'ok') {
71 $list = set_list($list, $synctime, $vmid);
72 } elsif ($job->{state} eq 'sync') {
73
74 my $synctime += $interval * ($job->{fail}+1);
75 $list = set_list($list, $synctime, $vmid)
76 if ($now >= $synctime);
77
78 }
79 }
80
81 return $list;
82 };
83
84 my $replicate_vms = sub {
85 my ($list) = @_;
86
87 my @sorted_times = reverse sort keys %$list;
88
89 foreach my $synctime (@sorted_times) {
90 eval {
91 PVE::ReplicationTools::sync_guest($list->{$synctime});
92 };
93 if (my $err = $@) {
94 syslog ('err', $err );
95 }
96 }
97 };
98
99 __PACKAGE__->register_method ({
100 name => 'run',
101 path => 'run',
102 method => 'POST',
103 description => "This method will run by the systemd-timer and sync all jobs",
104 protected => 1,
105 parameters => {
106 additionalProperties => 0,
107 properties => {
108 },
109 },
110 returns => { type => 'null' },
111 code => sub {
112
113 my $list = &$get_replica_list();
114 &$replicate_vms($list);
115
116 return undef;
117 }});
118
119 our $cmddef = {
120 jobs => [ 'PVE::API2::Storage::Replication', 'jobs' , [],
121 {node => $nodename}, $print_job_list ],
122
123 destroyjob => [ 'PVE::API2::Storage::Replication', 'destroy_job' , ['vmid']],
124
125 run => [ __PACKAGE__ , 'run'],
126 };
127
128 1;