use warnings;
use PVE::Ceph::Tools;
+use PVE::Cluster qw(cfs_read_file);
use PVE::JSONSchema qw(get_standard_option);
use PVE::RADOS;
use PVE::Tools qw(file_get_contents);
my $result = [
{ name => 'raw' },
{ name => 'db' },
+ { name => 'value' },
];
return $result;
return $res;
}});
+
+
+my $SINGLE_CONFIGKEY_RE = qr/[0-9a-z\-_\.]+:[0-9a-zA-Z\-_]+/i;
+my $CONFIGKEYS_RE = qr/^(:?${SINGLE_CONFIGKEY_RE})(:?[;, ]${SINGLE_CONFIGKEY_RE})*$/;
+
+__PACKAGE__->register_method ({
+ name => 'value',
+ path => 'value',
+ method => 'GET',
+ proxyto => 'node',
+ protected => 1,
+ permissions => {
+ check => ['perm', '/', [ 'Sys.Audit' ]],
+ },
+ description => "Get configured values from either the config file or config DB.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ 'config-keys' => {
+ type => "string",
+ typetext => "<section>:<config key>[;<section>:<config key>]",
+ pattern => $CONFIGKEYS_RE,
+ description => "List of <section>:<config key> items.",
+ }
+ },
+ },
+ returns => {
+ type => 'object',
+ description => "Contains {section}->{key} children with the values",
+ },
+ code => sub {
+ my ($param) = @_;
+
+ PVE::Ceph::Tools::check_ceph_inited();
+
+ # Ceph treats '-' and '_' the same in parameter names, stick with '-'
+ my $normalize = sub {
+ my $t = shift;
+ $t =~ s/_/-/g;
+ return $t;
+ };
+
+ my $requested_keys = {};
+ for my $pair (PVE::Tools::split_list($param->{'config-keys'})) {
+ my ($section, $key) = split(":", $pair);
+ $section = $normalize->($section);
+ $key = $normalize->($key);
+
+ $requested_keys->{$section}->{$key} = 1;
+ }
+
+ my $config = {};
+
+ my $rados = PVE::RADOS->new();
+ my $configdb = $rados->mon_command( { prefix => 'config dump', format => 'json' });
+ for my $s (@{$configdb}) {
+ my ($section, $name, $value) = $s->@{'section', 'name', 'value'};
+ my $n_section = $normalize->($section);
+ my $n_name = $normalize->($name);
+
+ $config->{$n_section}->{$n_name} = $value
+ if defined $requested_keys->{$n_section} && $n_name eq $n_name;
+ }
+
+ # read ceph.conf after config db as it has priority if settings are present in both
+ my $config_file = cfs_read_file('ceph.conf'); # cfs_read_file to get it parsed
+ for my $section (keys %{$config_file}) {
+ my $n_section = $normalize->($section);
+ next if !defined $requested_keys->{$n_section};
+
+ for my $key (keys %{$config_file->{$section}}) {
+ my $n_key = $normalize->($key);
+ $config->{$n_section}->{$n_key} = $config_file->{$section}->{$key}
+ if $requested_keys->{$n_section}->{$n_key};
+ }
+ }
+
+ return $config;
+ }});