remote_daemon.c 43.6 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"
59
#include "virsystemd.h"
D
Daniel P. Berrange 已提交
60

61
#include "driver.h"
62

63 64
#include "configmake.h"

65 66
#include "virdbus.h"

67 68
VIR_LOG_INIT("daemon.libvirtd");

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

75 76
volatile bool driversInitialized = false;

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

    VIR_DAEMON_ERR_LAST
};

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

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

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

124
            VIR_FORCE_CLOSE(statuspipe[0]);
125

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

            if (setsid() < 0)
                goto cleanup;

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

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

        }

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

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

171
            VIR_FORCE_CLOSE(statuspipe[1]);
172 173

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

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

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

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

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

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

212

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

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

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

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

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

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

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

263 264 265

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

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:
286
    case VIR_ERR_NO_NWFILTER_BINDING:
287 288
    case VIR_ERR_NO_SECRET:
    case VIR_ERR_NO_DOMAIN_SNAPSHOT:
289
    case VIR_ERR_OPERATION_INVALID:
290
    case VIR_ERR_NO_DOMAIN_METADATA:
291 292
    case VIR_ERR_NO_SERVER:
    case VIR_ERR_NO_CLIENT:
293 294 295 296 297 298
        return VIR_LOG_DEBUG;
    }

    return priority;
}

299

300
static int daemonInitialize(void)
301
{
302 303
    /*
     * Note that the order is important: the first ones have a higher
304 305 306
     * 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
307
     * domains can be auto-started.
308
     */
309
#ifdef WITH_NETWORK
310 311
    if (virDriverLoadModule("network", "networkRegister", false) < 0)
        return -1;
312 313
#endif
#ifdef WITH_INTERFACE
314 315
    if (virDriverLoadModule("interface", "interfaceRegister", false) < 0)
        return -1;
316
#endif
317 318 319 320
#ifdef WITH_SECRETS
    if (virDriverLoadModule("secret", "secretRegister", false) < 0)
        return -1;
#endif
321
#ifdef WITH_STORAGE
322 323
    if (virDriverLoadModule("storage", "storageRegister", false) < 0)
        return -1;
324 325
#endif
#ifdef WITH_NODE_DEVICES
326 327
    if (virDriverLoadModule("nodedev", "nodedevRegister", false) < 0)
        return -1;
328 329
#endif
#ifdef WITH_NWFILTER
330 331
    if (virDriverLoadModule("nwfilter", "nwfilterRegister", false) < 0)
        return -1;
332 333
#endif
#ifdef WITH_LIBXL
334 335
    if (virDriverLoadModule("libxl", "libxlRegister", false) < 0)
        return -1;
336 337
#endif
#ifdef WITH_QEMU
338 339
    if (virDriverLoadModule("qemu", "qemuRegister", false) < 0)
        return -1;
340 341
#endif
#ifdef WITH_LXC
342 343
    if (virDriverLoadModule("lxc", "lxcRegister", false) < 0)
        return -1;
344 345
#endif
#ifdef WITH_VBOX
346 347
    if (virDriverLoadModule("vbox", "vboxRegister", false) < 0)
        return -1;
348 349
#endif
#ifdef WITH_BHYVE
350 351
    if (virDriverLoadModule("bhyve", "bhyveRegister", false) < 0)
        return -1;
352 353
#endif
#ifdef WITH_VZ
354 355
    if (virDriverLoadModule("vz", "vzRegister", false) < 0)
        return -1;
356
#endif
357
    return 0;
358 359 360
}


361 362
static int ATTRIBUTE_NONNULL(3)
daemonSetupNetworking(virNetServerPtr srv,
363
                      virNetServerPtr srvAdm,
364 365 366
                      struct daemonConfig *config,
                      const char *sock_path,
                      const char *sock_path_ro,
367
                      const char *sock_path_adm,
368 369
                      bool ipsock,
                      bool privileged)
370 371 372 373
{
    gid_t unix_sock_gid = 0;
    int unix_sock_ro_mask = 0;
    int unix_sock_rw_mask = 0;
374
    int unix_sock_adm_mask = 0;
375
    int ret = -1;
376 377 378 379 380 381 382 383 384 385 386 387 388 389
    VIR_AUTOPTR(virSystemdActivation) act = NULL;
    virSystemdActivationMap actmap[] = {
        { .name = "libvirtd.socket", .family = AF_UNIX, .path = sock_path },
        { .name = "libvirtd-ro.socket", .family = AF_UNIX, .path = sock_path_ro },
        { .name = "libvirtd-admin.socket", .family = AF_UNIX, .path = sock_path_adm },
        { .name = "libvirtd-tcp.socket", .family = AF_INET },
        { .name = "libvirtd-tls.socket", .family = AF_INET },
    };

    if ((actmap[3].port = virSocketAddrResolveService(config->tcp_port)) < 0)
        return -1;

    if ((actmap[4].port = virSocketAddrResolveService(config->tls_port)) < 0)
        return -1;
390

391 392
    if (virSystemdGetActivation(actmap, ARRAY_CARDINALITY(actmap), &act) < 0)
        return -1;
393

394 395
    if (config->unix_sock_group) {
        if (virGetGroupID(config->unix_sock_group, &unix_sock_gid) < 0)
396
            return ret;
397
    }
398

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

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

409 410
    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);
411
        goto cleanup;
412
    }
413

414 415 416 417 418 419 420 421 422 423 424
    if (virNetServerAddServiceUNIX(srv,
                                   act,
                                   "libvirtd.socket",
                                   sock_path,
                                   unix_sock_rw_mask,
                                   unix_sock_gid,
                                   config->auth_unix_rw,
                                   NULL,
                                   false,
                                   config->max_queued_clients,
                                   config->max_client_requests) < 0)
425
        goto cleanup;
426 427 428 429 430 431 432 433 434 435 436 437
    if (sock_path_ro &&
        virNetServerAddServiceUNIX(srv,
                                   act,
                                   "libvirtd-ro.socket",
                                   sock_path_ro,
                                   unix_sock_ro_mask,
                                   unix_sock_gid,
                                   config->auth_unix_ro,
                                   NULL,
                                   true,
                                   config->max_queued_clients,
                                   config->max_client_requests) < 0)
438
        goto cleanup;
439

440 441 442 443 444 445 446 447 448 449 450 451
    if (sock_path_adm &&
        virNetServerAddServiceUNIX(srvAdm,
                                   act,
                                   "libvirtd-admin.socket",
                                   sock_path_adm,
                                   unix_sock_adm_mask,
                                   unix_sock_gid,
                                   REMOTE_AUTH_NONE,
                                   NULL,
                                   false,
                                   config->admin_max_queued_clients,
                                   config->admin_max_client_requests) < 0)
452
        goto cleanup;
453

454 455 456 457 458 459 460 461 462 463 464 465 466
    if (((ipsock && config->listen_tcp) || act) &&
        virNetServerAddServiceTCP(srv,
                                  act,
                                  "libvirtd-tcp.socket",
                                  config->listen_addr,
                                  config->tcp_port,
                                  AF_UNSPEC,
                                  config->auth_tcp,
                                  NULL,
                                  false,
                                  config->max_queued_clients,
                                  config->max_client_requests) < 0)
        goto cleanup;
467

468 469
    if (((ipsock && config->listen_tls) || (act && virSystemdActivationHasName(act, "ip-tls")))) {
        virNetTLSContextPtr ctxt = NULL;
470

471 472 473 474 475 476
        if (config->ca_file ||
            config->cert_file ||
            config->key_file) {
            if (!config->ca_file) {
                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                               _("No CA certificate path set to match server key/cert"));
477
                goto cleanup;
478 479 480 481
            }
            if (!config->cert_file) {
                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                               _("No server certificate path set to match server key"));
482
                goto cleanup;
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502
            }
            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);
            if (!(ctxt = virNetTLSContextNewServer(config->ca_file,
                                                   config->crl_file,
                                                   config->cert_file,
                                                   config->key_file,
                                                   (const char *const*)config->tls_allowed_dn_list,
                                                   config->tls_priority,
                                                   config->tls_no_sanity_certificate ? false : true,
                                                   config->tls_no_verify_certificate ? false : true)))
                goto cleanup;
        } else {
            if (!(ctxt = virNetTLSContextNewServerPath(NULL,
                                                       !privileged,
503
                                                       (const char *const*)config->tls_allowed_dn_list,
504
                                                       config->tls_priority,
505
                                                       config->tls_no_sanity_certificate ? false : true,
506
                                                       config->tls_no_verify_certificate ? false : true)))
507
                goto cleanup;
508
        }
509

510 511 512 513 514 515 516 517 518 519 520 521 522
        VIR_DEBUG("Registering TLS socket %s:%s",
                  config->listen_addr, config->tls_port);
        if (virNetServerAddServiceTCP(srv,
                                      act,
                                      "libvirtd-tls.socket",
                                      config->listen_addr,
                                      config->tls_port,
                                      AF_UNSPEC,
                                      config->auth_tls,
                                      ctxt,
                                      false,
                                      config->max_queued_clients,
                                      config->max_client_requests) < 0) {
523
            virObjectUnref(ctxt);
524
            goto cleanup;
525
        }
526
        virObjectUnref(ctxt);
527 528
    }

529 530 531 532
    if (act &&
        virSystemdActivationComplete(act) < 0)
        goto cleanup;

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

540
    ret = 0;
541

542 543
 cleanup:
    return ret;
D
Daniel P. Berrange 已提交
544 545 546
}


547 548 549 550 551 552 553 554 555 556
/*
 * Set up the openvswitch timeout
 */
static void
daemonSetupNetDevOpenvswitch(struct daemonConfig *config)
{
    virNetDevOpenvswitchSetTimeout(config->ovs_timeout);
}


557 558
/*
 * Set up the logging environment
559 560
 * By default if daemonized all errors go to the logfile libvirtd.log,
 * but if verbose or error debugging is asked for then also output
561
 * informational and debug messages. Default size if 64 kB.
562
 */
563
static int
564 565 566 567
daemonSetupLogging(struct daemonConfig *config,
                   bool privileged,
                   bool verbose,
                   bool godaemon)
568
{
569 570
    virLogReset();

571
    /*
572 573 574
     * Libvirtd's order of precedence is:
     * cmdline > environment > config
     *
575
     * Given the precedence, we must process the variables in the opposite
576
     * order, each one overriding the previous.
577
     */
578 579
    if (config->log_level != 0)
        virLogSetDefaultPriority(config->log_level);
580

581 582 583
    /* 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.
584 585 586
     */
    ignore_value(virLogSetFilters(config->log_filters));
    ignore_value(virLogSetOutputs(config->log_outputs));
587

588 589
    /* If there are some environment variables defined, use those instead */
    virLogSetFromEnv();
590

591 592 593 594 595 596
    /*
     * Command line override for --verbose
     */
    if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
        virLogSetDefaultPriority(VIR_LOG_INFO);

597 598 599
    /* Define the default output. This is only applied if there was no setting
     * from either the config or the environment.
     */
600
    if (virLogSetDefaultOutput("libvirtd", godaemon, privileged) < 0)
601 602 603 604 605
        return -1;

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

606 607 608
    return 0;
}

609

610 611 612 613 614
static int
daemonSetupAccessManager(struct daemonConfig *config)
{
    virAccessManagerPtr mgr;
    const char *none[] = { "none", NULL };
J
Ján Tomko 已提交
615
    const char **drv = (const char **)config->access_drivers;
616

J
Ján Tomko 已提交
617 618 619
    if (!drv ||
        !drv[0])
        drv = none;
620

J
Ján Tomko 已提交
621
    if (!(mgr = virAccessManagerNewStack(drv)))
622 623 624 625 626 627 628 629
        return -1;

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


630 631
/* Display version information. */
static void
632
daemonVersion(const char *argv0)
633
{
634
    printf("%s (%s) %s\n", argv0, PACKAGE_NAME, PACKAGE_VERSION);
635 636
}

637

638
static void daemonShutdownHandler(virNetDaemonPtr dmn,
639 640
                                  siginfo_t *sig ATTRIBUTE_UNUSED,
                                  void *opaque ATTRIBUTE_UNUSED)
641
{
642
    virNetDaemonQuit(dmn);
643
}
644

645 646 647 648 649 650 651 652 653
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");
}

654
static void daemonReloadHandler(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
655 656 657
                                siginfo_t *sig ATTRIBUTE_UNUSED,
                                void *opaque ATTRIBUTE_UNUSED)
{
658 659
    virThread thr;

660 661 662 663 664
    if (!driversInitialized) {
        VIR_WARN("Drivers are not initialized, reload ignored");
        return;
    }

665 666 667 668 669 670
    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"));
    }
671 672
}

673
static int daemonSetupSignals(virNetDaemonPtr dmn)
674
{
675
    if (virNetDaemonAddSignalHandler(dmn, SIGINT, daemonShutdownHandler, NULL) < 0)
676
        return -1;
677
    if (virNetDaemonAddSignalHandler(dmn, SIGQUIT, daemonShutdownHandler, NULL) < 0)
678
        return -1;
679
    if (virNetDaemonAddSignalHandler(dmn, SIGTERM, daemonShutdownHandler, NULL) < 0)
680
        return -1;
681
    if (virNetDaemonAddSignalHandler(dmn, SIGHUP, daemonReloadHandler, NULL) < 0)
682
        return -1;
683 684
    return 0;
}
685

686 687 688

static void daemonInhibitCallback(bool inhibit, void *opaque)
{
689
    virNetDaemonPtr dmn = opaque;
690 691

    if (inhibit)
692
        virNetDaemonAddShutdownInhibition(dmn);
693
    else
694
        virNetDaemonRemoveShutdownInhibition(dmn);
695 696 697
}


698
#ifdef WITH_DBUS
699 700 701 702 703
static DBusConnection *sessionBus;
static DBusConnection *systemBus;

static void daemonStopWorker(void *opaque)
{
704
    virNetDaemonPtr dmn = opaque;
705

706
    VIR_DEBUG("Begin stop dmn=%p", dmn);
707 708 709

    ignore_value(virStateStop());

710
    VIR_DEBUG("Completed stop dmn=%p", dmn);
711 712

    /* Exit libvirtd cleanly */
713
    virNetDaemonQuit(dmn);
714 715 716 717
}


/* We do this in a thread to not block the main loop */
718
static void daemonStop(virNetDaemonPtr dmn)
719 720
{
    virThread thr;
721 722 723
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonStopWorker, dmn) < 0)
        virObjectUnref(dmn);
724 725 726 727 728 729 730 731
}


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

734
    VIR_DEBUG("dmn=%p", dmn);
735 736 737 738

    if (dbus_message_is_signal(message,
                               DBUS_INTERFACE_LOCAL,
                               "Disconnected"))
739
        daemonStop(dmn);
740 741 742 743 744 745 746 747 748 749

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}


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

752
    VIR_DEBUG("dmn=%p", dmn);
753 754 755 756

    if (dbus_message_is_signal(message,
                               "org.freedesktop.login1.Manager",
                               "PrepareForShutdown"))
757
        daemonStop(dmn);
758 759 760 761 762 763

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
#endif


764 765
static void daemonRunStateInit(void *opaque)
{
766
    virNetDaemonPtr dmn = opaque;
767 768 769
    virIdentityPtr sysident = virIdentityGetSystem();

    virIdentitySetCurrent(sysident);
770

771 772
    /* Since driver initialization can take time inhibit daemon shutdown until
       we're done so clients get a chance to connect */
773
    daemonInhibitCallback(true, dmn);
774

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

788 789
    driversInitialized = true;

790
#ifdef WITH_DBUS
791
    /* Tie the non-privileged libvirtd to the session/shutdown lifecycle */
792
    if (!virNetDaemonIsPrivileged(dmn)) {
793 794 795 796

        sessionBus = virDBusGetSessionBus();
        if (sessionBus != NULL)
            dbus_connection_add_filter(sessionBus,
797
                                       handleSessionMessageFunc, dmn, NULL);
798 799 800 801

        systemBus = virDBusGetSystemBus();
        if (systemBus != NULL) {
            dbus_connection_add_filter(systemBus,
802
                                       handleSystemMessageFunc, dmn, NULL);
803 804 805 806 807 808
            dbus_bus_add_match(systemBus,
                               "type='signal',sender='org.freedesktop.login1', interface='org.freedesktop.login1.Manager'",
                               NULL);
        }
    }
#endif
809
    /* Only now accept clients from network */
810
    virNetDaemonUpdateServices(dmn, true);
811
 cleanup:
812 813
    daemonInhibitCallback(false, dmn);
    virObjectUnref(dmn);
814 815
    virObjectUnref(sysident);
    virIdentitySetCurrent(NULL);
816
}
817

818
static int daemonStateInit(virNetDaemonPtr dmn)
819 820
{
    virThread thr;
821 822 823
    virObjectRef(dmn);
    if (virThreadCreate(&thr, false, daemonRunStateInit, dmn) < 0) {
        virObjectUnref(dmn);
824 825
        return -1;
    }
826 827 828
    return 0;
}

829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861
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;
}

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

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

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

    struct option opts[] = {
958 959 960
        { "verbose", no_argument, &verbose, 'v'},
        { "daemon", no_argument, &godaemon, 'd'},
        { "listen", no_argument, &ipsock, 'l'},
961
        { "config", required_argument, NULL, 'f'},
962 963
        { "timeout", required_argument, NULL, 't'},
        { "pid-file", required_argument, NULL, 'p'},
964 965
        { "version", no_argument, NULL, 'V' },
        { "help", no_argument, NULL, 'h' },
D
Daniel P. Berrange 已提交
966 967 968
        {0, 0, 0, 0}
    };

969
    if (virGettextInitialize() < 0 ||
E
Eric Blake 已提交
970
        virInitialize() < 0) {
971
        fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
E
Eric Blake 已提交
972
        exit(EXIT_FAILURE);
973
    }
D
Daniel P. Berrange 已提交
974

975 976
    virUpdateSelfLastChanged(argv[0]);

977 978
    virFileActivateDirOverride(argv[0]);

D
Daniel P. Berrange 已提交
979 980 981 982 983
    while (1) {
        int optidx = 0;
        int c;
        char *tmp;

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

986
        if (c == -1)
D
Daniel P. Berrange 已提交
987 988 989 990 991 992 993 994 995 996 997 998
            break;

        switch (c) {
        case 0:
            /* Got one of the flags */
            break;
        case 'v':
            verbose = 1;
            break;
        case 'd':
            godaemon = 1;
            break;
999 1000
        case 'l':
            ipsock = 1;
D
Daniel P. Berrange 已提交
1001 1002 1003
            break;

        case 't':
1004
            if (virStrToLong_i(optarg, &tmp, 10, &timeout) != 0
1005 1006
                || timeout <= 0
                /* Ensure that we can multiply by 1000 without overflowing.  */
1007 1008 1009 1010
                || timeout > INT_MAX / 1000) {
                VIR_ERROR(_("Invalid value for timeout"));
                exit(EXIT_FAILURE);
            }
D
Daniel P. Berrange 已提交
1011
            break;
1012 1013

        case 'p':
1014
            VIR_FREE(pid_file);
1015
            if (VIR_STRDUP_QUIET(pid_file, optarg) < 0) {
1016
                VIR_ERROR(_("Can't allocate memory"));
1017
                exit(EXIT_FAILURE);
1018
            }
1019 1020 1021
            break;

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

1029
        case 'V':
1030
            daemonVersion(argv[0]);
1031
            exit(EXIT_SUCCESS);
1032

1033
        case 'h':
1034
            daemonUsage(argv[0], privileged);
1035
            exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
1036

1037
        case '?':
D
Daniel P. Berrange 已提交
1038
        default:
1039
            daemonUsage(argv[0], privileged);
1040
            exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
1041 1042 1043
        }
    }

1044 1045 1046 1047 1048 1049
    if (optind != argc) {
        fprintf(stderr, "%s: unexpected, non-option, command line arguments\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

1050 1051
    if (!(config = daemonConfigNew(privileged))) {
        VIR_ERROR(_("Can't create initial configuration"));
1052
        exit(EXIT_FAILURE);
1053
    }
1054 1055

    /* No explicit config, so try and find a default one */
1056 1057 1058
    if (remote_config_file == NULL) {
        implicit_conf = true;
        if (daemonConfigFilePath(privileged,
1059 1060
                                 &remote_config_file) < 0) {
            VIR_ERROR(_("Can't determine config path"));
1061
            exit(EXIT_FAILURE);
1062
        }
1063
    }
1064 1065 1066

    /* Read the config file if it exists*/
    if (remote_config_file &&
1067
        daemonConfigLoadFile(config, remote_config_file, implicit_conf) < 0) {
1068 1069
        VIR_ERROR(_("Can't load config file: %s: %s"),
                  virGetLastErrorMessage(), remote_config_file);
1070
        exit(EXIT_FAILURE);
1071
    }
1072

1073 1074
    if (daemonSetupHostUUID(config) < 0) {
        VIR_ERROR(_("Can't setup host uuid"));
1075
        exit(EXIT_FAILURE);
1076 1077
    }

1078 1079
    if (daemonSetupLogging(config, privileged, verbose, godaemon) < 0) {
        VIR_ERROR(_("Can't initialize logging"));
1080
        exit(EXIT_FAILURE);
1081
    }
1082

1083 1084
    daemonSetupNetDevOpenvswitch(config);

1085 1086 1087 1088 1089
    if (daemonSetupAccessManager(config) < 0) {
        VIR_ERROR(_("Can't initialize access manager"));
        exit(EXIT_FAILURE);
    }

1090
    if (!pid_file &&
1091 1092 1093 1094
        virPidFileConstructPath(privileged,
                                LOCALSTATEDIR,
                                "libvirtd",
                                &pid_file) < 0) {
1095
        VIR_ERROR(_("Can't determine pid file path."));
1096
        exit(EXIT_FAILURE);
1097
    }
1098
    VIR_DEBUG("Decided on pid file path '%s'", NULLSTR(pid_file));
1099 1100 1101 1102

    if (daemonUnixSocketPaths(config,
                              privileged,
                              &sock_file,
1103 1104
                              &sock_file_ro,
                              &sock_file_adm) < 0) {
1105
        VIR_ERROR(_("Can't determine socket paths"));
1106
        exit(EXIT_FAILURE);
1107
    }
1108 1109 1110 1111
    VIR_DEBUG("Decided on socket paths '%s', '%s' and '%s'",
              sock_file,
              NULLSTR(sock_file_ro),
              NULLSTR(sock_file_adm));
1112

1113
    if (godaemon) {
1114
        char ebuf[1024];
1115 1116 1117 1118

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

1122
        if ((statuswrite = daemonForkIntoBackground(argv[0])) < 0) {
1123
            VIR_ERROR(_("Failed to fork as daemon: %s"),
1124
                      virStrerror(errno, ebuf, sizeof(ebuf)));
1125
            goto cleanup;
1126 1127 1128
        }
    }

1129 1130 1131 1132 1133 1134
    /* 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 已提交
1135
    /* Ensure the rundir exists (on tmpfs on some systems) */
1136
    if (privileged) {
1137 1138 1139 1140
        if (VIR_STRDUP_QUIET(run_dir, LOCALSTATEDIR "/run/libvirt") < 0) {
            VIR_ERROR(_("Can't allocate memory"));
            goto cleanup;
        }
1141
    } else {
1142
        run_dir = virGetUserRuntimeDirectory();
1143

1144
        if (!run_dir) {
1145 1146
            VIR_ERROR(_("Can't determine user directory"));
            goto cleanup;
J
John Levon 已提交
1147 1148
        }
    }
1149 1150 1151 1152
    if (privileged)
        old_umask = umask(022);
    else
        old_umask = umask(077);
1153
    VIR_DEBUG("Ensuring run dir '%s' exists", run_dir);
1154 1155 1156 1157 1158 1159 1160 1161
    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 已提交
1162

1163 1164 1165 1166 1167
    if (virNetlinkStartup() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1168
    if (!(dmn = virNetDaemonNew())) {
1169
        ret = VIR_DAEMON_ERR_DRIVER;
1170 1171 1172
        goto cleanup;
    }

1173
    if (!(srv = virNetServerNew("libvirtd", 1,
1174
                                config->min_workers,
1175
                                config->max_workers,
1176
                                config->prio_workers,
1177
                                config->max_clients,
1178
                                config->max_anonymous_clients,
1179 1180
                                config->keepalive_interval,
                                config->keepalive_count,
1181
                                remoteClientNew,
1182
                                NULL,
1183
                                remoteClientFree,
1184
                                NULL))) {
1185 1186 1187 1188
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1189
    if (virNetDaemonAddServer(dmn, srv) < 0) {
1190 1191 1192 1193
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1194 1195 1196 1197
    if (daemonInitialize() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }
1198

1199 1200 1201 1202 1203 1204 1205 1206 1207
    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))) {
1208
        ret = VIR_DAEMON_ERR_INIT;
1209 1210 1211 1212 1213
        goto cleanup;
    }
    if (virNetServerAddProgram(srv, remoteProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1214
    }
1215

1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
    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;
    }

1228 1229 1230 1231 1232 1233 1234 1235 1236 1237
    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;
1238
    }
1239

1240
    if (!(srvAdm = virNetServerNew("admin", 1,
1241
                                   config->admin_min_workers,
1242 1243 1244 1245 1246 1247
                                   config->admin_max_workers,
                                   0,
                                   config->admin_max_clients,
                                   0,
                                   config->admin_keepalive_interval,
                                   config->admin_keepalive_count,
1248
                                   remoteAdmClientNew,
1249
                                   NULL,
1250
                                   remoteAdmClientFree,
1251 1252 1253 1254 1255
                                   dmn))) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1256
    if (virNetDaemonAddServer(dmn, srvAdm) < 0) {
1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272
        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;
    }

1273 1274
    if (timeout != -1) {
        VIR_DEBUG("Registering shutdown timeout %d", timeout);
1275
        virNetDaemonAutoShutdown(dmn, timeout);
1276
    }
1277

1278
    if ((daemonSetupSignals(dmn)) < 0) {
1279 1280
        ret = VIR_DAEMON_ERR_SIGNAL;
        goto cleanup;
1281
    }
D
Daniel P. Berrange 已提交
1282

1283
    if (config->audit_level) {
1284
        VIR_DEBUG("Attempting to configure auditing subsystem");
1285
        if (virAuditOpen(config->audit_level) < 0) {
1286
            if (config->audit_level > 1) {
1287
                ret = VIR_DAEMON_ERR_AUDIT;
1288
                goto cleanup;
1289
            }
1290
            VIR_DEBUG("Proceeding without auditing");
1291 1292
        }
    }
E
Eric Blake 已提交
1293
    virAuditLog(config->audit_logging > 0);
1294

1295
    /* setup the hooks if any */
1296
    if (virHookInitialize() < 0) {
1297
        ret = VIR_DAEMON_ERR_HOOKS;
1298
        goto cleanup;
1299 1300
    }

1301
    /* Disable error func, now logging is setup */
1302
    virSetErrorFunc(NULL, daemonErrorHandler);
1303
    virSetErrorLogPriorityFunc(daemonErrorLogFilter);
1304

1305 1306 1307 1308 1309 1310
    /*
     * 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,
1311
                0, "start", NULL, NULL);
1312

1313 1314 1315 1316 1317
    if (daemonSetupNetworking(srv, srvAdm,
                              config,
                              sock_file,
                              sock_file_ro,
                              sock_file_adm,
1318
                              ipsock, privileged) < 0) {
1319
        ret = VIR_DAEMON_ERR_NETWORK;
1320
        goto cleanup;
1321 1322
    }

1323 1324 1325 1326 1327 1328
    /* 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;
1329
        ignore_value(safewrite(statuswrite, &status, 1));
1330
        VIR_FORCE_CLOSE(statuswrite);
1331 1332
    }

1333
    /* Initialize drivers & then start accepting new clients from network */
1334
    if (daemonStateInit(dmn) < 0) {
1335 1336
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1337
    }
D
Daniel P. Berrange 已提交
1338

1339
#if defined(__linux__) && defined(NETLINK_ROUTE)
1340 1341
    /* Register the netlink event service for NETLINK_ROUTE */
    if (virNetlinkEventServiceStart(NETLINK_ROUTE, 0) < 0) {
1342 1343 1344
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1345
#endif
1346

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

1355
    /* Run event loop. */
1356
    virNetDaemonRun(dmn);
1357

1358 1359
    ret = 0;

1360
    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
1361
                0, "shutdown", NULL, NULL);
1362

1363
 cleanup:
1364 1365 1366
    /* Keep cleanup order in inverse order of startup */
    virNetDaemonClose(dmn);

1367
    virNetlinkEventServiceStopAll();
1368 1369 1370 1371 1372 1373 1374 1375

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

1376 1377
    virObjectUnref(adminProgram);
    virObjectUnref(srvAdm);
1378 1379 1380 1381 1382 1383
    virObjectUnref(qemuProgram);
    virObjectUnref(lxcProgram);
    virObjectUnref(remoteProgram);
    virObjectUnref(srv);
    virObjectUnref(dmn);

1384
    virNetlinkShutdown();
1385 1386 1387 1388 1389 1390

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

    VIR_FREE(run_dir);

1391 1392 1393 1394
    if (statuswrite != -1) {
        if (ret != 0) {
            /* Tell parent of daemon what failed */
            char status = ret;
1395
            ignore_value(safewrite(statuswrite, &status, 1));
1396
        }
1397
        VIR_FORCE_CLOSE(statuswrite);
1398
    }
1399 1400 1401

    VIR_FREE(sock_file);
    VIR_FREE(sock_file_ro);
1402
    VIR_FREE(sock_file_adm);
1403

1404
    VIR_FREE(pid_file);
1405

1406
    VIR_FREE(remote_config_file);
1407 1408
    daemonConfigFree(config);

1409
    return ret;
D
Daniel P. Berrange 已提交
1410
}