libvirtd.c 45.5 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>
E
Eric Blake 已提交
33
#include <locale.h>
34

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

42 43
#define VIR_FROM_THIS VIR_FROM_QEMU

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

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"
D
Daniel P. Berrange 已提交
60

61
#ifdef WITH_DRIVER_MODULES
62
# include "driver.h"
63
#else
64 65 66 67 68 69
# ifdef WITH_QEMU
#  include "qemu/qemu_driver.h"
# endif
# ifdef WITH_LXC
#  include "lxc/lxc_driver.h"
# endif
70 71 72
# ifdef WITH_XEN
#  include "xen/xen_driver.h"
# endif
J
Jim Fehlig 已提交
73 74 75
# ifdef WITH_LIBXL
#  include "libxl/libxl_driver.h"
# endif
76 77 78
# ifdef WITH_UML
#  include "uml/uml_driver.h"
# endif
79 80 81
# ifdef WITH_VBOX
#  include "vbox/vbox_driver.h"
# endif
R
Roman Bogorodskiy 已提交
82 83 84
# ifdef WITH_BHYVE
#  include "bhyve/bhyve_driver.h"
# endif
85 86 87
# ifdef WITH_NETWORK
#  include "network/bridge_driver.h"
# endif
88 89
# ifdef WITH_INTERFACE
#  include "interface/interface_driver.h"
90
# endif
91
# ifdef WITH_STORAGE
92 93 94 95 96 97 98 99
#  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
100 101 102
# ifdef WITH_NWFILTER
#  include "nwfilter/nwfilter_driver.h"
# endif
103
#endif
104

105 106
#include "configmake.h"

107 108
#include "virdbus.h"

109 110
VIR_LOG_INIT("daemon.libvirtd");

111
#if WITH_SASL
112
virNetSASLContextPtr saslCtxt = NULL;
113
#endif
114 115
virNetServerProgramPtr remoteProgram = NULL;
virNetServerProgramPtr qemuProgram = NULL;
116
virNetServerProgramPtr lxcProgram = NULL;
117

118 119
volatile bool driversInitialized = false;

120 121 122 123 124 125 126 127 128
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,
129
    VIR_DAEMON_ERR_HOOKS,
130
    VIR_DAEMON_ERR_AUDIT,
131 132 133 134 135 136 137 138 139 140 141 142 143

    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",
144
              "Unable to load configuration file",
145 146
              "Unable to look for hook scripts",
              "Unable to initialize audit system")
147

148
static int daemonForkIntoBackground(const char *argv0)
149
{
150 151 152 153
    int statuspipe[2];
    if (pipe(statuspipe) < 0)
        return -1;

154
    pid_t pid = fork();
D
Daniel P. Berrange 已提交
155 156 157
    switch (pid) {
    case 0:
        {
E
Eric Blake 已提交
158
            /* intermediate child */
D
Daniel P. Berrange 已提交
159 160
            int stdinfd = -1;
            int stdoutfd = -1;
161
            int nextpid;
D
Daniel P. Berrange 已提交
162

163
            VIR_FORCE_CLOSE(statuspipe[0]);
164

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

            if (setsid() < 0)
                goto cleanup;

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

        cleanup:
194 195
            VIR_FORCE_CLOSE(stdoutfd);
            VIR_FORCE_CLOSE(stdinfd);
E
Eric Blake 已提交
196 197
            VIR_FORCE_CLOSE(statuspipe[1]);
            _exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
198 199 200

        }

E
Eric Blake 已提交
201 202
    case -1: /* error in parent */
        goto error;
D
Daniel P. Berrange 已提交
203 204 205

    default:
        {
E
Eric Blake 已提交
206
            /* parent */
207 208 209
            int ret;
            char status;

210
            VIR_FORCE_CLOSE(statuspipe[1]);
211 212

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

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

E
Eric Blake 已提交
224 225 226 227 228
            VIR_FORCE_CLOSE(statuspipe[0]);

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

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

245
 error:
E
Eric Blake 已提交
246 247 248
    VIR_FORCE_CLOSE(statuspipe[0]);
    VIR_FORCE_CLOSE(statuspipe[1]);
    return -1;
D
Daniel P. Berrange 已提交
249 250
}

251

252 253 254 255 256
static int
daemonUnixSocketPaths(struct daemonConfig *config,
                      bool privileged,
                      char **sockfile,
                      char **rosockfile)
J
John Levon 已提交
257
{
258 259
    if (config->unix_sock_dir) {
        if (virAsprintf(sockfile, "%s/libvirt-sock", config->unix_sock_dir) < 0)
260
            goto error;
261 262
        if (privileged &&
            virAsprintf(rosockfile, "%s/libvirt-sock-ro", config->unix_sock_dir) < 0)
263
            goto error;
D
Daniel P. Berrange 已提交
264
    } else {
265
        if (privileged) {
266 267 268
            if (VIR_STRDUP(*sockfile, LOCALSTATEDIR "/run/libvirt/libvirt-sock") < 0 ||
                VIR_STRDUP(*rosockfile, LOCALSTATEDIR "/run/libvirt/libvirt-sock-ro") < 0)
                goto error;
269
        } else {
270 271
            char *rundir = NULL;
            mode_t old_umask;
272

273
            if (!(rundir = virGetUserRuntimeDirectory()))
274
                goto error;
275

276 277 278 279 280 281 282
            old_umask = umask(077);
            if (virFileMakePath(rundir) < 0) {
                umask(old_umask);
                goto error;
            }
            umask(old_umask);

283
            if (virAsprintf(sockfile, "%s/libvirt-sock", rundir) < 0) {
284
                VIR_FREE(rundir);
285
                goto error;
286
            }
287

288
            VIR_FREE(rundir);
289 290 291
        }
    }
    return 0;
292

293
 error:
294
    return -1;
D
Daniel P. Berrange 已提交
295 296
}

297 298 299

static void daemonErrorHandler(void *opaque ATTRIBUTE_UNUSED,
                               virErrorPtr err ATTRIBUTE_UNUSED)
300 301 302 303 304
{
    /* Don't do anything, since logging infrastructure already
     * took care of reporting the error */
}

305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
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:
322
    case VIR_ERR_OPERATION_INVALID:
323
    case VIR_ERR_NO_DOMAIN_METADATA:
324 325 326 327 328 329
        return VIR_LOG_DEBUG;
    }

    return priority;
}

330 331
static void daemonInitialize(void)
{
332 333
    /*
     * Note that the order is important: the first ones have a higher
334 335 336
     * 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
337
     * domains can be auto-started.
338
     */
339 340 341
#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 已提交
342
     * If they try to open a connection for a module that
343 344
     * is not loaded they'll get a suitable error at that point
     */
345
# ifdef WITH_NETWORK
346
    virDriverLoadModule("network");
347
# endif
348 349 350
# ifdef WITH_INTERFACE
    virDriverLoadModule("interface");
# endif
351
# ifdef WITH_STORAGE
352
    virDriverLoadModule("storage");
353 354
# endif
# ifdef WITH_NODE_DEVICES
355
    virDriverLoadModule("nodedev");
356 357
# endif
# ifdef WITH_SECRETS
358
    virDriverLoadModule("secret");
359 360 361 362
# endif
# ifdef WITH_NWFILTER
    virDriverLoadModule("nwfilter");
# endif
363 364 365 366 367 368
# ifdef WITH_XEN
    virDriverLoadModule("xen");
# endif
# ifdef WITH_LIBXL
    virDriverLoadModule("libxl");
# endif
369
# ifdef WITH_QEMU
370
    virDriverLoadModule("qemu");
371 372
# endif
# ifdef WITH_LXC
373
    virDriverLoadModule("lxc");
374 375
# endif
# ifdef WITH_UML
376
    virDriverLoadModule("uml");
377
# endif
M
Michal Privoznik 已提交
378 379 380
# ifdef WITH_VBOX
    virDriverLoadModule("vbox");
# endif
R
Roman Bogorodskiy 已提交
381 382 383
# ifdef WITH_BHYVE
    virDriverLoadModule("bhyve");
# endif
384
#else
385
# ifdef WITH_NETWORK
386
    networkRegister();
387
# endif
388
# ifdef WITH_INTERFACE
389
    interfaceRegister();
390
# endif
391
# ifdef WITH_STORAGE
392
    storageRegister();
393
# endif
394
# ifdef WITH_NODE_DEVICES
395
    nodedevRegister();
396 397
# endif
# ifdef WITH_SECRETS
398
    secretRegister();
399
# endif
400 401 402
# ifdef WITH_NWFILTER
    nwfilterRegister();
# endif
403 404 405
# ifdef WITH_XEN
    xenRegister();
# endif
J
Jim Fehlig 已提交
406 407 408
# ifdef WITH_LIBXL
    libxlRegister();
# endif
409
# ifdef WITH_QEMU
410
    qemuRegister();
411 412
# endif
# ifdef WITH_LXC
413
    lxcRegister();
414 415
# endif
# ifdef WITH_UML
416
    umlRegister();
417
# endif
M
Michal Privoznik 已提交
418 419 420
# ifdef WITH_VBOX
    vboxRegister();
# endif
R
Roman Bogorodskiy 已提交
421 422 423
# ifdef WITH_BHYVE
    bhyveRegister();
# endif
424
#endif
425 426 427
}


428 429 430 431 432 433 434
static int ATTRIBUTE_NONNULL(3)
daemonSetupNetworking(virNetServerPtr srv,
                      struct daemonConfig *config,
                      const char *sock_path,
                      const char *sock_path_ro,
                      bool ipsock,
                      bool privileged)
435 436 437 438
{
    virNetServerServicePtr svc = NULL;
    virNetServerServicePtr svcRO = NULL;
    virNetServerServicePtr svcTCP = NULL;
439
#if WITH_GNUTLS
440
    virNetServerServicePtr svcTLS = NULL;
441
#endif
442 443 444 445
    gid_t unix_sock_gid = 0;
    int unix_sock_ro_mask = 0;
    int unix_sock_rw_mask = 0;

446 447 448
    unsigned int cur_fd = STDERR_FILENO + 1;
    unsigned int nfds = virGetListenFDs();

449 450 451 452
    if (config->unix_sock_group) {
        if (virGetGroupID(config->unix_sock_group, &unix_sock_gid) < 0)
            return -1;
    }
453

454
    if (nfds > (sock_path_ro ? 2 : 1)) {
455 456 457 458
        VIR_ERROR(_("Too many (%u) FDs passed from caller"), nfds);
        return -1;
    }

459 460 461 462
    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);
        goto error;
    }
463

464 465 466 467
    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);
        goto error;
    }
468

469 470 471 472
    if (!(svc = virNetServerServiceNewFDOrUNIX(sock_path,
                                               unix_sock_rw_mask,
                                               unix_sock_gid,
                                               config->auth_unix_rw,
473
#if WITH_GNUTLS
474
                                               NULL,
475
#endif
476 477 478 479
                                               false,
                                               config->max_queued_clients,
                                               config->max_client_requests,
                                               nfds, &cur_fd)))
480
        goto error;
481
    if (sock_path_ro) {
482 483 484 485
        if (!(svcRO = virNetServerServiceNewFDOrUNIX(sock_path_ro,
                                                     unix_sock_ro_mask,
                                                     unix_sock_gid,
                                                     config->auth_unix_ro,
486
#if WITH_GNUTLS
487
                                                     NULL,
488
#endif
489 490 491 492
                                                     true,
                                                     config->max_queued_clients,
                                                     config->max_client_requests,
                                                     nfds, &cur_fd)))
493 494
            goto error;
    }
495

496 497 498 499
    if (virNetServerAddService(srv, svc,
                               config->mdns_adv && !ipsock ?
                               "_libvirt._tcp" :
                               NULL) < 0)
500
        goto error;
501

502 503 504
    if (svcRO &&
        virNetServerAddService(srv, svcRO, NULL) < 0)
        goto error;
505

506
    if (ipsock) {
507
        if (config->listen_tcp) {
508 509
            VIR_DEBUG("Registering TCP socket %s:%s",
                      config->listen_addr, config->tcp_port);
510 511
            if (!(svcTCP = virNetServerServiceNewTCP(config->listen_addr,
                                                     config->tcp_port,
512
                                                     AF_UNSPEC,
513
                                                     config->auth_tcp,
514
#if WITH_GNUTLS
515 516
                                                     NULL,
#endif
517
                                                     false,
M
Michal Privoznik 已提交
518
                                                     config->max_queued_clients,
519
                                                     config->max_client_requests)))
520
                goto error;
521

522 523 524
            if (virNetServerAddService(srv, svcTCP,
                                       config->mdns_adv ? "_libvirt._tcp" : NULL) < 0)
                goto error;
525 526
        }

527
#if WITH_GNUTLS
528 529
        if (config->listen_tls) {
            virNetTLSContextPtr ctxt = NULL;
530

531 532 533 534 535 536 537 538
            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,
539
                                                       config->tls_no_sanity_certificate ? false : true,
540 541 542 543 544 545
                                                       config->tls_no_verify_certificate ? false : true)))
                    goto error;
            } else {
                if (!(ctxt = virNetTLSContextNewServerPath(NULL,
                                                           !privileged,
                                                           (const char *const*)config->tls_allowed_dn_list,
546
                                                           config->tls_no_sanity_certificate ? false : true,
547 548
                                                           config->tls_no_verify_certificate ? false : true)))
                    goto error;
549 550
            }

551 552
            VIR_DEBUG("Registering TLS socket %s:%s",
                      config->listen_addr, config->tls_port);
553 554 555
            if (!(svcTLS =
                  virNetServerServiceNewTCP(config->listen_addr,
                                            config->tls_port,
556
                                            AF_UNSPEC,
557
                                            config->auth_tls,
558
                                            ctxt,
559
                                            false,
M
Michal Privoznik 已提交
560
                                            config->max_queued_clients,
561
                                            config->max_client_requests))) {
562
                virObjectUnref(ctxt);
563
                goto error;
564
            }
565 566 567 568
            if (virNetServerAddService(srv, svcTLS,
                                       config->mdns_adv &&
                                       !config->listen_tcp ? "_libvirt._tcp" : NULL) < 0)
                goto error;
569

570
            virObjectUnref(ctxt);
571
        }
572 573 574 575 576 577 578 579
#else
        (void)privileged;
        if (config->listen_tls) {
            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                           _("This libvirtd build does not support TLS"));
            goto error;
        }
#endif
580 581
    }

582
#if WITH_SASL
583 584
    if (config->auth_unix_rw == REMOTE_AUTH_SASL ||
        config->auth_unix_ro == REMOTE_AUTH_SASL ||
585
# if WITH_GNUTLS
586 587 588
        config->auth_tls == REMOTE_AUTH_SASL ||
# endif
        config->auth_tcp == REMOTE_AUTH_SASL) {
589 590 591
        saslCtxt = virNetSASLContextNewServer(
            (const char *const*)config->sasl_allowed_username_list);
        if (!saslCtxt)
592
            goto error;
D
Daniel P. Berrange 已提交
593
    }
594
#endif
D
Daniel P. Berrange 已提交
595 596

    return 0;
597

598
 error:
599
#if WITH_GNUTLS
600
    virObjectUnref(svcTLS);
601
#endif
602 603 604
    virObjectUnref(svcTCP);
    virObjectUnref(svc);
    virObjectUnref(svcRO);
605
    return -1;
D
Daniel P. Berrange 已提交
606 607 608
}


609 610
/*
 * Set up the logging environment
611 612
 * By default if daemonized all errors go to the logfile libvirtd.log,
 * but if verbose or error debugging is asked for then also output
613
 * informational and debug messages. Default size if 64 kB.
614
 */
615
static int
616 617 618 619
daemonSetupLogging(struct daemonConfig *config,
                   bool privileged,
                   bool verbose,
                   bool godaemon)
620
{
621 622
    virLogReset();

623
    /*
624 625 626 627 628 629 630 631 632 633 634 635
     * 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.
636
     */
637 638
    if (config->log_level != 0)
        virLogSetDefaultPriority(config->log_level);
639

640
    virLogSetFromEnv();
641

642 643 644 645 646
    if (virLogGetNbFilters() == 0)
        virLogParseFilters(config->log_filters);

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

648 649 650 651 652 653
    /*
     * Command line override for --verbose
     */
    if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
        virLogSetDefaultPriority(VIR_LOG_INFO);

654
    /*
655 656 657 658
     * 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)....
659
     */
660 661
    if (virLogGetNbOutputs() == 0 &&
        (godaemon || !isatty(STDIN_FILENO))) {
662 663
        char *tmp;
        if (access("/run/systemd/journal/socket", W_OK) >= 0) {
664 665 666 667 668 669 670 671
            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)
672
                goto error;
673 674 675 676 677 678 679
            virLogParseOutputs(tmp);
            VIR_FREE(tmp);
        }
    }

    /*
     * otherwise direct to libvirtd.log when running
680
     * as daemon. Otherwise the default output is stderr.
681
     */
682
    if (virLogGetNbOutputs() == 0) {
683
        char *tmp = NULL;
684

685
        if (godaemon) {
686
            if (privileged) {
687 688 689
                if (virAsprintf(&tmp, "%d:file:%s/log/libvirt/libvirtd.log",
                                virLogGetDefaultPriority(),
                                LOCALSTATEDIR) == -1)
690
                    goto error;
691
            } else {
692
                char *logdir = virGetUserCacheDirectory();
693 694 695 696 697 698 699 700
                mode_t old_umask;

                if (!logdir)
                    goto error;

                old_umask = umask(077);
                if (virFileMakePath(logdir) < 0) {
                    umask(old_umask);
701
                    goto error;
702 703
                }
                umask(old_umask);
704

705 706 707
                if (virAsprintf(&tmp, "%d:file:%s/libvirtd.log",
                                virLogGetDefaultPriority(), logdir) == -1) {
                    VIR_FREE(logdir);
708
                    goto error;
E
Eric Blake 已提交
709
                }
710
                VIR_FREE(logdir);
711
            }
712
        } else {
713
            if (virAsprintf(&tmp, "%d:stderr", virLogGetDefaultPriority()) < 0)
714
                goto error;
715
        }
716 717
        virLogParseOutputs(tmp);
        VIR_FREE(tmp);
718
    }
719

720 721
    return 0;

722
 error:
723 724 725
    return -1;
}

726

727 728 729 730 731
static int
daemonSetupAccessManager(struct daemonConfig *config)
{
    virAccessManagerPtr mgr;
    const char *none[] = { "none", NULL };
J
Ján Tomko 已提交
732
    const char **drv = (const char **)config->access_drivers;
733

J
Ján Tomko 已提交
734 735 736
    if (!drv ||
        !drv[0])
        drv = none;
737

J
Ján Tomko 已提交
738
    if (!(mgr = virAccessManagerNewStack(drv)))
739 740 741 742 743 744 745 746
        return -1;

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


747 748
/* Display version information. */
static void
749
daemonVersion(const char *argv0)
750
{
751
    printf("%s (%s) %s\n", argv0, PACKAGE_NAME, PACKAGE_VERSION);
752 753
}

J
John Levon 已提交
754 755
#ifdef __sun
static int
756
daemonSetupPrivs(void)
J
John Levon 已提交
757
{
758
    chown("/var/run/libvirt", SYSTEM_UID, SYSTEM_UID);
J
John Levon 已提交
759

760 761
    if (__init_daemon_priv(PU_RESETGROUPS | PU_CLEARLIMITSET,
                           SYSTEM_UID, SYSTEM_UID, PRIV_XVM_CONTROL, NULL)) {
762
        VIR_ERROR(_("additional privileges are required"));
J
John Levon 已提交
763 764 765
        return -1;
    }

766 767
    if (priv_set(PRIV_OFF, PRIV_ALLSETS, PRIV_FILE_LINK_ANY, PRIV_PROC_INFO,
                 PRIV_PROC_SESSION, PRIV_PROC_EXEC, PRIV_PROC_FORK, NULL)) {
768
        VIR_ERROR(_("failed to set reduced privileges"));
J
John Levon 已提交
769 770 771 772 773 774
        return -1;
    }

    return 0;
}
#else
775
# define daemonSetupPrivs() 0
J
John Levon 已提交
776 777
#endif

778

779
static void daemonShutdownHandler(virNetDaemonPtr dmn,
780 781
                                  siginfo_t *sig ATTRIBUTE_UNUSED,
                                  void *opaque ATTRIBUTE_UNUSED)
782
{
783
    virNetDaemonQuit(dmn);
784
}
785

786
static void daemonReloadHandler(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
787 788 789
                                siginfo_t *sig ATTRIBUTE_UNUSED,
                                void *opaque ATTRIBUTE_UNUSED)
{
790 791 792 793 794
    if (!driversInitialized) {
        VIR_WARN("Drivers are not initialized, reload ignored");
        return;
    }

W
Wang Rui 已提交
795 796 797 798 799
    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");
800 801
}

802
static int daemonSetupSignals(virNetDaemonPtr dmn)
803
{
804
    if (virNetDaemonAddSignalHandler(dmn, SIGINT, daemonShutdownHandler, NULL) < 0)
805
        return -1;
806
    if (virNetDaemonAddSignalHandler(dmn, SIGQUIT, daemonShutdownHandler, NULL) < 0)
807
        return -1;
808
    if (virNetDaemonAddSignalHandler(dmn, SIGTERM, daemonShutdownHandler, NULL) < 0)
809
        return -1;
810
    if (virNetDaemonAddSignalHandler(dmn, SIGHUP, daemonReloadHandler, NULL) < 0)
811
        return -1;
812 813
    return 0;
}
814

815 816 817

static void daemonInhibitCallback(bool inhibit, void *opaque)
{
818
    virNetDaemonPtr dmn = opaque;
819 820

    if (inhibit)
821
        virNetDaemonAddShutdownInhibition(dmn);
822
    else
823
        virNetDaemonRemoveShutdownInhibition(dmn);
824 825 826
}


827 828 829 830 831 832
#ifdef HAVE_DBUS
static DBusConnection *sessionBus;
static DBusConnection *systemBus;

static void daemonStopWorker(void *opaque)
{
833
    virNetDaemonPtr dmn = opaque;
834

835
    VIR_DEBUG("Begin stop dmn=%p", dmn);
836 837 838

    ignore_value(virStateStop());

839
    VIR_DEBUG("Completed stop dmn=%p", dmn);
840 841

    /* Exit libvirtd cleanly */
842
    virNetDaemonQuit(dmn);
843 844 845 846
}


/* We do this in a thread to not block the main loop */
847
static void daemonStop(virNetDaemonPtr dmn)
848 849
{
    virThread thr;
850 851 852
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonStopWorker, dmn) < 0)
        virObjectUnref(dmn);
853 854 855 856 857 858 859 860
}


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

863
    VIR_DEBUG("dmn=%p", dmn);
864 865 866 867

    if (dbus_message_is_signal(message,
                               DBUS_INTERFACE_LOCAL,
                               "Disconnected"))
868
        daemonStop(dmn);
869 870 871 872 873 874 875 876 877 878

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}


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

881
    VIR_DEBUG("dmn=%p", dmn);
882 883 884 885

    if (dbus_message_is_signal(message,
                               "org.freedesktop.login1.Manager",
                               "PrepareForShutdown"))
886
        daemonStop(dmn);
887 888 889 890 891 892

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
#endif


893 894
static void daemonRunStateInit(void *opaque)
{
895
    virNetDaemonPtr dmn = opaque;
896 897 898
    virIdentityPtr sysident = virIdentityGetSystem();

    virIdentitySetCurrent(sysident);
899

900 901
    /* Since driver initialization can take time inhibit daemon shutdown until
       we're done so clients get a chance to connect */
902
    daemonInhibitCallback(true, dmn);
903

904
    /* Start the stateful HV drivers
E
Eric Blake 已提交
905
     * This is deliberately done after telling the parent process
906 907
     * we're ready, since it can take a long time and this will
     * seriously delay OS bootup process */
908
    if (virStateInitialize(virNetDaemonIsPrivileged(dmn),
909
                           daemonInhibitCallback,
910
                           dmn) < 0) {
911
        VIR_ERROR(_("Driver state initialization failed"));
912 913
        /* Ensure the main event loop quits */
        kill(getpid(), SIGTERM);
914
        goto cleanup;
915 916
    }

917 918
    driversInitialized = true;

919 920
#ifdef HAVE_DBUS
    /* Tie the non-priviledged libvirtd to the session/shutdown lifecycle */
921
    if (!virNetDaemonIsPrivileged(dmn)) {
922 923 924 925

        sessionBus = virDBusGetSessionBus();
        if (sessionBus != NULL)
            dbus_connection_add_filter(sessionBus,
926
                                       handleSessionMessageFunc, dmn, NULL);
927 928 929 930

        systemBus = virDBusGetSystemBus();
        if (systemBus != NULL) {
            dbus_connection_add_filter(systemBus,
931
                                       handleSystemMessageFunc, dmn, NULL);
932 933 934 935 936 937
            dbus_bus_add_match(systemBus,
                               "type='signal',sender='org.freedesktop.login1', interface='org.freedesktop.login1.Manager'",
                               NULL);
        }
    }
#endif
938
    /* Only now accept clients from network */
939
    virNetDaemonUpdateServices(dmn, true);
940
 cleanup:
941 942
    daemonInhibitCallback(false, dmn);
    virObjectUnref(dmn);
943 944
    virObjectUnref(sysident);
    virIdentitySetCurrent(NULL);
945
}
946

947
static int daemonStateInit(virNetDaemonPtr dmn)
948 949
{
    virThread thr;
950 951 952
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonRunStateInit, dmn) < 0) {
        virObjectUnref(dmn);
953 954
        return -1;
    }
955 956 957
    return 0;
}

958 959 960 961 962 963 964 965 966 967 968
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;

969 970
    VIR_DEBUG("Checking if user profile needs migrating");

971
    if (!(home = virGetUserDirectory()))
972 973
        goto cleanup;

974
    if (virAsprintf(&old_base, "%s/.libvirt", home) < 0)
975 976 977
        goto cleanup;

    /* if the new directory is there or the old one is not: do nothing */
978
    if (!(config_dir = virGetUserConfigDirectory()))
979 980 981
        goto cleanup;

    if (!virFileIsDir(old_base) || virFileExists(config_dir)) {
982 983 984
        VIR_DEBUG("No old profile in '%s' / "
                  "new profile directory already present '%s'",
                  old_base, config_dir);
985 986 987 988 989
        ret = 0;
        goto cleanup;
    }

    /* test if we already attempted to migrate first */
990
    if (virAsprintf(&updated, "%s/DEPRECATED-DIRECTORY", old_base) < 0)
991
        goto cleanup;
992
    if (virFileExists(updated))
993 994
        goto cleanup;

995
    config_home = virGetEnvBlockSUID("XDG_CONFIG_HOME");
996
    if (config_home && config_home[0] != '\0') {
997 998
        if (VIR_STRDUP(xdg_dir, config_home) < 0)
            goto cleanup;
999
    } else {
1000
        if (virAsprintf(&xdg_dir, "%s/.config", home) < 0)
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
            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;
    }

1018
    VIR_DEBUG("Profile migrated from %s to %s", old_base, config_dir);
1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
    ret = 0;

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

    return ret;
}

1031 1032
/* Print command-line usage. */
static void
1033
daemonUsage(const char *argv0, bool privileged)
1034
{
1035 1036 1037 1038 1039 1040
    fprintf(stderr,
            _("\n"
              "Usage:\n"
              "  %s [options]\n"
              "\n"
              "Options:\n"
1041
              "  -h | --help            Display program help:\n"
1042 1043 1044 1045 1046
              "  -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"
1047
              "  -V | --version         Display version information.\n"
1048 1049 1050 1051
              "  -p | --pid-file <file> Change name of PID file.\n"
              "\n"
              "libvirt management daemon:\n"),
            argv0);
1052 1053 1054

    if (privileged) {
        fprintf(stderr,
1055 1056 1057 1058
                _("\n"
                  "  Default paths:\n"
                  "\n"
                  "    Configuration file (unless overridden by -f):\n"
1059
                  "      %s\n"
1060 1061
                  "\n"
                  "    Sockets:\n"
1062 1063
                  "      %s\n"
                  "      %s\n"
1064 1065
                  "\n"
                  "    TLS:\n"
1066 1067 1068
                  "      CA certificate:     %s\n"
                  "      Server certificate: %s\n"
                  "      Server private key: %s\n"
1069 1070 1071 1072
                  "\n"
                  "    PID file (unless overridden by -p):\n"
                  "      %s/run/libvirtd.pid\n"
                  "\n"),
1073 1074 1075
                LIBVIRTD_CONFIGURATION_FILE,
                LIBVIRTD_PRIV_UNIX_SOCKET,
                LIBVIRTD_PRIV_UNIX_SOCKET_RO,
1076 1077 1078
                LIBVIRT_CACERT,
                LIBVIRT_SERVERCERT,
                LIBVIRT_SERVERKEY,
1079 1080
                LOCALSTATEDIR);
    } else {
1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
        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"));
1099
    }
1100 1101
}

D
Daniel P. Berrange 已提交
1102
int main(int argc, char **argv) {
1103
    virNetDaemonPtr dmn = NULL;
1104 1105
    virNetServerPtr srv = NULL;
    char *remote_config_file = NULL;
1106
    int statuswrite = -1;
1107
    int ret = 1;
1108
    int pid_file_fd = -1;
1109 1110 1111 1112 1113 1114 1115 1116 1117
    char *pid_file = NULL;
    char *sock_file = NULL;
    char *sock_file_ro = NULL;
    int timeout = -1;        /* -t: Shutdown timeout */
    int verbose = 0;
    int godaemon = 0;
    int ipsock = 0;
    struct daemonConfig *config;
    bool privileged = geteuid() == 0 ? true : false;
1118
    bool implicit_conf = false;
1119 1120
    char *run_dir = NULL;
    mode_t old_umask;
D
Daniel P. Berrange 已提交
1121 1122

    struct option opts[] = {
1123 1124 1125
        { "verbose", no_argument, &verbose, 'v'},
        { "daemon", no_argument, &godaemon, 'd'},
        { "listen", no_argument, &ipsock, 'l'},
1126
        { "config", required_argument, NULL, 'f'},
1127 1128
        { "timeout", required_argument, NULL, 't'},
        { "pid-file", required_argument, NULL, 'p'},
1129 1130
        { "version", no_argument, NULL, 'V' },
        { "help", no_argument, NULL, 'h' },
D
Daniel P. Berrange 已提交
1131 1132 1133
        {0, 0, 0, 0}
    };

1134 1135
    if (setlocale(LC_ALL, "") == NULL ||
        bindtextdomain(PACKAGE, LOCALEDIR) == NULL ||
E
Eric Blake 已提交
1136 1137
        textdomain(PACKAGE) == NULL ||
        virInitialize() < 0) {
1138
        fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
E
Eric Blake 已提交
1139
        exit(EXIT_FAILURE);
1140
    }
D
Daniel P. Berrange 已提交
1141

1142 1143
    virUpdateSelfLastChanged(argv[0]);

1144 1145
    virFileActivateDirOverride(argv[0]);

D
Daniel P. Berrange 已提交
1146 1147 1148 1149 1150
    while (1) {
        int optidx = 0;
        int c;
        char *tmp;

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

1153
        if (c == -1)
D
Daniel P. Berrange 已提交
1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165
            break;

        switch (c) {
        case 0:
            /* Got one of the flags */
            break;
        case 'v':
            verbose = 1;
            break;
        case 'd':
            godaemon = 1;
            break;
1166 1167
        case 'l':
            ipsock = 1;
D
Daniel P. Berrange 已提交
1168 1169 1170
            break;

        case 't':
1171
            if (virStrToLong_i(optarg, &tmp, 10, &timeout) != 0
1172 1173
                || timeout <= 0
                /* Ensure that we can multiply by 1000 without overflowing.  */
1174 1175 1176 1177
                || timeout > INT_MAX / 1000) {
                VIR_ERROR(_("Invalid value for timeout"));
                exit(EXIT_FAILURE);
            }
D
Daniel P. Berrange 已提交
1178
            break;
1179 1180

        case 'p':
1181
            VIR_FREE(pid_file);
1182
            if (VIR_STRDUP_QUIET(pid_file, optarg) < 0) {
1183
                VIR_ERROR(_("Can't allocate memory"));
1184
                exit(EXIT_FAILURE);
1185
            }
1186 1187 1188
            break;

        case 'f':
1189
            VIR_FREE(remote_config_file);
1190
            if (VIR_STRDUP_QUIET(remote_config_file, optarg) < 0) {
1191
                VIR_ERROR(_("Can't allocate memory"));
1192
                exit(EXIT_FAILURE);
1193
            }
1194 1195
            break;

1196
        case 'V':
1197
            daemonVersion(argv[0]);
1198
            exit(EXIT_SUCCESS);
1199

1200
        case 'h':
1201
            daemonUsage(argv[0], privileged);
1202
            exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
1203

1204
        case '?':
D
Daniel P. Berrange 已提交
1205
        default:
1206
            daemonUsage(argv[0], privileged);
1207
            exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
1208 1209 1210
        }
    }

1211 1212 1213 1214 1215 1216
    if (optind != argc) {
        fprintf(stderr, "%s: unexpected, non-option, command line arguments\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

1217 1218
    if (!(config = daemonConfigNew(privileged))) {
        VIR_ERROR(_("Can't create initial configuration"));
1219
        exit(EXIT_FAILURE);
1220
    }
1221 1222

    /* No explicit config, so try and find a default one */
1223 1224 1225
    if (remote_config_file == NULL) {
        implicit_conf = true;
        if (daemonConfigFilePath(privileged,
1226 1227
                                 &remote_config_file) < 0) {
            VIR_ERROR(_("Can't determine config path"));
1228
            exit(EXIT_FAILURE);
1229
        }
1230
    }
1231 1232 1233

    /* Read the config file if it exists*/
    if (remote_config_file &&
1234
        daemonConfigLoadFile(config, remote_config_file, implicit_conf) < 0) {
1235 1236 1237 1238 1239 1240
        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);
1241
        exit(EXIT_FAILURE);
1242
    }
1243

1244
    if (!privileged &&
1245 1246
        migrateProfile() < 0) {
        VIR_ERROR(_("Exiting due to failure to migrate profile"));
1247
        exit(EXIT_FAILURE);
1248
    }
1249

1250 1251 1252 1253
    if (config->host_uuid &&
        virSetHostUUIDStr(config->host_uuid) < 0) {
        VIR_ERROR(_("invalid host UUID: %s"), config->host_uuid);
        exit(EXIT_FAILURE);
1254 1255
    }

1256 1257
    if (daemonSetupLogging(config, privileged, verbose, godaemon) < 0) {
        VIR_ERROR(_("Can't initialize logging"));
1258
        exit(EXIT_FAILURE);
1259
    }
1260

1261 1262 1263 1264 1265
    if (daemonSetupAccessManager(config) < 0) {
        VIR_ERROR(_("Can't initialize access manager"));
        exit(EXIT_FAILURE);
    }

1266
    if (!pid_file &&
1267 1268 1269 1270
        virPidFileConstructPath(privileged,
                                LOCALSTATEDIR,
                                "libvirtd",
                                &pid_file) < 0) {
1271
        VIR_ERROR(_("Can't determine pid file path."));
1272
        exit(EXIT_FAILURE);
1273
    }
1274
    VIR_DEBUG("Decided on pid file path '%s'", NULLSTR(pid_file));
1275 1276 1277 1278

    if (daemonUnixSocketPaths(config,
                              privileged,
                              &sock_file,
1279 1280
                              &sock_file_ro) < 0) {
        VIR_ERROR(_("Can't determine socket paths"));
1281
        exit(EXIT_FAILURE);
1282
    }
1283 1284
    VIR_DEBUG("Decided on socket paths '%s' and '%s'",
              sock_file, NULLSTR(sock_file_ro));
1285

1286
    if (godaemon) {
1287
        char ebuf[1024];
1288 1289 1290 1291

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

1295
        if ((statuswrite = daemonForkIntoBackground(argv[0])) < 0) {
1296
            VIR_ERROR(_("Failed to fork as daemon: %s"),
1297
                      virStrerror(errno, ebuf, sizeof(ebuf)));
1298
            goto cleanup;
1299 1300 1301
        }
    }

J
John Levon 已提交
1302
    /* Ensure the rundir exists (on tmpfs on some systems) */
1303
    if (privileged) {
1304 1305 1306 1307
        if (VIR_STRDUP_QUIET(run_dir, LOCALSTATEDIR "/run/libvirt") < 0) {
            VIR_ERROR(_("Can't allocate memory"));
            goto cleanup;
        }
1308
    } else {
1309
        run_dir = virGetUserRuntimeDirectory();
1310

1311
        if (!run_dir) {
1312 1313
            VIR_ERROR(_("Can't determine user directory"));
            goto cleanup;
J
John Levon 已提交
1314 1315
        }
    }
1316 1317 1318 1319
    if (privileged)
        old_umask = umask(022);
    else
        old_umask = umask(077);
1320
    VIR_DEBUG("Ensuring run dir '%s' exists", run_dir);
1321 1322 1323 1324 1325 1326 1327 1328
    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 已提交
1329

1330
    /* Try to claim the pidfile, exiting if we can't */
1331
    if ((pid_file_fd = virPidFileAcquirePath(pid_file, false, getpid())) < 0) {
1332 1333 1334 1335
        ret = VIR_DAEMON_ERR_PIDFILE;
        goto cleanup;
    }

1336 1337 1338 1339 1340
    if (virNetlinkStartup() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1341 1342
    if (!(srv = virNetServerNew(config->min_workers,
                                config->max_workers,
1343
                                config->prio_workers,
1344
                                config->max_clients,
1345
                                config->max_anonymous_clients,
1346 1347 1348
                                config->keepalive_interval,
                                config->keepalive_count,
                                !!config->keepalive_required,
1349
                                config->mdns_adv ? config->mdns_name : NULL,
1350
                                remoteClientInitHook,
1351
                                NULL,
1352
                                remoteClientFreeFunc,
1353
                                NULL))) {
1354 1355 1356 1357
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1358 1359 1360 1361 1362 1363
    if (!(dmn = virNetDaemonNew()) ||
        virNetDaemonAddServer(dmn, srv) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1364 1365 1366
    /* Beyond this point, nothing should rely on using
     * getuid/geteuid() == 0, for privilege level checks.
     */
1367
    VIR_DEBUG("Dropping privileges (if required)");
1368
    if (daemonSetupPrivs() < 0) {
1369
        ret = VIR_DAEMON_ERR_PRIVS;
1370
        goto cleanup;
1371
    }
J
John Levon 已提交
1372

1373
    daemonInitialize();
1374

1375 1376 1377 1378 1379 1380 1381 1382 1383
    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))) {
1384
        ret = VIR_DAEMON_ERR_INIT;
1385 1386 1387 1388 1389
        goto cleanup;
    }
    if (virNetServerAddProgram(srv, remoteProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1390
    }
1391

1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403
    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;
    }

1404 1405 1406 1407 1408 1409 1410 1411 1412 1413
    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;
1414
    }
1415

1416 1417
    if (timeout != -1) {
        VIR_DEBUG("Registering shutdown timeout %d", timeout);
1418
        virNetDaemonAutoShutdown(dmn, timeout);
1419
    }
1420

1421
    if ((daemonSetupSignals(dmn)) < 0) {
1422 1423
        ret = VIR_DAEMON_ERR_SIGNAL;
        goto cleanup;
1424
    }
D
Daniel P. Berrange 已提交
1425

1426
    if (config->audit_level) {
1427
        VIR_DEBUG("Attempting to configure auditing subsystem");
1428
        if (virAuditOpen() < 0) {
1429
            if (config->audit_level > 1) {
1430
                ret = VIR_DAEMON_ERR_AUDIT;
1431
                goto cleanup;
1432
            }
1433
            VIR_DEBUG("Proceeding without auditing");
1434 1435
        }
    }
E
Eric Blake 已提交
1436
    virAuditLog(config->audit_logging > 0);
1437

1438
    /* setup the hooks if any */
1439
    if (virHookInitialize() < 0) {
1440
        ret = VIR_DAEMON_ERR_HOOKS;
1441
        goto cleanup;
1442 1443
    }

1444
    /* Disable error func, now logging is setup */
1445
    virSetErrorFunc(NULL, daemonErrorHandler);
1446
    virSetErrorLogPriorityFunc(daemonErrorLogFilter);
1447

1448 1449 1450 1451 1452 1453
    /*
     * 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,
1454
                0, "start", NULL, NULL);
1455

1456 1457 1458
    if (daemonSetupNetworking(srv, config,
                              sock_file, sock_file_ro,
                              ipsock, privileged) < 0) {
1459
        ret = VIR_DAEMON_ERR_NETWORK;
1460
        goto cleanup;
1461 1462
    }

1463 1464 1465 1466 1467 1468 1469 1470 1471
    /* 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)
            ;
1472
        VIR_FORCE_CLOSE(statuswrite);
1473 1474
    }

1475
    /* Initialize drivers & then start accepting new clients from network */
1476
    if (daemonStateInit(dmn) < 0) {
1477 1478
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1479
    }
D
Daniel P. Berrange 已提交
1480

1481
#if defined(__linux__) && defined(NETLINK_ROUTE)
1482 1483
    /* Register the netlink event service for NETLINK_ROUTE */
    if (virNetlinkEventServiceStart(NETLINK_ROUTE, 0) < 0) {
1484 1485 1486
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1487
#endif
1488

1489
#if defined(__linux__) && defined(NETLINK_KOBJECT_UEVENT)
T
Tang Chen 已提交
1490 1491 1492 1493 1494
    /* Register the netlink event service for NETLINK_KOBJECT_UEVENT */
    if (virNetlinkEventServiceStart(NETLINK_KOBJECT_UEVENT, 1) < 0) {
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1495
#endif
T
Tang Chen 已提交
1496

1497
    /* Run event loop. */
1498
    virNetDaemonRun(dmn);
1499

1500 1501
    ret = 0;

1502
    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
1503
                0, "shutdown", NULL, NULL);
1504

1505
 cleanup:
1506
    virNetlinkEventServiceStopAll();
1507
    virObjectUnref(remoteProgram);
1508
    virObjectUnref(lxcProgram);
1509
    virObjectUnref(qemuProgram);
1510 1511
    virNetDaemonClose(dmn);
    virObjectUnref(dmn);
1512
    virObjectUnref(srv);
1513
    virNetlinkShutdown();
1514 1515 1516 1517 1518 1519 1520 1521
    if (statuswrite != -1) {
        if (ret != 0) {
            /* Tell parent of daemon what failed */
            char status = ret;
            while (write(statuswrite, &status, 1) == -1 &&
                   errno == EINTR)
                ;
        }
1522
        VIR_FORCE_CLOSE(statuswrite);
1523
    }
1524 1525
    if (pid_file_fd != -1)
        virPidFileReleasePath(pid_file, pid_file_fd);
1526 1527 1528 1529 1530

    VIR_FREE(sock_file);
    VIR_FREE(sock_file_ro);
    VIR_FREE(pid_file);
    VIR_FREE(remote_config_file);
1531 1532
    VIR_FREE(run_dir);

1533 1534
    daemonConfigFree(config);

1535 1536
    if (driversInitialized) {
        driversInitialized = false;
1537
        virStateCleanup();
1538
    }
1539

1540
    return ret;
D
Daniel P. Berrange 已提交
1541
}