“db46f3cefef204aa13a9078e2856417a9223c1a9”上不存在“src/remote/remote_daemon.c”
remote_daemon.c 44.1 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
#include <config.h>
23

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

31
#include "libvirt_internal.h"
32
#include "virerror.h"
E
Eric Blake 已提交
33
#include "virfile.h"
34
#include "virlog.h"
35
#include "virpidfile.h"
36
#include "virprocess.h"
37

38 39
#define VIR_FROM_THIS VIR_FROM_QEMU

40 41
#include "remote_daemon.h"
#include "remote_daemon_config.h"
42

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

60
#include "driver.h"
61

62 63
#include "configmake.h"

64 65
#include "virdbus.h"

66 67
VIR_LOG_INIT("daemon.libvirtd");

68
#if WITH_SASL
69
virNetSASLContextPtr saslCtxt = NULL;
70
#endif
71 72
virNetServerProgramPtr remoteProgram = NULL;
virNetServerProgramPtr qemuProgram = NULL;
73

74 75
volatile bool driversInitialized = false;

76 77 78 79 80 81 82 83 84
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,
85
    VIR_DAEMON_ERR_HOOKS,
86
    VIR_DAEMON_ERR_AUDIT,
87
    VIR_DAEMON_ERR_DRIVER,
88 89 90 91

    VIR_DAEMON_ERR_LAST
};

92
VIR_ENUM_DECL(virDaemonErr);
93 94
VIR_ENUM_IMPL(virDaemonErr,
              VIR_DAEMON_ERR_LAST,
95 96 97 98 99 100 101
              "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",
102
              "Unable to load configuration file",
103
              "Unable to look for hook scripts",
104
              "Unable to initialize audit system",
105 106
              "Unable to initialize driver",
);
107

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

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

123
            VIR_FORCE_CLOSE(statuspipe[0]);
124

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

            if (setsid() < 0)
                goto cleanup;

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

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

        }

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

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

170
            VIR_FORCE_CLOSE(statuspipe[1]);
171 172

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

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

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

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

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

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

211

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

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

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

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

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

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

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

262 263 264

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

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

    return priority;
}

298

299
static int daemonInitialize(void)
300
{
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
#ifdef WITH_NETWORK
309 310
    if (virDriverLoadModule("network", "networkRegister", false) < 0)
        return -1;
311 312
#endif
#ifdef WITH_INTERFACE
313 314
    if (virDriverLoadModule("interface", "interfaceRegister", false) < 0)
        return -1;
315
#endif
316 317 318 319
#ifdef WITH_SECRETS
    if (virDriverLoadModule("secret", "secretRegister", false) < 0)
        return -1;
#endif
320
#ifdef WITH_STORAGE
321 322
    if (virDriverLoadModule("storage", "storageRegister", false) < 0)
        return -1;
323 324
#endif
#ifdef WITH_NODE_DEVICES
325 326
    if (virDriverLoadModule("nodedev", "nodedevRegister", false) < 0)
        return -1;
327 328
#endif
#ifdef WITH_NWFILTER
329 330
    if (virDriverLoadModule("nwfilter", "nwfilterRegister", false) < 0)
        return -1;
331 332
#endif
#ifdef WITH_LIBXL
333 334
    if (virDriverLoadModule("libxl", "libxlRegister", false) < 0)
        return -1;
335 336
#endif
#ifdef WITH_QEMU
337 338
    if (virDriverLoadModule("qemu", "qemuRegister", false) < 0)
        return -1;
339 340
#endif
#ifdef WITH_LXC
341 342
    if (virDriverLoadModule("lxc", "lxcRegister", false) < 0)
        return -1;
343 344
#endif
#ifdef WITH_VBOX
345 346
    if (virDriverLoadModule("vbox", "vboxRegister", false) < 0)
        return -1;
347 348
#endif
#ifdef WITH_BHYVE
349 350
    if (virDriverLoadModule("bhyve", "bhyveRegister", false) < 0)
        return -1;
351 352
#endif
#ifdef WITH_VZ
353 354
    if (virDriverLoadModule("vz", "vzRegister", false) < 0)
        return -1;
355
#endif
356
    return 0;
357 358 359
}


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

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

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

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

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

399 400
    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);
401
        goto cleanup;
402 403
    }

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

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

432
    if (virNetServerAddService(srv, svc) < 0)
433
        goto cleanup;
434

435
    if (svcRO &&
436
        virNetServerAddService(srv, svcRO) < 0)
437
        goto cleanup;
438

439
    if (sock_path_adm) {
440 441 442 443 444 445
        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,
                                                  NULL,
446
                                                  false,
447 448
                                                  config->admin_max_queued_clients,
                                                  config->admin_max_client_requests)))
449
            goto cleanup;
450

451
        if (virNetServerAddService(srvAdm, svcAdm) < 0)
452
            goto cleanup;
453
    }
454

455
    if (ipsock) {
456
        if (config->listen_tcp) {
457 458
            VIR_DEBUG("Registering TCP socket %s:%s",
                      config->listen_addr, config->tcp_port);
459 460
            if (!(svcTCP = virNetServerServiceNewTCP(config->listen_addr,
                                                     config->tcp_port,
461
                                                     AF_UNSPEC,
462
                                                     config->auth_tcp,
463
                                                     NULL,
464
                                                     false,
M
Michal Privoznik 已提交
465
                                                     config->max_queued_clients,
466
                                                     config->max_client_requests)))
467
                goto cleanup;
468

469
            if (virNetServerAddService(srv, svcTCP) < 0)
470
                goto cleanup;
471 472
        }

473 474
        if (config->listen_tls) {
            virNetTLSContextPtr ctxt = NULL;
475

476 477 478
            if (config->ca_file ||
                config->cert_file ||
                config->key_file) {
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495
                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);
496 497 498 499 500
                if (!(ctxt = virNetTLSContextNewServer(config->ca_file,
                                                       config->crl_file,
                                                       config->cert_file,
                                                       config->key_file,
                                                       (const char *const*)config->tls_allowed_dn_list,
501
                                                       config->tls_priority,
502
                                                       config->tls_no_sanity_certificate ? false : true,
503
                                                       config->tls_no_verify_certificate ? false : true)))
504
                    goto cleanup;
505 506 507 508
            } else {
                if (!(ctxt = virNetTLSContextNewServerPath(NULL,
                                                           !privileged,
                                                           (const char *const*)config->tls_allowed_dn_list,
509
                                                           config->tls_priority,
510
                                                           config->tls_no_sanity_certificate ? false : true,
511
                                                           config->tls_no_verify_certificate ? false : true)))
512
                    goto cleanup;
513 514
            }

515 516
            VIR_DEBUG("Registering TLS socket %s:%s",
                      config->listen_addr, config->tls_port);
517 518 519
            if (!(svcTLS =
                  virNetServerServiceNewTCP(config->listen_addr,
                                            config->tls_port,
520
                                            AF_UNSPEC,
521
                                            config->auth_tls,
522
                                            ctxt,
523
                                            false,
M
Michal Privoznik 已提交
524
                                            config->max_queued_clients,
525
                                            config->max_client_requests))) {
526
                virObjectUnref(ctxt);
527
                goto cleanup;
528
            }
529
            if (virNetServerAddService(srv, svcTLS) < 0)
530
                goto cleanup;
531

532
            virObjectUnref(ctxt);
533 534 535
        }
    }

536
#if WITH_SASL
537 538 539
    if (virNetServerNeedsAuth(srv, REMOTE_AUTH_SASL) &&
        !(saslCtxt = virNetSASLContextNewServer(
              (const char *const*)config->sasl_allowed_username_list)))
540
            goto cleanup;
541
#endif
D
Daniel P. Berrange 已提交
542

543
    ret = 0;
544

545
 cleanup:
546 547 548
    virObjectUnref(svcTLS);
    virObjectUnref(svcTCP);
    virObjectUnref(svcRO);
549
    virObjectUnref(svcAdm);
550 551
    virObjectUnref(svc);
    return ret;
D
Daniel P. Berrange 已提交
552 553 554
}


555 556 557 558 559 560 561 562 563 564
/*
 * Set up the openvswitch timeout
 */
static void
daemonSetupNetDevOpenvswitch(struct daemonConfig *config)
{
    virNetDevOpenvswitchSetTimeout(config->ovs_timeout);
}


565 566
/*
 * Set up the logging environment
567 568
 * By default if daemonized all errors go to the logfile libvirtd.log,
 * but if verbose or error debugging is asked for then also output
569
 * informational and debug messages. Default size if 64 kB.
570
 */
571
static int
572 573 574 575
daemonSetupLogging(struct daemonConfig *config,
                   bool privileged,
                   bool verbose,
                   bool godaemon)
576
{
577 578
    virLogReset();

579
    /*
580 581 582
     * Libvirtd's order of precedence is:
     * cmdline > environment > config
     *
583
     * Given the precedence, we must process the variables in the opposite
584
     * order, each one overriding the previous.
585
     */
586 587
    if (config->log_level != 0)
        virLogSetDefaultPriority(config->log_level);
588

589 590 591
    /* 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.
592 593 594
     */
    ignore_value(virLogSetFilters(config->log_filters));
    ignore_value(virLogSetOutputs(config->log_outputs));
595

596 597
    /* If there are some environment variables defined, use those instead */
    virLogSetFromEnv();
598

599 600 601 602 603 604
    /*
     * Command line override for --verbose
     */
    if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
        virLogSetDefaultPriority(VIR_LOG_INFO);

605 606 607 608 609 610 611 612 613
    /* 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());

614 615 616
    return 0;
}

617

618 619 620 621 622
static int
daemonSetupAccessManager(struct daemonConfig *config)
{
    virAccessManagerPtr mgr;
    const char *none[] = { "none", NULL };
J
Ján Tomko 已提交
623
    const char **drv = (const char **)config->access_drivers;
624

J
Ján Tomko 已提交
625 626 627
    if (!drv ||
        !drv[0])
        drv = none;
628

J
Ján Tomko 已提交
629
    if (!(mgr = virAccessManagerNewStack(drv)))
630 631 632 633 634 635 636 637
        return -1;

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


638 639
/* Display version information. */
static void
640
daemonVersion(const char *argv0)
641
{
642
    printf("%s (%s) %s\n", argv0, PACKAGE_NAME, PACKAGE_VERSION);
643 644
}

645

646
static void daemonShutdownHandler(virNetDaemonPtr dmn,
647 648
                                  siginfo_t *sig ATTRIBUTE_UNUSED,
                                  void *opaque ATTRIBUTE_UNUSED)
649
{
650
    virNetDaemonQuit(dmn);
651
}
652

653 654 655 656 657 658 659 660 661
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");
}

662
static void daemonReloadHandler(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
663 664 665
                                siginfo_t *sig ATTRIBUTE_UNUSED,
                                void *opaque ATTRIBUTE_UNUSED)
{
666 667
    virThread thr;

668 669 670 671 672
    if (!driversInitialized) {
        VIR_WARN("Drivers are not initialized, reload ignored");
        return;
    }

673 674 675 676 677 678
    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"));
    }
679 680
}

681
static int daemonSetupSignals(virNetDaemonPtr dmn)
682
{
683
    if (virNetDaemonAddSignalHandler(dmn, SIGINT, daemonShutdownHandler, NULL) < 0)
684
        return -1;
685
    if (virNetDaemonAddSignalHandler(dmn, SIGQUIT, daemonShutdownHandler, NULL) < 0)
686
        return -1;
687
    if (virNetDaemonAddSignalHandler(dmn, SIGTERM, daemonShutdownHandler, NULL) < 0)
688
        return -1;
689
    if (virNetDaemonAddSignalHandler(dmn, SIGHUP, daemonReloadHandler, NULL) < 0)
690
        return -1;
691 692
    return 0;
}
693

694 695 696

static void daemonInhibitCallback(bool inhibit, void *opaque)
{
697
    virNetDaemonPtr dmn = opaque;
698 699

    if (inhibit)
700
        virNetDaemonAddShutdownInhibition(dmn);
701
    else
702
        virNetDaemonRemoveShutdownInhibition(dmn);
703 704 705
}


706
#ifdef WITH_DBUS
707 708 709 710 711
static DBusConnection *sessionBus;
static DBusConnection *systemBus;

static void daemonStopWorker(void *opaque)
{
712
    virNetDaemonPtr dmn = opaque;
713

714
    VIR_DEBUG("Begin stop dmn=%p", dmn);
715 716 717

    ignore_value(virStateStop());

718
    VIR_DEBUG("Completed stop dmn=%p", dmn);
719 720

    /* Exit libvirtd cleanly */
721
    virNetDaemonQuit(dmn);
722 723 724 725
}


/* We do this in a thread to not block the main loop */
726
static void daemonStop(virNetDaemonPtr dmn)
727 728
{
    virThread thr;
729 730 731
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonStopWorker, dmn) < 0)
        virObjectUnref(dmn);
732 733 734 735 736 737 738 739
}


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

742
    VIR_DEBUG("dmn=%p", dmn);
743 744 745 746

    if (dbus_message_is_signal(message,
                               DBUS_INTERFACE_LOCAL,
                               "Disconnected"))
747
        daemonStop(dmn);
748 749 750 751 752 753 754 755 756 757

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}


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

760
    VIR_DEBUG("dmn=%p", dmn);
761 762 763 764

    if (dbus_message_is_signal(message,
                               "org.freedesktop.login1.Manager",
                               "PrepareForShutdown"))
765
        daemonStop(dmn);
766 767 768 769 770 771

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
#endif


772 773
static void daemonRunStateInit(void *opaque)
{
774
    virNetDaemonPtr dmn = opaque;
775 776 777
    virIdentityPtr sysident = virIdentityGetSystem();

    virIdentitySetCurrent(sysident);
778

779 780
    /* Since driver initialization can take time inhibit daemon shutdown until
       we're done so clients get a chance to connect */
781
    daemonInhibitCallback(true, dmn);
782

783
    /* Start the stateful HV drivers
E
Eric Blake 已提交
784
     * This is deliberately done after telling the parent process
785 786
     * we're ready, since it can take a long time and this will
     * seriously delay OS bootup process */
787
    if (virStateInitialize(virNetDaemonIsPrivileged(dmn),
788
                           daemonInhibitCallback,
789
                           dmn) < 0) {
790
        VIR_ERROR(_("Driver state initialization failed"));
791 792
        /* Ensure the main event loop quits */
        kill(getpid(), SIGTERM);
793
        goto cleanup;
794 795
    }

796 797
    driversInitialized = true;

798
#ifdef WITH_DBUS
799
    /* Tie the non-privileged libvirtd to the session/shutdown lifecycle */
800
    if (!virNetDaemonIsPrivileged(dmn)) {
801 802 803 804

        sessionBus = virDBusGetSessionBus();
        if (sessionBus != NULL)
            dbus_connection_add_filter(sessionBus,
805
                                       handleSessionMessageFunc, dmn, NULL);
806 807 808 809

        systemBus = virDBusGetSystemBus();
        if (systemBus != NULL) {
            dbus_connection_add_filter(systemBus,
810
                                       handleSystemMessageFunc, dmn, NULL);
811 812 813 814 815 816
            dbus_bus_add_match(systemBus,
                               "type='signal',sender='org.freedesktop.login1', interface='org.freedesktop.login1.Manager'",
                               NULL);
        }
    }
#endif
817
    /* Only now accept clients from network */
818
    virNetDaemonUpdateServices(dmn, true);
819
 cleanup:
820 821
    daemonInhibitCallback(false, dmn);
    virObjectUnref(dmn);
822 823
    virObjectUnref(sysident);
    virIdentitySetCurrent(NULL);
824
}
825

826
static int daemonStateInit(virNetDaemonPtr dmn)
827 828
{
    virThread thr;
829 830 831
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonRunStateInit, dmn) < 0) {
        virObjectUnref(dmn);
832 833
        return -1;
    }
834 835 836
    return 0;
}

837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869
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;
}

870 871
/* Print command-line usage. */
static void
872
daemonUsage(const char *argv0, bool privileged)
873
{
874 875 876 877 878 879
    fprintf(stderr,
            _("\n"
              "Usage:\n"
              "  %s [options]\n"
              "\n"
              "Options:\n"
880
              "  -h | --help            Display program help:\n"
881 882 883 884 885
              "  -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"
886
              "  -V | --version         Display version information.\n"
887 888 889 890
              "  -p | --pid-file <file> Change name of PID file.\n"
              "\n"
              "libvirt management daemon:\n"),
            argv0);
891 892 893

    if (privileged) {
        fprintf(stderr,
894 895 896 897
                _("\n"
                  "  Default paths:\n"
                  "\n"
                  "    Configuration file (unless overridden by -f):\n"
898
                  "      %s\n"
899 900
                  "\n"
                  "    Sockets:\n"
901 902
                  "      %s\n"
                  "      %s\n"
903 904
                  "\n"
                  "    TLS:\n"
905 906 907
                  "      CA certificate:     %s\n"
                  "      Server certificate: %s\n"
                  "      Server private key: %s\n"
908 909 910 911
                  "\n"
                  "    PID file (unless overridden by -p):\n"
                  "      %s/run/libvirtd.pid\n"
                  "\n"),
912 913 914
                LIBVIRTD_CONFIGURATION_FILE,
                LIBVIRTD_PRIV_UNIX_SOCKET,
                LIBVIRTD_PRIV_UNIX_SOCKET_RO,
915 916 917
                LIBVIRT_CACERT,
                LIBVIRT_SERVERCERT,
                LIBVIRT_SERVERKEY,
918 919
                LOCALSTATEDIR);
    } else {
920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937
        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"));
938
    }
939 940
}

D
Daniel P. Berrange 已提交
941
int main(int argc, char **argv) {
942
    virNetDaemonPtr dmn = NULL;
943
    virNetServerPtr srv = NULL;
944
    virNetServerPtr srvAdm = NULL;
945 946
    virNetServerProgramPtr adminProgram = NULL;
    virNetServerProgramPtr lxcProgram = NULL;
947
    char *remote_config_file = NULL;
948
    int statuswrite = -1;
949
    int ret = 1;
950
    int pid_file_fd = -1;
951 952 953
    char *pid_file = NULL;
    char *sock_file = NULL;
    char *sock_file_ro = NULL;
954
    char *sock_file_adm = NULL;
955 956 957 958 959 960
    int timeout = -1;        /* -t: Shutdown timeout */
    int verbose = 0;
    int godaemon = 0;
    int ipsock = 0;
    struct daemonConfig *config;
    bool privileged = geteuid() == 0 ? true : false;
961
    bool implicit_conf = false;
962 963
    char *run_dir = NULL;
    mode_t old_umask;
D
Daniel P. Berrange 已提交
964 965

    struct option opts[] = {
966 967 968
        { "verbose", no_argument, &verbose, 'v'},
        { "daemon", no_argument, &godaemon, 'd'},
        { "listen", no_argument, &ipsock, 'l'},
969
        { "config", required_argument, NULL, 'f'},
970 971
        { "timeout", required_argument, NULL, 't'},
        { "pid-file", required_argument, NULL, 'p'},
972 973
        { "version", no_argument, NULL, 'V' },
        { "help", no_argument, NULL, 'h' },
D
Daniel P. Berrange 已提交
974 975 976
        {0, 0, 0, 0}
    };

977
    if (virGettextInitialize() < 0 ||
E
Eric Blake 已提交
978
        virInitialize() < 0) {
979
        fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
E
Eric Blake 已提交
980
        exit(EXIT_FAILURE);
981
    }
D
Daniel P. Berrange 已提交
982

983 984
    virUpdateSelfLastChanged(argv[0]);

985 986
    virFileActivateDirOverride(argv[0]);

D
Daniel P. Berrange 已提交
987 988 989 990 991
    while (1) {
        int optidx = 0;
        int c;
        char *tmp;

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

994
        if (c == -1)
D
Daniel P. Berrange 已提交
995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
            break;

        switch (c) {
        case 0:
            /* Got one of the flags */
            break;
        case 'v':
            verbose = 1;
            break;
        case 'd':
            godaemon = 1;
            break;
1007 1008
        case 'l':
            ipsock = 1;
D
Daniel P. Berrange 已提交
1009 1010 1011
            break;

        case 't':
1012
            if (virStrToLong_i(optarg, &tmp, 10, &timeout) != 0
1013 1014
                || timeout <= 0
                /* Ensure that we can multiply by 1000 without overflowing.  */
1015 1016 1017 1018
                || timeout > INT_MAX / 1000) {
                VIR_ERROR(_("Invalid value for timeout"));
                exit(EXIT_FAILURE);
            }
D
Daniel P. Berrange 已提交
1019
            break;
1020 1021

        case 'p':
1022
            VIR_FREE(pid_file);
1023
            if (VIR_STRDUP_QUIET(pid_file, optarg) < 0) {
1024
                VIR_ERROR(_("Can't allocate memory"));
1025
                exit(EXIT_FAILURE);
1026
            }
1027 1028 1029
            break;

        case 'f':
1030
            VIR_FREE(remote_config_file);
1031
            if (VIR_STRDUP_QUIET(remote_config_file, optarg) < 0) {
1032
                VIR_ERROR(_("Can't allocate memory"));
1033
                exit(EXIT_FAILURE);
1034
            }
1035 1036
            break;

1037
        case 'V':
1038
            daemonVersion(argv[0]);
1039
            exit(EXIT_SUCCESS);
1040

1041
        case 'h':
1042
            daemonUsage(argv[0], privileged);
1043
            exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
1044

1045
        case '?':
D
Daniel P. Berrange 已提交
1046
        default:
1047
            daemonUsage(argv[0], privileged);
1048
            exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
1049 1050 1051
        }
    }

1052 1053 1054 1055 1056 1057
    if (optind != argc) {
        fprintf(stderr, "%s: unexpected, non-option, command line arguments\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

1058 1059
    if (!(config = daemonConfigNew(privileged))) {
        VIR_ERROR(_("Can't create initial configuration"));
1060
        exit(EXIT_FAILURE);
1061
    }
1062 1063

    /* No explicit config, so try and find a default one */
1064 1065 1066
    if (remote_config_file == NULL) {
        implicit_conf = true;
        if (daemonConfigFilePath(privileged,
1067 1068
                                 &remote_config_file) < 0) {
            VIR_ERROR(_("Can't determine config path"));
1069
            exit(EXIT_FAILURE);
1070
        }
1071
    }
1072 1073 1074

    /* Read the config file if it exists*/
    if (remote_config_file &&
1075
        daemonConfigLoadFile(config, remote_config_file, implicit_conf) < 0) {
1076 1077
        VIR_ERROR(_("Can't load config file: %s: %s"),
                  virGetLastErrorMessage(), remote_config_file);
1078
        exit(EXIT_FAILURE);
1079
    }
1080

1081 1082
    if (daemonSetupHostUUID(config) < 0) {
        VIR_ERROR(_("Can't setup host uuid"));
1083
        exit(EXIT_FAILURE);
1084 1085
    }

1086 1087
    if (daemonSetupLogging(config, privileged, verbose, godaemon) < 0) {
        VIR_ERROR(_("Can't initialize logging"));
1088
        exit(EXIT_FAILURE);
1089
    }
1090

1091 1092
    daemonSetupNetDevOpenvswitch(config);

1093 1094 1095 1096 1097
    if (daemonSetupAccessManager(config) < 0) {
        VIR_ERROR(_("Can't initialize access manager"));
        exit(EXIT_FAILURE);
    }

1098
    if (!pid_file &&
1099 1100 1101 1102
        virPidFileConstructPath(privileged,
                                LOCALSTATEDIR,
                                "libvirtd",
                                &pid_file) < 0) {
1103
        VIR_ERROR(_("Can't determine pid file path."));
1104
        exit(EXIT_FAILURE);
1105
    }
1106
    VIR_DEBUG("Decided on pid file path '%s'", NULLSTR(pid_file));
1107 1108 1109 1110

    if (daemonUnixSocketPaths(config,
                              privileged,
                              &sock_file,
1111 1112
                              &sock_file_ro,
                              &sock_file_adm) < 0) {
1113
        VIR_ERROR(_("Can't determine socket paths"));
1114
        exit(EXIT_FAILURE);
1115
    }
1116 1117 1118 1119
    VIR_DEBUG("Decided on socket paths '%s', '%s' and '%s'",
              sock_file,
              NULLSTR(sock_file_ro),
              NULLSTR(sock_file_adm));
1120

1121
    if (godaemon) {
1122
        char ebuf[1024];
1123 1124 1125 1126

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

1130
        if ((statuswrite = daemonForkIntoBackground(argv[0])) < 0) {
1131
            VIR_ERROR(_("Failed to fork as daemon: %s"),
1132
                      virStrerror(errno, ebuf, sizeof(ebuf)));
1133
            goto cleanup;
1134 1135 1136
        }
    }

1137 1138 1139 1140 1141 1142
    /* 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 已提交
1143
    /* Ensure the rundir exists (on tmpfs on some systems) */
1144
    if (privileged) {
1145 1146 1147 1148
        if (VIR_STRDUP_QUIET(run_dir, LOCALSTATEDIR "/run/libvirt") < 0) {
            VIR_ERROR(_("Can't allocate memory"));
            goto cleanup;
        }
1149
    } else {
1150
        run_dir = virGetUserRuntimeDirectory();
1151

1152
        if (!run_dir) {
1153 1154
            VIR_ERROR(_("Can't determine user directory"));
            goto cleanup;
J
John Levon 已提交
1155 1156
        }
    }
1157 1158 1159 1160
    if (privileged)
        old_umask = umask(022);
    else
        old_umask = umask(077);
1161
    VIR_DEBUG("Ensuring run dir '%s' exists", run_dir);
1162 1163 1164 1165 1166 1167 1168 1169
    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 已提交
1170

1171 1172 1173 1174 1175
    if (virNetlinkStartup() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1176
    if (!(dmn = virNetDaemonNew())) {
1177
        ret = VIR_DAEMON_ERR_DRIVER;
1178 1179 1180
        goto cleanup;
    }

1181
    if (!(srv = virNetServerNew("libvirtd", 1,
1182
                                config->min_workers,
1183
                                config->max_workers,
1184
                                config->prio_workers,
1185
                                config->max_clients,
1186
                                config->max_anonymous_clients,
1187 1188
                                config->keepalive_interval,
                                config->keepalive_count,
1189
                                remoteClientNew,
1190
                                NULL,
1191
                                remoteClientFree,
1192
                                NULL))) {
1193 1194 1195 1196
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1197
    if (virNetDaemonAddServer(dmn, srv) < 0) {
1198 1199 1200 1201
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1202 1203 1204 1205
    if (daemonInitialize() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }
1206

1207 1208 1209 1210 1211 1212 1213 1214 1215
    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))) {
1216
        ret = VIR_DAEMON_ERR_INIT;
1217 1218 1219 1220 1221
        goto cleanup;
    }
    if (virNetServerAddProgram(srv, remoteProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1222
    }
1223

1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235
    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;
    }

1236 1237 1238 1239 1240 1241 1242 1243 1244 1245
    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;
1246
    }
1247

1248
    if (!(srvAdm = virNetServerNew("admin", 1,
1249
                                   config->admin_min_workers,
1250 1251 1252 1253 1254 1255
                                   config->admin_max_workers,
                                   0,
                                   config->admin_max_clients,
                                   0,
                                   config->admin_keepalive_interval,
                                   config->admin_keepalive_count,
1256
                                   remoteAdmClientNew,
1257
                                   NULL,
1258
                                   remoteAdmClientFree,
1259 1260 1261 1262 1263
                                   dmn))) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1264
    if (virNetDaemonAddServer(dmn, srvAdm) < 0) {
1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280
        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;
    }

1281 1282
    if (timeout != -1) {
        VIR_DEBUG("Registering shutdown timeout %d", timeout);
1283
        virNetDaemonAutoShutdown(dmn, timeout);
1284
    }
1285

1286
    if ((daemonSetupSignals(dmn)) < 0) {
1287 1288
        ret = VIR_DAEMON_ERR_SIGNAL;
        goto cleanup;
1289
    }
D
Daniel P. Berrange 已提交
1290

1291
    if (config->audit_level) {
1292
        VIR_DEBUG("Attempting to configure auditing subsystem");
1293
        if (virAuditOpen(config->audit_level) < 0) {
1294
            if (config->audit_level > 1) {
1295
                ret = VIR_DAEMON_ERR_AUDIT;
1296
                goto cleanup;
1297
            }
1298
            VIR_DEBUG("Proceeding without auditing");
1299 1300
        }
    }
E
Eric Blake 已提交
1301
    virAuditLog(config->audit_logging > 0);
1302

1303
    /* setup the hooks if any */
1304
    if (virHookInitialize() < 0) {
1305
        ret = VIR_DAEMON_ERR_HOOKS;
1306
        goto cleanup;
1307 1308
    }

1309
    /* Disable error func, now logging is setup */
1310
    virSetErrorFunc(NULL, daemonErrorHandler);
1311
    virSetErrorLogPriorityFunc(daemonErrorLogFilter);
1312

1313 1314 1315 1316 1317 1318
    /*
     * 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,
1319
                0, "start", NULL, NULL);
1320

1321 1322 1323 1324 1325
    if (daemonSetupNetworking(srv, srvAdm,
                              config,
                              sock_file,
                              sock_file_ro,
                              sock_file_adm,
1326
                              ipsock, privileged) < 0) {
1327
        ret = VIR_DAEMON_ERR_NETWORK;
1328
        goto cleanup;
1329 1330
    }

1331 1332 1333 1334 1335 1336
    /* 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;
1337
        ignore_value(safewrite(statuswrite, &status, 1));
1338
        VIR_FORCE_CLOSE(statuswrite);
1339 1340
    }

1341
    /* Initialize drivers & then start accepting new clients from network */
1342
    if (daemonStateInit(dmn) < 0) {
1343 1344
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1345
    }
D
Daniel P. Berrange 已提交
1346

1347
#if defined(__linux__) && defined(NETLINK_ROUTE)
1348 1349
    /* Register the netlink event service for NETLINK_ROUTE */
    if (virNetlinkEventServiceStart(NETLINK_ROUTE, 0) < 0) {
1350 1351 1352
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1353
#endif
1354

1355
#if defined(__linux__) && defined(NETLINK_KOBJECT_UEVENT)
T
Tang Chen 已提交
1356 1357 1358 1359 1360
    /* Register the netlink event service for NETLINK_KOBJECT_UEVENT */
    if (virNetlinkEventServiceStart(NETLINK_KOBJECT_UEVENT, 1) < 0) {
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1361
#endif
T
Tang Chen 已提交
1362

1363
    /* Run event loop. */
1364
    virNetDaemonRun(dmn);
1365

1366 1367
    ret = 0;

1368
    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
1369
                0, "shutdown", NULL, NULL);
1370

1371
 cleanup:
1372 1373 1374
    /* Keep cleanup order in inverse order of startup */
    virNetDaemonClose(dmn);

1375
    virNetlinkEventServiceStopAll();
1376 1377 1378 1379 1380 1381 1382 1383

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

1384 1385
    virObjectUnref(adminProgram);
    virObjectUnref(srvAdm);
1386 1387 1388 1389 1390 1391
    virObjectUnref(qemuProgram);
    virObjectUnref(lxcProgram);
    virObjectUnref(remoteProgram);
    virObjectUnref(srv);
    virObjectUnref(dmn);

1392
    virNetlinkShutdown();
1393 1394 1395 1396 1397 1398

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

    VIR_FREE(run_dir);

1399 1400 1401 1402
    if (statuswrite != -1) {
        if (ret != 0) {
            /* Tell parent of daemon what failed */
            char status = ret;
1403
            ignore_value(safewrite(statuswrite, &status, 1));
1404
        }
1405
        VIR_FORCE_CLOSE(statuswrite);
1406
    }
1407 1408 1409

    VIR_FREE(sock_file);
    VIR_FREE(sock_file_ro);
1410
    VIR_FREE(sock_file_adm);
1411

1412
    VIR_FREE(pid_file);
1413

1414
    VIR_FREE(remote_config_file);
1415 1416
    daemonConfigFree(config);

1417
    return ret;
D
Daniel P. Berrange 已提交
1418
}