remote_daemon.c 46.8 KB
Newer Older
D
Daniel P. Berrange 已提交
1
/*
2
 * remote_daemon.c: daemon start of day, guest process & i/o management
D
Daniel P. Berrange 已提交
3
 *
4
 * Copyright (C) 2006-2018 Red Hat, Inc.
D
Daniel P. Berrange 已提交
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/>.
D
Daniel P. Berrange 已提交
20 21
 */

22
#include <config.h>
23

D
Daniel P. Berrange 已提交
24 25
#include <unistd.h>
#include <fcntl.h>
26 27
#include <sys/wait.h>
#include <sys/stat.h>
D
Daniel P. Berrange 已提交
28
#include <getopt.h>
29
#include <grp.h>
30

31
#include "libvirt_internal.h"
32
#include "virerror.h"
E
Eric Blake 已提交
33
#include "virfile.h"
34
#include "virlog.h"
35
#include "virpidfile.h"
36
#include "virprocess.h"
37

38 39
#define VIR_FROM_THIS VIR_FROM_QEMU

40 41
#include "remote_daemon.h"
#include "remote_daemon_config.h"
42

43
#include "admin/admin_server_dispatch.h"
44
#include "viruuid.h"
45
#include "remote_driver.h"
46
#include "viralloc.h"
47
#include "virconf.h"
48
#include "virnetlink.h"
49
#include "virnetdaemon.h"
50
#include "remote_daemon_dispatch.h"
51
#include "virhook.h"
52
#include "viraudit.h"
53
#include "virstring.h"
54 55
#include "locking/lock_manager.h"
#include "viraccessmanager.h"
56
#include "virutil.h"
57
#include "virgettext.h"
58
#include "util/virnetdevopenvswitch.h"
D
Daniel P. Berrange 已提交
59

60
#include "driver.h"
61

62 63
#include "configmake.h"

64 65
#include "virdbus.h"

66 67
VIR_LOG_INIT("daemon.libvirtd");

68
#if WITH_SASL
69
virNetSASLContextPtr saslCtxt = NULL;
70
#endif
71 72
virNetServerProgramPtr remoteProgram = NULL;
virNetServerProgramPtr qemuProgram = NULL;
73

74 75
volatile bool driversInitialized = false;

76 77 78 79 80 81 82 83 84
enum {
    VIR_DAEMON_ERR_NONE = 0,
    VIR_DAEMON_ERR_PIDFILE,
    VIR_DAEMON_ERR_RUNDIR,
    VIR_DAEMON_ERR_INIT,
    VIR_DAEMON_ERR_SIGNAL,
    VIR_DAEMON_ERR_PRIVS,
    VIR_DAEMON_ERR_NETWORK,
    VIR_DAEMON_ERR_CONFIG,
85
    VIR_DAEMON_ERR_HOOKS,
86
    VIR_DAEMON_ERR_AUDIT,
87
    VIR_DAEMON_ERR_DRIVER,
88 89 90 91 92 93 94 95 96 97 98 99 100

    VIR_DAEMON_ERR_LAST
};

VIR_ENUM_DECL(virDaemonErr)
VIR_ENUM_IMPL(virDaemonErr, VIR_DAEMON_ERR_LAST,
              "Initialization successful",
              "Unable to obtain pidfile",
              "Unable to create rundir",
              "Unable to initialize libvirt",
              "Unable to setup signal handlers",
              "Unable to drop privileges",
              "Unable to initialize network sockets",
101
              "Unable to load configuration file",
102
              "Unable to look for hook scripts",
103 104
              "Unable to initialize audit system",
              "Unable to initialize driver")
105

106
static int daemonForkIntoBackground(const char *argv0)
107
{
108 109 110 111
    int statuspipe[2];
    if (pipe(statuspipe) < 0)
        return -1;

112
    pid_t pid = fork();
D
Daniel P. Berrange 已提交
113 114 115
    switch (pid) {
    case 0:
        {
E
Eric Blake 已提交
116
            /* intermediate child */
D
Daniel P. Berrange 已提交
117 118
            int stdinfd = -1;
            int stdoutfd = -1;
119
            int nextpid;
D
Daniel P. Berrange 已提交
120

121
            VIR_FORCE_CLOSE(statuspipe[0]);
122

123
            if ((stdinfd = open("/dev/null", O_RDONLY)) <= STDERR_FILENO)
D
Daniel P. Berrange 已提交
124
                goto cleanup;
125
            if ((stdoutfd = open("/dev/null", O_WRONLY)) <= STDERR_FILENO)
D
Daniel P. Berrange 已提交
126 127 128 129 130 131 132
                goto cleanup;
            if (dup2(stdinfd, STDIN_FILENO) != STDIN_FILENO)
                goto cleanup;
            if (dup2(stdoutfd, STDOUT_FILENO) != STDOUT_FILENO)
                goto cleanup;
            if (dup2(stdoutfd, STDERR_FILENO) != STDERR_FILENO)
                goto cleanup;
133
            if (VIR_CLOSE(stdinfd) < 0)
D
Daniel P. Berrange 已提交
134
                goto cleanup;
135
            if (VIR_CLOSE(stdoutfd) < 0)
D
Daniel P. Berrange 已提交
136 137 138 139 140 141 142
                goto cleanup;

            if (setsid() < 0)
                goto cleanup;

            nextpid = fork();
            switch (nextpid) {
E
Eric Blake 已提交
143
            case 0: /* grandchild */
144
                return statuspipe[1];
E
Eric Blake 已提交
145 146 147 148
            case -1: /* error */
                goto cleanup;
            default: /* intermediate child succeeded */
                _exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
149 150 151
            }

        cleanup:
152 153
            VIR_FORCE_CLOSE(stdoutfd);
            VIR_FORCE_CLOSE(stdinfd);
E
Eric Blake 已提交
154 155
            VIR_FORCE_CLOSE(statuspipe[1]);
            _exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
156 157 158

        }

E
Eric Blake 已提交
159 160
    case -1: /* error in parent */
        goto error;
D
Daniel P. Berrange 已提交
161 162 163

    default:
        {
E
Eric Blake 已提交
164
            /* parent */
165 166 167
            int ret;
            char status;

168
            VIR_FORCE_CLOSE(statuspipe[1]);
169 170

            /* We wait to make sure the first child forked successfully */
171
            if (virProcessWait(pid, NULL, false) < 0)
E
Eric Blake 已提交
172
                goto error;
173

E
Eric Blake 已提交
174 175 176
            /* If we get here, then the grandchild was spawned, so we
             * must exit.  Block until the second child initializes
             * successfully */
177 178 179 180 181
        again:
            ret = read(statuspipe[0], &status, 1);
            if (ret == -1 && errno == EINTR)
                goto again;

E
Eric Blake 已提交
182 183 184 185 186
            VIR_FORCE_CLOSE(statuspipe[0]);

            if (ret != 1) {
                char ebuf[1024];

187
                fprintf(stderr,
E
Eric Blake 已提交
188 189 190 191 192 193 194 195
                        _("%s: error: unable to determine if daemon is "
                          "running: %s\n"), argv0,
                        virStrerror(errno, ebuf, sizeof(ebuf)));
                exit(EXIT_FAILURE);
            } else if (status != 0) {
                fprintf(stderr,
                        _("%s: error: %s. Check /var/log/messages or run "
                          "without --daemon for more info.\n"), argv0,
196
                        virDaemonErrTypeToString(status));
E
Eric Blake 已提交
197
                exit(EXIT_FAILURE);
198
            }
E
Eric Blake 已提交
199
            _exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
200 201
        }
    }
E
Eric Blake 已提交
202

203
 error:
E
Eric Blake 已提交
204 205 206
    VIR_FORCE_CLOSE(statuspipe[0]);
    VIR_FORCE_CLOSE(statuspipe[1]);
    return -1;
D
Daniel P. Berrange 已提交
207 208
}

209

210 211 212 213
static int
daemonUnixSocketPaths(struct daemonConfig *config,
                      bool privileged,
                      char **sockfile,
214 215
                      char **rosockfile,
                      char **admsockfile)
J
John Levon 已提交
216
{
217 218 219
    int ret = -1;
    char *rundir = NULL;

220 221
    if (config->unix_sock_dir) {
        if (virAsprintf(sockfile, "%s/libvirt-sock", config->unix_sock_dir) < 0)
222
            goto cleanup;
223 224

        if (privileged) {
225 226 227
            if (virAsprintf(rosockfile, "%s/libvirt-sock-ro", config->unix_sock_dir) < 0 ||
                virAsprintf(admsockfile, "%s/libvirt-admin-sock", config->unix_sock_dir) < 0)
                goto cleanup;
228
        }
D
Daniel P. Berrange 已提交
229
    } else {
230
        if (privileged) {
231
            if (VIR_STRDUP(*sockfile, LOCALSTATEDIR "/run/libvirt/libvirt-sock") < 0 ||
232 233
                VIR_STRDUP(*rosockfile, LOCALSTATEDIR "/run/libvirt/libvirt-sock-ro") < 0 ||
                VIR_STRDUP(*admsockfile, LOCALSTATEDIR "/run/libvirt/libvirt-admin-sock") < 0)
234
                goto cleanup;
235
        } else {
236
            mode_t old_umask;
237

238
            if (!(rundir = virGetUserRuntimeDirectory()))
239
                goto cleanup;
240

241 242 243
            old_umask = umask(077);
            if (virFileMakePath(rundir) < 0) {
                umask(old_umask);
244
                goto cleanup;
245 246 247
            }
            umask(old_umask);

248
            if (virAsprintf(sockfile, "%s/libvirt-sock", rundir) < 0 ||
249 250
                virAsprintf(admsockfile, "%s/libvirt-admin-sock", rundir) < 0)
                goto cleanup;
251 252
        }
    }
253

254 255 256 257
    ret = 0;
 cleanup:
    VIR_FREE(rundir);
    return ret;
D
Daniel P. Berrange 已提交
258 259
}

260 261 262

static void daemonErrorHandler(void *opaque ATTRIBUTE_UNUSED,
                               virErrorPtr err ATTRIBUTE_UNUSED)
263 264 265 266 267
{
    /* Don't do anything, since logging infrastructure already
     * took care of reporting the error */
}

268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
static int daemonErrorLogFilter(virErrorPtr err, int priority)
{
    /* These error codes don't really reflect real errors. They
     * are expected events that occur when an app tries to check
     * whether a particular guest already exists. This filters
     * them to a lower log level to prevent pollution of syslog
     */
    switch (err->code) {
    case VIR_ERR_NO_DOMAIN:
    case VIR_ERR_NO_NETWORK:
    case VIR_ERR_NO_STORAGE_POOL:
    case VIR_ERR_NO_STORAGE_VOL:
    case VIR_ERR_NO_NODE_DEVICE:
    case VIR_ERR_NO_INTERFACE:
    case VIR_ERR_NO_NWFILTER:
283
    case VIR_ERR_NO_NWFILTER_BINDING:
284 285
    case VIR_ERR_NO_SECRET:
    case VIR_ERR_NO_DOMAIN_SNAPSHOT:
286
    case VIR_ERR_OPERATION_INVALID:
287
    case VIR_ERR_NO_DOMAIN_METADATA:
288 289
    case VIR_ERR_NO_SERVER:
    case VIR_ERR_NO_CLIENT:
290 291 292 293 294 295
        return VIR_LOG_DEBUG;
    }

    return priority;
}

296

297
static int daemonInitialize(void)
298
{
299 300
    /*
     * Note that the order is important: the first ones have a higher
301 302 303
     * priority when calling virStateInitialize. We must register the
     * network, storage and nodedev drivers before any stateful domain
     * driver, since their resources must be auto-started before any
304
     * domains can be auto-started.
305
     */
306
#ifdef WITH_NETWORK
307 308
    if (virDriverLoadModule("network", "networkRegister", false) < 0)
        return -1;
309 310
#endif
#ifdef WITH_INTERFACE
311 312
    if (virDriverLoadModule("interface", "interfaceRegister", false) < 0)
        return -1;
313 314
#endif
#ifdef WITH_STORAGE
315 316
    if (virDriverLoadModule("storage", "storageRegister", false) < 0)
        return -1;
317 318
#endif
#ifdef WITH_NODE_DEVICES
319 320
    if (virDriverLoadModule("nodedev", "nodedevRegister", false) < 0)
        return -1;
321 322
#endif
#ifdef WITH_SECRETS
323 324
    if (virDriverLoadModule("secret", "secretRegister", false) < 0)
        return -1;
325 326
#endif
#ifdef WITH_NWFILTER
327 328
    if (virDriverLoadModule("nwfilter", "nwfilterRegister", false) < 0)
        return -1;
329 330
#endif
#ifdef WITH_LIBXL
331 332
    if (virDriverLoadModule("libxl", "libxlRegister", false) < 0)
        return -1;
333 334
#endif
#ifdef WITH_QEMU
335 336
    if (virDriverLoadModule("qemu", "qemuRegister", false) < 0)
        return -1;
337 338
#endif
#ifdef WITH_LXC
339 340
    if (virDriverLoadModule("lxc", "lxcRegister", false) < 0)
        return -1;
341 342
#endif
#ifdef WITH_VBOX
343 344
    if (virDriverLoadModule("vbox", "vboxRegister", false) < 0)
        return -1;
345 346
#endif
#ifdef WITH_BHYVE
347 348
    if (virDriverLoadModule("bhyve", "bhyveRegister", false) < 0)
        return -1;
349 350
#endif
#ifdef WITH_VZ
351 352
    if (virDriverLoadModule("vz", "vzRegister", false) < 0)
        return -1;
353
#endif
354
    return 0;
355 356 357
}


358 359
static int ATTRIBUTE_NONNULL(3)
daemonSetupNetworking(virNetServerPtr srv,
360
                      virNetServerPtr srvAdm,
361 362 363
                      struct daemonConfig *config,
                      const char *sock_path,
                      const char *sock_path_ro,
364
                      const char *sock_path_adm,
365 366
                      bool ipsock,
                      bool privileged)
367 368
{
    virNetServerServicePtr svc = NULL;
369
    virNetServerServicePtr svcAdm = NULL;
370 371 372 373 374 375
    virNetServerServicePtr svcRO = NULL;
    virNetServerServicePtr svcTCP = NULL;
    virNetServerServicePtr svcTLS = NULL;
    gid_t unix_sock_gid = 0;
    int unix_sock_ro_mask = 0;
    int unix_sock_rw_mask = 0;
376
    int unix_sock_adm_mask = 0;
377
    int ret = -1;
378

379 380 381
    unsigned int cur_fd = STDERR_FILENO + 1;
    unsigned int nfds = virGetListenFDs();

382 383
    if (config->unix_sock_group) {
        if (virGetGroupID(config->unix_sock_group, &unix_sock_gid) < 0)
384
            return ret;
385
    }
386

387
    if (nfds > (sock_path_ro ? 2 : 1)) {
388
        VIR_ERROR(_("Too many (%u) FDs passed from caller"), nfds);
389
        return ret;
390 391
    }

392 393
    if (virStrToLong_i(config->unix_sock_ro_perms, NULL, 8, &unix_sock_ro_mask) != 0) {
        VIR_ERROR(_("Failed to parse mode '%s'"), config->unix_sock_ro_perms);
394
        goto cleanup;
395
    }
396

397 398
    if (virStrToLong_i(config->unix_sock_admin_perms, NULL, 8, &unix_sock_adm_mask) != 0) {
        VIR_ERROR(_("Failed to parse mode '%s'"), config->unix_sock_admin_perms);
399
        goto cleanup;
400 401
    }

402 403
    if (virStrToLong_i(config->unix_sock_rw_perms, NULL, 8, &unix_sock_rw_mask) != 0) {
        VIR_ERROR(_("Failed to parse mode '%s'"), config->unix_sock_rw_perms);
404
        goto cleanup;
405
    }
406

407 408 409 410 411 412 413 414 415
    if (!(svc = virNetServerServiceNewFDOrUNIX(sock_path,
                                               unix_sock_rw_mask,
                                               unix_sock_gid,
                                               config->auth_unix_rw,
                                               NULL,
                                               false,
                                               config->max_queued_clients,
                                               config->max_client_requests,
                                               nfds, &cur_fd)))
416
        goto cleanup;
417
    if (sock_path_ro) {
418 419 420 421 422 423 424 425 426
        if (!(svcRO = virNetServerServiceNewFDOrUNIX(sock_path_ro,
                                                     unix_sock_ro_mask,
                                                     unix_sock_gid,
                                                     config->auth_unix_ro,
                                                     NULL,
                                                     true,
                                                     config->max_queued_clients,
                                                     config->max_client_requests,
                                                     nfds, &cur_fd)))
427
            goto cleanup;
428
    }
429

430 431 432 433
    if (virNetServerAddService(srv, svc,
                               config->mdns_adv && !ipsock ?
                               "_libvirt._tcp" :
                               NULL) < 0)
434
        goto cleanup;
435

436 437
    if (svcRO &&
        virNetServerAddService(srv, svcRO, NULL) < 0)
438
        goto cleanup;
439

440
    if (sock_path_adm) {
441 442 443 444 445 446
        VIR_DEBUG("Registering unix socket %s", sock_path_adm);
        if (!(svcAdm = virNetServerServiceNewUNIX(sock_path_adm,
                                                  unix_sock_adm_mask,
                                                  unix_sock_gid,
                                                  REMOTE_AUTH_NONE,
                                                  NULL,
447
                                                  false,
448 449
                                                  config->admin_max_queued_clients,
                                                  config->admin_max_client_requests)))
450
            goto cleanup;
451

452
        if (virNetServerAddService(srvAdm, svcAdm, NULL) < 0)
453
            goto cleanup;
454
    }
455

456
    if (ipsock) {
457
        if (config->listen_tcp) {
458 459
            VIR_DEBUG("Registering TCP socket %s:%s",
                      config->listen_addr, config->tcp_port);
460 461
            if (!(svcTCP = virNetServerServiceNewTCP(config->listen_addr,
                                                     config->tcp_port,
462
                                                     AF_UNSPEC,
463
                                                     config->auth_tcp,
464
                                                     NULL,
465
                                                     false,
M
Michal Privoznik 已提交
466
                                                     config->max_queued_clients,
467
                                                     config->max_client_requests)))
468
                goto cleanup;
469

470 471
            if (virNetServerAddService(srv, svcTCP,
                                       config->mdns_adv ? "_libvirt._tcp" : NULL) < 0)
472
                goto cleanup;
473 474
        }

475 476
        if (config->listen_tls) {
            virNetTLSContextPtr ctxt = NULL;
477

478 479 480
            if (config->ca_file ||
                config->cert_file ||
                config->key_file) {
481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497
                if (!config->ca_file) {
                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                                   _("No CA certificate path set to match server key/cert"));
                    goto cleanup;
                }
                if (!config->cert_file) {
                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                                   _("No server certificate path set to match server key"));
                    goto cleanup;
                }
                if (!config->key_file) {
                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                                   _("No server key path set to match server cert"));
                    goto cleanup;
                }
                VIR_DEBUG("Using CA='%s' cert='%s' key='%s'",
                          config->ca_file, config->cert_file, config->key_file);
498 499 500 501 502
                if (!(ctxt = virNetTLSContextNewServer(config->ca_file,
                                                       config->crl_file,
                                                       config->cert_file,
                                                       config->key_file,
                                                       (const char *const*)config->tls_allowed_dn_list,
503
                                                       config->tls_priority,
504
                                                       config->tls_no_sanity_certificate ? false : true,
505
                                                       config->tls_no_verify_certificate ? false : true)))
506
                    goto cleanup;
507 508 509 510
            } else {
                if (!(ctxt = virNetTLSContextNewServerPath(NULL,
                                                           !privileged,
                                                           (const char *const*)config->tls_allowed_dn_list,
511
                                                           config->tls_priority,
512
                                                           config->tls_no_sanity_certificate ? false : true,
513
                                                           config->tls_no_verify_certificate ? false : true)))
514
                    goto cleanup;
515 516
            }

517 518
            VIR_DEBUG("Registering TLS socket %s:%s",
                      config->listen_addr, config->tls_port);
519 520 521
            if (!(svcTLS =
                  virNetServerServiceNewTCP(config->listen_addr,
                                            config->tls_port,
522
                                            AF_UNSPEC,
523
                                            config->auth_tls,
524
                                            ctxt,
525
                                            false,
M
Michal Privoznik 已提交
526
                                            config->max_queued_clients,
527
                                            config->max_client_requests))) {
528
                virObjectUnref(ctxt);
529
                goto cleanup;
530
            }
531 532 533
            if (virNetServerAddService(srv, svcTLS,
                                       config->mdns_adv &&
                                       !config->listen_tcp ? "_libvirt._tcp" : NULL) < 0)
534
                goto cleanup;
535

536
            virObjectUnref(ctxt);
537 538 539
        }
    }

540
#if WITH_SASL
541
    if (config->auth_unix_rw == REMOTE_AUTH_SASL ||
542 543 544
        (sock_path_ro && config->auth_unix_ro == REMOTE_AUTH_SASL) ||
        (ipsock && config->listen_tls && config->auth_tls == REMOTE_AUTH_SASL) ||
        (ipsock && config->listen_tcp && config->auth_tcp == REMOTE_AUTH_SASL)) {
545 546 547
        saslCtxt = virNetSASLContextNewServer(
            (const char *const*)config->sasl_allowed_username_list);
        if (!saslCtxt)
548
            goto cleanup;
D
Daniel P. Berrange 已提交
549
    }
550
#endif
D
Daniel P. Berrange 已提交
551

552
    ret = 0;
553

554
 cleanup:
555 556 557
    virObjectUnref(svcTLS);
    virObjectUnref(svcTCP);
    virObjectUnref(svcRO);
558
    virObjectUnref(svcAdm);
559 560
    virObjectUnref(svc);
    return ret;
D
Daniel P. Berrange 已提交
561 562 563
}


564 565 566 567 568 569 570 571 572 573
/*
 * Set up the openvswitch timeout
 */
static void
daemonSetupNetDevOpenvswitch(struct daemonConfig *config)
{
    virNetDevOpenvswitchSetTimeout(config->ovs_timeout);
}


574 575
/*
 * Set up the logging environment
576 577
 * By default if daemonized all errors go to the logfile libvirtd.log,
 * but if verbose or error debugging is asked for then also output
578
 * informational and debug messages. Default size if 64 kB.
579
 */
580
static int
581 582 583 584
daemonSetupLogging(struct daemonConfig *config,
                   bool privileged,
                   bool verbose,
                   bool godaemon)
585
{
586 587
    virLogReset();

588
    /*
589 590 591
     * Libvirtd's order of precedence is:
     * cmdline > environment > config
     *
592
     * Given the precedence, we must process the variables in the opposite
593
     * order, each one overriding the previous.
594
     */
595 596
    if (config->log_level != 0)
        virLogSetDefaultPriority(config->log_level);
597

598 599 600
    /* In case the config is empty, both filters and outputs will become empty,
     * however we can't start with empty outputs, thus we'll need to define and
     * setup a default one.
601 602 603
     */
    ignore_value(virLogSetFilters(config->log_filters));
    ignore_value(virLogSetOutputs(config->log_outputs));
604

605 606
    /* If there are some environment variables defined, use those instead */
    virLogSetFromEnv();
607

608 609 610 611 612 613
    /*
     * Command line override for --verbose
     */
    if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
        virLogSetDefaultPriority(VIR_LOG_INFO);

614 615 616 617 618 619 620 621 622
    /* Define the default output. This is only applied if there was no setting
     * from either the config or the environment.
     */
    if (virLogSetDefaultOutput("libvirtd.log", godaemon, privileged) < 0)
        return -1;

    if (virLogGetNbOutputs() == 0)
        virLogSetOutputs(virLogGetDefaultOutput());

623 624 625
    return 0;
}

626

627 628 629 630 631
static int
daemonSetupAccessManager(struct daemonConfig *config)
{
    virAccessManagerPtr mgr;
    const char *none[] = { "none", NULL };
J
Ján Tomko 已提交
632
    const char **drv = (const char **)config->access_drivers;
633

J
Ján Tomko 已提交
634 635 636
    if (!drv ||
        !drv[0])
        drv = none;
637

J
Ján Tomko 已提交
638
    if (!(mgr = virAccessManagerNewStack(drv)))
639 640 641 642 643 644 645 646
        return -1;

    virAccessManagerSetDefault(mgr);
    virObjectUnref(mgr);
    return 0;
}


647 648
/* Display version information. */
static void
649
daemonVersion(const char *argv0)
650
{
651
    printf("%s (%s) %s\n", argv0, PACKAGE_NAME, PACKAGE_VERSION);
652 653
}

654

655
static void daemonShutdownHandler(virNetDaemonPtr dmn,
656 657
                                  siginfo_t *sig ATTRIBUTE_UNUSED,
                                  void *opaque ATTRIBUTE_UNUSED)
658
{
659
    virNetDaemonQuit(dmn);
660
}
661

662 663 664 665 666 667 668 669 670
static void daemonReloadHandlerThread(void *opague ATTRIBUTE_UNUSED)
{
    VIR_INFO("Reloading configuration on SIGHUP");
    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-",
                VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL, NULL);
    if (virStateReload() < 0)
        VIR_WARN("Error while reloading drivers");
}

671
static void daemonReloadHandler(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
672 673 674
                                siginfo_t *sig ATTRIBUTE_UNUSED,
                                void *opaque ATTRIBUTE_UNUSED)
{
675 676
    virThread thr;

677 678 679 680 681
    if (!driversInitialized) {
        VIR_WARN("Drivers are not initialized, reload ignored");
        return;
    }

682 683 684 685 686 687
    if (virThreadCreate(&thr, false, daemonReloadHandlerThread, NULL) < 0) {
        /*
         * Not much we can do on error here except log it.
         */
        VIR_ERROR(_("Failed to create thread to handle daemon restart"));
    }
688 689
}

690
static int daemonSetupSignals(virNetDaemonPtr dmn)
691
{
692
    if (virNetDaemonAddSignalHandler(dmn, SIGINT, daemonShutdownHandler, NULL) < 0)
693
        return -1;
694
    if (virNetDaemonAddSignalHandler(dmn, SIGQUIT, daemonShutdownHandler, NULL) < 0)
695
        return -1;
696
    if (virNetDaemonAddSignalHandler(dmn, SIGTERM, daemonShutdownHandler, NULL) < 0)
697
        return -1;
698
    if (virNetDaemonAddSignalHandler(dmn, SIGHUP, daemonReloadHandler, NULL) < 0)
699
        return -1;
700 701
    return 0;
}
702

703 704 705

static void daemonInhibitCallback(bool inhibit, void *opaque)
{
706
    virNetDaemonPtr dmn = opaque;
707 708

    if (inhibit)
709
        virNetDaemonAddShutdownInhibition(dmn);
710
    else
711
        virNetDaemonRemoveShutdownInhibition(dmn);
712 713 714
}


715
#ifdef WITH_DBUS
716 717 718 719 720
static DBusConnection *sessionBus;
static DBusConnection *systemBus;

static void daemonStopWorker(void *opaque)
{
721
    virNetDaemonPtr dmn = opaque;
722

723
    VIR_DEBUG("Begin stop dmn=%p", dmn);
724 725 726

    ignore_value(virStateStop());

727
    VIR_DEBUG("Completed stop dmn=%p", dmn);
728 729

    /* Exit libvirtd cleanly */
730
    virNetDaemonQuit(dmn);
731 732 733 734
}


/* We do this in a thread to not block the main loop */
735
static void daemonStop(virNetDaemonPtr dmn)
736 737
{
    virThread thr;
738 739 740
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonStopWorker, dmn) < 0)
        virObjectUnref(dmn);
741 742 743 744 745 746 747 748
}


static DBusHandlerResult
handleSessionMessageFunc(DBusConnection *connection ATTRIBUTE_UNUSED,
                         DBusMessage *message,
                         void *opaque)
{
749
    virNetDaemonPtr dmn = opaque;
750

751
    VIR_DEBUG("dmn=%p", dmn);
752 753 754 755

    if (dbus_message_is_signal(message,
                               DBUS_INTERFACE_LOCAL,
                               "Disconnected"))
756
        daemonStop(dmn);
757 758 759 760 761 762 763 764 765 766

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}


static DBusHandlerResult
handleSystemMessageFunc(DBusConnection *connection ATTRIBUTE_UNUSED,
                        DBusMessage *message,
                        void *opaque)
{
767
    virNetDaemonPtr dmn = opaque;
768

769
    VIR_DEBUG("dmn=%p", dmn);
770 771 772 773

    if (dbus_message_is_signal(message,
                               "org.freedesktop.login1.Manager",
                               "PrepareForShutdown"))
774
        daemonStop(dmn);
775 776 777 778 779 780

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
#endif


781 782
static void daemonRunStateInit(void *opaque)
{
783
    virNetDaemonPtr dmn = opaque;
784 785 786
    virIdentityPtr sysident = virIdentityGetSystem();

    virIdentitySetCurrent(sysident);
787

788 789
    /* Since driver initialization can take time inhibit daemon shutdown until
       we're done so clients get a chance to connect */
790
    daemonInhibitCallback(true, dmn);
791

792
    /* Start the stateful HV drivers
E
Eric Blake 已提交
793
     * This is deliberately done after telling the parent process
794 795
     * we're ready, since it can take a long time and this will
     * seriously delay OS bootup process */
796
    if (virStateInitialize(virNetDaemonIsPrivileged(dmn),
797
                           daemonInhibitCallback,
798
                           dmn) < 0) {
799
        VIR_ERROR(_("Driver state initialization failed"));
800 801
        /* Ensure the main event loop quits */
        kill(getpid(), SIGTERM);
802
        goto cleanup;
803 804
    }

805 806
    driversInitialized = true;

807
#ifdef WITH_DBUS
808
    /* Tie the non-privileged libvirtd to the session/shutdown lifecycle */
809
    if (!virNetDaemonIsPrivileged(dmn)) {
810 811 812 813

        sessionBus = virDBusGetSessionBus();
        if (sessionBus != NULL)
            dbus_connection_add_filter(sessionBus,
814
                                       handleSessionMessageFunc, dmn, NULL);
815 816 817 818

        systemBus = virDBusGetSystemBus();
        if (systemBus != NULL) {
            dbus_connection_add_filter(systemBus,
819
                                       handleSystemMessageFunc, dmn, NULL);
820 821 822 823 824 825
            dbus_bus_add_match(systemBus,
                               "type='signal',sender='org.freedesktop.login1', interface='org.freedesktop.login1.Manager'",
                               NULL);
        }
    }
#endif
826
    /* Only now accept clients from network */
827
    virNetDaemonUpdateServices(dmn, true);
828
 cleanup:
829 830
    daemonInhibitCallback(false, dmn);
    virObjectUnref(dmn);
831 832
    virObjectUnref(sysident);
    virIdentitySetCurrent(NULL);
833
}
834

835
static int daemonStateInit(virNetDaemonPtr dmn)
836 837
{
    virThread thr;
838 839 840
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonRunStateInit, dmn) < 0) {
        virObjectUnref(dmn);
841 842
        return -1;
    }
843 844 845
    return 0;
}

846 847 848 849 850 851 852 853 854 855 856
static int migrateProfile(void)
{
    char *old_base = NULL;
    char *updated = NULL;
    char *home = NULL;
    char *xdg_dir = NULL;
    char *config_dir = NULL;
    const char *config_home;
    int ret = -1;
    mode_t old_umask;

857 858
    VIR_DEBUG("Checking if user profile needs migrating");

859
    if (!(home = virGetUserDirectory()))
860 861
        goto cleanup;

862
    if (virAsprintf(&old_base, "%s/.libvirt", home) < 0)
863 864 865
        goto cleanup;

    /* if the new directory is there or the old one is not: do nothing */
866
    if (!(config_dir = virGetUserConfigDirectory()))
867 868 869
        goto cleanup;

    if (!virFileIsDir(old_base) || virFileExists(config_dir)) {
870 871 872
        VIR_DEBUG("No old profile in '%s' / "
                  "new profile directory already present '%s'",
                  old_base, config_dir);
873 874 875 876 877
        ret = 0;
        goto cleanup;
    }

    /* test if we already attempted to migrate first */
878
    if (virAsprintf(&updated, "%s/DEPRECATED-DIRECTORY", old_base) < 0)
879
        goto cleanup;
880
    if (virFileExists(updated))
881 882
        goto cleanup;

883
    config_home = virGetEnvBlockSUID("XDG_CONFIG_HOME");
884
    if (config_home && config_home[0] != '\0') {
885 886
        if (VIR_STRDUP(xdg_dir, config_home) < 0)
            goto cleanup;
887
    } else {
888
        if (virAsprintf(&xdg_dir, "%s/.config", home) < 0)
889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905
            goto cleanup;
    }

    old_umask = umask(077);
    if (virFileMakePath(xdg_dir) < 0) {
        umask(old_umask);
        goto cleanup;
    }
    umask(old_umask);

    if (rename(old_base, config_dir) < 0) {
        int fd = creat(updated, 0600);
        VIR_FORCE_CLOSE(fd);
        VIR_ERROR(_("Unable to migrate %s to %s"), old_base, config_dir);
        goto cleanup;
    }

906
    VIR_DEBUG("Profile migrated from %s to %s", old_base, config_dir);
907 908 909 910 911 912 913 914 915 916 917 918
    ret = 0;

 cleanup:
    VIR_FREE(home);
    VIR_FREE(old_base);
    VIR_FREE(xdg_dir);
    VIR_FREE(config_dir);
    VIR_FREE(updated);

    return ret;
}

919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951
static int
daemonSetupHostUUID(const struct daemonConfig *config)
{
    static const char *machine_id = "/etc/machine-id";
    char buf[VIR_UUID_STRING_BUFLEN];
    const char *uuid;

    if (config->host_uuid) {
        uuid = config->host_uuid;
    } else if (!config->host_uuid_source ||
               STREQ(config->host_uuid_source, "smbios")) {
        /* smbios UUID is fetched on demand in virGetHostUUID */
        return 0;
    } else if (STREQ(config->host_uuid_source, "machine-id")) {
        if (virFileReadBufQuiet(machine_id, buf, sizeof(buf)) < 0) {
            VIR_ERROR(_("Can't read %s"), machine_id);
            return -1;
        }

        uuid = buf;
    } else {
        VIR_ERROR(_("invalid UUID source: %s"), config->host_uuid_source);
        return -1;
    }

    if (virSetHostUUIDStr(uuid)) {
        VIR_ERROR(_("invalid host UUID: %s"), uuid);
        return -1;
    }

    return 0;
}

952 953
/* Print command-line usage. */
static void
954
daemonUsage(const char *argv0, bool privileged)
955
{
956 957 958 959 960 961
    fprintf(stderr,
            _("\n"
              "Usage:\n"
              "  %s [options]\n"
              "\n"
              "Options:\n"
962
              "  -h | --help            Display program help:\n"
963 964 965 966 967
              "  -v | --verbose         Verbose messages.\n"
              "  -d | --daemon          Run as a daemon & write PID file.\n"
              "  -l | --listen          Listen for TCP/IP connections.\n"
              "  -t | --timeout <secs>  Exit after timeout period.\n"
              "  -f | --config <file>   Configuration file.\n"
968
              "  -V | --version         Display version information.\n"
969 970 971 972
              "  -p | --pid-file <file> Change name of PID file.\n"
              "\n"
              "libvirt management daemon:\n"),
            argv0);
973 974 975

    if (privileged) {
        fprintf(stderr,
976 977 978 979
                _("\n"
                  "  Default paths:\n"
                  "\n"
                  "    Configuration file (unless overridden by -f):\n"
980
                  "      %s\n"
981 982
                  "\n"
                  "    Sockets:\n"
983 984
                  "      %s\n"
                  "      %s\n"
985 986
                  "\n"
                  "    TLS:\n"
987 988 989
                  "      CA certificate:     %s\n"
                  "      Server certificate: %s\n"
                  "      Server private key: %s\n"
990 991 992 993
                  "\n"
                  "    PID file (unless overridden by -p):\n"
                  "      %s/run/libvirtd.pid\n"
                  "\n"),
994 995 996
                LIBVIRTD_CONFIGURATION_FILE,
                LIBVIRTD_PRIV_UNIX_SOCKET,
                LIBVIRTD_PRIV_UNIX_SOCKET_RO,
997 998 999
                LIBVIRT_CACERT,
                LIBVIRT_SERVERCERT,
                LIBVIRT_SERVERKEY,
1000 1001
                LOCALSTATEDIR);
    } else {
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
        fprintf(stderr, "%s",
                _("\n"
                  "  Default paths:\n"
                  "\n"
                  "    Configuration file (unless overridden by -f):\n"
                  "      $XDG_CONFIG_HOME/libvirt/libvirtd.conf\n"
                  "\n"
                  "    Sockets:\n"
                  "      $XDG_RUNTIME_DIR/libvirt/libvirt-sock\n"
                  "\n"
                  "    TLS:\n"
                  "      CA certificate:     $HOME/.pki/libvirt/cacert.pem\n"
                  "      Server certificate: $HOME/.pki/libvirt/servercert.pem\n"
                  "      Server private key: $HOME/.pki/libvirt/serverkey.pem\n"
                  "\n"
                  "    PID file:\n"
                  "      $XDG_RUNTIME_DIR/libvirt/libvirtd.pid\n"
                  "\n"));
1020
    }
1021 1022
}

D
Daniel P. Berrange 已提交
1023
int main(int argc, char **argv) {
1024
    virNetDaemonPtr dmn = NULL;
1025
    virNetServerPtr srv = NULL;
1026
    virNetServerPtr srvAdm = NULL;
1027 1028
    virNetServerProgramPtr adminProgram = NULL;
    virNetServerProgramPtr lxcProgram = NULL;
1029
    char *remote_config_file = NULL;
1030
    int statuswrite = -1;
1031
    int ret = 1;
1032
    int pid_file_fd = -1;
1033 1034 1035
    char *pid_file = NULL;
    char *sock_file = NULL;
    char *sock_file_ro = NULL;
1036
    char *sock_file_adm = NULL;
1037 1038 1039 1040 1041 1042
    int timeout = -1;        /* -t: Shutdown timeout */
    int verbose = 0;
    int godaemon = 0;
    int ipsock = 0;
    struct daemonConfig *config;
    bool privileged = geteuid() == 0 ? true : false;
1043
    bool implicit_conf = false;
1044 1045
    char *run_dir = NULL;
    mode_t old_umask;
D
Daniel P. Berrange 已提交
1046 1047

    struct option opts[] = {
1048 1049 1050
        { "verbose", no_argument, &verbose, 'v'},
        { "daemon", no_argument, &godaemon, 'd'},
        { "listen", no_argument, &ipsock, 'l'},
1051
        { "config", required_argument, NULL, 'f'},
1052 1053
        { "timeout", required_argument, NULL, 't'},
        { "pid-file", required_argument, NULL, 'p'},
1054 1055
        { "version", no_argument, NULL, 'V' },
        { "help", no_argument, NULL, 'h' },
D
Daniel P. Berrange 已提交
1056 1057 1058
        {0, 0, 0, 0}
    };

1059
    if (virGettextInitialize() < 0 ||
E
Eric Blake 已提交
1060
        virInitialize() < 0) {
1061
        fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
E
Eric Blake 已提交
1062
        exit(EXIT_FAILURE);
1063
    }
D
Daniel P. Berrange 已提交
1064

1065 1066
    virUpdateSelfLastChanged(argv[0]);

1067 1068
    virFileActivateDirOverride(argv[0]);

D
Daniel P. Berrange 已提交
1069 1070 1071 1072 1073
    while (1) {
        int optidx = 0;
        int c;
        char *tmp;

1074
        c = getopt_long(argc, argv, "ldf:p:t:vVh", opts, &optidx);
D
Daniel P. Berrange 已提交
1075

1076
        if (c == -1)
D
Daniel P. Berrange 已提交
1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
            break;

        switch (c) {
        case 0:
            /* Got one of the flags */
            break;
        case 'v':
            verbose = 1;
            break;
        case 'd':
            godaemon = 1;
            break;
1089 1090
        case 'l':
            ipsock = 1;
D
Daniel P. Berrange 已提交
1091 1092 1093
            break;

        case 't':
1094
            if (virStrToLong_i(optarg, &tmp, 10, &timeout) != 0
1095 1096
                || timeout <= 0
                /* Ensure that we can multiply by 1000 without overflowing.  */
1097 1098 1099 1100
                || timeout > INT_MAX / 1000) {
                VIR_ERROR(_("Invalid value for timeout"));
                exit(EXIT_FAILURE);
            }
D
Daniel P. Berrange 已提交
1101
            break;
1102 1103

        case 'p':
1104
            VIR_FREE(pid_file);
1105
            if (VIR_STRDUP_QUIET(pid_file, optarg) < 0) {
1106
                VIR_ERROR(_("Can't allocate memory"));
1107
                exit(EXIT_FAILURE);
1108
            }
1109 1110 1111
            break;

        case 'f':
1112
            VIR_FREE(remote_config_file);
1113
            if (VIR_STRDUP_QUIET(remote_config_file, optarg) < 0) {
1114
                VIR_ERROR(_("Can't allocate memory"));
1115
                exit(EXIT_FAILURE);
1116
            }
1117 1118
            break;

1119
        case 'V':
1120
            daemonVersion(argv[0]);
1121
            exit(EXIT_SUCCESS);
1122

1123
        case 'h':
1124
            daemonUsage(argv[0], privileged);
1125
            exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
1126

1127
        case '?':
D
Daniel P. Berrange 已提交
1128
        default:
1129
            daemonUsage(argv[0], privileged);
1130
            exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
1131 1132 1133
        }
    }

1134 1135 1136 1137 1138 1139
    if (optind != argc) {
        fprintf(stderr, "%s: unexpected, non-option, command line arguments\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

1140 1141
    if (!(config = daemonConfigNew(privileged))) {
        VIR_ERROR(_("Can't create initial configuration"));
1142
        exit(EXIT_FAILURE);
1143
    }
1144 1145

    /* No explicit config, so try and find a default one */
1146 1147 1148
    if (remote_config_file == NULL) {
        implicit_conf = true;
        if (daemonConfigFilePath(privileged,
1149 1150
                                 &remote_config_file) < 0) {
            VIR_ERROR(_("Can't determine config path"));
1151
            exit(EXIT_FAILURE);
1152
        }
1153
    }
1154 1155 1156

    /* Read the config file if it exists*/
    if (remote_config_file &&
1157
        daemonConfigLoadFile(config, remote_config_file, implicit_conf) < 0) {
1158 1159
        VIR_ERROR(_("Can't load config file: %s: %s"),
                  virGetLastErrorMessage(), remote_config_file);
1160
        exit(EXIT_FAILURE);
1161
    }
1162

1163
    if (!privileged &&
1164 1165
        migrateProfile() < 0) {
        VIR_ERROR(_("Exiting due to failure to migrate profile"));
1166
        exit(EXIT_FAILURE);
1167
    }
1168

1169 1170
    if (daemonSetupHostUUID(config) < 0) {
        VIR_ERROR(_("Can't setup host uuid"));
1171
        exit(EXIT_FAILURE);
1172 1173
    }

1174 1175
    if (daemonSetupLogging(config, privileged, verbose, godaemon) < 0) {
        VIR_ERROR(_("Can't initialize logging"));
1176
        exit(EXIT_FAILURE);
1177
    }
1178

1179 1180
    daemonSetupNetDevOpenvswitch(config);

1181 1182 1183 1184 1185
    if (daemonSetupAccessManager(config) < 0) {
        VIR_ERROR(_("Can't initialize access manager"));
        exit(EXIT_FAILURE);
    }

1186
    if (!pid_file &&
1187 1188 1189 1190
        virPidFileConstructPath(privileged,
                                LOCALSTATEDIR,
                                "libvirtd",
                                &pid_file) < 0) {
1191
        VIR_ERROR(_("Can't determine pid file path."));
1192
        exit(EXIT_FAILURE);
1193
    }
1194
    VIR_DEBUG("Decided on pid file path '%s'", NULLSTR(pid_file));
1195 1196 1197 1198

    if (daemonUnixSocketPaths(config,
                              privileged,
                              &sock_file,
1199 1200
                              &sock_file_ro,
                              &sock_file_adm) < 0) {
1201
        VIR_ERROR(_("Can't determine socket paths"));
1202
        exit(EXIT_FAILURE);
1203
    }
1204 1205 1206 1207
    VIR_DEBUG("Decided on socket paths '%s', '%s' and '%s'",
              sock_file,
              NULLSTR(sock_file_ro),
              NULLSTR(sock_file_adm));
1208

1209
    if (godaemon) {
1210
        char ebuf[1024];
1211 1212 1213 1214

        if (chdir("/") < 0) {
            VIR_ERROR(_("cannot change to root directory: %s"),
                      virStrerror(errno, ebuf, sizeof(ebuf)));
1215
            goto cleanup;
1216 1217
        }

1218
        if ((statuswrite = daemonForkIntoBackground(argv[0])) < 0) {
1219
            VIR_ERROR(_("Failed to fork as daemon: %s"),
1220
                      virStrerror(errno, ebuf, sizeof(ebuf)));
1221
            goto cleanup;
1222 1223 1224
        }
    }

1225 1226 1227 1228 1229 1230
    /* Try to claim the pidfile, exiting if we can't */
    if ((pid_file_fd = virPidFileAcquirePath(pid_file, false, getpid())) < 0) {
        ret = VIR_DAEMON_ERR_PIDFILE;
        goto cleanup;
    }

J
John Levon 已提交
1231
    /* Ensure the rundir exists (on tmpfs on some systems) */
1232
    if (privileged) {
1233 1234 1235 1236
        if (VIR_STRDUP_QUIET(run_dir, LOCALSTATEDIR "/run/libvirt") < 0) {
            VIR_ERROR(_("Can't allocate memory"));
            goto cleanup;
        }
1237
    } else {
1238
        run_dir = virGetUserRuntimeDirectory();
1239

1240
        if (!run_dir) {
1241 1242
            VIR_ERROR(_("Can't determine user directory"));
            goto cleanup;
J
John Levon 已提交
1243 1244
        }
    }
1245 1246 1247 1248
    if (privileged)
        old_umask = umask(022);
    else
        old_umask = umask(077);
1249
    VIR_DEBUG("Ensuring run dir '%s' exists", run_dir);
1250 1251 1252 1253 1254 1255 1256 1257
    if (virFileMakePath(run_dir) < 0) {
        char ebuf[1024];
        VIR_ERROR(_("unable to create rundir %s: %s"), run_dir,
                  virStrerror(errno, ebuf, sizeof(ebuf)));
        ret = VIR_DAEMON_ERR_RUNDIR;
        goto cleanup;
    }
    umask(old_umask);
J
John Levon 已提交
1258

1259 1260 1261 1262 1263
    if (virNetlinkStartup() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1264
    if (!(dmn = virNetDaemonNew())) {
1265
        ret = VIR_DAEMON_ERR_DRIVER;
1266 1267 1268
        goto cleanup;
    }

1269
    if (!(srv = virNetServerNew("libvirtd", 1,
1270
                                config->min_workers,
1271
                                config->max_workers,
1272
                                config->prio_workers,
1273
                                config->max_clients,
1274
                                config->max_anonymous_clients,
1275 1276
                                config->keepalive_interval,
                                config->keepalive_count,
1277
                                config->mdns_adv ? config->mdns_name : NULL,
1278
                                remoteClientNew,
1279
                                NULL,
1280
                                remoteClientFree,
1281
                                NULL))) {
1282 1283 1284 1285
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1286
    if (virNetDaemonAddServer(dmn, srv) < 0) {
1287 1288 1289 1290
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1291 1292 1293 1294
    if (daemonInitialize() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }
1295

1296 1297 1298 1299 1300 1301 1302 1303 1304
    remoteProcs[REMOTE_PROC_AUTH_LIST].needAuth = false;
    remoteProcs[REMOTE_PROC_AUTH_SASL_INIT].needAuth = false;
    remoteProcs[REMOTE_PROC_AUTH_SASL_STEP].needAuth = false;
    remoteProcs[REMOTE_PROC_AUTH_SASL_START].needAuth = false;
    remoteProcs[REMOTE_PROC_AUTH_POLKIT].needAuth = false;
    if (!(remoteProgram = virNetServerProgramNew(REMOTE_PROGRAM,
                                                 REMOTE_PROTOCOL_VERSION,
                                                 remoteProcs,
                                                 remoteNProcs))) {
1305
        ret = VIR_DAEMON_ERR_INIT;
1306 1307 1308 1309 1310
        goto cleanup;
    }
    if (virNetServerAddProgram(srv, remoteProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1311
    }
1312

1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324
    if (!(lxcProgram = virNetServerProgramNew(LXC_PROGRAM,
                                              LXC_PROTOCOL_VERSION,
                                              lxcProcs,
                                              lxcNProcs))) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }
    if (virNetServerAddProgram(srv, lxcProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1325 1326 1327 1328 1329 1330 1331 1332 1333 1334
    if (!(qemuProgram = virNetServerProgramNew(QEMU_PROGRAM,
                                               QEMU_PROTOCOL_VERSION,
                                               qemuProcs,
                                               qemuNProcs))) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }
    if (virNetServerAddProgram(srv, qemuProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1335
    }
1336

1337
    if (!(srvAdm = virNetServerNew("admin", 1,
1338
                                   config->admin_min_workers,
1339 1340 1341 1342 1343 1344 1345
                                   config->admin_max_workers,
                                   0,
                                   config->admin_max_clients,
                                   0,
                                   config->admin_keepalive_interval,
                                   config->admin_keepalive_count,
                                   NULL,
1346
                                   remoteAdmClientNew,
1347
                                   NULL,
1348
                                   remoteAdmClientFree,
1349 1350 1351 1352 1353
                                   dmn))) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1354
    if (virNetDaemonAddServer(dmn, srvAdm) < 0) {
1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

    if (!(adminProgram = virNetServerProgramNew(ADMIN_PROGRAM,
                                                ADMIN_PROTOCOL_VERSION,
                                                adminProcs,
                                                adminNProcs))) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }
    if (virNetServerAddProgram(srvAdm, adminProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1371 1372
    if (timeout != -1) {
        VIR_DEBUG("Registering shutdown timeout %d", timeout);
1373
        virNetDaemonAutoShutdown(dmn, timeout);
1374
    }
1375

1376
    if ((daemonSetupSignals(dmn)) < 0) {
1377 1378
        ret = VIR_DAEMON_ERR_SIGNAL;
        goto cleanup;
1379
    }
D
Daniel P. Berrange 已提交
1380

1381
    if (config->audit_level) {
1382
        VIR_DEBUG("Attempting to configure auditing subsystem");
1383
        if (virAuditOpen(config->audit_level) < 0) {
1384
            if (config->audit_level > 1) {
1385
                ret = VIR_DAEMON_ERR_AUDIT;
1386
                goto cleanup;
1387
            }
1388
            VIR_DEBUG("Proceeding without auditing");
1389 1390
        }
    }
E
Eric Blake 已提交
1391
    virAuditLog(config->audit_logging > 0);
1392

1393
    /* setup the hooks if any */
1394
    if (virHookInitialize() < 0) {
1395
        ret = VIR_DAEMON_ERR_HOOKS;
1396
        goto cleanup;
1397 1398
    }

1399
    /* Disable error func, now logging is setup */
1400
    virSetErrorFunc(NULL, daemonErrorHandler);
1401
    virSetErrorLogPriorityFunc(daemonErrorLogFilter);
1402

1403 1404 1405 1406 1407 1408
    /*
     * Call the daemon startup hook
     * TODO: should we abort the daemon startup if the script returned
     *       an error ?
     */
    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_START,
1409
                0, "start", NULL, NULL);
1410

1411 1412 1413 1414 1415
    if (daemonSetupNetworking(srv, srvAdm,
                              config,
                              sock_file,
                              sock_file_ro,
                              sock_file_adm,
1416
                              ipsock, privileged) < 0) {
1417
        ret = VIR_DAEMON_ERR_NETWORK;
1418
        goto cleanup;
1419 1420
    }

1421 1422 1423 1424 1425 1426
    /* Tell parent of daemon that basic initialization is complete
     * In particular we're ready to accept net connections & have
     * written the pidfile
     */
    if (statuswrite != -1) {
        char status = 0;
1427
        ignore_value(safewrite(statuswrite, &status, 1));
1428
        VIR_FORCE_CLOSE(statuswrite);
1429 1430
    }

1431
    /* Initialize drivers & then start accepting new clients from network */
1432
    if (daemonStateInit(dmn) < 0) {
1433 1434
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1435
    }
D
Daniel P. Berrange 已提交
1436

1437
#if defined(__linux__) && defined(NETLINK_ROUTE)
1438 1439
    /* Register the netlink event service for NETLINK_ROUTE */
    if (virNetlinkEventServiceStart(NETLINK_ROUTE, 0) < 0) {
1440 1441 1442
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1443
#endif
1444

1445
#if defined(__linux__) && defined(NETLINK_KOBJECT_UEVENT)
T
Tang Chen 已提交
1446 1447 1448 1449 1450
    /* Register the netlink event service for NETLINK_KOBJECT_UEVENT */
    if (virNetlinkEventServiceStart(NETLINK_KOBJECT_UEVENT, 1) < 0) {
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1451
#endif
T
Tang Chen 已提交
1452

1453
    /* Run event loop. */
1454
    virNetDaemonRun(dmn);
1455

1456 1457
    ret = 0;

1458
    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
1459
                0, "shutdown", NULL, NULL);
1460

1461
 cleanup:
1462 1463 1464
    /* Keep cleanup order in inverse order of startup */
    virNetDaemonClose(dmn);

1465
    virNetlinkEventServiceStopAll();
1466 1467 1468 1469 1470 1471 1472 1473

    if (driversInitialized) {
        /* NB: Possible issue with timing window between driversInitialized
         * setting if virNetlinkEventServerStart fails */
        driversInitialized = false;
        virStateCleanup();
    }

1474 1475
    virObjectUnref(adminProgram);
    virObjectUnref(srvAdm);
1476 1477 1478 1479 1480 1481
    virObjectUnref(qemuProgram);
    virObjectUnref(lxcProgram);
    virObjectUnref(remoteProgram);
    virObjectUnref(srv);
    virObjectUnref(dmn);

1482
    virNetlinkShutdown();
1483 1484 1485 1486 1487 1488

    if (pid_file_fd != -1)
        virPidFileReleasePath(pid_file, pid_file_fd);

    VIR_FREE(run_dir);

1489 1490 1491 1492
    if (statuswrite != -1) {
        if (ret != 0) {
            /* Tell parent of daemon what failed */
            char status = ret;
1493
            ignore_value(safewrite(statuswrite, &status, 1));
1494
        }
1495
        VIR_FORCE_CLOSE(statuswrite);
1496
    }
1497 1498 1499

    VIR_FREE(sock_file);
    VIR_FREE(sock_file_ro);
1500
    VIR_FREE(sock_file_adm);
1501

1502
    VIR_FREE(pid_file);
1503

1504
    VIR_FREE(remote_config_file);
1505 1506
    daemonConfigFree(config);

1507
    return ret;
D
Daniel P. Berrange 已提交
1508
}