libvirtd.c 49.7 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 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111
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;
}

1112 1113
/* Print command-line usage. */
static void
1114
daemonUsage(const char *argv0, bool privileged)
1115
{
1116 1117 1118 1119 1120 1121
    fprintf(stderr,
            _("\n"
              "Usage:\n"
              "  %s [options]\n"
              "\n"
              "Options:\n"
1122
              "  -h | --help            Display program help:\n"
1123 1124 1125 1126 1127
              "  -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"
1128
              "  -V | --version         Display version information.\n"
1129 1130 1131 1132
              "  -p | --pid-file <file> Change name of PID file.\n"
              "\n"
              "libvirt management daemon:\n"),
            argv0);
1133 1134 1135

    if (privileged) {
        fprintf(stderr,
1136 1137 1138 1139
                _("\n"
                  "  Default paths:\n"
                  "\n"
                  "    Configuration file (unless overridden by -f):\n"
1140
                  "      %s\n"
1141 1142
                  "\n"
                  "    Sockets:\n"
1143 1144
                  "      %s\n"
                  "      %s\n"
1145 1146
                  "\n"
                  "    TLS:\n"
1147 1148 1149
                  "      CA certificate:     %s\n"
                  "      Server certificate: %s\n"
                  "      Server private key: %s\n"
1150 1151 1152 1153
                  "\n"
                  "    PID file (unless overridden by -p):\n"
                  "      %s/run/libvirtd.pid\n"
                  "\n"),
1154 1155 1156
                LIBVIRTD_CONFIGURATION_FILE,
                LIBVIRTD_PRIV_UNIX_SOCKET,
                LIBVIRTD_PRIV_UNIX_SOCKET_RO,
1157 1158 1159
                LIBVIRT_CACERT,
                LIBVIRT_SERVERCERT,
                LIBVIRT_SERVERKEY,
1160 1161
                LOCALSTATEDIR);
    } else {
1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179
        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"));
1180
    }
1181 1182
}

D
Daniel P. Berrange 已提交
1183
int main(int argc, char **argv) {
1184
    virNetDaemonPtr dmn = NULL;
1185
    virNetServerPtr srv = NULL;
1186
    virNetServerPtr srvAdm = NULL;
1187
    char *remote_config_file = NULL;
1188
    int statuswrite = -1;
1189
    int ret = 1;
1190
    int pid_file_fd = -1;
1191 1192 1193
    char *pid_file = NULL;
    char *sock_file = NULL;
    char *sock_file_ro = NULL;
1194
    char *sock_file_adm = NULL;
1195 1196 1197 1198 1199 1200
    int timeout = -1;        /* -t: Shutdown timeout */
    int verbose = 0;
    int godaemon = 0;
    int ipsock = 0;
    struct daemonConfig *config;
    bool privileged = geteuid() == 0 ? true : false;
1201
    bool implicit_conf = false;
1202 1203
    char *run_dir = NULL;
    mode_t old_umask;
D
Daniel P. Berrange 已提交
1204 1205

    struct option opts[] = {
1206 1207 1208
        { "verbose", no_argument, &verbose, 'v'},
        { "daemon", no_argument, &godaemon, 'd'},
        { "listen", no_argument, &ipsock, 'l'},
1209
        { "config", required_argument, NULL, 'f'},
1210 1211
        { "timeout", required_argument, NULL, 't'},
        { "pid-file", required_argument, NULL, 'p'},
1212 1213
        { "version", no_argument, NULL, 'V' },
        { "help", no_argument, NULL, 'h' },
D
Daniel P. Berrange 已提交
1214 1215 1216
        {0, 0, 0, 0}
    };

1217
    if (virGettextInitialize() < 0 ||
E
Eric Blake 已提交
1218
        virInitialize() < 0) {
1219
        fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
E
Eric Blake 已提交
1220
        exit(EXIT_FAILURE);
1221
    }
D
Daniel P. Berrange 已提交
1222

1223 1224
    virUpdateSelfLastChanged(argv[0]);

1225 1226
    virFileActivateDirOverride(argv[0]);

D
Daniel P. Berrange 已提交
1227 1228 1229 1230 1231
    while (1) {
        int optidx = 0;
        int c;
        char *tmp;

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

1234
        if (c == -1)
D
Daniel P. Berrange 已提交
1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246
            break;

        switch (c) {
        case 0:
            /* Got one of the flags */
            break;
        case 'v':
            verbose = 1;
            break;
        case 'd':
            godaemon = 1;
            break;
1247 1248
        case 'l':
            ipsock = 1;
D
Daniel P. Berrange 已提交
1249 1250 1251
            break;

        case 't':
1252
            if (virStrToLong_i(optarg, &tmp, 10, &timeout) != 0
1253 1254
                || timeout <= 0
                /* Ensure that we can multiply by 1000 without overflowing.  */
1255 1256 1257 1258
                || timeout > INT_MAX / 1000) {
                VIR_ERROR(_("Invalid value for timeout"));
                exit(EXIT_FAILURE);
            }
D
Daniel P. Berrange 已提交
1259
            break;
1260 1261

        case 'p':
1262
            VIR_FREE(pid_file);
1263
            if (VIR_STRDUP_QUIET(pid_file, optarg) < 0) {
1264
                VIR_ERROR(_("Can't allocate memory"));
1265
                exit(EXIT_FAILURE);
1266
            }
1267 1268 1269
            break;

        case 'f':
1270
            VIR_FREE(remote_config_file);
1271
            if (VIR_STRDUP_QUIET(remote_config_file, optarg) < 0) {
1272
                VIR_ERROR(_("Can't allocate memory"));
1273
                exit(EXIT_FAILURE);
1274
            }
1275 1276
            break;

1277
        case 'V':
1278
            daemonVersion(argv[0]);
1279
            exit(EXIT_SUCCESS);
1280

1281
        case 'h':
1282
            daemonUsage(argv[0], privileged);
1283
            exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
1284

1285
        case '?':
D
Daniel P. Berrange 已提交
1286
        default:
1287
            daemonUsage(argv[0], privileged);
1288
            exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
1289 1290 1291
        }
    }

1292 1293 1294 1295 1296 1297
    if (optind != argc) {
        fprintf(stderr, "%s: unexpected, non-option, command line arguments\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

1298 1299
    if (!(config = daemonConfigNew(privileged))) {
        VIR_ERROR(_("Can't create initial configuration"));
1300
        exit(EXIT_FAILURE);
1301
    }
1302 1303

    /* No explicit config, so try and find a default one */
1304 1305 1306
    if (remote_config_file == NULL) {
        implicit_conf = true;
        if (daemonConfigFilePath(privileged,
1307 1308
                                 &remote_config_file) < 0) {
            VIR_ERROR(_("Can't determine config path"));
1309
            exit(EXIT_FAILURE);
1310
        }
1311
    }
1312 1313 1314

    /* Read the config file if it exists*/
    if (remote_config_file &&
1315
        daemonConfigLoadFile(config, remote_config_file, implicit_conf) < 0) {
1316 1317 1318 1319 1320 1321
        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);
1322
        exit(EXIT_FAILURE);
1323
    }
1324

1325
    if (!privileged &&
1326 1327
        migrateProfile() < 0) {
        VIR_ERROR(_("Exiting due to failure to migrate profile"));
1328
        exit(EXIT_FAILURE);
1329
    }
1330

1331 1332
    if (daemonSetupHostUUID(config) < 0) {
        VIR_ERROR(_("Can't setup host uuid"));
1333
        exit(EXIT_FAILURE);
1334 1335
    }

1336 1337
    if (daemonSetupLogging(config, privileged, verbose, godaemon) < 0) {
        VIR_ERROR(_("Can't initialize logging"));
1338
        exit(EXIT_FAILURE);
1339
    }
1340

1341 1342 1343 1344 1345
    if (daemonSetupAccessManager(config) < 0) {
        VIR_ERROR(_("Can't initialize access manager"));
        exit(EXIT_FAILURE);
    }

1346
    if (!pid_file &&
1347 1348 1349 1350
        virPidFileConstructPath(privileged,
                                LOCALSTATEDIR,
                                "libvirtd",
                                &pid_file) < 0) {
1351
        VIR_ERROR(_("Can't determine pid file path."));
1352
        exit(EXIT_FAILURE);
1353
    }
1354
    VIR_DEBUG("Decided on pid file path '%s'", NULLSTR(pid_file));
1355 1356 1357 1358

    if (daemonUnixSocketPaths(config,
                              privileged,
                              &sock_file,
1359 1360
                              &sock_file_ro,
                              &sock_file_adm) < 0) {
1361
        VIR_ERROR(_("Can't determine socket paths"));
1362
        exit(EXIT_FAILURE);
1363
    }
1364 1365 1366 1367
    VIR_DEBUG("Decided on socket paths '%s', '%s' and '%s'",
              sock_file,
              NULLSTR(sock_file_ro),
              NULLSTR(sock_file_adm));
1368

1369
    if (godaemon) {
1370
        char ebuf[1024];
1371 1372 1373 1374

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

1378
        if ((statuswrite = daemonForkIntoBackground(argv[0])) < 0) {
1379
            VIR_ERROR(_("Failed to fork as daemon: %s"),
1380
                      virStrerror(errno, ebuf, sizeof(ebuf)));
1381
            goto cleanup;
1382 1383 1384
        }
    }

J
John Levon 已提交
1385
    /* Ensure the rundir exists (on tmpfs on some systems) */
1386
    if (privileged) {
1387 1388 1389 1390
        if (VIR_STRDUP_QUIET(run_dir, LOCALSTATEDIR "/run/libvirt") < 0) {
            VIR_ERROR(_("Can't allocate memory"));
            goto cleanup;
        }
1391
    } else {
1392
        run_dir = virGetUserRuntimeDirectory();
1393

1394
        if (!run_dir) {
1395 1396
            VIR_ERROR(_("Can't determine user directory"));
            goto cleanup;
J
John Levon 已提交
1397 1398
        }
    }
1399 1400 1401 1402
    if (privileged)
        old_umask = umask(022);
    else
        old_umask = umask(077);
1403
    VIR_DEBUG("Ensuring run dir '%s' exists", run_dir);
1404 1405 1406 1407 1408 1409 1410 1411
    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 已提交
1412

1413
    /* Try to claim the pidfile, exiting if we can't */
1414
    if ((pid_file_fd = virPidFileAcquirePath(pid_file, false, getpid())) < 0) {
1415 1416 1417 1418
        ret = VIR_DAEMON_ERR_PIDFILE;
        goto cleanup;
    }

1419 1420 1421 1422 1423
    if (virNetlinkStartup() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1424
    if (!(srv = virNetServerNew("libvirtd", 1,
1425
                                config->min_workers,
1426
                                config->max_workers,
1427
                                config->prio_workers,
1428
                                config->max_clients,
1429
                                config->max_anonymous_clients,
1430 1431
                                config->keepalive_interval,
                                config->keepalive_count,
1432
                                config->mdns_adv ? config->mdns_name : NULL,
1433
                                remoteClientInitHook,
1434
                                NULL,
1435
                                remoteClientFreeFunc,
1436
                                NULL))) {
1437 1438 1439 1440
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1441
    if (!(dmn = virNetDaemonNew()) ||
1442
        virNetDaemonAddServer(dmn, srv) < 0) {
1443 1444 1445 1446
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1447 1448 1449
    /* Beyond this point, nothing should rely on using
     * getuid/geteuid() == 0, for privilege level checks.
     */
1450
    VIR_DEBUG("Dropping privileges (if required)");
1451
    if (daemonSetupPrivs() < 0) {
1452
        ret = VIR_DAEMON_ERR_PRIVS;
1453
        goto cleanup;
1454
    }
J
John Levon 已提交
1455

1456
    daemonInitialize();
1457

1458 1459 1460 1461 1462 1463 1464 1465 1466
    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))) {
1467
        ret = VIR_DAEMON_ERR_INIT;
1468 1469 1470 1471 1472
        goto cleanup;
    }
    if (virNetServerAddProgram(srv, remoteProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1473
    }
1474

1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486
    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;
    }

1487 1488 1489 1490 1491 1492 1493 1494 1495 1496
    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;
1497
    }
1498

1499
    if (!(srvAdm = virNetServerNew("admin", 1,
1500
                                   config->admin_min_workers,
1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515
                                   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;
    }

1516
    if (virNetDaemonAddServer(dmn, srvAdm) < 0) {
1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532
        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;
    }

1533 1534
    if (timeout != -1) {
        VIR_DEBUG("Registering shutdown timeout %d", timeout);
1535
        virNetDaemonAutoShutdown(dmn, timeout);
1536
    }
1537

1538
    if ((daemonSetupSignals(dmn)) < 0) {
1539 1540
        ret = VIR_DAEMON_ERR_SIGNAL;
        goto cleanup;
1541
    }
D
Daniel P. Berrange 已提交
1542

1543
    if (config->audit_level) {
1544
        VIR_DEBUG("Attempting to configure auditing subsystem");
1545
        if (virAuditOpen() < 0) {
1546
            if (config->audit_level > 1) {
1547
                ret = VIR_DAEMON_ERR_AUDIT;
1548
                goto cleanup;
1549
            }
1550
            VIR_DEBUG("Proceeding without auditing");
1551 1552
        }
    }
E
Eric Blake 已提交
1553
    virAuditLog(config->audit_logging > 0);
1554

1555
    /* setup the hooks if any */
1556
    if (virHookInitialize() < 0) {
1557
        ret = VIR_DAEMON_ERR_HOOKS;
1558
        goto cleanup;
1559 1560
    }

1561
    /* Disable error func, now logging is setup */
1562
    virSetErrorFunc(NULL, daemonErrorHandler);
1563
    virSetErrorLogPriorityFunc(daemonErrorLogFilter);
1564

1565 1566 1567 1568 1569 1570
    /*
     * 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,
1571
                0, "start", NULL, NULL);
1572

1573 1574 1575 1576 1577
    if (daemonSetupNetworking(srv, srvAdm,
                              config,
                              sock_file,
                              sock_file_ro,
                              sock_file_adm,
1578
                              ipsock, privileged) < 0) {
1579
        ret = VIR_DAEMON_ERR_NETWORK;
1580
        goto cleanup;
1581 1582
    }

1583 1584 1585 1586 1587 1588 1589 1590 1591
    /* 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)
            ;
1592
        VIR_FORCE_CLOSE(statuswrite);
1593 1594
    }

1595
    /* Initialize drivers & then start accepting new clients from network */
1596
    if (daemonStateInit(dmn) < 0) {
1597 1598
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1599
    }
D
Daniel P. Berrange 已提交
1600

1601
#if defined(__linux__) && defined(NETLINK_ROUTE)
1602 1603
    /* Register the netlink event service for NETLINK_ROUTE */
    if (virNetlinkEventServiceStart(NETLINK_ROUTE, 0) < 0) {
1604 1605 1606
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1607
#endif
1608

1609
#if defined(__linux__) && defined(NETLINK_KOBJECT_UEVENT)
T
Tang Chen 已提交
1610 1611 1612 1613 1614
    /* Register the netlink event service for NETLINK_KOBJECT_UEVENT */
    if (virNetlinkEventServiceStart(NETLINK_KOBJECT_UEVENT, 1) < 0) {
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1615
#endif
T
Tang Chen 已提交
1616

1617
    /* Run event loop. */
1618
    virNetDaemonRun(dmn);
1619

1620 1621
    ret = 0;

1622
    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
1623
                0, "shutdown", NULL, NULL);
1624

1625
 cleanup:
1626
    virNetlinkEventServiceStopAll();
1627
    virObjectUnref(remoteProgram);
1628
    virObjectUnref(lxcProgram);
1629
    virObjectUnref(qemuProgram);
1630
    virObjectUnref(adminProgram);
1631 1632
    virNetDaemonClose(dmn);
    virObjectUnref(dmn);
1633
    virObjectUnref(srv);
1634
    virObjectUnref(srvAdm);
1635
    virNetlinkShutdown();
1636 1637 1638 1639 1640 1641 1642 1643
    if (statuswrite != -1) {
        if (ret != 0) {
            /* Tell parent of daemon what failed */
            char status = ret;
            while (write(statuswrite, &status, 1) == -1 &&
                   errno == EINTR)
                ;
        }
1644
        VIR_FORCE_CLOSE(statuswrite);
1645
    }
1646 1647
    if (pid_file_fd != -1)
        virPidFileReleasePath(pid_file, pid_file_fd);
1648 1649 1650

    VIR_FREE(sock_file);
    VIR_FREE(sock_file_ro);
1651
    VIR_FREE(sock_file_adm);
1652 1653
    VIR_FREE(pid_file);
    VIR_FREE(remote_config_file);
1654 1655
    VIR_FREE(run_dir);

1656 1657
    daemonConfigFree(config);

1658 1659
    if (driversInitialized) {
        driversInitialized = false;
1660
        virStateCleanup();
1661
    }
1662

1663
    return ret;
D
Daniel P. Berrange 已提交
1664
}