remote_daemon.c 47.2 KB
Newer Older
D
Daniel P. Berrange 已提交
1
/*
2
 * remote_daemon.c: daemon start of day, guest process & i/o management
D
Daniel P. Berrange 已提交
3
 *
4
 * Copyright (C) 2006-2018 Red Hat, Inc.
D
Daniel P. Berrange 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17
 * Copyright (C) 2006 Daniel P. Berrange
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library.  If not, see
O
Osier Yang 已提交
19
 * <http://www.gnu.org/licenses/>.
D
Daniel P. Berrange 已提交
20 21 22 23
 *
 * Author: Daniel P. Berrange <berrange@redhat.com>
 */

24
#include <config.h>
25

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

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

41 42
#define VIR_FROM_THIS VIR_FROM_QEMU

43 44
#include "remote_daemon.h"
#include "remote_daemon_config.h"
45

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

63
#include "driver.h"
64

65 66
#include "configmake.h"

67 68
#include "virdbus.h"

69 70
VIR_LOG_INIT("daemon.libvirtd");

71
#if WITH_SASL
72
virNetSASLContextPtr saslCtxt = NULL;
73
#endif
74 75
virNetServerProgramPtr remoteProgram = NULL;
virNetServerProgramPtr qemuProgram = NULL;
76

77 78
volatile bool driversInitialized = false;

79 80 81 82 83 84 85 86 87
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,
88
    VIR_DAEMON_ERR_HOOKS,
89
    VIR_DAEMON_ERR_AUDIT,
90 91 92 93 94 95 96 97 98 99 100 101 102

    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",
103
              "Unable to load configuration file",
104 105
              "Unable to look for hook scripts",
              "Unable to initialize audit system")
106

107
static int daemonForkIntoBackground(const char *argv0)
108
{
109 110 111 112
    int statuspipe[2];
    if (pipe(statuspipe) < 0)
        return -1;

113
    pid_t pid = fork();
D
Daniel P. Berrange 已提交
114 115 116
    switch (pid) {
    case 0:
        {
E
Eric Blake 已提交
117
            /* intermediate child */
D
Daniel P. Berrange 已提交
118 119
            int stdinfd = -1;
            int stdoutfd = -1;
120
            int nextpid;
D
Daniel P. Berrange 已提交
121

122
            VIR_FORCE_CLOSE(statuspipe[0]);
123

124
            if ((stdinfd = open("/dev/null", O_RDONLY)) <= STDERR_FILENO)
D
Daniel P. Berrange 已提交
125
                goto cleanup;
126
            if ((stdoutfd = open("/dev/null", O_WRONLY)) <= STDERR_FILENO)
D
Daniel P. Berrange 已提交
127 128 129 130 131 132 133
                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;
134
            if (VIR_CLOSE(stdinfd) < 0)
D
Daniel P. Berrange 已提交
135
                goto cleanup;
136
            if (VIR_CLOSE(stdoutfd) < 0)
D
Daniel P. Berrange 已提交
137 138 139 140 141 142 143
                goto cleanup;

            if (setsid() < 0)
                goto cleanup;

            nextpid = fork();
            switch (nextpid) {
E
Eric Blake 已提交
144
            case 0: /* grandchild */
145
                return statuspipe[1];
E
Eric Blake 已提交
146 147 148 149
            case -1: /* error */
                goto cleanup;
            default: /* intermediate child succeeded */
                _exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
150 151 152
            }

        cleanup:
153 154
            VIR_FORCE_CLOSE(stdoutfd);
            VIR_FORCE_CLOSE(stdinfd);
E
Eric Blake 已提交
155 156
            VIR_FORCE_CLOSE(statuspipe[1]);
            _exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
157 158 159

        }

E
Eric Blake 已提交
160 161
    case -1: /* error in parent */
        goto error;
D
Daniel P. Berrange 已提交
162 163 164

    default:
        {
E
Eric Blake 已提交
165
            /* parent */
166 167 168
            int ret;
            char status;

169
            VIR_FORCE_CLOSE(statuspipe[1]);
170 171

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

E
Eric Blake 已提交
175 176 177
            /* If we get here, then the grandchild was spawned, so we
             * must exit.  Block until the second child initializes
             * successfully */
178 179 180 181 182
        again:
            ret = read(statuspipe[0], &status, 1);
            if (ret == -1 && errno == EINTR)
                goto again;

E
Eric Blake 已提交
183 184 185 186 187
            VIR_FORCE_CLOSE(statuspipe[0]);

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

188
                fprintf(stderr,
E
Eric Blake 已提交
189 190 191 192 193 194 195 196
                        _("%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,
197
                        virDaemonErrTypeToString(status));
E
Eric Blake 已提交
198
                exit(EXIT_FAILURE);
199
            }
E
Eric Blake 已提交
200
            _exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
201 202
        }
    }
E
Eric Blake 已提交
203

204
 error:
E
Eric Blake 已提交
205 206 207
    VIR_FORCE_CLOSE(statuspipe[0]);
    VIR_FORCE_CLOSE(statuspipe[1]);
    return -1;
D
Daniel P. Berrange 已提交
208 209
}

210

211 212 213 214
static int
daemonUnixSocketPaths(struct daemonConfig *config,
                      bool privileged,
                      char **sockfile,
215 216
                      char **rosockfile,
                      char **admsockfile)
J
John Levon 已提交
217
{
218 219 220
    int ret = -1;
    char *rundir = NULL;

221 222
    if (config->unix_sock_dir) {
        if (virAsprintf(sockfile, "%s/libvirt-sock", config->unix_sock_dir) < 0)
223
            goto cleanup;
224 225

        if (privileged) {
226 227 228
            if (virAsprintf(rosockfile, "%s/libvirt-sock-ro", config->unix_sock_dir) < 0 ||
                virAsprintf(admsockfile, "%s/libvirt-admin-sock", config->unix_sock_dir) < 0)
                goto cleanup;
229
        }
D
Daniel P. Berrange 已提交
230
    } else {
231
        if (privileged) {
232
            if (VIR_STRDUP(*sockfile, LOCALSTATEDIR "/run/libvirt/libvirt-sock") < 0 ||
233 234
                VIR_STRDUP(*rosockfile, LOCALSTATEDIR "/run/libvirt/libvirt-sock-ro") < 0 ||
                VIR_STRDUP(*admsockfile, LOCALSTATEDIR "/run/libvirt/libvirt-admin-sock") < 0)
235
                goto cleanup;
236
        } else {
237
            mode_t old_umask;
238

239
            if (!(rundir = virGetUserRuntimeDirectory()))
240
                goto cleanup;
241

242 243 244
            old_umask = umask(077);
            if (virFileMakePath(rundir) < 0) {
                umask(old_umask);
245
                goto cleanup;
246 247 248
            }
            umask(old_umask);

249
            if (virAsprintf(sockfile, "%s/libvirt-sock", rundir) < 0 ||
250 251
                virAsprintf(admsockfile, "%s/libvirt-admin-sock", rundir) < 0)
                goto cleanup;
252 253
        }
    }
254

255 256 257 258
    ret = 0;
 cleanup:
    VIR_FREE(rundir);
    return ret;
D
Daniel P. Berrange 已提交
259 260
}

261 262 263

static void daemonErrorHandler(void *opaque ATTRIBUTE_UNUSED,
                               virErrorPtr err ATTRIBUTE_UNUSED)
264 265 266 267 268
{
    /* Don't do anything, since logging infrastructure already
     * took care of reporting the error */
}

269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
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:
286
    case VIR_ERR_OPERATION_INVALID:
287
    case VIR_ERR_NO_DOMAIN_METADATA:
288 289
    case VIR_ERR_NO_SERVER:
    case VIR_ERR_NO_CLIENT:
290 291 292 293 294 295
        return VIR_LOG_DEBUG;
    }

    return priority;
}

296

297
#define VIR_DAEMON_LOAD_MODULE(func, module) \
298
    virDriverLoadModule(module, #func)
299 300
static void daemonInitialize(void)
{
301 302
    /*
     * Note that the order is important: the first ones have a higher
303 304 305
     * 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
306
     * domains can be auto-started.
307
     */
308 309
    /* 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 已提交
310
     * If they try to open a connection for a module that
311 312
     * is not loaded they'll get a suitable error at that point
     */
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
#ifdef WITH_NETWORK
    VIR_DAEMON_LOAD_MODULE(networkRegister, "network");
#endif
#ifdef WITH_INTERFACE
    VIR_DAEMON_LOAD_MODULE(interfaceRegister, "interface");
#endif
#ifdef WITH_STORAGE
    VIR_DAEMON_LOAD_MODULE(storageRegister, "storage");
#endif
#ifdef WITH_NODE_DEVICES
    VIR_DAEMON_LOAD_MODULE(nodedevRegister, "nodedev");
#endif
#ifdef WITH_SECRETS
    VIR_DAEMON_LOAD_MODULE(secretRegister, "secret");
#endif
#ifdef WITH_NWFILTER
    VIR_DAEMON_LOAD_MODULE(nwfilterRegister, "nwfilter");
#endif
#ifdef WITH_XEN
    VIR_DAEMON_LOAD_MODULE(xenRegister, "xen");
#endif
#ifdef WITH_LIBXL
    VIR_DAEMON_LOAD_MODULE(libxlRegister, "libxl");
#endif
#ifdef WITH_QEMU
    VIR_DAEMON_LOAD_MODULE(qemuRegister, "qemu");
#endif
#ifdef WITH_LXC
    VIR_DAEMON_LOAD_MODULE(lxcRegister, "lxc");
#endif
#ifdef WITH_UML
    VIR_DAEMON_LOAD_MODULE(umlRegister, "uml");
#endif
#ifdef WITH_VBOX
    VIR_DAEMON_LOAD_MODULE(vboxRegister, "vbox");
#endif
#ifdef WITH_BHYVE
    VIR_DAEMON_LOAD_MODULE(bhyveRegister, "bhyve");
#endif
#ifdef WITH_VZ
    VIR_DAEMON_LOAD_MODULE(vzRegister, "vz");
354
#endif
355
}
356
#undef VIR_DAEMON_LOAD_MODULE
357 358


359 360
static int ATTRIBUTE_NONNULL(3)
daemonSetupNetworking(virNetServerPtr srv,
361
                      virNetServerPtr srvAdm,
362 363 364
                      struct daemonConfig *config,
                      const char *sock_path,
                      const char *sock_path_ro,
365
                      const char *sock_path_adm,
366 367
                      bool ipsock,
                      bool privileged)
368 369
{
    virNetServerServicePtr svc = NULL;
370
    virNetServerServicePtr svcAdm = NULL;
371 372
    virNetServerServicePtr svcRO = NULL;
    virNetServerServicePtr svcTCP = NULL;
373
#if WITH_GNUTLS
374
    virNetServerServicePtr svcTLS = NULL;
375
#endif
376 377 378
    gid_t unix_sock_gid = 0;
    int unix_sock_ro_mask = 0;
    int unix_sock_rw_mask = 0;
379
    int unix_sock_adm_mask = 0;
380
    int ret = -1;
381

382 383 384
    unsigned int cur_fd = STDERR_FILENO + 1;
    unsigned int nfds = virGetListenFDs();

385 386
    if (config->unix_sock_group) {
        if (virGetGroupID(config->unix_sock_group, &unix_sock_gid) < 0)
387
            return ret;
388
    }
389

390
    if (nfds > (sock_path_ro ? 2 : 1)) {
391
        VIR_ERROR(_("Too many (%u) FDs passed from caller"), nfds);
392
        return ret;
393 394
    }

395 396
    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);
397
        goto cleanup;
398
    }
399

400 401
    if (virStrToLong_i(config->unix_sock_admin_perms, NULL, 8, &unix_sock_adm_mask) != 0) {
        VIR_ERROR(_("Failed to parse mode '%s'"), config->unix_sock_admin_perms);
402
        goto cleanup;
403 404
    }

405 406
    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);
407
        goto cleanup;
408
    }
409

410 411 412 413
    if (!(svc = virNetServerServiceNewFDOrUNIX(sock_path,
                                               unix_sock_rw_mask,
                                               unix_sock_gid,
                                               config->auth_unix_rw,
414
#if WITH_GNUTLS
415
                                               NULL,
416
#endif
417 418 419 420
                                               false,
                                               config->max_queued_clients,
                                               config->max_client_requests,
                                               nfds, &cur_fd)))
421
        goto cleanup;
422
    if (sock_path_ro) {
423 424 425 426
        if (!(svcRO = virNetServerServiceNewFDOrUNIX(sock_path_ro,
                                                     unix_sock_ro_mask,
                                                     unix_sock_gid,
                                                     config->auth_unix_ro,
427
#if WITH_GNUTLS
428
                                                     NULL,
429
#endif
430 431 432 433
                                                     true,
                                                     config->max_queued_clients,
                                                     config->max_client_requests,
                                                     nfds, &cur_fd)))
434
            goto cleanup;
435
    }
436

437 438 439 440
    if (virNetServerAddService(srv, svc,
                               config->mdns_adv && !ipsock ?
                               "_libvirt._tcp" :
                               NULL) < 0)
441
        goto cleanup;
442

443 444
    if (svcRO &&
        virNetServerAddService(srv, svcRO, NULL) < 0)
445
        goto cleanup;
446

447
    if (sock_path_adm) {
448 449 450 451 452 453 454 455
        VIR_DEBUG("Registering unix socket %s", sock_path_adm);
        if (!(svcAdm = virNetServerServiceNewUNIX(sock_path_adm,
                                                  unix_sock_adm_mask,
                                                  unix_sock_gid,
                                                  REMOTE_AUTH_NONE,
#if WITH_GNUTLS
                                                  NULL,
#endif
456
                                                  false,
457 458
                                                  config->admin_max_queued_clients,
                                                  config->admin_max_client_requests)))
459
            goto cleanup;
460

461
        if (virNetServerAddService(srvAdm, svcAdm, NULL) < 0)
462
            goto cleanup;
463
    }
464

465
    if (ipsock) {
466
        if (config->listen_tcp) {
467 468
            VIR_DEBUG("Registering TCP socket %s:%s",
                      config->listen_addr, config->tcp_port);
469 470
            if (!(svcTCP = virNetServerServiceNewTCP(config->listen_addr,
                                                     config->tcp_port,
471
                                                     AF_UNSPEC,
472
                                                     config->auth_tcp,
473
#if WITH_GNUTLS
474 475
                                                     NULL,
#endif
476
                                                     false,
M
Michal Privoznik 已提交
477
                                                     config->max_queued_clients,
478
                                                     config->max_client_requests)))
479
                goto cleanup;
480

481 482
            if (virNetServerAddService(srv, svcTCP,
                                       config->mdns_adv ? "_libvirt._tcp" : NULL) < 0)
483
                goto cleanup;
484 485
        }

486
#if WITH_GNUTLS
487 488
        if (config->listen_tls) {
            virNetTLSContextPtr ctxt = NULL;
489

490 491 492
            if (config->ca_file ||
                config->cert_file ||
                config->key_file) {
493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
                if (!config->ca_file) {
                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                                   _("No CA certificate path set to match server key/cert"));
                    goto cleanup;
                }
                if (!config->cert_file) {
                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                                   _("No server certificate path set to match server key"));
                    goto cleanup;
                }
                if (!config->key_file) {
                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                                   _("No server key path set to match server cert"));
                    goto cleanup;
                }
                VIR_DEBUG("Using CA='%s' cert='%s' key='%s'",
                          config->ca_file, config->cert_file, config->key_file);
510 511 512 513 514
                if (!(ctxt = virNetTLSContextNewServer(config->ca_file,
                                                       config->crl_file,
                                                       config->cert_file,
                                                       config->key_file,
                                                       (const char *const*)config->tls_allowed_dn_list,
515
                                                       config->tls_priority,
516
                                                       config->tls_no_sanity_certificate ? false : true,
517
                                                       config->tls_no_verify_certificate ? false : true)))
518
                    goto cleanup;
519 520 521 522
            } else {
                if (!(ctxt = virNetTLSContextNewServerPath(NULL,
                                                           !privileged,
                                                           (const char *const*)config->tls_allowed_dn_list,
523
                                                           config->tls_priority,
524
                                                           config->tls_no_sanity_certificate ? false : true,
525
                                                           config->tls_no_verify_certificate ? false : true)))
526
                    goto cleanup;
527 528
            }

529 530
            VIR_DEBUG("Registering TLS socket %s:%s",
                      config->listen_addr, config->tls_port);
531 532 533
            if (!(svcTLS =
                  virNetServerServiceNewTCP(config->listen_addr,
                                            config->tls_port,
534
                                            AF_UNSPEC,
535
                                            config->auth_tls,
536
                                            ctxt,
537
                                            false,
M
Michal Privoznik 已提交
538
                                            config->max_queued_clients,
539
                                            config->max_client_requests))) {
540
                virObjectUnref(ctxt);
541
                goto cleanup;
542
            }
543 544 545
            if (virNetServerAddService(srv, svcTLS,
                                       config->mdns_adv &&
                                       !config->listen_tcp ? "_libvirt._tcp" : NULL) < 0)
546
                goto cleanup;
547

548
            virObjectUnref(ctxt);
549
        }
550 551 552 553 554
#else
        (void)privileged;
        if (config->listen_tls) {
            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                           _("This libvirtd build does not support TLS"));
555
            goto cleanup;
556 557
        }
#endif
558 559
    }

560
#if WITH_SASL
561
    if (config->auth_unix_rw == REMOTE_AUTH_SASL ||
562
        (sock_path_ro && config->auth_unix_ro == REMOTE_AUTH_SASL) ||
563
# if WITH_GNUTLS
564
        (ipsock && config->listen_tls && config->auth_tls == REMOTE_AUTH_SASL) ||
565
# endif
566
        (ipsock && config->listen_tcp && config->auth_tcp == REMOTE_AUTH_SASL)) {
567 568 569
        saslCtxt = virNetSASLContextNewServer(
            (const char *const*)config->sasl_allowed_username_list);
        if (!saslCtxt)
570
            goto cleanup;
D
Daniel P. Berrange 已提交
571
    }
572
#endif
D
Daniel P. Berrange 已提交
573

574
    ret = 0;
575

576
 cleanup:
577
#if WITH_GNUTLS
578
    virObjectUnref(svcTLS);
579
#endif
580 581
    virObjectUnref(svcTCP);
    virObjectUnref(svcRO);
582
    virObjectUnref(svcAdm);
583 584
    virObjectUnref(svc);
    return ret;
D
Daniel P. Berrange 已提交
585 586 587
}


588 589 590 591 592 593 594 595 596 597
/*
 * Set up the openvswitch timeout
 */
static void
daemonSetupNetDevOpenvswitch(struct daemonConfig *config)
{
    virNetDevOpenvswitchSetTimeout(config->ovs_timeout);
}


598 599
/*
 * Set up the logging environment
600 601
 * By default if daemonized all errors go to the logfile libvirtd.log,
 * but if verbose or error debugging is asked for then also output
602
 * informational and debug messages. Default size if 64 kB.
603
 */
604
static int
605 606 607 608
daemonSetupLogging(struct daemonConfig *config,
                   bool privileged,
                   bool verbose,
                   bool godaemon)
609
{
610 611
    virLogReset();

612
    /*
613 614 615
     * Libvirtd's order of precedence is:
     * cmdline > environment > config
     *
616
     * Given the precedence, we must process the variables in the opposite
617
     * order, each one overriding the previous.
618
     */
619 620
    if (config->log_level != 0)
        virLogSetDefaultPriority(config->log_level);
621

622 623 624
    /* In case the config is empty, both filters and outputs will become empty,
     * however we can't start with empty outputs, thus we'll need to define and
     * setup a default one.
625 626 627
     */
    ignore_value(virLogSetFilters(config->log_filters));
    ignore_value(virLogSetOutputs(config->log_outputs));
628

629 630
    /* If there are some environment variables defined, use those instead */
    virLogSetFromEnv();
631

632 633 634 635 636 637
    /*
     * Command line override for --verbose
     */
    if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
        virLogSetDefaultPriority(VIR_LOG_INFO);

638 639 640 641 642 643 644 645 646
    /* Define the default output. This is only applied if there was no setting
     * from either the config or the environment.
     */
    if (virLogSetDefaultOutput("libvirtd.log", godaemon, privileged) < 0)
        return -1;

    if (virLogGetNbOutputs() == 0)
        virLogSetOutputs(virLogGetDefaultOutput());

647 648 649
    return 0;
}

650

651 652 653 654 655
static int
daemonSetupAccessManager(struct daemonConfig *config)
{
    virAccessManagerPtr mgr;
    const char *none[] = { "none", NULL };
J
Ján Tomko 已提交
656
    const char **drv = (const char **)config->access_drivers;
657

J
Ján Tomko 已提交
658 659 660
    if (!drv ||
        !drv[0])
        drv = none;
661

J
Ján Tomko 已提交
662
    if (!(mgr = virAccessManagerNewStack(drv)))
663 664 665 666 667 668 669 670
        return -1;

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


671 672
/* Display version information. */
static void
673
daemonVersion(const char *argv0)
674
{
675
    printf("%s (%s) %s\n", argv0, PACKAGE_NAME, PACKAGE_VERSION);
676 677
}

678

679
static void daemonShutdownHandler(virNetDaemonPtr dmn,
680 681
                                  siginfo_t *sig ATTRIBUTE_UNUSED,
                                  void *opaque ATTRIBUTE_UNUSED)
682
{
683
    virNetDaemonQuit(dmn);
684
}
685

686 687 688 689 690 691 692 693 694
static void daemonReloadHandlerThread(void *opague ATTRIBUTE_UNUSED)
{
    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");
}

695
static void daemonReloadHandler(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
696 697 698
                                siginfo_t *sig ATTRIBUTE_UNUSED,
                                void *opaque ATTRIBUTE_UNUSED)
{
699 700
    virThread thr;

701 702 703 704 705
    if (!driversInitialized) {
        VIR_WARN("Drivers are not initialized, reload ignored");
        return;
    }

706 707 708 709 710 711
    if (virThreadCreate(&thr, false, daemonReloadHandlerThread, NULL) < 0) {
        /*
         * Not much we can do on error here except log it.
         */
        VIR_ERROR(_("Failed to create thread to handle daemon restart"));
    }
712 713
}

714
static int daemonSetupSignals(virNetDaemonPtr dmn)
715
{
716
    if (virNetDaemonAddSignalHandler(dmn, SIGINT, daemonShutdownHandler, NULL) < 0)
717
        return -1;
718
    if (virNetDaemonAddSignalHandler(dmn, SIGQUIT, daemonShutdownHandler, NULL) < 0)
719
        return -1;
720
    if (virNetDaemonAddSignalHandler(dmn, SIGTERM, daemonShutdownHandler, NULL) < 0)
721
        return -1;
722
    if (virNetDaemonAddSignalHandler(dmn, SIGHUP, daemonReloadHandler, NULL) < 0)
723
        return -1;
724 725
    return 0;
}
726

727 728 729

static void daemonInhibitCallback(bool inhibit, void *opaque)
{
730
    virNetDaemonPtr dmn = opaque;
731 732

    if (inhibit)
733
        virNetDaemonAddShutdownInhibition(dmn);
734
    else
735
        virNetDaemonRemoveShutdownInhibition(dmn);
736 737 738
}


739
#ifdef WITH_DBUS
740 741 742 743 744
static DBusConnection *sessionBus;
static DBusConnection *systemBus;

static void daemonStopWorker(void *opaque)
{
745
    virNetDaemonPtr dmn = opaque;
746

747
    VIR_DEBUG("Begin stop dmn=%p", dmn);
748 749 750

    ignore_value(virStateStop());

751
    VIR_DEBUG("Completed stop dmn=%p", dmn);
752 753

    /* Exit libvirtd cleanly */
754
    virNetDaemonQuit(dmn);
755 756 757 758
}


/* We do this in a thread to not block the main loop */
759
static void daemonStop(virNetDaemonPtr dmn)
760 761
{
    virThread thr;
762 763 764
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonStopWorker, dmn) < 0)
        virObjectUnref(dmn);
765 766 767 768 769 770 771 772
}


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

775
    VIR_DEBUG("dmn=%p", dmn);
776 777 778 779

    if (dbus_message_is_signal(message,
                               DBUS_INTERFACE_LOCAL,
                               "Disconnected"))
780
        daemonStop(dmn);
781 782 783 784 785 786 787 788 789 790

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}


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

793
    VIR_DEBUG("dmn=%p", dmn);
794 795 796 797

    if (dbus_message_is_signal(message,
                               "org.freedesktop.login1.Manager",
                               "PrepareForShutdown"))
798
        daemonStop(dmn);
799 800 801 802 803 804

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
#endif


805 806
static void daemonRunStateInit(void *opaque)
{
807
    virNetDaemonPtr dmn = opaque;
808 809 810
    virIdentityPtr sysident = virIdentityGetSystem();

    virIdentitySetCurrent(sysident);
811

812 813
    /* Since driver initialization can take time inhibit daemon shutdown until
       we're done so clients get a chance to connect */
814
    daemonInhibitCallback(true, dmn);
815

816
    /* Start the stateful HV drivers
E
Eric Blake 已提交
817
     * This is deliberately done after telling the parent process
818 819
     * we're ready, since it can take a long time and this will
     * seriously delay OS bootup process */
820
    if (virStateInitialize(virNetDaemonIsPrivileged(dmn),
821
                           daemonInhibitCallback,
822
                           dmn) < 0) {
823
        VIR_ERROR(_("Driver state initialization failed"));
824 825
        /* Ensure the main event loop quits */
        kill(getpid(), SIGTERM);
826
        goto cleanup;
827 828
    }

829 830
    driversInitialized = true;

831
#ifdef WITH_DBUS
832
    /* Tie the non-privileged libvirtd to the session/shutdown lifecycle */
833
    if (!virNetDaemonIsPrivileged(dmn)) {
834 835 836 837

        sessionBus = virDBusGetSessionBus();
        if (sessionBus != NULL)
            dbus_connection_add_filter(sessionBus,
838
                                       handleSessionMessageFunc, dmn, NULL);
839 840 841 842

        systemBus = virDBusGetSystemBus();
        if (systemBus != NULL) {
            dbus_connection_add_filter(systemBus,
843
                                       handleSystemMessageFunc, dmn, NULL);
844 845 846 847 848 849
            dbus_bus_add_match(systemBus,
                               "type='signal',sender='org.freedesktop.login1', interface='org.freedesktop.login1.Manager'",
                               NULL);
        }
    }
#endif
850
    /* Only now accept clients from network */
851
    virNetDaemonUpdateServices(dmn, true);
852
 cleanup:
853 854
    daemonInhibitCallback(false, dmn);
    virObjectUnref(dmn);
855 856
    virObjectUnref(sysident);
    virIdentitySetCurrent(NULL);
857
}
858

859
static int daemonStateInit(virNetDaemonPtr dmn)
860 861
{
    virThread thr;
862 863 864
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonRunStateInit, dmn) < 0) {
        virObjectUnref(dmn);
865 866
        return -1;
    }
867 868 869
    return 0;
}

870 871 872 873 874 875 876 877 878 879 880
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;

881 882
    VIR_DEBUG("Checking if user profile needs migrating");

883
    if (!(home = virGetUserDirectory()))
884 885
        goto cleanup;

886
    if (virAsprintf(&old_base, "%s/.libvirt", home) < 0)
887 888 889
        goto cleanup;

    /* if the new directory is there or the old one is not: do nothing */
890
    if (!(config_dir = virGetUserConfigDirectory()))
891 892 893
        goto cleanup;

    if (!virFileIsDir(old_base) || virFileExists(config_dir)) {
894 895 896
        VIR_DEBUG("No old profile in '%s' / "
                  "new profile directory already present '%s'",
                  old_base, config_dir);
897 898 899 900 901
        ret = 0;
        goto cleanup;
    }

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

907
    config_home = virGetEnvBlockSUID("XDG_CONFIG_HOME");
908
    if (config_home && config_home[0] != '\0') {
909 910
        if (VIR_STRDUP(xdg_dir, config_home) < 0)
            goto cleanup;
911
    } else {
912
        if (virAsprintf(&xdg_dir, "%s/.config", home) < 0)
913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929
            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;
    }

930
    VIR_DEBUG("Profile migrated from %s to %s", old_base, config_dir);
931 932 933 934 935 936 937 938 939 940 941 942
    ret = 0;

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

    return ret;
}

943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975
static int
daemonSetupHostUUID(const struct daemonConfig *config)
{
    static const char *machine_id = "/etc/machine-id";
    char buf[VIR_UUID_STRING_BUFLEN];
    const char *uuid;

    if (config->host_uuid) {
        uuid = config->host_uuid;
    } else if (!config->host_uuid_source ||
               STREQ(config->host_uuid_source, "smbios")) {
        /* smbios UUID is fetched on demand in virGetHostUUID */
        return 0;
    } else if (STREQ(config->host_uuid_source, "machine-id")) {
        if (virFileReadBufQuiet(machine_id, buf, sizeof(buf)) < 0) {
            VIR_ERROR(_("Can't read %s"), machine_id);
            return -1;
        }

        uuid = buf;
    } else {
        VIR_ERROR(_("invalid UUID source: %s"), config->host_uuid_source);
        return -1;
    }

    if (virSetHostUUIDStr(uuid)) {
        VIR_ERROR(_("invalid host UUID: %s"), uuid);
        return -1;
    }

    return 0;
}

976 977
/* Print command-line usage. */
static void
978
daemonUsage(const char *argv0, bool privileged)
979
{
980 981 982 983 984 985
    fprintf(stderr,
            _("\n"
              "Usage:\n"
              "  %s [options]\n"
              "\n"
              "Options:\n"
986
              "  -h | --help            Display program help:\n"
987 988 989 990 991
              "  -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"
992
              "  -V | --version         Display version information.\n"
993 994 995 996
              "  -p | --pid-file <file> Change name of PID file.\n"
              "\n"
              "libvirt management daemon:\n"),
            argv0);
997 998 999

    if (privileged) {
        fprintf(stderr,
1000 1001 1002 1003
                _("\n"
                  "  Default paths:\n"
                  "\n"
                  "    Configuration file (unless overridden by -f):\n"
1004
                  "      %s\n"
1005 1006
                  "\n"
                  "    Sockets:\n"
1007 1008
                  "      %s\n"
                  "      %s\n"
1009 1010
                  "\n"
                  "    TLS:\n"
1011 1012 1013
                  "      CA certificate:     %s\n"
                  "      Server certificate: %s\n"
                  "      Server private key: %s\n"
1014 1015 1016 1017
                  "\n"
                  "    PID file (unless overridden by -p):\n"
                  "      %s/run/libvirtd.pid\n"
                  "\n"),
1018 1019 1020
                LIBVIRTD_CONFIGURATION_FILE,
                LIBVIRTD_PRIV_UNIX_SOCKET,
                LIBVIRTD_PRIV_UNIX_SOCKET_RO,
1021 1022 1023
                LIBVIRT_CACERT,
                LIBVIRT_SERVERCERT,
                LIBVIRT_SERVERKEY,
1024 1025
                LOCALSTATEDIR);
    } else {
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
        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"));
1044
    }
1045 1046
}

D
Daniel P. Berrange 已提交
1047
int main(int argc, char **argv) {
1048
    virNetDaemonPtr dmn = NULL;
1049
    virNetServerPtr srv = NULL;
1050
    virNetServerPtr srvAdm = NULL;
1051 1052
    virNetServerProgramPtr adminProgram = NULL;
    virNetServerProgramPtr lxcProgram = NULL;
1053
    char *remote_config_file = NULL;
1054
    int statuswrite = -1;
1055
    int ret = 1;
1056
    int pid_file_fd = -1;
1057 1058 1059
    char *pid_file = NULL;
    char *sock_file = NULL;
    char *sock_file_ro = NULL;
1060
    char *sock_file_adm = NULL;
1061 1062 1063 1064 1065 1066
    int timeout = -1;        /* -t: Shutdown timeout */
    int verbose = 0;
    int godaemon = 0;
    int ipsock = 0;
    struct daemonConfig *config;
    bool privileged = geteuid() == 0 ? true : false;
1067
    bool implicit_conf = false;
1068 1069
    char *run_dir = NULL;
    mode_t old_umask;
D
Daniel P. Berrange 已提交
1070 1071

    struct option opts[] = {
1072 1073 1074
        { "verbose", no_argument, &verbose, 'v'},
        { "daemon", no_argument, &godaemon, 'd'},
        { "listen", no_argument, &ipsock, 'l'},
1075
        { "config", required_argument, NULL, 'f'},
1076 1077
        { "timeout", required_argument, NULL, 't'},
        { "pid-file", required_argument, NULL, 'p'},
1078 1079
        { "version", no_argument, NULL, 'V' },
        { "help", no_argument, NULL, 'h' },
D
Daniel P. Berrange 已提交
1080 1081 1082
        {0, 0, 0, 0}
    };

1083
    if (virGettextInitialize() < 0 ||
E
Eric Blake 已提交
1084
        virInitialize() < 0) {
1085
        fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
E
Eric Blake 已提交
1086
        exit(EXIT_FAILURE);
1087
    }
D
Daniel P. Berrange 已提交
1088

1089 1090
    virUpdateSelfLastChanged(argv[0]);

1091 1092
    virFileActivateDirOverride(argv[0]);

D
Daniel P. Berrange 已提交
1093 1094 1095 1096 1097
    while (1) {
        int optidx = 0;
        int c;
        char *tmp;

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

1100
        if (c == -1)
D
Daniel P. Berrange 已提交
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112
            break;

        switch (c) {
        case 0:
            /* Got one of the flags */
            break;
        case 'v':
            verbose = 1;
            break;
        case 'd':
            godaemon = 1;
            break;
1113 1114
        case 'l':
            ipsock = 1;
D
Daniel P. Berrange 已提交
1115 1116 1117
            break;

        case 't':
1118
            if (virStrToLong_i(optarg, &tmp, 10, &timeout) != 0
1119 1120
                || timeout <= 0
                /* Ensure that we can multiply by 1000 without overflowing.  */
1121 1122 1123 1124
                || timeout > INT_MAX / 1000) {
                VIR_ERROR(_("Invalid value for timeout"));
                exit(EXIT_FAILURE);
            }
D
Daniel P. Berrange 已提交
1125
            break;
1126 1127

        case 'p':
1128
            VIR_FREE(pid_file);
1129
            if (VIR_STRDUP_QUIET(pid_file, optarg) < 0) {
1130
                VIR_ERROR(_("Can't allocate memory"));
1131
                exit(EXIT_FAILURE);
1132
            }
1133 1134 1135
            break;

        case 'f':
1136
            VIR_FREE(remote_config_file);
1137
            if (VIR_STRDUP_QUIET(remote_config_file, optarg) < 0) {
1138
                VIR_ERROR(_("Can't allocate memory"));
1139
                exit(EXIT_FAILURE);
1140
            }
1141 1142
            break;

1143
        case 'V':
1144
            daemonVersion(argv[0]);
1145
            exit(EXIT_SUCCESS);
1146

1147
        case 'h':
1148
            daemonUsage(argv[0], privileged);
1149
            exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
1150

1151
        case '?':
D
Daniel P. Berrange 已提交
1152
        default:
1153
            daemonUsage(argv[0], privileged);
1154
            exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
1155 1156 1157
        }
    }

1158 1159 1160 1161 1162 1163
    if (optind != argc) {
        fprintf(stderr, "%s: unexpected, non-option, command line arguments\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

1164 1165
    if (!(config = daemonConfigNew(privileged))) {
        VIR_ERROR(_("Can't create initial configuration"));
1166
        exit(EXIT_FAILURE);
1167
    }
1168 1169

    /* No explicit config, so try and find a default one */
1170 1171 1172
    if (remote_config_file == NULL) {
        implicit_conf = true;
        if (daemonConfigFilePath(privileged,
1173 1174
                                 &remote_config_file) < 0) {
            VIR_ERROR(_("Can't determine config path"));
1175
            exit(EXIT_FAILURE);
1176
        }
1177
    }
1178 1179 1180

    /* Read the config file if it exists*/
    if (remote_config_file &&
1181
        daemonConfigLoadFile(config, remote_config_file, implicit_conf) < 0) {
1182 1183
        VIR_ERROR(_("Can't load config file: %s: %s"),
                  virGetLastErrorMessage(), remote_config_file);
1184
        exit(EXIT_FAILURE);
1185
    }
1186

1187
    if (!privileged &&
1188 1189
        migrateProfile() < 0) {
        VIR_ERROR(_("Exiting due to failure to migrate profile"));
1190
        exit(EXIT_FAILURE);
1191
    }
1192

1193 1194
    if (daemonSetupHostUUID(config) < 0) {
        VIR_ERROR(_("Can't setup host uuid"));
1195
        exit(EXIT_FAILURE);
1196 1197
    }

1198 1199
    if (daemonSetupLogging(config, privileged, verbose, godaemon) < 0) {
        VIR_ERROR(_("Can't initialize logging"));
1200
        exit(EXIT_FAILURE);
1201
    }
1202

1203 1204
    daemonSetupNetDevOpenvswitch(config);

1205 1206 1207 1208 1209
    if (daemonSetupAccessManager(config) < 0) {
        VIR_ERROR(_("Can't initialize access manager"));
        exit(EXIT_FAILURE);
    }

1210
    if (!pid_file &&
1211 1212 1213 1214
        virPidFileConstructPath(privileged,
                                LOCALSTATEDIR,
                                "libvirtd",
                                &pid_file) < 0) {
1215
        VIR_ERROR(_("Can't determine pid file path."));
1216
        exit(EXIT_FAILURE);
1217
    }
1218
    VIR_DEBUG("Decided on pid file path '%s'", NULLSTR(pid_file));
1219 1220 1221 1222

    if (daemonUnixSocketPaths(config,
                              privileged,
                              &sock_file,
1223 1224
                              &sock_file_ro,
                              &sock_file_adm) < 0) {
1225
        VIR_ERROR(_("Can't determine socket paths"));
1226
        exit(EXIT_FAILURE);
1227
    }
1228 1229 1230 1231
    VIR_DEBUG("Decided on socket paths '%s', '%s' and '%s'",
              sock_file,
              NULLSTR(sock_file_ro),
              NULLSTR(sock_file_adm));
1232

1233
    if (godaemon) {
1234
        char ebuf[1024];
1235 1236 1237 1238

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

1242
        if ((statuswrite = daemonForkIntoBackground(argv[0])) < 0) {
1243
            VIR_ERROR(_("Failed to fork as daemon: %s"),
1244
                      virStrerror(errno, ebuf, sizeof(ebuf)));
1245
            goto cleanup;
1246 1247 1248
        }
    }

1249 1250 1251 1252 1253 1254
    /* Try to claim the pidfile, exiting if we can't */
    if ((pid_file_fd = virPidFileAcquirePath(pid_file, false, getpid())) < 0) {
        ret = VIR_DAEMON_ERR_PIDFILE;
        goto cleanup;
    }

J
John Levon 已提交
1255
    /* Ensure the rundir exists (on tmpfs on some systems) */
1256
    if (privileged) {
1257 1258 1259 1260
        if (VIR_STRDUP_QUIET(run_dir, LOCALSTATEDIR "/run/libvirt") < 0) {
            VIR_ERROR(_("Can't allocate memory"));
            goto cleanup;
        }
1261
    } else {
1262
        run_dir = virGetUserRuntimeDirectory();
1263

1264
        if (!run_dir) {
1265 1266
            VIR_ERROR(_("Can't determine user directory"));
            goto cleanup;
J
John Levon 已提交
1267 1268
        }
    }
1269 1270 1271 1272
    if (privileged)
        old_umask = umask(022);
    else
        old_umask = umask(077);
1273
    VIR_DEBUG("Ensuring run dir '%s' exists", run_dir);
1274 1275 1276 1277 1278 1279 1280 1281
    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 已提交
1282

1283 1284 1285 1286 1287
    if (virNetlinkStartup() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1288 1289 1290 1291 1292
    if (!(dmn = virNetDaemonNew())) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1293
    if (!(srv = virNetServerNew("libvirtd", 1,
1294
                                config->min_workers,
1295
                                config->max_workers,
1296
                                config->prio_workers,
1297
                                config->max_clients,
1298
                                config->max_anonymous_clients,
1299 1300
                                config->keepalive_interval,
                                config->keepalive_count,
1301
                                config->mdns_adv ? config->mdns_name : NULL,
1302
                                remoteClientNew,
1303
                                NULL,
1304
                                remoteClientFree,
1305
                                NULL))) {
1306 1307 1308 1309
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1310
    if (virNetDaemonAddServer(dmn, srv) < 0) {
1311 1312 1313 1314
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1315
    daemonInitialize();
1316

1317 1318 1319 1320 1321 1322 1323 1324 1325
    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))) {
1326
        ret = VIR_DAEMON_ERR_INIT;
1327 1328 1329 1330 1331
        goto cleanup;
    }
    if (virNetServerAddProgram(srv, remoteProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1332
    }
1333

1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345
    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;
    }

1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
    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;
1356
    }
1357

1358
    if (!(srvAdm = virNetServerNew("admin", 1,
1359
                                   config->admin_min_workers,
1360 1361 1362 1363 1364 1365 1366
                                   config->admin_max_workers,
                                   0,
                                   config->admin_max_clients,
                                   0,
                                   config->admin_keepalive_interval,
                                   config->admin_keepalive_count,
                                   NULL,
1367
                                   remoteAdmClientNew,
1368
                                   NULL,
1369
                                   remoteAdmClientFree,
1370 1371 1372 1373 1374
                                   dmn))) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1375
    if (virNetDaemonAddServer(dmn, srvAdm) < 0) {
1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

    if (!(adminProgram = virNetServerProgramNew(ADMIN_PROGRAM,
                                                ADMIN_PROTOCOL_VERSION,
                                                adminProcs,
                                                adminNProcs))) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }
    if (virNetServerAddProgram(srvAdm, adminProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1392 1393
    if (timeout != -1) {
        VIR_DEBUG("Registering shutdown timeout %d", timeout);
1394
        virNetDaemonAutoShutdown(dmn, timeout);
1395
    }
1396

1397
    if ((daemonSetupSignals(dmn)) < 0) {
1398 1399
        ret = VIR_DAEMON_ERR_SIGNAL;
        goto cleanup;
1400
    }
D
Daniel P. Berrange 已提交
1401

1402
    if (config->audit_level) {
1403
        VIR_DEBUG("Attempting to configure auditing subsystem");
1404
        if (virAuditOpen(config->audit_level) < 0) {
1405
            if (config->audit_level > 1) {
1406
                ret = VIR_DAEMON_ERR_AUDIT;
1407
                goto cleanup;
1408
            }
1409
            VIR_DEBUG("Proceeding without auditing");
1410 1411
        }
    }
E
Eric Blake 已提交
1412
    virAuditLog(config->audit_logging > 0);
1413

1414
    /* setup the hooks if any */
1415
    if (virHookInitialize() < 0) {
1416
        ret = VIR_DAEMON_ERR_HOOKS;
1417
        goto cleanup;
1418 1419
    }

1420
    /* Disable error func, now logging is setup */
1421
    virSetErrorFunc(NULL, daemonErrorHandler);
1422
    virSetErrorLogPriorityFunc(daemonErrorLogFilter);
1423

1424 1425 1426 1427 1428 1429
    /*
     * 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,
1430
                0, "start", NULL, NULL);
1431

1432 1433 1434 1435 1436
    if (daemonSetupNetworking(srv, srvAdm,
                              config,
                              sock_file,
                              sock_file_ro,
                              sock_file_adm,
1437
                              ipsock, privileged) < 0) {
1438
        ret = VIR_DAEMON_ERR_NETWORK;
1439
        goto cleanup;
1440 1441
    }

1442 1443 1444 1445 1446 1447
    /* 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;
1448
        ignore_value(safewrite(statuswrite, &status, 1));
1449
        VIR_FORCE_CLOSE(statuswrite);
1450 1451
    }

1452
    /* Initialize drivers & then start accepting new clients from network */
1453
    if (daemonStateInit(dmn) < 0) {
1454 1455
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1456
    }
D
Daniel P. Berrange 已提交
1457

1458
#if defined(__linux__) && defined(NETLINK_ROUTE)
1459 1460
    /* Register the netlink event service for NETLINK_ROUTE */
    if (virNetlinkEventServiceStart(NETLINK_ROUTE, 0) < 0) {
1461 1462 1463
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1464
#endif
1465

1466
#if defined(__linux__) && defined(NETLINK_KOBJECT_UEVENT)
T
Tang Chen 已提交
1467 1468 1469 1470 1471
    /* Register the netlink event service for NETLINK_KOBJECT_UEVENT */
    if (virNetlinkEventServiceStart(NETLINK_KOBJECT_UEVENT, 1) < 0) {
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1472
#endif
T
Tang Chen 已提交
1473

1474
    /* Run event loop. */
1475
    virNetDaemonRun(dmn);
1476

1477 1478
    ret = 0;

1479
    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
1480
                0, "shutdown", NULL, NULL);
1481

1482
 cleanup:
1483 1484 1485
    /* Keep cleanup order in inverse order of startup */
    virNetDaemonClose(dmn);

1486
    virNetlinkEventServiceStopAll();
1487 1488 1489 1490 1491 1492 1493 1494

    if (driversInitialized) {
        /* NB: Possible issue with timing window between driversInitialized
         * setting if virNetlinkEventServerStart fails */
        driversInitialized = false;
        virStateCleanup();
    }

1495 1496
    virObjectUnref(adminProgram);
    virObjectUnref(srvAdm);
1497 1498 1499 1500 1501 1502
    virObjectUnref(qemuProgram);
    virObjectUnref(lxcProgram);
    virObjectUnref(remoteProgram);
    virObjectUnref(srv);
    virObjectUnref(dmn);

1503
    virNetlinkShutdown();
1504 1505 1506 1507 1508 1509

    if (pid_file_fd != -1)
        virPidFileReleasePath(pid_file, pid_file_fd);

    VIR_FREE(run_dir);

1510 1511 1512 1513
    if (statuswrite != -1) {
        if (ret != 0) {
            /* Tell parent of daemon what failed */
            char status = ret;
1514
            ignore_value(safewrite(statuswrite, &status, 1));
1515
        }
1516
        VIR_FORCE_CLOSE(statuswrite);
1517
    }
1518 1519 1520

    VIR_FREE(sock_file);
    VIR_FREE(sock_file_ro);
1521
    VIR_FREE(sock_file_adm);
1522

1523
    VIR_FREE(pid_file);
1524

1525
    VIR_FREE(remote_config_file);
1526 1527
    daemonConfigFree(config);

1528
    return ret;
D
Daniel P. Berrange 已提交
1529
}