remote_daemon_config.c 12.1 KB
Newer Older
1
/*
2
 * remote_daemon_config.c: libvirtd config file handling
3
 *
4
 * Copyright (C) 2006-2018 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17
 * Copyright (C) 2006 Daniel P. Berrange
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library.  If not, see
O
Osier Yang 已提交
19
 * <http://www.gnu.org/licenses/>.
20 21 22 23
 */

#include <config.h>

24
#include "remote_daemon_config.h"
25
#include "virconf.h"
26
#include "viralloc.h"
27
#include "virerror.h"
28
#include "virlog.h"
29
#include "rpc/virnetserver.h"
30
#include "configmake.h"
31 32
#include "remote_protocol.h"
#include "remote_driver.h"
33
#include "util/virnetdevopenvswitch.h"
34 35
#include "virstring.h"
#include "virutil.h"
36 37 38

#define VIR_FROM_THIS VIR_FROM_CONF

39 40
VIR_LOG_INIT("daemon.libvirtd-config");

41

42 43
static int
remoteConfigGetAuth(virConfPtr conf,
44
                    const char *filename,
45
                    const char *key,
46
                    int *auth)
47
{
48
    char *authstr = NULL;
49

50
    if (virConfGetValueString(conf, key, &authstr) < 0)
51 52
        return -1;

53
    if (!authstr)
54 55
        return 0;

56
    if (STREQ(authstr, "none")) {
57
        *auth = VIR_NET_SERVER_SERVICE_AUTH_NONE;
58
#if WITH_SASL
59
    } else if (STREQ(authstr, "sasl")) {
60 61
        *auth = VIR_NET_SERVER_SERVICE_AUTH_SASL;
#endif
62
    } else if (STREQ(authstr, "polkit")) {
63 64
        *auth = VIR_NET_SERVER_SERVICE_AUTH_POLKIT;
    } else {
65
        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
66 67 68
                       _("%s: %s: unsupported auth %s"),
                       filename, key, authstr);
        VIR_FREE(authstr);
69 70 71
        return -1;
    }

72
    VIR_FREE(authstr);
73 74 75 76 77 78 79
    return 0;
}

int
daemonConfigFilePath(bool privileged, char **configfile)
{
    if (privileged) {
80 81
        if (VIR_STRDUP(*configfile,
                       SYSCONFDIR "/libvirt/" DAEMON_NAME ".conf") < 0)
82
            goto error;
83
    } else {
84
        char *configdir = NULL;
85

86
        if (!(configdir = virGetUserConfigDirectory()))
87 88
            goto error;

89
        if (virAsprintf(configfile, "%s/%s.conf", configdir, DAEMON_NAME) < 0) {
90
            VIR_FREE(configdir);
91
            goto error;
92
        }
93
        VIR_FREE(configdir);
94 95 96 97
    }

    return 0;

98
 error:
99 100 101 102 103 104 105 106
    return -1;
}

struct daemonConfig*
daemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
{
    struct daemonConfig *data;

107
    if (VIR_ALLOC(data) < 0)
108 109 110 111 112
        return NULL;

    data->listen_tls = 1;
    data->listen_tcp = 0;

113 114 115
    if (VIR_STRDUP(data->tls_port, LIBVIRTD_TLS_PORT) < 0 ||
        VIR_STRDUP(data->tcp_port, LIBVIRTD_TCP_PORT) < 0)
        goto error;
116 117

    /* Only default to PolicyKit if running as root */
118
#if WITH_POLKIT
119 120 121 122 123 124 125
    if (privileged) {
        data->auth_unix_rw = REMOTE_AUTH_POLKIT;
        data->auth_unix_ro = REMOTE_AUTH_POLKIT;
    } else {
#endif
        data->auth_unix_rw = REMOTE_AUTH_NONE;
        data->auth_unix_ro = REMOTE_AUTH_NONE;
126
#if WITH_POLKIT
127 128 129
    }
#endif

130 131
    if (VIR_STRDUP(data->unix_sock_rw_perms,
                   data->auth_unix_rw == REMOTE_AUTH_POLKIT ? "0777" : "0700") < 0 ||
132 133
        VIR_STRDUP(data->unix_sock_ro_perms, "0777") < 0 ||
        VIR_STRDUP(data->unix_sock_admin_perms, "0700") < 0)
134
        goto error;
135

136
#if WITH_SASL
137 138 139 140 141 142 143 144
    data->auth_tcp = REMOTE_AUTH_SASL;
#else
    data->auth_tcp = REMOTE_AUTH_NONE;
#endif
    data->auth_tls = REMOTE_AUTH_NONE;

    data->min_workers = 5;
    data->max_workers = 20;
145
    data->max_clients = 5000;
146
    data->max_queued_clients = 1000;
147
    data->max_anonymous_clients = 20;
148 149 150 151 152 153 154 155 156 157 158

    data->prio_workers = 5;

    data->max_client_requests = 5;

    data->audit_level = 1;
    data->audit_logging = 0;

    data->keepalive_interval = 5;
    data->keepalive_count = 5;

159 160 161 162 163 164 165 166 167
    data->admin_min_workers = 5;
    data->admin_max_workers = 20;
    data->admin_max_clients = 5000;
    data->admin_max_queued_clients = 20;
    data->admin_max_client_requests = 5;

    data->admin_keepalive_interval = 5;
    data->admin_keepalive_count = 5;

168 169
    data->ovs_timeout = VIR_NETDEV_OVS_DEFAULT_TIMEOUT;

170 171
    return data;

172
 error:
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
    daemonConfigFree(data);
    return NULL;
}

void
daemonConfigFree(struct daemonConfig *data)
{
    char **tmp;

    if (!data)
        return;

    VIR_FREE(data->listen_addr);
    VIR_FREE(data->tls_port);
    VIR_FREE(data->tcp_port);
188 189 190 191 192 193
    tmp = data->access_drivers;
    while (tmp && *tmp) {
        VIR_FREE(*tmp);
        tmp++;
    }
    VIR_FREE(data->access_drivers);
194

195
    VIR_FREE(data->unix_sock_admin_perms);
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
    VIR_FREE(data->unix_sock_ro_perms);
    VIR_FREE(data->unix_sock_rw_perms);
    VIR_FREE(data->unix_sock_group);
    VIR_FREE(data->unix_sock_dir);

    tmp = data->tls_allowed_dn_list;
    while (tmp && *tmp) {
        VIR_FREE(*tmp);
        tmp++;
    }
    VIR_FREE(data->tls_allowed_dn_list);

    tmp = data->sasl_allowed_username_list;
    while (tmp && *tmp) {
        VIR_FREE(*tmp);
        tmp++;
    }
    VIR_FREE(data->sasl_allowed_username_list);
214
    VIR_FREE(data->tls_priority);
215 216 217 218 219 220

    VIR_FREE(data->key_file);
    VIR_FREE(data->ca_file);
    VIR_FREE(data->cert_file);
    VIR_FREE(data->crl_file);

A
Alex Jia 已提交
221
    VIR_FREE(data->host_uuid);
222
    VIR_FREE(data->host_uuid_source);
223 224 225 226 227 228
    VIR_FREE(data->log_filters);
    VIR_FREE(data->log_outputs);

    VIR_FREE(data);
}

229 230 231 232
static int
daemonConfigLoadOptions(struct daemonConfig *data,
                        const char *filename,
                        virConfPtr conf)
233
{
234 235 236 237 238 239 240 241 242 243
    if (virConfGetValueBool(conf, "listen_tcp", &data->listen_tcp) < 0)
        goto error;
    if (virConfGetValueBool(conf, "listen_tls", &data->listen_tls) < 0)
        goto error;
    if (virConfGetValueString(conf, "tls_port", &data->tls_port) < 0)
        goto error;
    if (virConfGetValueString(conf, "tcp_port", &data->tcp_port) < 0)
        goto error;
    if (virConfGetValueString(conf, "listen_addr", &data->listen_addr) < 0)
        goto error;
244

245
    if (remoteConfigGetAuth(conf, filename, "auth_unix_rw", &data->auth_unix_rw) < 0)
246
        goto error;
247
#if WITH_POLKIT
248 249 250 251 252
    /* Change default perms to be wide-open if PolicyKit is enabled.
     * Admin can always override in config file
     */
    if (data->auth_unix_rw == REMOTE_AUTH_POLKIT) {
        VIR_FREE(data->unix_sock_rw_perms);
253
        if (VIR_STRDUP(data->unix_sock_rw_perms, "0777") < 0)
254 255 256
            goto error;
    }
#endif
257
    if (remoteConfigGetAuth(conf, filename, "auth_unix_ro", &data->auth_unix_ro) < 0)
258
        goto error;
259
    if (remoteConfigGetAuth(conf, filename, "auth_tcp", &data->auth_tcp) < 0)
260
        goto error;
261
    if (remoteConfigGetAuth(conf, filename, "auth_tls", &data->auth_tls) < 0)
262 263
        goto error;

264 265
    if (virConfGetValueStringList(conf, "access_drivers", false,
                                  &data->access_drivers) < 0)
266 267
        goto error;

268 269 270 271 272 273 274 275
    if (virConfGetValueString(conf, "unix_sock_group", &data->unix_sock_group) < 0)
        goto error;
    if (virConfGetValueString(conf, "unix_sock_admin_perms", &data->unix_sock_admin_perms) < 0)
        goto error;
    if (virConfGetValueString(conf, "unix_sock_ro_perms", &data->unix_sock_ro_perms) < 0)
        goto error;
    if (virConfGetValueString(conf, "unix_sock_rw_perms", &data->unix_sock_rw_perms) < 0)
        goto error;
276

277 278
    if (virConfGetValueString(conf, "unix_sock_dir", &data->unix_sock_dir) < 0)
        goto error;
279

280 281 282 283
    if (virConfGetValueBool(conf, "tls_no_sanity_certificate", &data->tls_no_sanity_certificate) < 0)
        goto error;
    if (virConfGetValueBool(conf, "tls_no_verify_certificate", &data->tls_no_verify_certificate) < 0)
        goto error;
284

285 286 287 288 289 290 291 292
    if (virConfGetValueString(conf, "key_file", &data->key_file) < 0)
        goto error;
    if (virConfGetValueString(conf, "cert_file", &data->cert_file) < 0)
        goto error;
    if (virConfGetValueString(conf, "ca_file", &data->ca_file) < 0)
        goto error;
    if (virConfGetValueString(conf, "crl_file", &data->crl_file) < 0)
        goto error;
293

294 295
    if (virConfGetValueStringList(conf, "tls_allowed_dn_list", false,
                                  &data->tls_allowed_dn_list) < 0)
296 297 298
        goto error;


299 300
    if (virConfGetValueStringList(conf, "sasl_allowed_username_list", false,
                                  &data->sasl_allowed_username_list) < 0)
301 302
        goto error;

303 304
    if (virConfGetValueString(conf, "tls_priority", &data->tls_priority) < 0)
        goto error;
305

306 307 308 309
    if (virConfGetValueUInt(conf, "min_workers", &data->min_workers) < 0)
        goto error;
    if (virConfGetValueUInt(conf, "max_workers", &data->max_workers) < 0)
        goto error;
310 311 312 313 314
    if (data->max_workers < 1) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("'max_workers' must be greater than 0"));
        goto error;
    }
315 316 317 318 319 320
    if (virConfGetValueUInt(conf, "max_clients", &data->max_clients) < 0)
        goto error;
    if (virConfGetValueUInt(conf, "max_queued_clients", &data->max_queued_clients) < 0)
        goto error;
    if (virConfGetValueUInt(conf, "max_anonymous_clients", &data->max_anonymous_clients) < 0)
        goto error;
321

322 323
    if (virConfGetValueUInt(conf, "prio_workers", &data->prio_workers) < 0)
        goto error;
324

325 326
    if (virConfGetValueUInt(conf, "max_client_requests", &data->max_client_requests) < 0)
        goto error;
327

328 329 330 331 332 333 334 335 336 337
    if (virConfGetValueUInt(conf, "admin_min_workers", &data->admin_min_workers) < 0)
        goto error;
    if (virConfGetValueUInt(conf, "admin_max_workers", &data->admin_max_workers) < 0)
        goto error;
    if (virConfGetValueUInt(conf, "admin_max_clients", &data->admin_max_clients) < 0)
        goto error;
    if (virConfGetValueUInt(conf, "admin_max_queued_clients", &data->admin_max_queued_clients) < 0)
        goto error;
    if (virConfGetValueUInt(conf, "admin_max_client_requests", &data->admin_max_client_requests) < 0)
        goto error;
338

339 340 341 342
    if (virConfGetValueUInt(conf, "audit_level", &data->audit_level) < 0)
        goto error;
    if (virConfGetValueBool(conf, "audit_logging", &data->audit_logging) < 0)
        goto error;
343

344 345 346 347
    if (virConfGetValueString(conf, "host_uuid", &data->host_uuid) < 0)
        goto error;
    if (virConfGetValueString(conf, "host_uuid_source", &data->host_uuid_source) < 0)
        goto error;
348

349 350 351 352 353 354
    if (virConfGetValueUInt(conf, "log_level", &data->log_level) < 0)
        goto error;
    if (virConfGetValueString(conf, "log_filters", &data->log_filters) < 0)
        goto error;
    if (virConfGetValueString(conf, "log_outputs", &data->log_outputs) < 0)
        goto error;
355

356 357 358 359
    if (virConfGetValueInt(conf, "keepalive_interval", &data->keepalive_interval) < 0)
        goto error;
    if (virConfGetValueUInt(conf, "keepalive_count", &data->keepalive_count) < 0)
        goto error;
360

361 362 363 364
    if (virConfGetValueInt(conf, "admin_keepalive_interval", &data->admin_keepalive_interval) < 0)
        goto error;
    if (virConfGetValueUInt(conf, "admin_keepalive_count", &data->admin_keepalive_count) < 0)
        goto error;
365

366 367 368
    if (virConfGetValueUInt(conf, "ovs_timeout", &data->ovs_timeout) < 0)
        goto error;

369 370
    return 0;

371
 error:
372 373
    return -1;
}
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407


/* Read the config file if it exists.
 * Only used in the remote case, hence the name.
 */
int
daemonConfigLoadFile(struct daemonConfig *data,
                     const char *filename,
                     bool allow_missing)
{
    virConfPtr conf;
    int ret;

    if (allow_missing &&
        access(filename, R_OK) == -1 &&
        errno == ENOENT)
        return 0;

    conf = virConfReadFile(filename, 0);
    if (!conf)
        return -1;

    ret = daemonConfigLoadOptions(data, filename, conf);
    virConfFree(conf);
    return ret;
}

int daemonConfigLoadData(struct daemonConfig *data,
                         const char *filename,
                         const char *filedata)
{
    virConfPtr conf;
    int ret;

J
Ján Tomko 已提交
408
    conf = virConfReadString(filedata, 0);
409 410 411 412 413 414 415
    if (!conf)
        return -1;

    ret = daemonConfigLoadOptions(data, filename, conf);
    virConfFree(conf);
    return ret;
}