libvirtd.c 48.9 KB
Newer Older
D
Daniel P. Berrange 已提交
1
/*
D
Daniel P. Berrange 已提交
2
 * libvirtd.c: daemon start of day, guest process & i/o management
D
Daniel P. Berrange 已提交
3
 *
4
 * Copyright (C) 2006-2015 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 23
 *
 * Author: Daniel P. Berrange <berrange@redhat.com>
 */

24
#include <config.h>
25

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

34
#include "libvirt_internal.h"
35
#include "virerror.h"
E
Eric Blake 已提交
36
#include "virfile.h"
37
#include "virlog.h"
38
#include "virpidfile.h"
39
#include "virprocess.h"
40

41 42
#define VIR_FROM_THIS VIR_FROM_QEMU

D
Daniel P. Berrange 已提交
43
#include "libvirtd.h"
44
#include "libvirtd-config.h"
45

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

62
#ifdef WITH_DRIVER_MODULES
63
# include "driver.h"
64
#else
65 66 67 68 69 70
# ifdef WITH_QEMU
#  include "qemu/qemu_driver.h"
# endif
# ifdef WITH_LXC
#  include "lxc/lxc_driver.h"
# endif
71 72 73
# ifdef WITH_XEN
#  include "xen/xen_driver.h"
# endif
J
Jim Fehlig 已提交
74 75 76
# ifdef WITH_LIBXL
#  include "libxl/libxl_driver.h"
# endif
77 78 79
# ifdef WITH_UML
#  include "uml/uml_driver.h"
# endif
80 81 82
# ifdef WITH_VBOX
#  include "vbox/vbox_driver.h"
# endif
R
Roman Bogorodskiy 已提交
83 84 85
# ifdef WITH_BHYVE
#  include "bhyve/bhyve_driver.h"
# endif
86 87 88
# ifdef WITH_NETWORK
#  include "network/bridge_driver.h"
# endif
89 90
# ifdef WITH_INTERFACE
#  include "interface/interface_driver.h"
91
# endif
92
# ifdef WITH_STORAGE
93 94 95 96 97 98 99 100
#  include "storage/storage_driver.h"
# endif
# ifdef WITH_NODE_DEVICES
#  include "node_device/node_device_driver.h"
# endif
# ifdef WITH_SECRETS
#  include "secret/secret_driver.h"
# endif
101 102 103
# ifdef WITH_NWFILTER
#  include "nwfilter/nwfilter_driver.h"
# endif
104
#endif
105 106 107
#ifdef WITH_VZ
# include "vz/vz_driver.h"
#endif
108

109 110
#include "configmake.h"

111 112
#include "virdbus.h"

113 114
VIR_LOG_INIT("daemon.libvirtd");

115
#if WITH_SASL
116
virNetSASLContextPtr saslCtxt = NULL;
117
#endif
118
virNetServerProgramPtr remoteProgram = NULL;
119
virNetServerProgramPtr adminProgram = NULL;
120
virNetServerProgramPtr qemuProgram = NULL;
121
virNetServerProgramPtr lxcProgram = NULL;
122

123 124
volatile bool driversInitialized = false;

125 126 127 128 129 130 131 132 133
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,
134
    VIR_DAEMON_ERR_HOOKS,
135
    VIR_DAEMON_ERR_AUDIT,
136 137 138 139 140 141 142 143 144 145 146 147 148

    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",
149
              "Unable to load configuration file",
150 151
              "Unable to look for hook scripts",
              "Unable to initialize audit system")
152

153
static int daemonForkIntoBackground(const char *argv0)
154
{
155 156 157 158
    int statuspipe[2];
    if (pipe(statuspipe) < 0)
        return -1;

159
    pid_t pid = fork();
D
Daniel P. Berrange 已提交
160 161 162
    switch (pid) {
    case 0:
        {
E
Eric Blake 已提交
163
            /* intermediate child */
D
Daniel P. Berrange 已提交
164 165
            int stdinfd = -1;
            int stdoutfd = -1;
166
            int nextpid;
D
Daniel P. Berrange 已提交
167

168
            VIR_FORCE_CLOSE(statuspipe[0]);
169

170
            if ((stdinfd = open("/dev/null", O_RDONLY)) <= STDERR_FILENO)
D
Daniel P. Berrange 已提交
171
                goto cleanup;
172
            if ((stdoutfd = open("/dev/null", O_WRONLY)) <= STDERR_FILENO)
D
Daniel P. Berrange 已提交
173 174 175 176 177 178 179
                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;
180
            if (VIR_CLOSE(stdinfd) < 0)
D
Daniel P. Berrange 已提交
181
                goto cleanup;
182
            if (VIR_CLOSE(stdoutfd) < 0)
D
Daniel P. Berrange 已提交
183 184 185 186 187 188 189
                goto cleanup;

            if (setsid() < 0)
                goto cleanup;

            nextpid = fork();
            switch (nextpid) {
E
Eric Blake 已提交
190
            case 0: /* grandchild */
191
                return statuspipe[1];
E
Eric Blake 已提交
192 193 194 195
            case -1: /* error */
                goto cleanup;
            default: /* intermediate child succeeded */
                _exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
196 197 198
            }

        cleanup:
199 200
            VIR_FORCE_CLOSE(stdoutfd);
            VIR_FORCE_CLOSE(stdinfd);
E
Eric Blake 已提交
201 202
            VIR_FORCE_CLOSE(statuspipe[1]);
            _exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
203 204 205

        }

E
Eric Blake 已提交
206 207
    case -1: /* error in parent */
        goto error;
D
Daniel P. Berrange 已提交
208 209 210

    default:
        {
E
Eric Blake 已提交
211
            /* parent */
212 213 214
            int ret;
            char status;

215
            VIR_FORCE_CLOSE(statuspipe[1]);
216 217

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

E
Eric Blake 已提交
221 222 223
            /* If we get here, then the grandchild was spawned, so we
             * must exit.  Block until the second child initializes
             * successfully */
224 225 226 227 228
        again:
            ret = read(statuspipe[0], &status, 1);
            if (ret == -1 && errno == EINTR)
                goto again;

E
Eric Blake 已提交
229 230 231 232 233
            VIR_FORCE_CLOSE(statuspipe[0]);

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

234
                fprintf(stderr,
E
Eric Blake 已提交
235 236 237 238 239 240 241 242
                        _("%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,
243
                        virDaemonErrTypeToString(status));
E
Eric Blake 已提交
244
                exit(EXIT_FAILURE);
245
            }
E
Eric Blake 已提交
246
            _exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
247 248
        }
    }
E
Eric Blake 已提交
249

250
 error:
E
Eric Blake 已提交
251 252 253
    VIR_FORCE_CLOSE(statuspipe[0]);
    VIR_FORCE_CLOSE(statuspipe[1]);
    return -1;
D
Daniel P. Berrange 已提交
254 255
}

256

257 258 259 260
static int
daemonUnixSocketPaths(struct daemonConfig *config,
                      bool privileged,
                      char **sockfile,
261 262
                      char **rosockfile,
                      char **admsockfile)
J
John Levon 已提交
263
{
264 265
    if (config->unix_sock_dir) {
        if (virAsprintf(sockfile, "%s/libvirt-sock", config->unix_sock_dir) < 0)
266
            goto error;
267 268 269 270 271 272 273

        if (privileged) {
            if (virAsprintf(rosockfile, "%s/libvirt-sock-ro", config->unix_sock_dir) < 0)
                goto error;
            if (virAsprintf(admsockfile, "%s/libvirt-admin-sock", config->unix_sock_dir) < 0)
                goto error;
        }
D
Daniel P. Berrange 已提交
274
    } else {
275
        if (privileged) {
276
            if (VIR_STRDUP(*sockfile, LOCALSTATEDIR "/run/libvirt/libvirt-sock") < 0 ||
277 278
                VIR_STRDUP(*rosockfile, LOCALSTATEDIR "/run/libvirt/libvirt-sock-ro") < 0 ||
                VIR_STRDUP(*admsockfile, LOCALSTATEDIR "/run/libvirt/libvirt-admin-sock") < 0)
279
                goto error;
280
        } else {
281 282
            char *rundir = NULL;
            mode_t old_umask;
283

284
            if (!(rundir = virGetUserRuntimeDirectory()))
285
                goto error;
286

287 288 289 290 291 292 293
            old_umask = umask(077);
            if (virFileMakePath(rundir) < 0) {
                umask(old_umask);
                goto error;
            }
            umask(old_umask);

294 295
            if (virAsprintf(sockfile, "%s/libvirt-sock", rundir) < 0 ||
                virAsprintf(admsockfile, "%s/libvirt-admin-sock", rundir) < 0) {
296
                VIR_FREE(rundir);
297
                goto error;
298
            }
299

300
            VIR_FREE(rundir);
301 302 303
        }
    }
    return 0;
304

305
 error:
306
    return -1;
D
Daniel P. Berrange 已提交
307 308
}

309 310 311

static void daemonErrorHandler(void *opaque ATTRIBUTE_UNUSED,
                               virErrorPtr err ATTRIBUTE_UNUSED)
312 313 314 315 316
{
    /* Don't do anything, since logging infrastructure already
     * took care of reporting the error */
}

317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333
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:
    case VIR_ERR_NO_SECRET:
    case VIR_ERR_NO_DOMAIN_SNAPSHOT:
334
    case VIR_ERR_OPERATION_INVALID:
335
    case VIR_ERR_NO_DOMAIN_METADATA:
336 337 338 339 340 341
        return VIR_LOG_DEBUG;
    }

    return priority;
}

342 343
static void daemonInitialize(void)
{
344 345
    /*
     * Note that the order is important: the first ones have a higher
346 347 348
     * 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
349
     * domains can be auto-started.
350
     */
351 352 353
#ifdef WITH_DRIVER_MODULES
    /* We don't care if any of these fail, because the whole point
     * is to allow users to only install modules they want to use.
D
Dan Kenigsberg 已提交
354
     * If they try to open a connection for a module that
355 356
     * is not loaded they'll get a suitable error at that point
     */
357
# ifdef WITH_NETWORK
358
    virDriverLoadModule("network");
359
# endif
360 361 362
# ifdef WITH_INTERFACE
    virDriverLoadModule("interface");
# endif
363
# ifdef WITH_STORAGE
364
    virDriverLoadModule("storage");
365 366
# endif
# ifdef WITH_NODE_DEVICES
367
    virDriverLoadModule("nodedev");
368 369
# endif
# ifdef WITH_SECRETS
370
    virDriverLoadModule("secret");
371 372 373 374
# endif
# ifdef WITH_NWFILTER
    virDriverLoadModule("nwfilter");
# endif
375 376 377 378 379 380
# ifdef WITH_XEN
    virDriverLoadModule("xen");
# endif
# ifdef WITH_LIBXL
    virDriverLoadModule("libxl");
# endif
381
# ifdef WITH_QEMU
382
    virDriverLoadModule("qemu");
383 384
# endif
# ifdef WITH_LXC
385
    virDriverLoadModule("lxc");
386 387
# endif
# ifdef WITH_UML
388
    virDriverLoadModule("uml");
389
# endif
M
Michal Privoznik 已提交
390 391 392
# ifdef WITH_VBOX
    virDriverLoadModule("vbox");
# endif
R
Roman Bogorodskiy 已提交
393 394 395
# ifdef WITH_BHYVE
    virDriverLoadModule("bhyve");
# endif
396 397 398
# ifdef WITH_VZ
    virDriverLoadModule("vz");
# endif
399
#else
400
# ifdef WITH_NETWORK
401
    networkRegister();
402
# endif
403
# ifdef WITH_INTERFACE
404
    interfaceRegister();
405
# endif
406
# ifdef WITH_STORAGE
407
    storageRegister();
408
# endif
409
# ifdef WITH_NODE_DEVICES
410
    nodedevRegister();
411 412
# endif
# ifdef WITH_SECRETS
413
    secretRegister();
414
# endif
415 416 417
# ifdef WITH_NWFILTER
    nwfilterRegister();
# endif
418 419 420
# ifdef WITH_XEN
    xenRegister();
# endif
J
Jim Fehlig 已提交
421 422 423
# ifdef WITH_LIBXL
    libxlRegister();
# endif
424
# ifdef WITH_QEMU
425
    qemuRegister();
426 427
# endif
# ifdef WITH_LXC
428
    lxcRegister();
429 430
# endif
# ifdef WITH_UML
431
    umlRegister();
432
# endif
M
Michal Privoznik 已提交
433 434 435
# ifdef WITH_VBOX
    vboxRegister();
# endif
R
Roman Bogorodskiy 已提交
436 437 438
# ifdef WITH_BHYVE
    bhyveRegister();
# endif
439 440 441
# ifdef WITH_VZ
    vzRegister();
# endif
442
#endif
443 444 445
}


446 447
static int ATTRIBUTE_NONNULL(3)
daemonSetupNetworking(virNetServerPtr srv,
448
                      virNetServerPtr srvAdm,
449 450 451
                      struct daemonConfig *config,
                      const char *sock_path,
                      const char *sock_path_ro,
452
                      const char *sock_path_adm,
453 454
                      bool ipsock,
                      bool privileged)
455 456
{
    virNetServerServicePtr svc = NULL;
457
    virNetServerServicePtr svcAdm = NULL;
458 459
    virNetServerServicePtr svcRO = NULL;
    virNetServerServicePtr svcTCP = NULL;
460
#if WITH_GNUTLS
461
    virNetServerServicePtr svcTLS = NULL;
462
#endif
463 464 465
    gid_t unix_sock_gid = 0;
    int unix_sock_ro_mask = 0;
    int unix_sock_rw_mask = 0;
466
    int unix_sock_adm_mask = 0;
467
    int ret = -1;
468

469 470 471
    unsigned int cur_fd = STDERR_FILENO + 1;
    unsigned int nfds = virGetListenFDs();

472 473
    if (config->unix_sock_group) {
        if (virGetGroupID(config->unix_sock_group, &unix_sock_gid) < 0)
474
            return ret;
475
    }
476

477
    if (nfds > (sock_path_ro ? 2 : 1)) {
478
        VIR_ERROR(_("Too many (%u) FDs passed from caller"), nfds);
479
        return ret;
480 481
    }

482 483
    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);
484
        goto cleanup;
485
    }
486

487 488
    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);
489
        goto cleanup;
490 491
    }

492 493
    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);
494
        goto cleanup;
495
    }
496

497 498 499 500
    if (!(svc = virNetServerServiceNewFDOrUNIX(sock_path,
                                               unix_sock_rw_mask,
                                               unix_sock_gid,
                                               config->auth_unix_rw,
501
#if WITH_GNUTLS
502
                                               NULL,
503
#endif
504 505 506 507
                                               false,
                                               config->max_queued_clients,
                                               config->max_client_requests,
                                               nfds, &cur_fd)))
508
        goto cleanup;
509
    if (sock_path_ro) {
510 511 512 513
        if (!(svcRO = virNetServerServiceNewFDOrUNIX(sock_path_ro,
                                                     unix_sock_ro_mask,
                                                     unix_sock_gid,
                                                     config->auth_unix_ro,
514
#if WITH_GNUTLS
515
                                                     NULL,
516
#endif
517 518 519 520
                                                     true,
                                                     config->max_queued_clients,
                                                     config->max_client_requests,
                                                     nfds, &cur_fd)))
521
            goto cleanup;
522
    }
523

524 525 526 527
    if (virNetServerAddService(srv, svc,
                               config->mdns_adv && !ipsock ?
                               "_libvirt._tcp" :
                               NULL) < 0)
528
        goto cleanup;
529

530 531
    if (svcRO &&
        virNetServerAddService(srv, svcRO, NULL) < 0)
532
        goto cleanup;
533

534 535
    /* Temporarily disabled */
    if (sock_path_adm && false) {
536 537 538 539 540 541 542 543 544 545 546
        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,
#if WITH_GNUTLS
                                                  NULL,
#endif
                                                  true,
                                                  config->admin_max_queued_clients,
                                                  config->admin_max_client_requests)))
547
            goto cleanup;
548

549
        if (virNetServerAddService(srvAdm, svcAdm, NULL) < 0)
550
            goto cleanup;
551
    }
552

553
    if (ipsock) {
554
        if (config->listen_tcp) {
555 556
            VIR_DEBUG("Registering TCP socket %s:%s",
                      config->listen_addr, config->tcp_port);
557 558
            if (!(svcTCP = virNetServerServiceNewTCP(config->listen_addr,
                                                     config->tcp_port,
559
                                                     AF_UNSPEC,
560
                                                     config->auth_tcp,
561
#if WITH_GNUTLS
562 563
                                                     NULL,
#endif
564
                                                     false,
M
Michal Privoznik 已提交
565
                                                     config->max_queued_clients,
566
                                                     config->max_client_requests)))
567
                goto cleanup;
568

569 570
            if (virNetServerAddService(srv, svcTCP,
                                       config->mdns_adv ? "_libvirt._tcp" : NULL) < 0)
571
                goto cleanup;
572 573
        }

574
#if WITH_GNUTLS
575 576
        if (config->listen_tls) {
            virNetTLSContextPtr ctxt = NULL;
577

578 579 580 581 582 583 584 585
            if (config->ca_file ||
                config->cert_file ||
                config->key_file) {
                if (!(ctxt = virNetTLSContextNewServer(config->ca_file,
                                                       config->crl_file,
                                                       config->cert_file,
                                                       config->key_file,
                                                       (const char *const*)config->tls_allowed_dn_list,
586
                                                       config->tls_no_sanity_certificate ? false : true,
587
                                                       config->tls_no_verify_certificate ? false : true)))
588
                    goto cleanup;
589 590 591 592
            } else {
                if (!(ctxt = virNetTLSContextNewServerPath(NULL,
                                                           !privileged,
                                                           (const char *const*)config->tls_allowed_dn_list,
593
                                                           config->tls_no_sanity_certificate ? false : true,
594
                                                           config->tls_no_verify_certificate ? false : true)))
595
                    goto cleanup;
596 597
            }

598 599
            VIR_DEBUG("Registering TLS socket %s:%s",
                      config->listen_addr, config->tls_port);
600 601 602
            if (!(svcTLS =
                  virNetServerServiceNewTCP(config->listen_addr,
                                            config->tls_port,
603
                                            AF_UNSPEC,
604
                                            config->auth_tls,
605
                                            ctxt,
606
                                            false,
M
Michal Privoznik 已提交
607
                                            config->max_queued_clients,
608
                                            config->max_client_requests))) {
609
                virObjectUnref(ctxt);
610
                goto cleanup;
611
            }
612 613 614
            if (virNetServerAddService(srv, svcTLS,
                                       config->mdns_adv &&
                                       !config->listen_tcp ? "_libvirt._tcp" : NULL) < 0)
615
                goto cleanup;
616

617
            virObjectUnref(ctxt);
618
        }
619 620 621 622 623
#else
        (void)privileged;
        if (config->listen_tls) {
            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                           _("This libvirtd build does not support TLS"));
624
            goto cleanup;
625 626
        }
#endif
627 628
    }

629
#if WITH_SASL
630 631
    if (config->auth_unix_rw == REMOTE_AUTH_SASL ||
        config->auth_unix_ro == REMOTE_AUTH_SASL ||
632
# if WITH_GNUTLS
633 634 635
        config->auth_tls == REMOTE_AUTH_SASL ||
# endif
        config->auth_tcp == REMOTE_AUTH_SASL) {
636 637 638
        saslCtxt = virNetSASLContextNewServer(
            (const char *const*)config->sasl_allowed_username_list);
        if (!saslCtxt)
639
            goto cleanup;
D
Daniel P. Berrange 已提交
640
    }
641
#endif
D
Daniel P. Berrange 已提交
642

643
    ret = 0;
644

645
 cleanup:
646
#if WITH_GNUTLS
647
    virObjectUnref(svcTLS);
648
#endif
649 650
    virObjectUnref(svcTCP);
    virObjectUnref(svcRO);
651
    virObjectUnref(svcAdm);
652 653
    virObjectUnref(svc);
    return ret;
D
Daniel P. Berrange 已提交
654 655 656
}


657 658
/*
 * Set up the logging environment
659 660
 * By default if daemonized all errors go to the logfile libvirtd.log,
 * but if verbose or error debugging is asked for then also output
661
 * informational and debug messages. Default size if 64 kB.
662
 */
663
static int
664 665 666 667
daemonSetupLogging(struct daemonConfig *config,
                   bool privileged,
                   bool verbose,
                   bool godaemon)
668
{
669 670
    virLogReset();

671
    /*
672 673 674 675 676 677 678 679 680 681 682 683
     * Libvirtd's order of precedence is:
     * cmdline > environment > config
     *
     * In order to achieve this, we must process configuration in
     * different order for the log level versus the filters and
     * outputs. Because filters and outputs append, we have to look at
     * the environment first and then only check the config file if
     * there was no result from the environment. The default output is
     * then applied only if there was no setting from either of the
     * first two. Because we don't have a way to determine if the log
     * level has been set, we must process variables in the opposite
     * order, each one overriding the previous.
684
     */
685 686
    if (config->log_level != 0)
        virLogSetDefaultPriority(config->log_level);
687

688
    virLogSetFromEnv();
689

690 691 692 693 694
    if (virLogGetNbFilters() == 0)
        virLogParseFilters(config->log_filters);

    if (virLogGetNbOutputs() == 0)
        virLogParseOutputs(config->log_outputs);
695

696 697 698 699 700 701
    /*
     * Command line override for --verbose
     */
    if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
        virLogSetDefaultPriority(VIR_LOG_INFO);

702
    /*
703 704 705 706
     * If no defined outputs, and either running
     * as daemon or not on a tty, then first try
     * to direct it to the systemd journal
     * (if it exists)....
707
     */
708 709
    if (virLogGetNbOutputs() == 0 &&
        (godaemon || !isatty(STDIN_FILENO))) {
710 711
        char *tmp;
        if (access("/run/systemd/journal/socket", W_OK) >= 0) {
712 713 714 715 716 717 718 719
            virLogPriority priority = virLogGetDefaultPriority();

            /* By default we don't want to log too much stuff into journald as
             * it may employ rate limiting and thus block libvirt execution. */
            if (priority == VIR_LOG_DEBUG)
                priority = VIR_LOG_INFO;

            if (virAsprintf(&tmp, "%d:journald", priority) < 0)
720
                goto error;
721 722 723 724 725 726 727
            virLogParseOutputs(tmp);
            VIR_FREE(tmp);
        }
    }

    /*
     * otherwise direct to libvirtd.log when running
728
     * as daemon. Otherwise the default output is stderr.
729
     */
730
    if (virLogGetNbOutputs() == 0) {
731
        char *tmp = NULL;
732

733
        if (godaemon) {
734
            if (privileged) {
735 736 737
                if (virAsprintf(&tmp, "%d:file:%s/log/libvirt/libvirtd.log",
                                virLogGetDefaultPriority(),
                                LOCALSTATEDIR) == -1)
738
                    goto error;
739
            } else {
740
                char *logdir = virGetUserCacheDirectory();
741 742 743 744 745 746 747 748
                mode_t old_umask;

                if (!logdir)
                    goto error;

                old_umask = umask(077);
                if (virFileMakePath(logdir) < 0) {
                    umask(old_umask);
749
                    goto error;
750 751
                }
                umask(old_umask);
752

753 754 755
                if (virAsprintf(&tmp, "%d:file:%s/libvirtd.log",
                                virLogGetDefaultPriority(), logdir) == -1) {
                    VIR_FREE(logdir);
756
                    goto error;
E
Eric Blake 已提交
757
                }
758
                VIR_FREE(logdir);
759
            }
760
        } else {
761
            if (virAsprintf(&tmp, "%d:stderr", virLogGetDefaultPriority()) < 0)
762
                goto error;
763
        }
764 765
        virLogParseOutputs(tmp);
        VIR_FREE(tmp);
766
    }
767

768 769
    return 0;

770
 error:
771 772 773
    return -1;
}

774

775 776 777 778 779
static int
daemonSetupAccessManager(struct daemonConfig *config)
{
    virAccessManagerPtr mgr;
    const char *none[] = { "none", NULL };
J
Ján Tomko 已提交
780
    const char **drv = (const char **)config->access_drivers;
781

J
Ján Tomko 已提交
782 783 784
    if (!drv ||
        !drv[0])
        drv = none;
785

J
Ján Tomko 已提交
786
    if (!(mgr = virAccessManagerNewStack(drv)))
787 788 789 790 791 792 793 794
        return -1;

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


795 796
/* Display version information. */
static void
797
daemonVersion(const char *argv0)
798
{
799
    printf("%s (%s) %s\n", argv0, PACKAGE_NAME, PACKAGE_VERSION);
800 801
}

J
John Levon 已提交
802 803
#ifdef __sun
static int
804
daemonSetupPrivs(void)
J
John Levon 已提交
805
{
806
    chown("/var/run/libvirt", SYSTEM_UID, SYSTEM_UID);
J
John Levon 已提交
807

808 809
    if (__init_daemon_priv(PU_RESETGROUPS | PU_CLEARLIMITSET,
                           SYSTEM_UID, SYSTEM_UID, PRIV_XVM_CONTROL, NULL)) {
810
        VIR_ERROR(_("additional privileges are required"));
J
John Levon 已提交
811 812 813
        return -1;
    }

814 815
    if (priv_set(PRIV_OFF, PRIV_ALLSETS, PRIV_FILE_LINK_ANY, PRIV_PROC_INFO,
                 PRIV_PROC_SESSION, PRIV_PROC_EXEC, PRIV_PROC_FORK, NULL)) {
816
        VIR_ERROR(_("failed to set reduced privileges"));
J
John Levon 已提交
817 818 819 820 821 822
        return -1;
    }

    return 0;
}
#else
823
# define daemonSetupPrivs() 0
J
John Levon 已提交
824 825
#endif

826

827
static void daemonShutdownHandler(virNetDaemonPtr dmn,
828 829
                                  siginfo_t *sig ATTRIBUTE_UNUSED,
                                  void *opaque ATTRIBUTE_UNUSED)
830
{
831
    virNetDaemonQuit(dmn);
832
}
833

834
static void daemonReloadHandler(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
835 836 837
                                siginfo_t *sig ATTRIBUTE_UNUSED,
                                void *opaque ATTRIBUTE_UNUSED)
{
838 839 840 841 842
    if (!driversInitialized) {
        VIR_WARN("Drivers are not initialized, reload ignored");
        return;
    }

W
Wang Rui 已提交
843 844 845 846 847
    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");
848 849
}

850
static int daemonSetupSignals(virNetDaemonPtr dmn)
851
{
852
    if (virNetDaemonAddSignalHandler(dmn, SIGINT, daemonShutdownHandler, NULL) < 0)
853
        return -1;
854
    if (virNetDaemonAddSignalHandler(dmn, SIGQUIT, daemonShutdownHandler, NULL) < 0)
855
        return -1;
856
    if (virNetDaemonAddSignalHandler(dmn, SIGTERM, daemonShutdownHandler, NULL) < 0)
857
        return -1;
858
    if (virNetDaemonAddSignalHandler(dmn, SIGHUP, daemonReloadHandler, NULL) < 0)
859
        return -1;
860 861
    return 0;
}
862

863 864 865

static void daemonInhibitCallback(bool inhibit, void *opaque)
{
866
    virNetDaemonPtr dmn = opaque;
867 868

    if (inhibit)
869
        virNetDaemonAddShutdownInhibition(dmn);
870
    else
871
        virNetDaemonRemoveShutdownInhibition(dmn);
872 873 874
}


875 876 877 878 879 880
#ifdef HAVE_DBUS
static DBusConnection *sessionBus;
static DBusConnection *systemBus;

static void daemonStopWorker(void *opaque)
{
881
    virNetDaemonPtr dmn = opaque;
882

883
    VIR_DEBUG("Begin stop dmn=%p", dmn);
884 885 886

    ignore_value(virStateStop());

887
    VIR_DEBUG("Completed stop dmn=%p", dmn);
888 889

    /* Exit libvirtd cleanly */
890
    virNetDaemonQuit(dmn);
891 892 893 894
}


/* We do this in a thread to not block the main loop */
895
static void daemonStop(virNetDaemonPtr dmn)
896 897
{
    virThread thr;
898 899 900
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonStopWorker, dmn) < 0)
        virObjectUnref(dmn);
901 902 903 904 905 906 907 908
}


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

911
    VIR_DEBUG("dmn=%p", dmn);
912 913 914 915

    if (dbus_message_is_signal(message,
                               DBUS_INTERFACE_LOCAL,
                               "Disconnected"))
916
        daemonStop(dmn);
917 918 919 920 921 922 923 924 925 926

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}


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

929
    VIR_DEBUG("dmn=%p", dmn);
930 931 932 933

    if (dbus_message_is_signal(message,
                               "org.freedesktop.login1.Manager",
                               "PrepareForShutdown"))
934
        daemonStop(dmn);
935 936 937 938 939 940

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
#endif


941 942
static void daemonRunStateInit(void *opaque)
{
943
    virNetDaemonPtr dmn = opaque;
944 945 946
    virIdentityPtr sysident = virIdentityGetSystem();

    virIdentitySetCurrent(sysident);
947

948 949
    /* Since driver initialization can take time inhibit daemon shutdown until
       we're done so clients get a chance to connect */
950
    daemonInhibitCallback(true, dmn);
951

952
    /* Start the stateful HV drivers
E
Eric Blake 已提交
953
     * This is deliberately done after telling the parent process
954 955
     * we're ready, since it can take a long time and this will
     * seriously delay OS bootup process */
956
    if (virStateInitialize(virNetDaemonIsPrivileged(dmn),
957
                           daemonInhibitCallback,
958
                           dmn) < 0) {
959
        VIR_ERROR(_("Driver state initialization failed"));
960 961
        /* Ensure the main event loop quits */
        kill(getpid(), SIGTERM);
962
        goto cleanup;
963 964
    }

965 966
    driversInitialized = true;

967
#ifdef HAVE_DBUS
968
    /* Tie the non-privileged libvirtd to the session/shutdown lifecycle */
969
    if (!virNetDaemonIsPrivileged(dmn)) {
970 971 972 973

        sessionBus = virDBusGetSessionBus();
        if (sessionBus != NULL)
            dbus_connection_add_filter(sessionBus,
974
                                       handleSessionMessageFunc, dmn, NULL);
975 976 977 978

        systemBus = virDBusGetSystemBus();
        if (systemBus != NULL) {
            dbus_connection_add_filter(systemBus,
979
                                       handleSystemMessageFunc, dmn, NULL);
980 981 982 983 984 985
            dbus_bus_add_match(systemBus,
                               "type='signal',sender='org.freedesktop.login1', interface='org.freedesktop.login1.Manager'",
                               NULL);
        }
    }
#endif
986
    /* Only now accept clients from network */
987
    virNetDaemonUpdateServices(dmn, true);
988
 cleanup:
989 990
    daemonInhibitCallback(false, dmn);
    virObjectUnref(dmn);
991 992
    virObjectUnref(sysident);
    virIdentitySetCurrent(NULL);
993
}
994

995
static int daemonStateInit(virNetDaemonPtr dmn)
996 997
{
    virThread thr;
998 999 1000
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonRunStateInit, dmn) < 0) {
        virObjectUnref(dmn);
1001 1002
        return -1;
    }
1003 1004 1005
    return 0;
}

1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016
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;

1017 1018
    VIR_DEBUG("Checking if user profile needs migrating");

1019
    if (!(home = virGetUserDirectory()))
1020 1021
        goto cleanup;

1022
    if (virAsprintf(&old_base, "%s/.libvirt", home) < 0)
1023 1024 1025
        goto cleanup;

    /* if the new directory is there or the old one is not: do nothing */
1026
    if (!(config_dir = virGetUserConfigDirectory()))
1027 1028 1029
        goto cleanup;

    if (!virFileIsDir(old_base) || virFileExists(config_dir)) {
1030 1031 1032
        VIR_DEBUG("No old profile in '%s' / "
                  "new profile directory already present '%s'",
                  old_base, config_dir);
1033 1034 1035 1036 1037
        ret = 0;
        goto cleanup;
    }

    /* test if we already attempted to migrate first */
1038
    if (virAsprintf(&updated, "%s/DEPRECATED-DIRECTORY", old_base) < 0)
1039
        goto cleanup;
1040
    if (virFileExists(updated))
1041 1042
        goto cleanup;

1043
    config_home = virGetEnvBlockSUID("XDG_CONFIG_HOME");
1044
    if (config_home && config_home[0] != '\0') {
1045 1046
        if (VIR_STRDUP(xdg_dir, config_home) < 0)
            goto cleanup;
1047
    } else {
1048
        if (virAsprintf(&xdg_dir, "%s/.config", home) < 0)
1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065
            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;
    }

1066
    VIR_DEBUG("Profile migrated from %s to %s", old_base, config_dir);
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
    ret = 0;

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

    return ret;
}

1079 1080
/* Print command-line usage. */
static void
1081
daemonUsage(const char *argv0, bool privileged)
1082
{
1083 1084 1085 1086 1087 1088
    fprintf(stderr,
            _("\n"
              "Usage:\n"
              "  %s [options]\n"
              "\n"
              "Options:\n"
1089
              "  -h | --help            Display program help:\n"
1090 1091 1092 1093 1094
              "  -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"
1095
              "  -V | --version         Display version information.\n"
1096 1097 1098 1099
              "  -p | --pid-file <file> Change name of PID file.\n"
              "\n"
              "libvirt management daemon:\n"),
            argv0);
1100 1101 1102

    if (privileged) {
        fprintf(stderr,
1103 1104 1105 1106
                _("\n"
                  "  Default paths:\n"
                  "\n"
                  "    Configuration file (unless overridden by -f):\n"
1107
                  "      %s\n"
1108 1109
                  "\n"
                  "    Sockets:\n"
1110 1111
                  "      %s\n"
                  "      %s\n"
1112 1113
                  "\n"
                  "    TLS:\n"
1114 1115 1116
                  "      CA certificate:     %s\n"
                  "      Server certificate: %s\n"
                  "      Server private key: %s\n"
1117 1118 1119 1120
                  "\n"
                  "    PID file (unless overridden by -p):\n"
                  "      %s/run/libvirtd.pid\n"
                  "\n"),
1121 1122 1123
                LIBVIRTD_CONFIGURATION_FILE,
                LIBVIRTD_PRIV_UNIX_SOCKET,
                LIBVIRTD_PRIV_UNIX_SOCKET_RO,
1124 1125 1126
                LIBVIRT_CACERT,
                LIBVIRT_SERVERCERT,
                LIBVIRT_SERVERKEY,
1127 1128
                LOCALSTATEDIR);
    } else {
1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146
        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"));
1147
    }
1148 1149
}

D
Daniel P. Berrange 已提交
1150
int main(int argc, char **argv) {
1151
    virNetDaemonPtr dmn = NULL;
1152
    virNetServerPtr srv = NULL;
1153
    virNetServerPtr srvAdm = NULL;
1154
    char *remote_config_file = NULL;
1155
    int statuswrite = -1;
1156
    int ret = 1;
1157
    int pid_file_fd = -1;
1158 1159 1160
    char *pid_file = NULL;
    char *sock_file = NULL;
    char *sock_file_ro = NULL;
1161
    char *sock_file_adm = NULL;
1162 1163 1164 1165 1166 1167
    int timeout = -1;        /* -t: Shutdown timeout */
    int verbose = 0;
    int godaemon = 0;
    int ipsock = 0;
    struct daemonConfig *config;
    bool privileged = geteuid() == 0 ? true : false;
1168
    bool implicit_conf = false;
1169 1170
    char *run_dir = NULL;
    mode_t old_umask;
D
Daniel P. Berrange 已提交
1171 1172

    struct option opts[] = {
1173 1174 1175
        { "verbose", no_argument, &verbose, 'v'},
        { "daemon", no_argument, &godaemon, 'd'},
        { "listen", no_argument, &ipsock, 'l'},
1176
        { "config", required_argument, NULL, 'f'},
1177 1178
        { "timeout", required_argument, NULL, 't'},
        { "pid-file", required_argument, NULL, 'p'},
1179 1180
        { "version", no_argument, NULL, 'V' },
        { "help", no_argument, NULL, 'h' },
D
Daniel P. Berrange 已提交
1181 1182 1183
        {0, 0, 0, 0}
    };

1184
    if (virGettextInitialize() < 0 ||
E
Eric Blake 已提交
1185
        virInitialize() < 0) {
1186
        fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
E
Eric Blake 已提交
1187
        exit(EXIT_FAILURE);
1188
    }
D
Daniel P. Berrange 已提交
1189

1190 1191
    virUpdateSelfLastChanged(argv[0]);

1192 1193
    virFileActivateDirOverride(argv[0]);

D
Daniel P. Berrange 已提交
1194 1195 1196 1197 1198
    while (1) {
        int optidx = 0;
        int c;
        char *tmp;

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

1201
        if (c == -1)
D
Daniel P. Berrange 已提交
1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213
            break;

        switch (c) {
        case 0:
            /* Got one of the flags */
            break;
        case 'v':
            verbose = 1;
            break;
        case 'd':
            godaemon = 1;
            break;
1214 1215
        case 'l':
            ipsock = 1;
D
Daniel P. Berrange 已提交
1216 1217 1218
            break;

        case 't':
1219
            if (virStrToLong_i(optarg, &tmp, 10, &timeout) != 0
1220 1221
                || timeout <= 0
                /* Ensure that we can multiply by 1000 without overflowing.  */
1222 1223 1224 1225
                || timeout > INT_MAX / 1000) {
                VIR_ERROR(_("Invalid value for timeout"));
                exit(EXIT_FAILURE);
            }
D
Daniel P. Berrange 已提交
1226
            break;
1227 1228

        case 'p':
1229
            VIR_FREE(pid_file);
1230
            if (VIR_STRDUP_QUIET(pid_file, optarg) < 0) {
1231
                VIR_ERROR(_("Can't allocate memory"));
1232
                exit(EXIT_FAILURE);
1233
            }
1234 1235 1236
            break;

        case 'f':
1237
            VIR_FREE(remote_config_file);
1238
            if (VIR_STRDUP_QUIET(remote_config_file, optarg) < 0) {
1239
                VIR_ERROR(_("Can't allocate memory"));
1240
                exit(EXIT_FAILURE);
1241
            }
1242 1243
            break;

1244
        case 'V':
1245
            daemonVersion(argv[0]);
1246
            exit(EXIT_SUCCESS);
1247

1248
        case 'h':
1249
            daemonUsage(argv[0], privileged);
1250
            exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
1251

1252
        case '?':
D
Daniel P. Berrange 已提交
1253
        default:
1254
            daemonUsage(argv[0], privileged);
1255
            exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
1256 1257 1258
        }
    }

1259 1260 1261 1262 1263 1264
    if (optind != argc) {
        fprintf(stderr, "%s: unexpected, non-option, command line arguments\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

1265 1266
    if (!(config = daemonConfigNew(privileged))) {
        VIR_ERROR(_("Can't create initial configuration"));
1267
        exit(EXIT_FAILURE);
1268
    }
1269 1270

    /* No explicit config, so try and find a default one */
1271 1272 1273
    if (remote_config_file == NULL) {
        implicit_conf = true;
        if (daemonConfigFilePath(privileged,
1274 1275
                                 &remote_config_file) < 0) {
            VIR_ERROR(_("Can't determine config path"));
1276
            exit(EXIT_FAILURE);
1277
        }
1278
    }
1279 1280 1281

    /* Read the config file if it exists*/
    if (remote_config_file &&
1282
        daemonConfigLoadFile(config, remote_config_file, implicit_conf) < 0) {
1283 1284 1285 1286 1287 1288
        virErrorPtr err = virGetLastError();
        if (err && err->message)
            VIR_ERROR(_("Can't load config file: %s: %s"),
                      err->message, remote_config_file);
        else
            VIR_ERROR(_("Can't load config file: %s"), remote_config_file);
1289
        exit(EXIT_FAILURE);
1290
    }
1291

1292
    if (!privileged &&
1293 1294
        migrateProfile() < 0) {
        VIR_ERROR(_("Exiting due to failure to migrate profile"));
1295
        exit(EXIT_FAILURE);
1296
    }
1297

1298 1299 1300 1301
    if (config->host_uuid &&
        virSetHostUUIDStr(config->host_uuid) < 0) {
        VIR_ERROR(_("invalid host UUID: %s"), config->host_uuid);
        exit(EXIT_FAILURE);
1302 1303
    }

1304 1305
    if (daemonSetupLogging(config, privileged, verbose, godaemon) < 0) {
        VIR_ERROR(_("Can't initialize logging"));
1306
        exit(EXIT_FAILURE);
1307
    }
1308

1309 1310 1311 1312 1313
    if (daemonSetupAccessManager(config) < 0) {
        VIR_ERROR(_("Can't initialize access manager"));
        exit(EXIT_FAILURE);
    }

1314
    if (!pid_file &&
1315 1316 1317 1318
        virPidFileConstructPath(privileged,
                                LOCALSTATEDIR,
                                "libvirtd",
                                &pid_file) < 0) {
1319
        VIR_ERROR(_("Can't determine pid file path."));
1320
        exit(EXIT_FAILURE);
1321
    }
1322
    VIR_DEBUG("Decided on pid file path '%s'", NULLSTR(pid_file));
1323 1324 1325 1326

    if (daemonUnixSocketPaths(config,
                              privileged,
                              &sock_file,
1327 1328
                              &sock_file_ro,
                              &sock_file_adm) < 0) {
1329
        VIR_ERROR(_("Can't determine socket paths"));
1330
        exit(EXIT_FAILURE);
1331
    }
1332 1333 1334 1335
    VIR_DEBUG("Decided on socket paths '%s', '%s' and '%s'",
              sock_file,
              NULLSTR(sock_file_ro),
              NULLSTR(sock_file_adm));
1336

1337
    if (godaemon) {
1338
        char ebuf[1024];
1339 1340 1341 1342

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

1346
        if ((statuswrite = daemonForkIntoBackground(argv[0])) < 0) {
1347
            VIR_ERROR(_("Failed to fork as daemon: %s"),
1348
                      virStrerror(errno, ebuf, sizeof(ebuf)));
1349
            goto cleanup;
1350 1351 1352
        }
    }

J
John Levon 已提交
1353
    /* Ensure the rundir exists (on tmpfs on some systems) */
1354
    if (privileged) {
1355 1356 1357 1358
        if (VIR_STRDUP_QUIET(run_dir, LOCALSTATEDIR "/run/libvirt") < 0) {
            VIR_ERROR(_("Can't allocate memory"));
            goto cleanup;
        }
1359
    } else {
1360
        run_dir = virGetUserRuntimeDirectory();
1361

1362
        if (!run_dir) {
1363 1364
            VIR_ERROR(_("Can't determine user directory"));
            goto cleanup;
J
John Levon 已提交
1365 1366
        }
    }
1367 1368 1369 1370
    if (privileged)
        old_umask = umask(022);
    else
        old_umask = umask(077);
1371
    VIR_DEBUG("Ensuring run dir '%s' exists", run_dir);
1372 1373 1374 1375 1376 1377 1378 1379
    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 已提交
1380

1381
    /* Try to claim the pidfile, exiting if we can't */
1382
    if ((pid_file_fd = virPidFileAcquirePath(pid_file, false, getpid())) < 0) {
1383 1384 1385 1386
        ret = VIR_DAEMON_ERR_PIDFILE;
        goto cleanup;
    }

1387 1388 1389 1390 1391
    if (virNetlinkStartup() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1392
    if (!(srv = virNetServerNew("libvirtd", 1,
1393
                                config->min_workers,
1394
                                config->max_workers,
1395
                                config->prio_workers,
1396
                                config->max_clients,
1397
                                config->max_anonymous_clients,
1398 1399
                                config->keepalive_interval,
                                config->keepalive_count,
1400
                                config->mdns_adv ? config->mdns_name : NULL,
1401
                                remoteClientInitHook,
1402
                                NULL,
1403
                                remoteClientFreeFunc,
1404
                                NULL))) {
1405 1406 1407 1408
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1409
    if (!(dmn = virNetDaemonNew()) ||
1410
        virNetDaemonAddServer(dmn, srv) < 0) {
1411 1412 1413 1414
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1415 1416 1417
    /* Beyond this point, nothing should rely on using
     * getuid/geteuid() == 0, for privilege level checks.
     */
1418
    VIR_DEBUG("Dropping privileges (if required)");
1419
    if (daemonSetupPrivs() < 0) {
1420
        ret = VIR_DAEMON_ERR_PRIVS;
1421
        goto cleanup;
1422
    }
J
John Levon 已提交
1423

1424
    daemonInitialize();
1425

1426 1427 1428 1429 1430 1431 1432 1433 1434
    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))) {
1435
        ret = VIR_DAEMON_ERR_INIT;
1436 1437 1438 1439 1440
        goto cleanup;
    }
    if (virNetServerAddProgram(srv, remoteProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1441
    }
1442

1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454
    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;
    }

1455 1456 1457 1458 1459 1460 1461 1462 1463 1464
    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;
1465
    }
1466

1467
    if (!(srvAdm = virNetServerNew("admin", 1,
1468
                                   config->admin_min_workers,
1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483
                                   config->admin_max_workers,
                                   0,
                                   config->admin_max_clients,
                                   0,
                                   config->admin_keepalive_interval,
                                   config->admin_keepalive_count,
                                   NULL,
                                   remoteAdmClientInitHook,
                                   NULL,
                                   remoteAdmClientFreeFunc,
                                   dmn))) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1484
    if (virNetDaemonAddServer(dmn, srvAdm) < 0) {
1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500
        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;
    }

1501 1502
    if (timeout != -1) {
        VIR_DEBUG("Registering shutdown timeout %d", timeout);
1503
        virNetDaemonAutoShutdown(dmn, timeout);
1504
    }
1505

1506
    if ((daemonSetupSignals(dmn)) < 0) {
1507 1508
        ret = VIR_DAEMON_ERR_SIGNAL;
        goto cleanup;
1509
    }
D
Daniel P. Berrange 已提交
1510

1511
    if (config->audit_level) {
1512
        VIR_DEBUG("Attempting to configure auditing subsystem");
1513
        if (virAuditOpen() < 0) {
1514
            if (config->audit_level > 1) {
1515
                ret = VIR_DAEMON_ERR_AUDIT;
1516
                goto cleanup;
1517
            }
1518
            VIR_DEBUG("Proceeding without auditing");
1519 1520
        }
    }
E
Eric Blake 已提交
1521
    virAuditLog(config->audit_logging > 0);
1522

1523
    /* setup the hooks if any */
1524
    if (virHookInitialize() < 0) {
1525
        ret = VIR_DAEMON_ERR_HOOKS;
1526
        goto cleanup;
1527 1528
    }

1529
    /* Disable error func, now logging is setup */
1530
    virSetErrorFunc(NULL, daemonErrorHandler);
1531
    virSetErrorLogPriorityFunc(daemonErrorLogFilter);
1532

1533 1534 1535 1536 1537 1538
    /*
     * 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,
1539
                0, "start", NULL, NULL);
1540

1541 1542 1543 1544 1545
    if (daemonSetupNetworking(srv, srvAdm,
                              config,
                              sock_file,
                              sock_file_ro,
                              sock_file_adm,
1546
                              ipsock, privileged) < 0) {
1547
        ret = VIR_DAEMON_ERR_NETWORK;
1548
        goto cleanup;
1549 1550
    }

1551 1552 1553 1554 1555 1556 1557 1558 1559
    /* 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;
        while (write(statuswrite, &status, 1) == -1 &&
               errno == EINTR)
            ;
1560
        VIR_FORCE_CLOSE(statuswrite);
1561 1562
    }

1563
    /* Initialize drivers & then start accepting new clients from network */
1564
    if (daemonStateInit(dmn) < 0) {
1565 1566
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1567
    }
D
Daniel P. Berrange 已提交
1568

1569
#if defined(__linux__) && defined(NETLINK_ROUTE)
1570 1571
    /* Register the netlink event service for NETLINK_ROUTE */
    if (virNetlinkEventServiceStart(NETLINK_ROUTE, 0) < 0) {
1572 1573 1574
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1575
#endif
1576

1577
#if defined(__linux__) && defined(NETLINK_KOBJECT_UEVENT)
T
Tang Chen 已提交
1578 1579 1580 1581 1582
    /* Register the netlink event service for NETLINK_KOBJECT_UEVENT */
    if (virNetlinkEventServiceStart(NETLINK_KOBJECT_UEVENT, 1) < 0) {
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1583
#endif
T
Tang Chen 已提交
1584

1585
    /* Run event loop. */
1586
    virNetDaemonRun(dmn);
1587

1588 1589
    ret = 0;

1590
    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
1591
                0, "shutdown", NULL, NULL);
1592

1593
 cleanup:
1594
    virNetlinkEventServiceStopAll();
1595
    virObjectUnref(remoteProgram);
1596
    virObjectUnref(lxcProgram);
1597
    virObjectUnref(qemuProgram);
1598
    virObjectUnref(adminProgram);
1599 1600
    virNetDaemonClose(dmn);
    virObjectUnref(dmn);
1601
    virObjectUnref(srv);
1602
    virObjectUnref(srvAdm);
1603
    virNetlinkShutdown();
1604 1605 1606 1607 1608 1609 1610 1611
    if (statuswrite != -1) {
        if (ret != 0) {
            /* Tell parent of daemon what failed */
            char status = ret;
            while (write(statuswrite, &status, 1) == -1 &&
                   errno == EINTR)
                ;
        }
1612
        VIR_FORCE_CLOSE(statuswrite);
1613
    }
1614 1615
    if (pid_file_fd != -1)
        virPidFileReleasePath(pid_file, pid_file_fd);
1616 1617 1618

    VIR_FREE(sock_file);
    VIR_FREE(sock_file_ro);
1619
    VIR_FREE(sock_file_adm);
1620 1621
    VIR_FREE(pid_file);
    VIR_FREE(remote_config_file);
1622 1623
    VIR_FREE(run_dir);

1624 1625
    daemonConfigFree(config);

1626 1627
    if (driversInitialized) {
        driversInitialized = false;
1628
        virStateCleanup();
1629
    }
1630

1631
    return ret;
D
Daniel P. Berrange 已提交
1632
}