libvirtd.c 45.8 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-2014 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 53
#include "virnetserver.h"
#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"
D
Daniel P. Berrange 已提交
59

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

104 105
#include "configmake.h"

106
#include "virdbus.h"
107
#include "cpu/cpu_map.h"
108

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)) < 0)
D
Daniel P. Berrange 已提交
166
                goto cleanup;
167
            if ((stdoutfd = open("/dev/null", O_WRONLY)) < 0)
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;
E
Eric Blake 已提交
175
            if (stdinfd > STDERR_FILENO && VIR_CLOSE(stdinfd) < 0)
D
Daniel P. Berrange 已提交
176
                goto cleanup;
E
Eric Blake 已提交
177
            if (stdoutfd > STDERR_FILENO && 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

static int
253 254
daemonPidFilePath(bool privileged,
                  char **pidfile)
255
{
256
    if (privileged) {
257 258
        if (VIR_STRDUP(*pidfile, LOCALSTATEDIR "/run/libvirtd.pid") < 0)
            goto error;
259
    } else {
260 261
        char *rundir = NULL;
        mode_t old_umask;
262

263
        if (!(rundir = virGetUserRuntimeDirectory()))
264
            goto error;
265

266 267 268 269 270 271 272 273 274
        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);
275
            goto error;
E
Eric Blake 已提交
276
        }
277

278
        VIR_FREE(rundir);
279 280 281
    }

    return 0;
282

283
 error:
284
    return -1;
285 286
}

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

308
            if (!(rundir = virGetUserRuntimeDirectory()))
309
                goto error;
310

311 312 313 314 315 316 317
            old_umask = umask(077);
            if (virFileMakePath(rundir) < 0) {
                umask(old_umask);
                goto error;
            }
            umask(old_umask);

318
            if (virAsprintf(sockfile, "%s/libvirt-sock", rundir) < 0) {
319
                VIR_FREE(rundir);
320
                goto error;
321
            }
322

323
            VIR_FREE(rundir);
324 325 326
        }
    }
    return 0;
327

328
 error:
329
    return -1;
D
Daniel P. Berrange 已提交
330 331
}

332 333 334

static void daemonErrorHandler(void *opaque ATTRIBUTE_UNUSED,
                               virErrorPtr err ATTRIBUTE_UNUSED)
335 336 337 338 339
{
    /* Don't do anything, since logging infrastructure already
     * took care of reporting the error */
}

340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356
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:
357
    case VIR_ERR_OPERATION_INVALID:
358 359 360 361 362 363
        return VIR_LOG_DEBUG;
    }

    return priority;
}

364 365
static void daemonInitialize(void)
{
366 367
    /*
     * Note that the order is important: the first ones have a higher
368 369 370 371 372 373 374 375 376
     * 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
     * domains can be auto-started. Moreover, some stateless drivers
     * implement their own subdrivers (e.g. the vbox driver has its
     * own network and storage subdriers) which need to have higher
     * priority. Otherwise, when connecting to such driver the generic
     * subdriver may be opened instead of the one corresponding to the
     * stateless driver.
377
     */
378 379 380
#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 已提交
381
     * If they try to open a connection for a module that
382 383
     * is not loaded they'll get a suitable error at that point
     */
384 385 386
# ifdef WITH_VBOX
    virDriverLoadModule("vbox");
# endif
387
# ifdef WITH_NETWORK
388
    virDriverLoadModule("network");
389
# endif
390 391 392
# ifdef WITH_INTERFACE
    virDriverLoadModule("interface");
# endif
393
# ifdef WITH_STORAGE
394
    virDriverLoadModule("storage");
395 396
# endif
# ifdef WITH_NODE_DEVICES
397
    virDriverLoadModule("nodedev");
398 399
# endif
# ifdef WITH_SECRETS
400
    virDriverLoadModule("secret");
401 402 403 404
# endif
# ifdef WITH_NWFILTER
    virDriverLoadModule("nwfilter");
# endif
405 406 407 408 409 410
# ifdef WITH_XEN
    virDriverLoadModule("xen");
# endif
# ifdef WITH_LIBXL
    virDriverLoadModule("libxl");
# endif
411
# ifdef WITH_QEMU
412
    virDriverLoadModule("qemu");
413 414
# endif
# ifdef WITH_LXC
415
    virDriverLoadModule("lxc");
416 417
# endif
# ifdef WITH_UML
418
    virDriverLoadModule("uml");
419
# endif
R
Roman Bogorodskiy 已提交
420 421 422
# ifdef WITH_BHYVE
    virDriverLoadModule("bhyve");
# endif
423
#else
424 425 426
# ifdef WITH_VBOX
    vboxRegister();
# endif
427
# ifdef WITH_NETWORK
428
    networkRegister();
429
# endif
430
# ifdef WITH_INTERFACE
431
    interfaceRegister();
432
# endif
433
# ifdef WITH_STORAGE
434
    storageRegister();
435
# endif
436
# ifdef WITH_NODE_DEVICES
437
    nodedevRegister();
438 439
# endif
# ifdef WITH_SECRETS
440
    secretRegister();
441
# endif
442 443 444
# ifdef WITH_NWFILTER
    nwfilterRegister();
# endif
445 446 447
# ifdef WITH_XEN
    xenRegister();
# endif
J
Jim Fehlig 已提交
448 449 450
# ifdef WITH_LIBXL
    libxlRegister();
# endif
451
# ifdef WITH_QEMU
452
    qemuRegister();
453 454
# endif
# ifdef WITH_LXC
455
    lxcRegister();
456 457
# endif
# ifdef WITH_UML
458
    umlRegister();
459
# endif
R
Roman Bogorodskiy 已提交
460 461 462
# ifdef WITH_BHYVE
    bhyveRegister();
# endif
463
#endif
464 465 466
}


467 468 469 470 471 472 473 474 475 476
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;
477
#if WITH_GNUTLS
478
    virNetServerServicePtr svcTLS = NULL;
479
#endif
480 481 482 483 484 485 486 487
    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;
    }
488

489 490 491 492
    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;
    }
493

494 495 496 497
    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;
    }
498

499
    VIR_DEBUG("Registering unix socket %s", sock_path);
500 501 502 503
    if (!(svc = virNetServerServiceNewUNIX(sock_path,
                                           unix_sock_rw_mask,
                                           unix_sock_gid,
                                           config->auth_unix_rw,
504
#if WITH_GNUTLS
505 506
                                           NULL,
#endif
507
                                           false,
M
Michal Privoznik 已提交
508
                                           config->max_queued_clients,
509
                                           config->max_client_requests)))
510
        goto error;
511 512 513 514 515 516
    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,
517
#if WITH_GNUTLS
518 519
                                                 NULL,
#endif
520
                                                 true,
M
Michal Privoznik 已提交
521
                                                 config->max_queued_clients,
522
                                                 config->max_client_requests)))
523 524
            goto error;
    }
525

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

532 533 534
    if (svcRO &&
        virNetServerAddService(srv, svcRO, NULL) < 0)
        goto error;
535

536
    if (ipsock) {
537
        if (config->listen_tcp) {
538 539
            VIR_DEBUG("Registering TCP socket %s:%s",
                      config->listen_addr, config->tcp_port);
540 541 542
            if (!(svcTCP = virNetServerServiceNewTCP(config->listen_addr,
                                                     config->tcp_port,
                                                     config->auth_tcp,
543
#if WITH_GNUTLS
544 545
                                                     NULL,
#endif
546
                                                     false,
M
Michal Privoznik 已提交
547
                                                     config->max_queued_clients,
548
                                                     config->max_client_requests)))
549
                goto error;
550

551 552 553
            if (virNetServerAddService(srv, svcTCP,
                                       config->mdns_adv ? "_libvirt._tcp" : NULL) < 0)
                goto error;
554 555
        }

556
#if WITH_GNUTLS
557 558
        if (config->listen_tls) {
            virNetTLSContextPtr ctxt = NULL;
559

560 561 562 563 564 565 566 567
            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,
568
                                                       config->tls_no_sanity_certificate ? false : true,
569 570 571 572 573 574
                                                       config->tls_no_verify_certificate ? false : true)))
                    goto error;
            } else {
                if (!(ctxt = virNetTLSContextNewServerPath(NULL,
                                                           !privileged,
                                                           (const char *const*)config->tls_allowed_dn_list,
575
                                                           config->tls_no_sanity_certificate ? false : true,
576 577
                                                           config->tls_no_verify_certificate ? false : true)))
                    goto error;
578 579
            }

580 581
            VIR_DEBUG("Registering TLS socket %s:%s",
                      config->listen_addr, config->tls_port);
582 583 584 585
            if (!(svcTLS =
                  virNetServerServiceNewTCP(config->listen_addr,
                                            config->tls_port,
                                            config->auth_tls,
586
                                            ctxt,
587
                                            false,
M
Michal Privoznik 已提交
588
                                            config->max_queued_clients,
589
                                            config->max_client_requests))) {
590
                virObjectUnref(ctxt);
591
                goto error;
592
            }
593 594 595 596
            if (virNetServerAddService(srv, svcTLS,
                                       config->mdns_adv &&
                                       !config->listen_tcp ? "_libvirt._tcp" : NULL) < 0)
                goto error;
597

598
            virObjectUnref(ctxt);
599
        }
600 601 602 603 604 605 606 607
#else
        (void)privileged;
        if (config->listen_tls) {
            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                           _("This libvirtd build does not support TLS"));
            goto error;
        }
#endif
608 609
    }

610
#if WITH_SASL
611 612
    if (config->auth_unix_rw == REMOTE_AUTH_SASL ||
        config->auth_unix_ro == REMOTE_AUTH_SASL ||
613
# if WITH_GNUTLS
614 615 616
        config->auth_tls == REMOTE_AUTH_SASL ||
# endif
        config->auth_tcp == REMOTE_AUTH_SASL) {
617 618 619
        saslCtxt = virNetSASLContextNewServer(
            (const char *const*)config->sasl_allowed_username_list);
        if (!saslCtxt)
620
            goto error;
D
Daniel P. Berrange 已提交
621
    }
622
#endif
D
Daniel P. Berrange 已提交
623 624

    return 0;
625

626
 error:
627
#if WITH_GNUTLS
628
    virObjectUnref(svcTLS);
629
#endif
630 631 632
    virObjectUnref(svcTCP);
    virObjectUnref(svc);
    virObjectUnref(svcRO);
633
    return -1;
D
Daniel P. Berrange 已提交
634 635 636
}


637 638
/*
 * Set up the logging environment
639 640
 * By default if daemonized all errors go to the logfile libvirtd.log,
 * but if verbose or error debugging is asked for then also output
641
 * informational and debug messages. Default size if 64 kB.
642
 */
643
static int
644 645 646 647
daemonSetupLogging(struct daemonConfig *config,
                   bool privileged,
                   bool verbose,
                   bool godaemon)
648
{
649 650
    virLogReset();

651
    /*
652 653 654 655 656 657 658 659 660 661 662 663
     * 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.
664
     */
665 666
    if (config->log_level != 0)
        virLogSetDefaultPriority(config->log_level);
667

668
    virLogSetFromEnv();
669

670 671 672 673 674
    if (virLogGetNbFilters() == 0)
        virLogParseFilters(config->log_filters);

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

    /*
677 678 679 680
     * 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)....
681
     */
682 683
    if (virLogGetNbOutputs() == 0 &&
        (godaemon || !isatty(STDIN_FILENO))) {
684 685
        char *tmp;
        if (access("/run/systemd/journal/socket", W_OK) >= 0) {
686 687 688 689 690 691 692 693
            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)
694
                goto error;
695 696 697 698 699 700 701
            virLogParseOutputs(tmp);
            VIR_FREE(tmp);
        }
    }

    /*
     * otherwise direct to libvirtd.log when running
702
     * as daemon. Otherwise the default output is stderr.
703
     */
704
    if (virLogGetNbOutputs() == 0) {
705
        char *tmp = NULL;
706

707
        if (godaemon) {
708
            if (privileged) {
709 710 711
                if (virAsprintf(&tmp, "%d:file:%s/log/libvirt/libvirtd.log",
                                virLogGetDefaultPriority(),
                                LOCALSTATEDIR) == -1)
712
                    goto error;
713
            } else {
714
                char *logdir = virGetUserCacheDirectory();
715 716 717 718 719 720 721 722
                mode_t old_umask;

                if (!logdir)
                    goto error;

                old_umask = umask(077);
                if (virFileMakePath(logdir) < 0) {
                    umask(old_umask);
723
                    goto error;
724 725
                }
                umask(old_umask);
726

727 728 729
                if (virAsprintf(&tmp, "%d:file:%s/libvirtd.log",
                                virLogGetDefaultPriority(), logdir) == -1) {
                    VIR_FREE(logdir);
730
                    goto error;
E
Eric Blake 已提交
731
                }
732
                VIR_FREE(logdir);
733
            }
734
        } else {
735
            if (virAsprintf(&tmp, "%d:stderr", virLogGetDefaultPriority()) < 0)
736
                goto error;
737
        }
738 739
        virLogParseOutputs(tmp);
        VIR_FREE(tmp);
740
    }
741 742 743 744 745 746 747

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

748 749
    return 0;

750
 error:
751 752 753
    return -1;
}

754

755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774
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;
}


775 776
/* Display version information. */
static void
777
daemonVersion(const char *argv0)
778
{
779
    printf("%s (%s) %s\n", argv0, PACKAGE_NAME, PACKAGE_VERSION);
780 781
}

J
John Levon 已提交
782 783
#ifdef __sun
static int
784
daemonSetupPrivs(void)
J
John Levon 已提交
785
{
786
    chown("/var/run/libvirt", SYSTEM_UID, SYSTEM_UID);
J
John Levon 已提交
787

788 789
    if (__init_daemon_priv(PU_RESETGROUPS | PU_CLEARLIMITSET,
                           SYSTEM_UID, SYSTEM_UID, PRIV_XVM_CONTROL, NULL)) {
790
        VIR_ERROR(_("additional privileges are required"));
J
John Levon 已提交
791 792 793
        return -1;
    }

794 795
    if (priv_set(PRIV_OFF, PRIV_ALLSETS, PRIV_FILE_LINK_ANY, PRIV_PROC_INFO,
                 PRIV_PROC_SESSION, PRIV_PROC_EXEC, PRIV_PROC_FORK, NULL)) {
796
        VIR_ERROR(_("failed to set reduced privileges"));
J
John Levon 已提交
797 798 799 800 801 802
        return -1;
    }

    return 0;
}
#else
803
# define daemonSetupPrivs() 0
J
John Levon 已提交
804 805
#endif

806

807 808 809
static void daemonShutdownHandler(virNetServerPtr srv,
                                  siginfo_t *sig ATTRIBUTE_UNUSED,
                                  void *opaque ATTRIBUTE_UNUSED)
810
{
811 812
    virNetServerQuit(srv);
}
813

814 815 816 817
static void daemonReloadHandler(virNetServerPtr srv ATTRIBUTE_UNUSED,
                                siginfo_t *sig ATTRIBUTE_UNUSED,
                                void *opaque ATTRIBUTE_UNUSED)
{
W
Wang Rui 已提交
818 819 820 821 822
    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");
823 824
}

825 826 827
static int daemonSetupSignals(virNetServerPtr srv)
{
    if (virNetServerAddSignalHandler(srv, SIGINT, daemonShutdownHandler, NULL) < 0)
828
        return -1;
829 830 831 832
    if (virNetServerAddSignalHandler(srv, SIGQUIT, daemonShutdownHandler, NULL) < 0)
        return -1;
    if (virNetServerAddSignalHandler(srv, SIGTERM, daemonShutdownHandler, NULL) < 0)
        return -1;
833 834
    if (virNetServerAddSignalHandler(srv, SIGHUP, daemonReloadHandler, NULL) < 0)
        return -1;
835 836
    return 0;
}
837

838 839 840 841 842 843 844 845 846 847 848 849

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

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


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 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915
#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


916 917 918
static void daemonRunStateInit(void *opaque)
{
    virNetServerPtr srv = opaque;
919 920 921
    virIdentityPtr sysident = virIdentityGetSystem();

    virIdentitySetCurrent(sysident);
922

923 924 925 926
    /* Since driver initialization can take time inhibit daemon shutdown until
       we're done so clients get a chance to connect */
    daemonInhibitCallback(true, srv);

927
    /* Start the stateful HV drivers
E
Eric Blake 已提交
928
     * This is deliberately done after telling the parent process
929 930
     * we're ready, since it can take a long time and this will
     * seriously delay OS bootup process */
931 932 933
    if (virStateInitialize(virNetServerIsPrivileged(srv),
                           daemonInhibitCallback,
                           srv) < 0) {
934
        VIR_ERROR(_("Driver state initialization failed"));
935 936
        /* Ensure the main event loop quits */
        kill(getpid(), SIGTERM);
937
        goto cleanup;
938 939
    }

940 941
    driversInitialized = true;

942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960
#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
961 962
    /* Only now accept clients from network */
    virNetServerUpdateServices(srv, true);
963
 cleanup:
964
    daemonInhibitCallback(false, srv);
965
    virObjectUnref(srv);
966 967
    virObjectUnref(sysident);
    virIdentitySetCurrent(NULL);
968
}
969

970 971 972
static int daemonStateInit(virNetServerPtr srv)
{
    virThread thr;
973
    virObjectRef(srv);
974
    if (virThreadCreate(&thr, false, daemonRunStateInit, srv) < 0) {
975
        virObjectUnref(srv);
976 977
        return -1;
    }
978 979 980
    return 0;
}

981 982 983 984 985 986 987 988 989 990 991
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;

992 993
    VIR_DEBUG("Checking if user profile needs migrating");

994
    if (!(home = virGetUserDirectory()))
995 996 997 998 999 1000 1001
        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 */
1002
    if (!(config_dir = virGetUserConfigDirectory()))
1003 1004 1005
        goto cleanup;

    if (!virFileIsDir(old_base) || virFileExists(config_dir)) {
1006 1007 1008
        VIR_DEBUG("No old profile in '%s' / "
                  "new profile directory already present '%s'",
                  old_base, config_dir);
1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
        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;
    }

1021
    config_home = virGetEnvBlockSUID("XDG_CONFIG_HOME");
1022
    if (config_home && config_home[0] != '\0') {
1023 1024
        if (VIR_STRDUP(xdg_dir, config_home) < 0)
            goto cleanup;
1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
    } 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;
    }

1045
    VIR_DEBUG("Profile migrated from %s to %s", old_base, config_dir);
1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057
    ret = 0;

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

    return ret;
}

1058 1059
/* Print command-line usage. */
static void
1060
daemonUsage(const char *argv0, bool privileged)
1061
{
1062 1063 1064 1065 1066 1067
    fprintf(stderr,
            _("\n"
              "Usage:\n"
              "  %s [options]\n"
              "\n"
              "Options:\n"
1068
              "  -h | --help            Display program help:\n"
1069 1070 1071 1072 1073
              "  -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"
1074
              "  -V | --version         Display version information.\n"
1075 1076 1077 1078
              "  -p | --pid-file <file> Change name of PID file.\n"
              "\n"
              "libvirt management daemon:\n"),
            argv0);
1079 1080 1081

    if (privileged) {
        fprintf(stderr,
1082 1083 1084 1085
                _("\n"
                  "  Default paths:\n"
                  "\n"
                  "    Configuration file (unless overridden by -f):\n"
1086
                  "      %s\n"
1087 1088
                  "\n"
                  "    Sockets:\n"
1089 1090
                  "      %s\n"
                  "      %s\n"
1091 1092
                  "\n"
                  "    TLS:\n"
1093 1094 1095
                  "      CA certificate:     %s\n"
                  "      Server certificate: %s\n"
                  "      Server private key: %s\n"
1096 1097 1098 1099
                  "\n"
                  "    PID file (unless overridden by -p):\n"
                  "      %s/run/libvirtd.pid\n"
                  "\n"),
1100 1101 1102
                LIBVIRTD_CONFIGURATION_FILE,
                LIBVIRTD_PRIV_UNIX_SOCKET,
                LIBVIRTD_PRIV_UNIX_SOCKET_RO,
1103 1104 1105
                LIBVIRT_CACERT,
                LIBVIRT_SERVERCERT,
                LIBVIRT_SERVERKEY,
1106 1107
                LOCALSTATEDIR);
    } else {
1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125
        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"));
1126
    }
1127 1128
}

D
Daniel P. Berrange 已提交
1129 1130
#define MAX_LISTEN 5
int main(int argc, char **argv) {
1131 1132
    virNetServerPtr srv = NULL;
    char *remote_config_file = NULL;
1133
    int statuswrite = -1;
1134
    int ret = 1;
1135
    int pid_file_fd = -1;
1136 1137 1138 1139 1140 1141 1142 1143 1144
    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;
1145
    bool implicit_conf = false;
1146 1147
    char *run_dir = NULL;
    mode_t old_umask;
D
Daniel P. Berrange 已提交
1148 1149

    struct option opts[] = {
1150 1151 1152
        { "verbose", no_argument, &verbose, 'v'},
        { "daemon", no_argument, &godaemon, 'd'},
        { "listen", no_argument, &ipsock, 'l'},
1153
        { "config", required_argument, NULL, 'f'},
1154 1155
        { "timeout", required_argument, NULL, 't'},
        { "pid-file", required_argument, NULL, 'p'},
1156 1157
        { "version", no_argument, NULL, 'V' },
        { "help", no_argument, NULL, 'h' },
D
Daniel P. Berrange 已提交
1158 1159 1160
        {0, 0, 0, 0}
    };

1161 1162
    if (setlocale(LC_ALL, "") == NULL ||
        bindtextdomain(PACKAGE, LOCALEDIR) == NULL ||
E
Eric Blake 已提交
1163 1164
        textdomain(PACKAGE) == NULL ||
        virInitialize() < 0) {
1165
        fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
E
Eric Blake 已提交
1166
        exit(EXIT_FAILURE);
1167
    }
D
Daniel P. Berrange 已提交
1168

1169 1170
    virUpdateSelfLastChanged(argv[0]);

1171 1172
    virFileActivateDirOverride(argv[0]);

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:vVh", 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 'V':
1225
            daemonVersion(argv[0]);
1226
            exit(EXIT_SUCCESS);
1227

1228
        case 'h':
1229
            daemonUsage(argv[0], privileged);
1230
            exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
1231

1232
        case '?':
D
Daniel P. Berrange 已提交
1233
        default:
1234
            daemonUsage(argv[0], privileged);
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
    /* Try to claim the pidfile, exiting if we can't */
1357
    if ((pid_file_fd = virPidFileAcquirePath(pid_file, false, getpid())) < 0) {
1358 1359 1360 1361
        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
                                config->max_anonymous_clients,
1372 1373 1374
                                config->keepalive_interval,
                                config->keepalive_count,
                                !!config->keepalive_required,
1375
                                config->mdns_adv ? config->mdns_name : NULL,
1376
                                remoteClientInitHook,
1377
                                NULL,
1378
                                remoteClientFreeFunc,
1379
                                NULL))) {
1380 1381 1382 1383
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

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

1393
    daemonInitialize();
1394

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1521 1522
    ret = 0;

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

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

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

1553 1554
    daemonConfigFree(config);

1555 1556
    if (driversInitialized)
        virStateCleanup();
1557

1558
    return ret;
D
Daniel P. Berrange 已提交
1559
}