]>
git.proxmox.com Git - pve-manager.git/blob - lib/PVE/API2/Cluster.pm
1 package PVE
::API2
::Cluster
;
7 use PVE
::Tools
qw(extract_param);
8 use PVE
::Cluster
qw(cfs_lock_file cfs_read_file cfs_write_file);
12 use Data
::Dumper
; # fixme: remove
14 use Apache2
::Const
qw(:http);
17 use PVE
::RPCEnvironment
;
19 use base
qw(PVE::RESTHandler);
21 my $dc_schema = PVE
::Cluster
::get_datacenter_schema
();
24 type
=> 'string', format
=> 'pve-configid-list',
25 description
=> "A list of settings you want to delete.",
29 foreach my $opt (keys %{$dc_schema->{properties
}}) {
30 $dc_properties->{$opt} = $dc_schema->{properties
}->{$opt};
33 __PACKAGE__-
>register_method ({
37 description
=> "Cluster index.",
38 permissions
=> { user
=> 'all' },
40 additionalProperties
=> 0,
49 links
=> [ { rel
=> 'child', href
=> "{name}" } ],
56 { name
=> 'options' },
57 { name
=> 'resources' },
64 __PACKAGE__-
>register_method({
68 description
=> "Read cluster log",
69 permissions
=> { user
=> 'all' },
71 additionalProperties
=> 0,
75 description
=> "Maximum number of entries.",
91 my $rpcenv = PVE
::RPCEnvironment
::get
();
93 my $max = $param->{max
} || 0;
94 my $user = $rpcenv->get_user();
96 my $admin = $rpcenv->check($user, "/", [ 'Sys.Syslog' ]);
98 my $loguser = $admin ?
'' : $user;
100 my $res = decode_json
(PVE
::Cluster
::get_cluster_log
($loguser, $max));
105 __PACKAGE__-
>register_method({
109 description
=> "Resources index (cluster wide).",
110 permissions
=> { user
=> 'all' },
112 additionalProperties
=> 0,
126 my $rpcenv = PVE
::RPCEnvironment
::get
();
127 my $user = $rpcenv->get_user();
131 my $nodes = PVE
::Cluster
::get_nodelist
();
133 my $rrd = PVE
::Cluster
::rrd_dump
();
135 my $vmlist = PVE
::Cluster
::get_vmlist
() || {};
136 my $idlist = $vmlist->{ids
} || {};
139 # we try to generate 'numbers' by using "$X + 0"
140 foreach my $vmid (keys %$idlist) {
141 my $data = $idlist->{$vmid};
143 next if !$rpcenv->check($user, "/vms/$vmid", [ 'VM.Audit' ]);
146 id
=> "$data->{type}/$vmid",
148 node
=> $data->{node
},
149 type
=> $data->{type
},
152 if (my $d = $rrd->{"pve2-vm/$vmid"}) {
154 $entry->{uptime
} = $d->[0] + 0;
155 $entry->{name
} = $d->[1];
157 $entry->{maxcpu
} = $d->[3] + 0;
158 $entry->{cpu
} = $d->[4] + 0;
159 $entry->{maxmem
} = $d->[5] + 0;
160 $entry->{mem
} = $d->[6] + 0;
161 $entry->{maxdisk
} = $d->[7] + 0;
162 $entry->{disk
} = $d->[8] + 0;
168 foreach my $node (@$nodes) {
174 if (my $d = $rrd->{"pve2-node/$node"}) {
176 $entry->{uptime
} = $d->[0] + 0;
177 $entry->{maxcpu
} = $d->[3] + 0;
178 $entry->{cpu
} = $d->[4] + 0;
179 $entry->{maxmem
} = $d->[6] + 0;
180 $entry->{mem
} = $d->[7] + 0;
181 $entry->{maxdisk
} = $d->[10] + 0;
182 $entry->{disk
} = $d->[11] + 0;
188 my $cfg = PVE
::Storage
::config
();
189 my @sids = PVE
::Storage
::storage_ids
($cfg);
191 foreach my $storeid (@sids) {
192 my $scfg = PVE
::Storage
::storage_config
($cfg, $storeid);
193 next if !$rpcenv->check($user, "/storage/$storeid", [ 'Datastore.Audit' ]);
194 # we create a entry for each node
195 foreach my $node (@$nodes) {
196 next if !PVE
::Storage
::storage_check_enabled
($cfg, $storeid, $node, 1);
198 id
=> "storage/$node/$storeid",
204 if (my $d = $rrd->{"pve2-storage/$node/$storeid"}) {
205 $entry->{maxdisk
} = $d->[1] + 0;
206 $entry->{disk
} = $d->[2] + 0;
217 __PACKAGE__-
>register_method({
221 description
=> "List recent tasks (cluster wide).",
222 permissions
=> { user
=> 'all' },
224 additionalProperties
=> 0,
232 upid
=> { type
=> 'string' },
239 my $rpcenv = PVE
::RPCEnvironment
::get
();
240 my $user = $rpcenv->get_user();
242 my $tlist = PVE
::Cluster
::get_tasklist
();
246 return $res if !$tlist;
248 my $all = $rpcenv->check($user, "/", [ 'Sys.Audit' ]);
250 foreach my $task (@$tlist) {
251 push @$res, $task if $all || ($task->{user
} eq $user);
257 __PACKAGE__-
>register_method({
258 name
=> 'get_options',
261 description
=> "Get datacenter options.",
264 privs
=> [ 'Sys.Audit' ],
267 additionalProperties
=> 0,
276 return PVE
::Cluster
::cfs_read_file
('datacenter.cfg');
279 __PACKAGE__-
>register_method({
280 name
=> 'set_options',
283 description
=> "Set datacenter options.",
286 privs
=> [ 'Sys.Modify' ],
290 additionalProperties
=> 0,
291 properties
=> $dc_properties,
293 returns
=> { type
=> "null" },
297 my $filename = 'datacenter.cfg';
299 my $delete = extract_param
($param, 'delete');
303 my $conf = cfs_read_file
($filename);
305 foreach my $opt (keys %$param) {
306 $conf->{$opt} = $param->{$opt};
309 foreach my $opt (PVE
::Tools
::split_list
($delete)) {
310 delete $conf->{$opt};
313 cfs_write_file
($filename, $conf);
316 cfs_lock_file
($filename, undef, $code);