libvirtd.c 45.6 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-2012 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 "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 "viruuid.h"
47
#include "remote_driver.h"
48
#include "viralloc.h"
49
#include "virconf.h"
50
#include "virnetlink.h"
51 52
#include "virnetserver.h"
#include "remote.h"
53
#include "virhook.h"
54
#include "viraudit.h"
55
#include "virstring.h"
56 57
#include "locking/lock_manager.h"
#include "viraccessmanager.h"
D
Daniel P. Berrange 已提交
58

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

100 101
#include "configmake.h"

102 103
#include "virdbus.h"

104
#if WITH_SASL
105
virNetSASLContextPtr saslCtxt = NULL;
106
#endif
107 108
virNetServerProgramPtr remoteProgram = NULL;
virNetServerProgramPtr qemuProgram = NULL;
109
virNetServerProgramPtr lxcProgram = NULL;
110

111 112 113 114 115 116 117 118 119
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,
120
    VIR_DAEMON_ERR_HOOKS,
121
    VIR_DAEMON_ERR_AUDIT,
122 123 124 125 126 127 128 129 130 131 132 133 134

    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",
135
              "Unable to load configuration file",
136 137
              "Unable to look for hook scripts",
              "Unable to initialize audit system")
138

139
static int daemonForkIntoBackground(const char *argv0)
140
{
141 142 143 144
    int statuspipe[2];
    if (pipe(statuspipe) < 0)
        return -1;

145
    pid_t pid = fork();
D
Daniel P. Berrange 已提交
146 147 148
    switch (pid) {
    case 0:
        {
E
Eric Blake 已提交
149
            /* intermediate child */
D
Daniel P. Berrange 已提交
150 151
            int stdinfd = -1;
            int stdoutfd = -1;
152
            int nextpid;
D
Daniel P. Berrange 已提交
153

154
            VIR_FORCE_CLOSE(statuspipe[0]);
155

156
            if ((stdinfd = open("/dev/null", O_RDONLY)) < 0)
D
Daniel P. Berrange 已提交
157
                goto cleanup;
158
            if ((stdoutfd = open("/dev/null", O_WRONLY)) < 0)
D
Daniel P. Berrange 已提交
159 160 161 162 163 164 165
                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;
E
Eric Blake 已提交
166
            if (stdinfd > STDERR_FILENO && VIR_CLOSE(stdinfd) < 0)
D
Daniel P. Berrange 已提交
167
                goto cleanup;
E
Eric Blake 已提交
168
            if (stdoutfd > STDERR_FILENO && VIR_CLOSE(stdoutfd) < 0)
D
Daniel P. Berrange 已提交
169 170 171 172 173 174 175
                goto cleanup;

            if (setsid() < 0)
                goto cleanup;

            nextpid = fork();
            switch (nextpid) {
E
Eric Blake 已提交
176
            case 0: /* grandchild */
177
                return statuspipe[1];
E
Eric Blake 已提交
178 179 180 181
            case -1: /* error */
                goto cleanup;
            default: /* intermediate child succeeded */
                _exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
182 183 184
            }

        cleanup:
185 186
            VIR_FORCE_CLOSE(stdoutfd);
            VIR_FORCE_CLOSE(stdinfd);
E
Eric Blake 已提交
187 188
            VIR_FORCE_CLOSE(statuspipe[1]);
            _exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
189 190 191

        }

E
Eric Blake 已提交
192 193
    case -1: /* error in parent */
        goto error;
D
Daniel P. Berrange 已提交
194 195 196

    default:
        {
E
Eric Blake 已提交
197
            /* parent */
198 199 200
            int ret;
            char status;

201
            VIR_FORCE_CLOSE(statuspipe[1]);
202 203

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

E
Eric Blake 已提交
207 208 209
            /* If we get here, then the grandchild was spawned, so we
             * must exit.  Block until the second child initializes
             * successfully */
210 211 212 213 214
        again:
            ret = read(statuspipe[0], &status, 1);
            if (ret == -1 && errno == EINTR)
                goto again;

E
Eric Blake 已提交
215 216 217 218 219
            VIR_FORCE_CLOSE(statuspipe[0]);

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

220
                fprintf(stderr,
E
Eric Blake 已提交
221 222 223 224 225 226 227 228
                        _("%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,
229
                        virDaemonErrTypeToString(status));
E
Eric Blake 已提交
230
                exit(EXIT_FAILURE);
231
            }
E
Eric Blake 已提交
232
            _exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
233 234
        }
    }
E
Eric Blake 已提交
235 236 237 238 239

error:
    VIR_FORCE_CLOSE(statuspipe[0]);
    VIR_FORCE_CLOSE(statuspipe[1]);
    return -1;
D
Daniel P. Berrange 已提交
240 241
}

242 243

static int
244 245
daemonPidFilePath(bool privileged,
                  char **pidfile)
246
{
247
    if (privileged) {
248 249
        if (VIR_STRDUP(*pidfile, LOCALSTATEDIR "/run/libvirtd.pid") < 0)
            goto error;
250
    } else {
251 252
        char *rundir = NULL;
        mode_t old_umask;
253

254
        if (!(rundir = virGetUserRuntimeDirectory()))
255
            goto error;
256

257 258 259 260 261 262 263 264 265
        old_umask = umask(077);
        if (virFileMakePath(rundir) < 0) {
            umask(old_umask);
            goto error;
        }
        umask(old_umask);

        if (virAsprintf(pidfile, "%s/libvirtd.pid", rundir) < 0) {
            VIR_FREE(rundir);
266
            goto no_memory;
E
Eric Blake 已提交
267
        }
268

269
        VIR_FREE(rundir);
270 271 272
    }

    return 0;
273

274 275 276
no_memory:
    virReportOOMError();
error:
277
    return -1;
278 279
}

280 281 282 283 284
static int
daemonUnixSocketPaths(struct daemonConfig *config,
                      bool privileged,
                      char **sockfile,
                      char **rosockfile)
J
John Levon 已提交
285
{
286 287
    if (config->unix_sock_dir) {
        if (virAsprintf(sockfile, "%s/libvirt-sock", config->unix_sock_dir) < 0)
288
            goto no_memory;
289 290
        if (privileged &&
            virAsprintf(rosockfile, "%s/libvirt-sock-ro", config->unix_sock_dir) < 0)
291
            goto no_memory;
D
Daniel P. Berrange 已提交
292
    } else {
293
        if (privileged) {
294 295 296
            if (VIR_STRDUP(*sockfile, LOCALSTATEDIR "/run/libvirt/libvirt-sock") < 0 ||
                VIR_STRDUP(*rosockfile, LOCALSTATEDIR "/run/libvirt/libvirt-sock-ro") < 0)
                goto error;
297
        } else {
298 299
            char *rundir = NULL;
            mode_t old_umask;
300

301
            if (!(rundir = virGetUserRuntimeDirectory()))
302
                goto error;
303

304 305 306 307 308 309 310
            old_umask = umask(077);
            if (virFileMakePath(rundir) < 0) {
                umask(old_umask);
                goto error;
            }
            umask(old_umask);

311
            if (virAsprintf(sockfile, "%s/libvirt-sock", rundir) < 0) {
312
                VIR_FREE(rundir);
313 314
                goto no_memory;
            }
315

316
            VIR_FREE(rundir);
317 318 319
        }
    }
    return 0;
320

321
no_memory:
322 323 324
    virReportOOMError();
error:
    return -1;
D
Daniel P. Berrange 已提交
325 326
}

327 328 329

static void daemonErrorHandler(void *opaque ATTRIBUTE_UNUSED,
                               virErrorPtr err ATTRIBUTE_UNUSED)
330 331 332 333 334
{
    /* Don't do anything, since logging infrastructure already
     * took care of reporting the error */
}

335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
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:
352
    case VIR_ERR_OPERATION_INVALID:
353 354 355 356 357 358
        return VIR_LOG_DEBUG;
    }

    return priority;
}

359 360
static void daemonInitialize(void)
{
361 362 363 364 365 366 367
    /*
     * Note that the order is important: the first ones have a higher
     * priority when calling virStateInitialize. We must register
     * the network, storage and nodedev drivers before any domain
     * drivers, since their resources must be auto-started before
     * any domains can be auto-started.
     */
368 369 370
#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 已提交
371
     * If they try to open a connection for a module that
372 373
     * is not loaded they'll get a suitable error at that point
     */
374
# ifdef WITH_NETWORK
375
    virDriverLoadModule("network");
376 377
# endif
# ifdef WITH_STORAGE
378
    virDriverLoadModule("storage");
379 380
# endif
# ifdef WITH_NODE_DEVICES
381
    virDriverLoadModule("nodedev");
382 383
# endif
# ifdef WITH_SECRETS
384
    virDriverLoadModule("secret");
385 386 387 388
# endif
# ifdef WITH_NWFILTER
    virDriverLoadModule("nwfilter");
# endif
389
# ifdef WITH_INTERFACE
390 391
    virDriverLoadModule("interface");
# endif
392 393 394 395 396 397
# ifdef WITH_XEN
    virDriverLoadModule("xen");
# endif
# ifdef WITH_LIBXL
    virDriverLoadModule("libxl");
# endif
398
# ifdef WITH_QEMU
399
    virDriverLoadModule("qemu");
400 401
# endif
# ifdef WITH_LXC
402
    virDriverLoadModule("lxc");
403 404
# endif
# ifdef WITH_UML
405
    virDriverLoadModule("uml");
406
# endif
407 408 409
# ifdef WITH_VBOX
    virDriverLoadModule("vbox");
# endif
410
#else
411
# ifdef WITH_NETWORK
412
    networkRegister();
413
# endif
414
# ifdef WITH_INTERFACE
415
    interfaceRegister();
416
# endif
417
# ifdef WITH_STORAGE
418
    storageRegister();
419
# endif
420
# ifdef WITH_NODE_DEVICES
421
    nodedevRegister();
422 423
# endif
# ifdef WITH_SECRETS
424
    secretRegister();
425
# endif
426 427 428
# ifdef WITH_NWFILTER
    nwfilterRegister();
# endif
429 430 431
# ifdef WITH_XEN
    xenRegister();
# endif
J
Jim Fehlig 已提交
432 433 434
# ifdef WITH_LIBXL
    libxlRegister();
# endif
435
# ifdef WITH_QEMU
436
    qemuRegister();
437 438
# endif
# ifdef WITH_LXC
439
    lxcRegister();
440 441
# endif
# ifdef WITH_UML
442
    umlRegister();
443
# endif
444 445 446
# ifdef WITH_VBOX
    vboxRegister();
# endif
447
#endif
448 449 450
}


451 452 453 454 455 456 457 458 459 460
static int daemonSetupNetworking(virNetServerPtr srv,
                                 struct daemonConfig *config,
                                 const char *sock_path,
                                 const char *sock_path_ro,
                                 bool ipsock,
                                 bool privileged)
{
    virNetServerServicePtr svc = NULL;
    virNetServerServicePtr svcRO = NULL;
    virNetServerServicePtr svcTCP = NULL;
461
#if WITH_GNUTLS
462
    virNetServerServicePtr svcTLS = NULL;
463
#endif
464 465 466 467 468 469 470 471
    gid_t unix_sock_gid = 0;
    int unix_sock_ro_mask = 0;
    int unix_sock_rw_mask = 0;

    if (config->unix_sock_group) {
        if (virGetGroupID(config->unix_sock_group, &unix_sock_gid) < 0)
            return -1;
    }
472

473 474 475 476
    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;
    }
477

478 479 480 481
    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;
    }
482

483
    VIR_DEBUG("Registering unix socket %s", sock_path);
484 485 486 487
    if (!(svc = virNetServerServiceNewUNIX(sock_path,
                                           unix_sock_rw_mask,
                                           unix_sock_gid,
                                           config->auth_unix_rw,
488
#if WITH_GNUTLS
489 490
                                           NULL,
#endif
491
                                           false,
492
                                           config->max_client_requests)))
493
        goto error;
494 495 496 497 498 499
    if (sock_path_ro) {
        VIR_DEBUG("Registering unix socket %s", sock_path_ro);
        if (!(svcRO = virNetServerServiceNewUNIX(sock_path_ro,
                                                 unix_sock_ro_mask,
                                                 unix_sock_gid,
                                                 config->auth_unix_ro,
500
#if WITH_GNUTLS
501 502
                                                 NULL,
#endif
503
                                                 true,
504
                                                 config->max_client_requests)))
505 506
            goto error;
    }
507

508 509 510 511
    if (virNetServerAddService(srv, svc,
                               config->mdns_adv && !ipsock ?
                               "_libvirt._tcp" :
                               NULL) < 0)
512
        goto error;
513

514 515 516
    if (svcRO &&
        virNetServerAddService(srv, svcRO, NULL) < 0)
        goto error;
517

518
    if (ipsock) {
519
        if (config->listen_tcp) {
520 521
            VIR_DEBUG("Registering TCP socket %s:%s",
                      config->listen_addr, config->tcp_port);
522 523 524
            if (!(svcTCP = virNetServerServiceNewTCP(config->listen_addr,
                                                     config->tcp_port,
                                                     config->auth_tcp,
525
#if WITH_GNUTLS
526 527
                                                     NULL,
#endif
528
                                                     false,
529
                                                     config->max_client_requests)))
530
                goto error;
531

532 533 534
            if (virNetServerAddService(srv, svcTCP,
                                       config->mdns_adv ? "_libvirt._tcp" : NULL) < 0)
                goto error;
535 536
        }

537
#if WITH_GNUTLS
538 539
        if (config->listen_tls) {
            virNetTLSContextPtr ctxt = NULL;
540

541 542 543 544 545 546 547 548
            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,
549
                                                       config->tls_no_sanity_certificate ? false : true,
550 551 552 553 554 555
                                                       config->tls_no_verify_certificate ? false : true)))
                    goto error;
            } else {
                if (!(ctxt = virNetTLSContextNewServerPath(NULL,
                                                           !privileged,
                                                           (const char *const*)config->tls_allowed_dn_list,
556
                                                           config->tls_no_sanity_certificate ? false : true,
557 558
                                                           config->tls_no_verify_certificate ? false : true)))
                    goto error;
559 560
            }

561 562
            VIR_DEBUG("Registering TLS socket %s:%s",
                      config->listen_addr, config->tls_port);
563 564 565 566
            if (!(svcTLS =
                  virNetServerServiceNewTCP(config->listen_addr,
                                            config->tls_port,
                                            config->auth_tls,
567
                                            ctxt,
568
                                            false,
569
                                            config->max_client_requests))) {
570
                virObjectUnref(ctxt);
571
                goto error;
572
            }
573 574 575 576
            if (virNetServerAddService(srv, svcTLS,
                                       config->mdns_adv &&
                                       !config->listen_tcp ? "_libvirt._tcp" : NULL) < 0)
                goto error;
577

578
            virObjectUnref(ctxt);
579
        }
580 581 582 583 584 585 586 587
#else
        (void)privileged;
        if (config->listen_tls) {
            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                           _("This libvirtd build does not support TLS"));
            goto error;
        }
#endif
588 589
    }

590
#if WITH_SASL
591 592
    if (config->auth_unix_rw == REMOTE_AUTH_SASL ||
        config->auth_unix_ro == REMOTE_AUTH_SASL ||
593
# if WITH_GNUTLS
594 595 596
        config->auth_tls == REMOTE_AUTH_SASL ||
# endif
        config->auth_tcp == REMOTE_AUTH_SASL) {
597 598 599
        saslCtxt = virNetSASLContextNewServer(
            (const char *const*)config->sasl_allowed_username_list);
        if (!saslCtxt)
600
            goto error;
D
Daniel P. Berrange 已提交
601
    }
602
#endif
D
Daniel P. Berrange 已提交
603 604

    return 0;
605

606
error:
607
#if WITH_GNUTLS
608
    virObjectUnref(svcTLS);
609
#endif
610 611 612
    virObjectUnref(svcTCP);
    virObjectUnref(svc);
    virObjectUnref(svcRO);
613
    return -1;
D
Daniel P. Berrange 已提交
614 615 616
}


617 618
/*
 * Set up the logging environment
619 620
 * By default if daemonized all errors go to the logfile libvirtd.log,
 * but if verbose or error debugging is asked for then also output
621
 * informational and debug messages. Default size if 64 kB.
622
 */
623
static int
624 625 626 627
daemonSetupLogging(struct daemonConfig *config,
                   bool privileged,
                   bool verbose,
                   bool godaemon)
628
{
629 630
    virLogReset();

631
    /*
632 633 634 635 636 637 638 639 640 641 642 643
     * 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.
644
     */
645 646
    if (config->log_level != 0)
        virLogSetDefaultPriority(config->log_level);
647

648
    virLogSetFromEnv();
649

650
    virLogSetBufferSize(config->log_buffer_size);
651

652 653 654 655 656
    if (virLogGetNbFilters() == 0)
        virLogParseFilters(config->log_filters);

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

    /*
659 660 661 662
     * 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)....
663
     */
664 665
    if (virLogGetNbOutputs() == 0 &&
        (godaemon || !isatty(STDIN_FILENO))) {
666 667 668 669 670 671 672 673 674 675 676
        char *tmp;
        if (access("/run/systemd/journal/socket", W_OK) >= 0) {
            if (virAsprintf(&tmp, "%d:journald", virLogGetDefaultPriority()) < 0)
                goto no_memory;
            virLogParseOutputs(tmp);
            VIR_FREE(tmp);
        }
    }

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

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

                if (!logdir)
                    goto error;

                old_umask = umask(077);
                if (virFileMakePath(logdir) < 0) {
                    umask(old_umask);
698
                    goto error;
699 700
                }
                umask(old_umask);
701

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

    /*
     * Command line override for --verbose
     */
    if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
        virLogSetDefaultPriority(VIR_LOG_INFO);

723 724 725 726 727 728 729 730
    return 0;

no_memory:
    virReportOOMError();
error:
    return -1;
}

731

732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751
static int
daemonSetupAccessManager(struct daemonConfig *config)
{
    virAccessManagerPtr mgr;
    const char *none[] = { "none", NULL };
    const char **driver = (const char **)config->access_drivers;

    if (!driver ||
        !driver[0])
        driver = none;

    if (!(mgr = virAccessManagerNewStack(driver)))
        return -1;

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


752 753
/* Display version information. */
static void
754
daemonVersion(const char *argv0)
755
{
756
    printf("%s (%s) %s\n", argv0, PACKAGE_NAME, PACKAGE_VERSION);
757 758
}

J
John Levon 已提交
759 760
#ifdef __sun
static int
761
daemonSetupPrivs(void)
J
John Levon 已提交
762
{
763
    chown("/var/run/libvirt", SYSTEM_UID, SYSTEM_UID);
J
John Levon 已提交
764

765 766
    if (__init_daemon_priv(PU_RESETGROUPS | PU_CLEARLIMITSET,
                           SYSTEM_UID, SYSTEM_UID, PRIV_XVM_CONTROL, NULL)) {
767
        VIR_ERROR(_("additional privileges are required"));
J
John Levon 已提交
768 769 770
        return -1;
    }

771 772
    if (priv_set(PRIV_OFF, PRIV_ALLSETS, PRIV_FILE_LINK_ANY, PRIV_PROC_INFO,
                 PRIV_PROC_SESSION, PRIV_PROC_EXEC, PRIV_PROC_FORK, NULL)) {
773
        VIR_ERROR(_("failed to set reduced privileges"));
J
John Levon 已提交
774 775 776 777 778 779
        return -1;
    }

    return 0;
}
#else
780
# define daemonSetupPrivs() 0
J
John Levon 已提交
781 782
#endif

783

784 785 786
static void daemonShutdownHandler(virNetServerPtr srv,
                                  siginfo_t *sig ATTRIBUTE_UNUSED,
                                  void *opaque ATTRIBUTE_UNUSED)
787
{
788 789
    virNetServerQuit(srv);
}
790

791 792 793 794 795 796
static void daemonReloadHandler(virNetServerPtr srv ATTRIBUTE_UNUSED,
                                siginfo_t *sig ATTRIBUTE_UNUSED,
                                void *opaque ATTRIBUTE_UNUSED)
{
        VIR_INFO("Reloading configuration on SIGHUP");
        virHookCall(VIR_HOOK_DRIVER_DAEMON, "-",
797
                    VIR_HOOK_DAEMON_OP_RELOAD, SIGHUP, "SIGHUP", NULL, NULL);
798 799 800 801
        if (virStateReload() < 0)
            VIR_WARN("Error while reloading drivers");
}

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

815 816 817 818 819 820 821 822 823 824 825 826

static void daemonInhibitCallback(bool inhibit, void *opaque)
{
    virNetServerPtr srv = opaque;

    if (inhibit)
        virNetServerAddShutdownInhibition(srv);
    else
        virNetServerRemoveShutdownInhibition(srv);
}


827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892
#ifdef HAVE_DBUS
static DBusConnection *sessionBus;
static DBusConnection *systemBus;

static void daemonStopWorker(void *opaque)
{
    virNetServerPtr srv = opaque;

    VIR_DEBUG("Begin stop srv=%p", srv);

    ignore_value(virStateStop());

    VIR_DEBUG("Completed stop srv=%p", srv);

    /* Exit libvirtd cleanly */
    virNetServerQuit(srv);
}


/* We do this in a thread to not block the main loop */
static void daemonStop(virNetServerPtr srv)
{
    virThread thr;
    virObjectRef(srv);
    if (virThreadCreate(&thr, false, daemonStopWorker, srv) < 0)
        virObjectUnref(srv);
}


static DBusHandlerResult
handleSessionMessageFunc(DBusConnection *connection ATTRIBUTE_UNUSED,
                         DBusMessage *message,
                         void *opaque)
{
    virNetServerPtr srv = opaque;

    VIR_DEBUG("srv=%p", srv);

    if (dbus_message_is_signal(message,
                               DBUS_INTERFACE_LOCAL,
                               "Disconnected"))
        daemonStop(srv);

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}


static DBusHandlerResult
handleSystemMessageFunc(DBusConnection *connection ATTRIBUTE_UNUSED,
                        DBusMessage *message,
                        void *opaque)
{
    virNetServerPtr srv = opaque;

    VIR_DEBUG("srv=%p", srv);

    if (dbus_message_is_signal(message,
                               "org.freedesktop.login1.Manager",
                               "PrepareForShutdown"))
        daemonStop(srv);

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
#endif


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

    virIdentitySetCurrent(sysident);
899

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

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 909 910
    if (virStateInitialize(virNetServerIsPrivileged(srv),
                           daemonInhibitCallback,
                           srv) < 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 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935
#ifdef HAVE_DBUS
    /* Tie the non-priviledged libvirtd to the session/shutdown lifecycle */
    if (!virNetServerIsPrivileged(srv)) {

        sessionBus = virDBusGetSessionBus();
        if (sessionBus != NULL)
            dbus_connection_add_filter(sessionBus,
                                       handleSessionMessageFunc, srv, NULL);

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

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

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

967 968
    VIR_DEBUG("Checking if user profile needs migrating");

969
    if (!(home = virGetUserDirectory()))
970 971 972 973 974 975 976
        goto cleanup;

    if (virAsprintf(&old_base, "%s/.libvirt", home) < 0) {
        goto cleanup;
    }

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

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

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

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

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

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

    return ret;
}

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

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

1103 1104 1105 1106
enum {
    OPT_VERSION = 129
};

D
Daniel P. Berrange 已提交
1107 1108
#define MAX_LISTEN 5
int main(int argc, char **argv) {
1109 1110
    virNetServerPtr srv = NULL;
    char *remote_config_file = NULL;
1111
    int statuswrite = -1;
1112
    int ret = 1;
1113
    int pid_file_fd = -1;
1114 1115 1116 1117 1118 1119 1120 1121 1122
    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;
1123
    bool implicit_conf = false;
1124 1125
    char *run_dir = NULL;
    mode_t old_umask;
D
Daniel P. Berrange 已提交
1126 1127 1128 1129

    struct option opts[] = {
        { "verbose", no_argument, &verbose, 1},
        { "daemon", no_argument, &godaemon, 1},
1130
        { "listen", no_argument, &ipsock, 1},
1131
        { "config", required_argument, NULL, 'f'},
1132 1133
        { "timeout", required_argument, NULL, 't'},
        { "pid-file", required_argument, NULL, 'p'},
1134
        { "version", no_argument, NULL, OPT_VERSION },
1135
        { "help", no_argument, NULL, '?' },
D
Daniel P. Berrange 已提交
1136 1137 1138
        {0, 0, 0, 0}
    };

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

1147 1148
    if (strstr(argv[0], "lt-libvirtd") ||
        strstr(argv[0], "/daemon/.libs/libvirtd")) {
1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164
        char *tmp = strrchr(argv[0], '/');
        if (!tmp) {
            fprintf(stderr, _("%s: cannot identify driver directory\n"), argv[0]);
            exit(EXIT_FAILURE);
        }
        *tmp = '\0';
        char *driverdir;
        if (virAsprintf(&driverdir, "%s/../../src/.libs", argv[0]) < 0) {
            fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
            exit(EXIT_FAILURE);
        }
        if (access(driverdir, R_OK) < 0) {
            fprintf(stderr, _("%s: expected driver directory '%s' is missing\n"),
                    argv[0], driverdir);
            exit(EXIT_FAILURE);
        }
1165 1166
        virLockManagerSetPluginDir(driverdir);
#ifdef WITH_DRIVER_MODULES
1167
        virDriverModuleInitialize(driverdir);
1168
#endif
1169 1170 1171
        *tmp = '/';
        /* Must not free 'driverdir' - it is still used */
    }
1172

D
Daniel P. Berrange 已提交
1173 1174 1175 1176 1177
    while (1) {
        int optidx = 0;
        int c;
        char *tmp;

1178
        c = getopt_long(argc, argv, "ldf:p:t:v", opts, &optidx);
D
Daniel P. Berrange 已提交
1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193

        if (c == -1) {
            break;
        }

        switch (c) {
        case 0:
            /* Got one of the flags */
            break;
        case 'v':
            verbose = 1;
            break;
        case 'd':
            godaemon = 1;
            break;
1194 1195
        case 'l':
            ipsock = 1;
D
Daniel P. Berrange 已提交
1196 1197 1198
            break;

        case 't':
1199
            if (virStrToLong_i(optarg, &tmp, 10, &timeout) != 0
1200 1201
                || timeout <= 0
                /* Ensure that we can multiply by 1000 without overflowing.  */
1202 1203 1204 1205
                || timeout > INT_MAX / 1000) {
                VIR_ERROR(_("Invalid value for timeout"));
                exit(EXIT_FAILURE);
            }
D
Daniel P. Berrange 已提交
1206
            break;
1207 1208

        case 'p':
1209
            VIR_FREE(pid_file);
1210
            if (VIR_STRDUP_QUIET(pid_file, optarg) < 0) {
1211
                VIR_ERROR(_("Can't allocate memory"));
1212
                exit(EXIT_FAILURE);
1213
            }
1214 1215 1216
            break;

        case 'f':
1217
            VIR_FREE(remote_config_file);
1218
            if (VIR_STRDUP_QUIET(remote_config_file, optarg) < 0) {
1219
                VIR_ERROR(_("Can't allocate memory"));
1220
                exit(EXIT_FAILURE);
1221
            }
1222 1223
            break;

1224
        case OPT_VERSION:
1225
            daemonVersion(argv[0]);
1226 1227
            return 0;

D
Daniel P. Berrange 已提交
1228
        case '?':
1229
            daemonUsage(argv[0], privileged);
D
Daniel P. Berrange 已提交
1230 1231 1232
            return 2;

        default:
1233 1234
            VIR_ERROR(_("%s: internal error: unknown flag: %c"),
                      argv[0], c);
1235
            exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
1236 1237 1238
        }
    }

1239 1240 1241 1242 1243 1244
    if (optind != argc) {
        fprintf(stderr, "%s: unexpected, non-option, command line arguments\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

1245 1246
    if (!(config = daemonConfigNew(privileged))) {
        VIR_ERROR(_("Can't create initial configuration"));
1247
        exit(EXIT_FAILURE);
1248
    }
1249 1250

    /* No explicit config, so try and find a default one */
1251 1252 1253
    if (remote_config_file == NULL) {
        implicit_conf = true;
        if (daemonConfigFilePath(privileged,
1254 1255
                                 &remote_config_file) < 0) {
            VIR_ERROR(_("Can't determine config path"));
1256
            exit(EXIT_FAILURE);
1257
        }
1258
    }
1259 1260 1261

    /* Read the config file if it exists*/
    if (remote_config_file &&
1262
        daemonConfigLoadFile(config, remote_config_file, implicit_conf) < 0) {
1263 1264 1265 1266 1267 1268
        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);
1269
        exit(EXIT_FAILURE);
1270
    }
1271

1272
    if (!privileged &&
1273 1274
        migrateProfile() < 0) {
        VIR_ERROR(_("Exiting due to failure to migrate profile"));
1275
        exit(EXIT_FAILURE);
1276
    }
1277

1278 1279 1280 1281
    if (config->host_uuid &&
        virSetHostUUIDStr(config->host_uuid) < 0) {
        VIR_ERROR(_("invalid host UUID: %s"), config->host_uuid);
        exit(EXIT_FAILURE);
1282 1283
    }

1284 1285
    if (daemonSetupLogging(config, privileged, verbose, godaemon) < 0) {
        VIR_ERROR(_("Can't initialize logging"));
1286
        exit(EXIT_FAILURE);
1287
    }
1288

1289 1290 1291 1292 1293
    if (daemonSetupAccessManager(config) < 0) {
        VIR_ERROR(_("Can't initialize access manager"));
        exit(EXIT_FAILURE);
    }

1294
    if (!pid_file &&
1295
        daemonPidFilePath(privileged,
1296 1297
                          &pid_file) < 0) {
        VIR_ERROR(_("Can't determine pid file path."));
1298
        exit(EXIT_FAILURE);
1299
    }
1300
    VIR_DEBUG("Decided on pid file path '%s'", NULLSTR(pid_file));
1301 1302 1303 1304

    if (daemonUnixSocketPaths(config,
                              privileged,
                              &sock_file,
1305 1306
                              &sock_file_ro) < 0) {
        VIR_ERROR(_("Can't determine socket paths"));
1307
        exit(EXIT_FAILURE);
1308
    }
1309 1310
    VIR_DEBUG("Decided on socket paths '%s' and '%s'",
              sock_file, NULLSTR(sock_file_ro));
1311

1312
    if (godaemon) {
1313
        char ebuf[1024];
1314 1315 1316 1317

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

1321
        if ((statuswrite = daemonForkIntoBackground(argv[0])) < 0) {
1322
            VIR_ERROR(_("Failed to fork as daemon: %s"),
1323
                      virStrerror(errno, ebuf, sizeof(ebuf)));
1324
            goto cleanup;
1325 1326 1327
        }
    }

J
John Levon 已提交
1328
    /* Ensure the rundir exists (on tmpfs on some systems) */
1329
    if (privileged) {
1330 1331 1332 1333
        if (VIR_STRDUP_QUIET(run_dir, LOCALSTATEDIR "/run/libvirt") < 0) {
            VIR_ERROR(_("Can't allocate memory"));
            goto cleanup;
        }
1334
    } else {
1335
        run_dir = virGetUserRuntimeDirectory();
1336

1337
        if (!run_dir) {
1338 1339
            VIR_ERROR(_("Can't determine user directory"));
            goto cleanup;
J
John Levon 已提交
1340 1341
        }
    }
1342 1343 1344 1345
    if (privileged)
        old_umask = umask(022);
    else
        old_umask = umask(077);
1346
    VIR_DEBUG("Ensuring run dir '%s' exists", run_dir);
1347 1348 1349 1350 1351 1352 1353 1354
    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 已提交
1355

1356 1357 1358 1359 1360 1361
    /* Try to claim the pidfile, exiting if we can't */
    if ((pid_file_fd = virPidFileAcquirePath(pid_file, getpid())) < 0) {
        ret = VIR_DAEMON_ERR_PIDFILE;
        goto cleanup;
    }

1362 1363 1364 1365 1366
    if (virNetlinkStartup() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1367 1368
    if (!(srv = virNetServerNew(config->min_workers,
                                config->max_workers,
1369
                                config->prio_workers,
1370
                                config->max_clients,
1371 1372 1373
                                config->keepalive_interval,
                                config->keepalive_count,
                                !!config->keepalive_required,
1374
                                config->mdns_adv ? config->mdns_name : NULL,
1375
                                remoteClientInitHook,
1376
                                NULL,
1377
                                remoteClientFreeFunc,
1378
                                NULL))) {
1379 1380 1381 1382
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1383 1384 1385
    /* Beyond this point, nothing should rely on using
     * getuid/geteuid() == 0, for privilege level checks.
     */
1386
    VIR_DEBUG("Dropping privileges (if required)");
1387
    if (daemonSetupPrivs() < 0) {
1388
        ret = VIR_DAEMON_ERR_PRIVS;
1389
        goto cleanup;
1390
    }
J
John Levon 已提交
1391

1392
    daemonInitialize();
1393

1394 1395 1396 1397 1398 1399 1400 1401 1402
    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))) {
1403
        ret = VIR_DAEMON_ERR_INIT;
1404 1405 1406 1407 1408
        goto cleanup;
    }
    if (virNetServerAddProgram(srv, remoteProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1409
    }
1410

1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422
    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;
    }

1423 1424 1425 1426 1427 1428 1429 1430 1431 1432
    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;
1433
    }
1434

1435 1436
    if (timeout != -1) {
        VIR_DEBUG("Registering shutdown timeout %d", timeout);
1437
        virNetServerAutoShutdown(srv,
1438
                                 timeout);
1439
    }
1440 1441 1442 1443

    if ((daemonSetupSignals(srv)) < 0) {
        ret = VIR_DAEMON_ERR_SIGNAL;
        goto cleanup;
1444
    }
D
Daniel P. Berrange 已提交
1445

1446
    if (config->audit_level) {
1447
        VIR_DEBUG("Attempting to configure auditing subsystem");
1448
        if (virAuditOpen() < 0) {
1449
            if (config->audit_level > 1) {
1450
                ret = VIR_DAEMON_ERR_AUDIT;
1451
                goto cleanup;
1452
            }
1453
            VIR_DEBUG("Proceeding without auditing");
1454 1455
        }
    }
1456
    virAuditLog(config->audit_logging);
1457

1458
    /* setup the hooks if any */
1459
    if (virHookInitialize() < 0) {
1460
        ret = VIR_DAEMON_ERR_HOOKS;
1461
        goto cleanup;
1462 1463
    }

1464
    /* Disable error func, now logging is setup */
1465
    virSetErrorFunc(NULL, daemonErrorHandler);
1466
    virSetErrorLogPriorityFunc(daemonErrorLogFilter);
1467

1468 1469 1470 1471 1472 1473
    /*
     * 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,
1474
                0, "start", NULL, NULL);
1475

1476 1477 1478
    if (daemonSetupNetworking(srv, config,
                              sock_file, sock_file_ro,
                              ipsock, privileged) < 0) {
1479
        ret = VIR_DAEMON_ERR_NETWORK;
1480
        goto cleanup;
1481 1482
    }

1483 1484 1485 1486 1487 1488 1489 1490 1491
    /* 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)
            ;
1492
        VIR_FORCE_CLOSE(statuswrite);
1493 1494
    }

1495 1496 1497 1498
    /* Initialize drivers & then start accepting new clients from network */
    if (daemonStateInit(srv) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1499
    }
D
Daniel P. Berrange 已提交
1500

1501
#if defined(__linux__) && defined(NETLINK_ROUTE)
1502 1503
    /* Register the netlink event service for NETLINK_ROUTE */
    if (virNetlinkEventServiceStart(NETLINK_ROUTE, 0) < 0) {
1504 1505 1506
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1507
#endif
1508

1509
#if defined(__linux__) && defined(NETLINK_KOBJECT_UEVENT)
T
Tang Chen 已提交
1510 1511 1512 1513 1514
    /* Register the netlink event service for NETLINK_KOBJECT_UEVENT */
    if (virNetlinkEventServiceStart(NETLINK_KOBJECT_UEVENT, 1) < 0) {
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1515
#endif
T
Tang Chen 已提交
1516

1517 1518
    /* Run event loop. */
    virNetServerRun(srv);
1519

1520 1521
    ret = 0;

1522
    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
1523
                0, "shutdown", NULL, NULL);
1524

1525
cleanup:
1526
    virNetlinkEventServiceStopAll();
1527
    virObjectUnref(remoteProgram);
1528
    virObjectUnref(lxcProgram);
1529
    virObjectUnref(qemuProgram);
1530
    virNetServerClose(srv);
1531
    virObjectUnref(srv);
1532
    virNetlinkShutdown();
1533 1534 1535 1536 1537 1538 1539 1540
    if (statuswrite != -1) {
        if (ret != 0) {
            /* Tell parent of daemon what failed */
            char status = ret;
            while (write(statuswrite, &status, 1) == -1 &&
                   errno == EINTR)
                ;
        }
1541
        VIR_FORCE_CLOSE(statuswrite);
1542
    }
1543 1544
    if (pid_file_fd != -1)
        virPidFileReleasePath(pid_file, pid_file_fd);
1545 1546 1547 1548 1549

    VIR_FREE(sock_file);
    VIR_FREE(sock_file_ro);
    VIR_FREE(pid_file);
    VIR_FREE(remote_config_file);
1550 1551
    VIR_FREE(run_dir);

1552 1553
    daemonConfigFree(config);

1554 1555
    virStateCleanup();

1556
    return ret;
D
Daniel P. Berrange 已提交
1557
}