remote_daemon.c 46.0 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
#include <sys/stat.h>
D
Daniel P. Berrange 已提交
27
#include <getopt.h>
28
#include <grp.h>
29

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

37 38
#define VIR_FROM_THIS VIR_FROM_QEMU

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

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

61
#include "driver.h"
62

63 64
#include "configmake.h"

65 66
#include "virdbus.h"

67 68 69 70 71
VIR_LOG_INIT("daemon." DAEMON_NAME);

#ifndef SOCK_PREFIX
# define SOCK_PREFIX DAEMON_NAME
#endif
72

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

79 80
volatile bool driversInitialized = false;

81 82 83 84 85 86 87 88 89
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,
90
    VIR_DAEMON_ERR_HOOKS,
91
    VIR_DAEMON_ERR_AUDIT,
92
    VIR_DAEMON_ERR_DRIVER,
93 94 95 96

    VIR_DAEMON_ERR_LAST
};

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

113
static int daemonForkIntoBackground(const char *argv0)
114
{
115
    int statuspipe[2];
116
    if (virPipeQuiet(statuspipe) < 0)
117 118
        return -1;

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

128
            VIR_FORCE_CLOSE(statuspipe[0]);
129

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

            if (setsid() < 0)
                goto cleanup;

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

        cleanup:
159 160
            VIR_FORCE_CLOSE(stdoutfd);
            VIR_FORCE_CLOSE(stdinfd);
E
Eric Blake 已提交
161 162
            VIR_FORCE_CLOSE(statuspipe[1]);
            _exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
163 164 165

        }

E
Eric Blake 已提交
166 167
    case -1: /* error in parent */
        goto error;
D
Daniel P. Berrange 已提交
168 169 170

    default:
        {
E
Eric Blake 已提交
171
            /* parent */
172 173 174
            int ret;
            char status;

175
            VIR_FORCE_CLOSE(statuspipe[1]);
176 177

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

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

E
Eric Blake 已提交
189 190 191
            VIR_FORCE_CLOSE(statuspipe[0]);

            if (ret != 1) {
192
                fprintf(stderr,
E
Eric Blake 已提交
193 194
                        _("%s: error: unable to determine if daemon is "
                          "running: %s\n"), argv0,
195
                        g_strerror(errno));
E
Eric Blake 已提交
196 197 198 199 200
                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,
201
                        virDaemonErrTypeToString(status));
E
Eric Blake 已提交
202
                exit(EXIT_FAILURE);
203
            }
E
Eric Blake 已提交
204
            _exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
205 206
        }
    }
E
Eric Blake 已提交
207

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

214

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

225
    if (config->unix_sock_dir) {
226 227
        *sockfile = g_strdup_printf("%s/%s-sock", config->unix_sock_dir,
                                    SOCK_PREFIX);
228 229

        if (privileged) {
230 231 232 233
            *rosockfile = g_strdup_printf("%s/%s-sock-ro",
                                          config->unix_sock_dir, SOCK_PREFIX);
            *admsockfile = g_strdup_printf("%s/%s-admin-sock",
                                           config->unix_sock_dir, SOCK_PREFIX);
234
        }
D
Daniel P. Berrange 已提交
235
    } else {
236
        if (privileged) {
237 238 239 240 241 242
            *sockfile = g_strdup_printf("%s/libvirt/%s-sock",
                                        RUNSTATEDIR, SOCK_PREFIX);
            *rosockfile = g_strdup_printf("%s/libvirt/%s-sock-ro",
                                          RUNSTATEDIR, SOCK_PREFIX);
            *admsockfile = g_strdup_printf("%s/libvirt/%s-admin-sock",
                                           RUNSTATEDIR, SOCK_PREFIX);
243
        } else {
244
            mode_t old_umask;
245

246
            rundir = virGetUserRuntimeDirectory();
247

248 249 250
            old_umask = umask(077);
            if (virFileMakePath(rundir) < 0) {
                umask(old_umask);
251
                goto cleanup;
252 253 254
            }
            umask(old_umask);

255 256
            *sockfile = g_strdup_printf("%s/%s-sock", rundir, SOCK_PREFIX);
            *admsockfile = g_strdup_printf("%s/%s-admin-sock", rundir, SOCK_PREFIX);
257 258
        }
    }
259

260 261 262 263
    ret = 0;
 cleanup:
    VIR_FREE(rundir);
    return ret;
D
Daniel P. Berrange 已提交
264 265
}

266

J
Ján Tomko 已提交
267 268
static void daemonErrorHandler(void *opaque G_GNUC_UNUSED,
                               virErrorPtr err G_GNUC_UNUSED)
269 270 271 272 273
{
    /* Don't do anything, since logging infrastructure already
     * took care of reporting the error */
}

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

    return priority;
}

303

304
static int daemonInitialize(void)
305
{
306 307
#ifndef LIBVIRTD
# ifdef MODULE_NAME
308 309 310
    /* This a dedicated per-driver daemon build */
    if (virDriverLoadModule(MODULE_NAME, MODULE_NAME "Register", true) < 0)
        return -1;
311 312 313 314 315
# else
    /* This is virtproxyd which merely proxies to the per-driver
     * daemons for back compat, and also allows IP connectivity.
     */
# endif
316 317 318
#else
    /* This is the legacy monolithic libvirtd built with all drivers
     *
319
     * Note that the order is important: the first ones have a higher
320 321 322
     * 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
323
     * domains can be auto-started.
324
     */
325
# ifdef WITH_NETWORK
326 327
    if (virDriverLoadModule("network", "networkRegister", false) < 0)
        return -1;
328 329
# endif
# ifdef WITH_INTERFACE
330 331
    if (virDriverLoadModule("interface", "interfaceRegister", false) < 0)
        return -1;
332 333
# endif
# ifdef WITH_SECRETS
334 335
    if (virDriverLoadModule("secret", "secretRegister", false) < 0)
        return -1;
336 337
# endif
# ifdef WITH_STORAGE
338 339
    if (virDriverLoadModule("storage", "storageRegister", false) < 0)
        return -1;
340 341
# endif
# ifdef WITH_NODE_DEVICES
342 343
    if (virDriverLoadModule("nodedev", "nodedevRegister", false) < 0)
        return -1;
344 345
# endif
# ifdef WITH_NWFILTER
346 347
    if (virDriverLoadModule("nwfilter", "nwfilterRegister", false) < 0)
        return -1;
348 349
# endif
# ifdef WITH_LIBXL
350 351
    if (virDriverLoadModule("libxl", "libxlRegister", false) < 0)
        return -1;
352 353
# endif
# ifdef WITH_QEMU
354 355
    if (virDriverLoadModule("qemu", "qemuRegister", false) < 0)
        return -1;
356 357
# endif
# ifdef WITH_LXC
358 359
    if (virDriverLoadModule("lxc", "lxcRegister", false) < 0)
        return -1;
360 361
# endif
# ifdef WITH_VBOX
362 363
    if (virDriverLoadModule("vbox", "vboxRegister", false) < 0)
        return -1;
364 365
# endif
# ifdef WITH_BHYVE
366 367
    if (virDriverLoadModule("bhyve", "bhyveRegister", false) < 0)
        return -1;
368 369
# endif
# ifdef WITH_VZ
370 371
    if (virDriverLoadModule("vz", "vzRegister", false) < 0)
        return -1;
372
# endif
373
#endif
374
    return 0;
375 376 377
}


378 379
static int ATTRIBUTE_NONNULL(3)
daemonSetupNetworking(virNetServerPtr srv,
380
                      virNetServerPtr srvAdm,
381
                      struct daemonConfig *config,
382 383 384 385
#ifdef WITH_IP
                      bool ipsock,
                      bool privileged,
#endif /* ! WITH_IP */
386 387
                      const char *sock_path,
                      const char *sock_path_ro,
388
                      const char *sock_path_adm)
389 390 391 392
{
    gid_t unix_sock_gid = 0;
    int unix_sock_ro_mask = 0;
    int unix_sock_rw_mask = 0;
393
    int unix_sock_adm_mask = 0;
J
Ján Tomko 已提交
394
    g_autoptr(virSystemdActivation) act = NULL;
395
    virSystemdActivationMap actmap[] = {
396 397 398
        { .name = DAEMON_NAME ".socket", .family = AF_UNIX, .path = sock_path },
        { .name = DAEMON_NAME "-ro.socket", .family = AF_UNIX, .path = sock_path_ro },
        { .name = DAEMON_NAME "-admin.socket", .family = AF_UNIX, .path = sock_path_adm },
399
#ifdef WITH_IP
400 401
        { .name = DAEMON_NAME "-tcp.socket", .family = AF_INET },
        { .name = DAEMON_NAME "-tls.socket", .family = AF_INET },
402
#endif /* ! WITH_IP */
403 404
    };

405
#ifdef WITH_IP
406 407 408 409 410
    if ((actmap[3].port = virSocketAddrResolveService(config->tcp_port)) < 0)
        return -1;

    if ((actmap[4].port = virSocketAddrResolveService(config->tls_port)) < 0)
        return -1;
411
#endif /* ! WITH_IP */
412

413
    if (virSystemdGetActivation(actmap, G_N_ELEMENTS(actmap), &act) < 0)
414
        return -1;
415

416
#ifdef WITH_IP
417
# ifdef LIBVIRTD
418 419 420 421 422
    if (act && ipsock) {
        VIR_ERROR(_("--listen parameter not permitted with systemd activation "
                    "sockets, see 'man libvirtd' for further guidance"));
        return -1;
    }
423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
# else /* ! LIBVIRTD */
    /*
     * "ipsock" traditionally reflected whether --listen is set.
     * The listen_tcp & listen_tls params in libvirtd.conf were
     * not honoured unless --listen was set.
     *
     * In virtproxyd we dropped --listen, and have listen_tcp and
     * listen_tls in the config file both default to 0. The user
     * can turn on listening simply by setting the libvirtd.conf
     * file settings and doesn't have to worry about also adding
     * --listen, which is saner.
     *
     * Hence, we initialized ipsock == 1 by default with virtproxyd.
     * When using systemd activation though, we clear ipsock, so
     * later code doesn't have any surprising behaviour differences
     * for virtproxyd vs libvirtd.
     */
    if (act)
        ipsock = 0;
# endif /* ! LIBVIRTD */
443 444
#endif /* ! WITH_IP */

445 446
    if (config->unix_sock_group) {
        if (virGetGroupID(config->unix_sock_group, &unix_sock_gid) < 0)
447
            return -1;
448
    }
449

450 451
    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);
452
        return -1;
453
    }
454

455 456
    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);
457
        return -1;
458 459
    }

460 461
    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);
462
        return -1;
463
    }
464

465 466
    if (virNetServerAddServiceUNIX(srv,
                                   act,
467
                                   DAEMON_NAME ".socket",
468 469 470 471 472 473 474 475
                                   sock_path,
                                   unix_sock_rw_mask,
                                   unix_sock_gid,
                                   config->auth_unix_rw,
                                   NULL,
                                   false,
                                   config->max_queued_clients,
                                   config->max_client_requests) < 0)
476
        return -1;
477 478 479
    if (sock_path_ro &&
        virNetServerAddServiceUNIX(srv,
                                   act,
480
                                   DAEMON_NAME "-ro.socket",
481 482 483 484 485 486 487 488
                                   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)
489
        return -1;
490

491 492 493
    if (sock_path_adm &&
        virNetServerAddServiceUNIX(srvAdm,
                                   act,
494
                                   DAEMON_NAME "-admin.socket",
495 496 497 498 499 500 501 502
                                   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)
503
        return -1;
504

505
#ifdef WITH_IP
506 507 508
    if (((ipsock && config->listen_tcp) || act) &&
        virNetServerAddServiceTCP(srv,
                                  act,
509
                                  DAEMON_NAME "-tcp.socket",
510 511 512 513 514 515 516 517
                                  config->listen_addr,
                                  config->tcp_port,
                                  AF_UNSPEC,
                                  config->auth_tcp,
                                  NULL,
                                  false,
                                  config->max_queued_clients,
                                  config->max_client_requests) < 0)
518
        return -1;
519

520
    if (((ipsock && config->listen_tls) || (act && virSystemdActivationHasName(act, DAEMON_NAME "-tls.socket")))) {
521
        virNetTLSContextPtr ctxt = NULL;
522

523 524 525 526 527 528
        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"));
529
                return -1;
530 531 532 533
            }
            if (!config->cert_file) {
                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                               _("No server certificate path set to match server key"));
534
                return -1;
535 536 537 538
            }
            if (!config->key_file) {
                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                               _("No server key path set to match server cert"));
539
                return -1;
540 541 542 543 544 545 546 547 548 549 550
            }
            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)))
551
                return -1;
552 553 554
        } else {
            if (!(ctxt = virNetTLSContextNewServerPath(NULL,
                                                       !privileged,
555
                                                       (const char *const*)config->tls_allowed_dn_list,
556
                                                       config->tls_priority,
557
                                                       config->tls_no_sanity_certificate ? false : true,
558
                                                       config->tls_no_verify_certificate ? false : true)))
559
                return -1;
560
        }
561

562 563 564 565
        VIR_DEBUG("Registering TLS socket %s:%s",
                  config->listen_addr, config->tls_port);
        if (virNetServerAddServiceTCP(srv,
                                      act,
566
                                      DAEMON_NAME "-tls.socket",
567 568 569 570 571 572 573 574
                                      config->listen_addr,
                                      config->tls_port,
                                      AF_UNSPEC,
                                      config->auth_tls,
                                      ctxt,
                                      false,
                                      config->max_queued_clients,
                                      config->max_client_requests) < 0) {
575
            virObjectUnref(ctxt);
576
            return -1;
577
        }
578
        virObjectUnref(ctxt);
579
    }
580
#endif /* ! WITH_IP */
581

582 583
    if (act &&
        virSystemdActivationComplete(act) < 0)
584
        return -1;
585

586
#if WITH_SASL
587 588 589
    if (virNetServerNeedsAuth(srv, REMOTE_AUTH_SASL) &&
        !(saslCtxt = virNetSASLContextNewServer(
              (const char *const*)config->sasl_allowed_username_list)))
590
        return -1;
591
#endif
D
Daniel P. Berrange 已提交
592

593
    return 0;
D
Daniel P. Berrange 已提交
594 595 596
}


597 598 599 600 601 602 603 604 605 606
/*
 * Set up the openvswitch timeout
 */
static void
daemonSetupNetDevOpenvswitch(struct daemonConfig *config)
{
    virNetDevOpenvswitchSetTimeout(config->ovs_timeout);
}


607 608
/*
 * Set up the logging environment
609
 * By default if daemonized all errors go to journald/a logfile
610
 * but if verbose or error debugging is asked for then also output
611
 * informational and debug messages. Default size if 64 kB.
612
 */
613
static int
614 615 616 617
daemonSetupLogging(struct daemonConfig *config,
                   bool privileged,
                   bool verbose,
                   bool godaemon)
618
{
619 620
    virLogReset();

621
    /*
622
     * Logging setup order of precedence is:
623 624
     * cmdline > environment > config
     *
625
     * Given the precedence, we must process the variables in the opposite
626
     * order, each one overriding the previous.
627
     */
628 629
    if (config->log_level != 0)
        virLogSetDefaultPriority(config->log_level);
630

631 632 633
    /* 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.
634 635 636
     */
    ignore_value(virLogSetFilters(config->log_filters));
    ignore_value(virLogSetOutputs(config->log_outputs));
637

638 639
    /* If there are some environment variables defined, use those instead */
    virLogSetFromEnv();
640

641 642 643 644 645 646
    /*
     * Command line override for --verbose
     */
    if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
        virLogSetDefaultPriority(VIR_LOG_INFO);

647 648 649
    /* Define the default output. This is only applied if there was no setting
     * from either the config or the environment.
     */
650
    virLogSetDefaultOutput(DAEMON_NAME, godaemon, privileged);
651 652 653 654

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

655 656 657
    return 0;
}

658

659 660 661 662 663
static int
daemonSetupAccessManager(struct daemonConfig *config)
{
    virAccessManagerPtr mgr;
    const char *none[] = { "none", NULL };
J
Ján Tomko 已提交
664
    const char **drv = (const char **)config->access_drivers;
665

J
Ján Tomko 已提交
666 667 668
    if (!drv ||
        !drv[0])
        drv = none;
669

J
Ján Tomko 已提交
670
    if (!(mgr = virAccessManagerNewStack(drv)))
671 672 673 674 675 676 677 678
        return -1;

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


679 680
/* Display version information. */
static void
681
daemonVersion(const char *argv0)
682
{
683
    printf("%s (%s) %s\n", argv0, PACKAGE_NAME, PACKAGE_VERSION);
684 685
}

686

687
static void daemonShutdownHandler(virNetDaemonPtr dmn,
J
Ján Tomko 已提交
688 689
                                  siginfo_t *sig G_GNUC_UNUSED,
                                  void *opaque G_GNUC_UNUSED)
690
{
691
    virNetDaemonQuit(dmn);
692
}
693

J
Ján Tomko 已提交
694
static void daemonReloadHandlerThread(void *opague G_GNUC_UNUSED)
695 696 697 698 699 700 701 702
{
    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");
}

J
Ján Tomko 已提交
703 704 705
static void daemonReloadHandler(virNetDaemonPtr dmn G_GNUC_UNUSED,
                                siginfo_t *sig G_GNUC_UNUSED,
                                void *opaque G_GNUC_UNUSED)
706
{
707 708
    virThread thr;

709 710 711 712 713
    if (!driversInitialized) {
        VIR_WARN("Drivers are not initialized, reload ignored");
        return;
    }

714 715
    if (virThreadCreateFull(&thr, false, daemonReloadHandlerThread,
                            "daemon-reload", false, NULL) < 0) {
716 717 718 719 720
        /*
         * Not much we can do on error here except log it.
         */
        VIR_ERROR(_("Failed to create thread to handle daemon restart"));
    }
721 722
}

723
static int daemonSetupSignals(virNetDaemonPtr dmn)
724
{
725
    if (virNetDaemonAddSignalHandler(dmn, SIGINT, daemonShutdownHandler, NULL) < 0)
726
        return -1;
727
    if (virNetDaemonAddSignalHandler(dmn, SIGQUIT, daemonShutdownHandler, NULL) < 0)
728
        return -1;
729
    if (virNetDaemonAddSignalHandler(dmn, SIGTERM, daemonShutdownHandler, NULL) < 0)
730
        return -1;
731
    if (virNetDaemonAddSignalHandler(dmn, SIGHUP, daemonReloadHandler, NULL) < 0)
732
        return -1;
733 734
    return 0;
}
735

736 737 738

static void daemonInhibitCallback(bool inhibit, void *opaque)
{
739
    virNetDaemonPtr dmn = opaque;
740 741

    if (inhibit)
742
        virNetDaemonAddShutdownInhibition(dmn);
743
    else
744
        virNetDaemonRemoveShutdownInhibition(dmn);
745 746 747
}


748
#ifdef WITH_DBUS
749 750 751 752 753
static DBusConnection *sessionBus;
static DBusConnection *systemBus;

static void daemonStopWorker(void *opaque)
{
754
    virNetDaemonPtr dmn = opaque;
755

756
    VIR_DEBUG("Begin stop dmn=%p", dmn);
757 758 759

    ignore_value(virStateStop());

760
    VIR_DEBUG("Completed stop dmn=%p", dmn);
761

762
    /* Exit daemon cleanly */
763
    virNetDaemonQuit(dmn);
764 765 766 767
}


/* We do this in a thread to not block the main loop */
768
static void daemonStop(virNetDaemonPtr dmn)
769 770
{
    virThread thr;
771
    virObjectRef(dmn);
772 773
    if (virThreadCreateFull(&thr, false, daemonStopWorker,
                            "daemon-stop", false, dmn) < 0)
774
        virObjectUnref(dmn);
775 776 777 778
}


static DBusHandlerResult
J
Ján Tomko 已提交
779
handleSessionMessageFunc(DBusConnection *connection G_GNUC_UNUSED,
780 781 782
                         DBusMessage *message,
                         void *opaque)
{
783
    virNetDaemonPtr dmn = opaque;
784

785
    VIR_DEBUG("dmn=%p", dmn);
786 787 788 789

    if (dbus_message_is_signal(message,
                               DBUS_INTERFACE_LOCAL,
                               "Disconnected"))
790
        daemonStop(dmn);
791 792 793 794 795 796

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}


static DBusHandlerResult
J
Ján Tomko 已提交
797
handleSystemMessageFunc(DBusConnection *connection G_GNUC_UNUSED,
798 799 800
                        DBusMessage *message,
                        void *opaque)
{
801
    virNetDaemonPtr dmn = opaque;
802

803
    VIR_DEBUG("dmn=%p", dmn);
804 805 806 807

    if (dbus_message_is_signal(message,
                               "org.freedesktop.login1.Manager",
                               "PrepareForShutdown"))
808
        daemonStop(dmn);
809 810 811 812 813 814

    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
#endif


815 816
static void daemonRunStateInit(void *opaque)
{
817
    virNetDaemonPtr dmn = opaque;
818
    g_autoptr(virIdentity) sysident = virIdentityGetSystem();
819 820 821 822 823
#ifdef MODULE_NAME
    bool mandatory = true;
#else /* ! MODULE_NAME */
    bool mandatory = false;
#endif /* ! MODULE_NAME */
824 825

    virIdentitySetCurrent(sysident);
826

827 828
    /* Since driver initialization can take time inhibit daemon shutdown until
       we're done so clients get a chance to connect */
829
    daemonInhibitCallback(true, dmn);
830

831
    /* Start the stateful HV drivers
E
Eric Blake 已提交
832
     * This is deliberately done after telling the parent process
833 834
     * we're ready, since it can take a long time and this will
     * seriously delay OS bootup process */
835
    if (virStateInitialize(virNetDaemonIsPrivileged(dmn),
836
                           mandatory,
837
                           NULL,
838
                           daemonInhibitCallback,
839
                           dmn) < 0) {
840
        VIR_ERROR(_("Driver state initialization failed"));
841 842
        /* Ensure the main event loop quits */
        kill(getpid(), SIGTERM);
843
        goto cleanup;
844 845
    }

846 847
    driversInitialized = true;

848
#ifdef WITH_DBUS
849
    /* Tie the non-privileged daemons to the session/shutdown lifecycle */
850
    if (!virNetDaemonIsPrivileged(dmn)) {
851 852 853 854

        sessionBus = virDBusGetSessionBus();
        if (sessionBus != NULL)
            dbus_connection_add_filter(sessionBus,
855
                                       handleSessionMessageFunc, dmn, NULL);
856 857 858 859

        systemBus = virDBusGetSystemBus();
        if (systemBus != NULL) {
            dbus_connection_add_filter(systemBus,
860
                                       handleSystemMessageFunc, dmn, NULL);
861 862 863 864 865 866
            dbus_bus_add_match(systemBus,
                               "type='signal',sender='org.freedesktop.login1', interface='org.freedesktop.login1.Manager'",
                               NULL);
        }
    }
#endif
867
    /* Only now accept clients from network */
868
    virNetDaemonUpdateServices(dmn, true);
869
 cleanup:
870 871
    daemonInhibitCallback(false, dmn);
    virObjectUnref(dmn);
872
    virIdentitySetCurrent(NULL);
873
}
874

875
static int daemonStateInit(virNetDaemonPtr dmn)
876 877
{
    virThread thr;
878
    virObjectRef(dmn);
879 880
    if (virThreadCreateFull(&thr, false, daemonRunStateInit,
                            "daemon-init", false, dmn) < 0) {
881
        virObjectUnref(dmn);
882 883
        return -1;
    }
884 885 886
    return 0;
}

887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919
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;
}

920 921 922 923 924
typedef struct {
    const char *opts;
    const char *help;
} virOptionHelp;

925 926
/* Print command-line usage. */
static void
927
daemonUsage(const char *argv0, bool privileged)
928
{
929 930 931 932 933
    size_t i;
    virOptionHelp opthelp[] = {
        { "-h | --help", N_("Display program help") },
        { "-v | --verbose", N_("Verbose messages") },
        { "-d | --daemon", N_("Run as a daemon & write PID file") },
934
#if defined(WITH_IP) && defined(LIBVIRTD)
935
        { "-l | --listen", N_("Listen for TCP/IP connections") },
936
#endif /* !(WITH_IP && LIBVIRTD) */
937 938 939 940 941 942 943 944 945 946 947 948
        { "-t | --timeout <secs>", N_("Exit after timeout period") },
        { "-f | --config <file>", N_("Configuration file") },
        { "-V | --version", N_("Display version information") },
        { "-p | --pid-file <file>", N_("Change name of PID file") },
    };

    fprintf(stderr, "\n");
    fprintf(stderr, "%s\n", _("Usage:"));
    fprintf(stderr, "  %s [%s]\n", argv0, _("options"));
    fprintf(stderr, "\n");

    fprintf(stderr, "%s\n", _("Options:"));
949
    for (i = 0; i < G_N_ELEMENTS(opthelp); i++)
950 951 952 953 954 955 956 957 958 959 960
        fprintf(stderr, "  %-22s %s\n", opthelp[i].opts,
                _(opthelp[i].help));
    fprintf(stderr, "\n");

    fprintf(stderr, "%s\n", _("libvirt management daemon:"));

    fprintf(stderr, "\n");
    fprintf(stderr, "  %s\n", _("Default paths:"));
    fprintf(stderr, "\n");

    fprintf(stderr, "    %s\n", _("Configuration file (unless overridden by -f):"));
961 962
    fprintf(stderr, "      %s/libvirt/%s.conf\n",
            privileged ? SYSCONFDIR : "$XDG_CONFIG_HOME", DAEMON_NAME);
963 964 965 966
    fprintf(stderr, "\n");

    fprintf(stderr, "    %s\n", _("Sockets:"));
    fprintf(stderr, "      %s/libvirt/%s-sock\n",
967
            privileged ? RUNSTATEDIR : "$XDG_RUNTIME_DIR",
968 969
            SOCK_PREFIX);
    if (privileged)
970 971
        fprintf(stderr, "      %s/libvirt/%s-sock-ro\n",
                RUNSTATEDIR, SOCK_PREFIX);
972 973
    fprintf(stderr, "\n");

974
#ifdef WITH_IP
975 976 977 978 979 980 981 982 983 984 985
    fprintf(stderr, "    %s\n", _("TLS:"));
    fprintf(stderr, "      %s %s\n",
            _("CA certificate:"),
            privileged ? LIBVIRT_CACERT : "$HOME/.pki/libvirt/cacert.pem");
    fprintf(stderr, "      %s %s\n",
            _("Server certificate:"),
            privileged ? LIBVIRT_SERVERCERT : "$HOME/.pki/libvirt/servercert.pem");
    fprintf(stderr, "      %s %s\n",
            _("Server private key:"),
            privileged ? LIBVIRT_SERVERKEY : "$HOME/.pki/libvirt/serverkey.pem");
    fprintf(stderr, "\n");
986
#endif /* ! WITH_IP */
987 988 989

    fprintf(stderr, "    %s\n",
            _("PID file (unless overridden by -p):"));
990
    fprintf(stderr, "      %s/%s.pid\n",
991
            privileged ? RUNSTATEDIR : "$XDG_RUNTIME_DIR/libvirt",
992
            DAEMON_NAME);
993
    fprintf(stderr, "\n");
994 995
}

D
Daniel P. Berrange 已提交
996
int main(int argc, char **argv) {
997
    virNetDaemonPtr dmn = NULL;
998
    virNetServerPtr srv = NULL;
999
    virNetServerPtr srvAdm = NULL;
1000 1001
    virNetServerProgramPtr adminProgram = NULL;
    virNetServerProgramPtr lxcProgram = NULL;
1002
    char *remote_config_file = NULL;
1003
    int statuswrite = -1;
1004
    int ret = 1;
1005
    int pid_file_fd = -1;
1006 1007 1008
    char *pid_file = NULL;
    char *sock_file = NULL;
    char *sock_file_ro = NULL;
1009
    char *sock_file_adm = NULL;
1010 1011 1012
    int timeout = -1;        /* -t: Shutdown timeout */
    int verbose = 0;
    int godaemon = 0;
1013
#ifdef WITH_IP
1014
# ifdef LIBVIRTD
1015
    int ipsock = 0;
1016 1017 1018
# else /* ! LIBVIRTD */
    int ipsock = 1; /* listen_tcp/listen_tls default to 0 */
# endif /* ! LIBVIRTD */
1019
#endif /* ! WITH_IP */
1020 1021
    struct daemonConfig *config;
    bool privileged = geteuid() == 0 ? true : false;
1022
    bool implicit_conf = false;
1023 1024
    char *run_dir = NULL;
    mode_t old_umask;
D
Daniel P. Berrange 已提交
1025 1026

    struct option opts[] = {
1027 1028
        { "verbose", no_argument, &verbose, 'v'},
        { "daemon", no_argument, &godaemon, 'd'},
1029
#if defined(WITH_IP) && defined(LIBVIRTD)
1030
        { "listen", no_argument, &ipsock, 'l'},
1031
#endif /* !(WITH_IP && LIBVIRTD) */
1032
        { "config", required_argument, NULL, 'f'},
1033 1034
        { "timeout", required_argument, NULL, 't'},
        { "pid-file", required_argument, NULL, 'p'},
1035 1036
        { "version", no_argument, NULL, 'V' },
        { "help", no_argument, NULL, 'h' },
D
Daniel P. Berrange 已提交
1037 1038 1039
        {0, 0, 0, 0}
    };

1040
    if (virGettextInitialize() < 0 ||
E
Eric Blake 已提交
1041
        virInitialize() < 0) {
1042
        fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
E
Eric Blake 已提交
1043
        exit(EXIT_FAILURE);
1044
    }
D
Daniel P. Berrange 已提交
1045

1046 1047
    virUpdateSelfLastChanged(argv[0]);

1048
    virFileActivateDirOverrideForProg(argv[0]);
1049

D
Daniel P. Berrange 已提交
1050 1051 1052 1053
    while (1) {
        int optidx = 0;
        int c;
        char *tmp;
1054
#if defined(WITH_IP) && defined(LIBVIRTD)
1055
        const char *optstr = "ldf:p:t:vVh";
1056
#else /* !(WITH_IP && LIBVIRTD) */
1057
        const char *optstr = "df:p:t:vVh";
1058
#endif /* !(WITH_IP && LIBVIRTD) */
D
Daniel P. Berrange 已提交
1059

1060
        c = getopt_long(argc, argv, optstr, opts, &optidx);
D
Daniel P. Berrange 已提交
1061

1062
        if (c == -1)
D
Daniel P. Berrange 已提交
1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074
            break;

        switch (c) {
        case 0:
            /* Got one of the flags */
            break;
        case 'v':
            verbose = 1;
            break;
        case 'd':
            godaemon = 1;
            break;
1075

1076
#if defined(WITH_IP) && defined(LIBVIRTD)
1077 1078
        case 'l':
            ipsock = 1;
D
Daniel P. Berrange 已提交
1079
            break;
1080
#endif /* !(WITH_IP && LIBVIRTD) */
D
Daniel P. Berrange 已提交
1081 1082

        case 't':
1083
            if (virStrToLong_i(optarg, &tmp, 10, &timeout) != 0
1084 1085
                || timeout <= 0
                /* Ensure that we can multiply by 1000 without overflowing.  */
1086 1087 1088 1089
                || timeout > INT_MAX / 1000) {
                VIR_ERROR(_("Invalid value for timeout"));
                exit(EXIT_FAILURE);
            }
D
Daniel P. Berrange 已提交
1090
            break;
1091 1092

        case 'p':
1093
            VIR_FREE(pid_file);
1094
            pid_file = g_strdup(optarg);
1095 1096 1097
            break;

        case 'f':
1098
            VIR_FREE(remote_config_file);
1099
            remote_config_file = g_strdup(optarg);
1100 1101
            break;

1102
        case 'V':
1103
            daemonVersion(argv[0]);
1104
            exit(EXIT_SUCCESS);
1105

1106
        case 'h':
1107
            daemonUsage(argv[0], privileged);
1108
            exit(EXIT_SUCCESS);
D
Daniel P. Berrange 已提交
1109

1110
        case '?':
D
Daniel P. Berrange 已提交
1111
        default:
1112
            daemonUsage(argv[0], privileged);
1113
            exit(EXIT_FAILURE);
D
Daniel P. Berrange 已提交
1114 1115 1116
        }
    }

1117 1118 1119 1120 1121 1122
    if (optind != argc) {
        fprintf(stderr, "%s: unexpected, non-option, command line arguments\n",
                argv[0]);
        exit(EXIT_FAILURE);
    }

1123 1124
    if (!(config = daemonConfigNew(privileged))) {
        VIR_ERROR(_("Can't create initial configuration"));
1125
        exit(EXIT_FAILURE);
1126
    }
1127 1128

    /* No explicit config, so try and find a default one */
1129 1130 1131
    if (remote_config_file == NULL) {
        implicit_conf = true;
        if (daemonConfigFilePath(privileged,
1132 1133
                                 &remote_config_file) < 0) {
            VIR_ERROR(_("Can't determine config path"));
1134
            exit(EXIT_FAILURE);
1135
        }
1136
    }
1137

J
Ján Tomko 已提交
1138
    /* Read the config file if it exists */
1139
    if (remote_config_file &&
1140
        daemonConfigLoadFile(config, remote_config_file, implicit_conf) < 0) {
1141 1142
        VIR_ERROR(_("Can't load config file: %s: %s"),
                  virGetLastErrorMessage(), remote_config_file);
1143
        exit(EXIT_FAILURE);
1144
    }
1145

1146 1147
    if (daemonSetupHostUUID(config) < 0) {
        VIR_ERROR(_("Can't setup host uuid"));
1148
        exit(EXIT_FAILURE);
1149 1150
    }

1151 1152
    if (daemonSetupLogging(config, privileged, verbose, godaemon) < 0) {
        VIR_ERROR(_("Can't initialize logging"));
1153
        exit(EXIT_FAILURE);
1154
    }
1155

1156 1157 1158 1159 1160 1161 1162 1163
    /* Let's try to initialize global variable that holds the host's boot time. */
    if (virHostBootTimeInit() < 0) {
        /* This is acceptable failure. Maybe we won't need the boot time
         * anyway, and if we do, then virHostGetBootTime() returns an
         * appropriate error. */
        VIR_DEBUG("Ignoring failed boot time init");
    }

1164 1165
    daemonSetupNetDevOpenvswitch(config);

1166 1167 1168 1169 1170
    if (daemonSetupAccessManager(config) < 0) {
        VIR_ERROR(_("Can't initialize access manager"));
        exit(EXIT_FAILURE);
    }

1171
    if (!pid_file &&
1172
        virPidFileConstructPath(privileged,
1173
                                RUNSTATEDIR,
1174
                                DAEMON_NAME,
1175
                                &pid_file) < 0) {
1176
        VIR_ERROR(_("Can't determine pid file path."));
1177
        exit(EXIT_FAILURE);
1178
    }
1179
    VIR_DEBUG("Decided on pid file path '%s'", NULLSTR(pid_file));
1180 1181 1182 1183

    if (daemonUnixSocketPaths(config,
                              privileged,
                              &sock_file,
1184 1185
                              &sock_file_ro,
                              &sock_file_adm) < 0) {
1186
        VIR_ERROR(_("Can't determine socket paths"));
1187
        exit(EXIT_FAILURE);
1188
    }
1189 1190 1191 1192
    VIR_DEBUG("Decided on socket paths '%s', '%s' and '%s'",
              sock_file,
              NULLSTR(sock_file_ro),
              NULLSTR(sock_file_adm));
1193

1194
    if (godaemon) {
1195 1196
        if (chdir("/") < 0) {
            VIR_ERROR(_("cannot change to root directory: %s"),
1197
                      g_strerror(errno));
1198
            goto cleanup;
1199 1200
        }

1201
        if ((statuswrite = daemonForkIntoBackground(argv[0])) < 0) {
1202
            VIR_ERROR(_("Failed to fork as daemon: %s"),
1203
                      g_strerror(errno));
1204
            goto cleanup;
1205 1206 1207
        }
    }

1208 1209 1210 1211 1212 1213
    /* 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 已提交
1214
    /* Ensure the rundir exists (on tmpfs on some systems) */
1215
    if (privileged) {
1216
        run_dir = g_strdup(RUNSTATEDIR "/libvirt");
1217
    } else {
1218
        run_dir = virGetUserRuntimeDirectory();
J
John Levon 已提交
1219
    }
1220 1221 1222 1223
    if (privileged)
        old_umask = umask(022);
    else
        old_umask = umask(077);
1224
    VIR_DEBUG("Ensuring run dir '%s' exists", run_dir);
1225 1226
    if (virFileMakePath(run_dir) < 0) {
        VIR_ERROR(_("unable to create rundir %s: %s"), run_dir,
1227
                  g_strerror(errno));
1228 1229 1230 1231
        ret = VIR_DAEMON_ERR_RUNDIR;
        goto cleanup;
    }
    umask(old_umask);
J
John Levon 已提交
1232

1233 1234 1235 1236 1237
    if (virNetlinkStartup() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1238
    if (!(dmn = virNetDaemonNew())) {
1239
        ret = VIR_DAEMON_ERR_DRIVER;
1240 1241 1242
        goto cleanup;
    }

1243
    if (!(srv = virNetServerNew(DAEMON_NAME, 1,
1244
                                config->min_workers,
1245
                                config->max_workers,
1246
                                config->prio_workers,
1247
                                config->max_clients,
1248
                                config->max_anonymous_clients,
1249 1250
                                config->keepalive_interval,
                                config->keepalive_count,
1251
                                remoteClientNew,
1252
                                NULL,
1253
                                remoteClientFree,
1254
                                NULL))) {
1255 1256 1257 1258
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1259
    if (virNetDaemonAddServer(dmn, srv) < 0) {
1260 1261 1262 1263
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1264 1265 1266 1267
    if (daemonInitialize() < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }
1268

1269 1270 1271 1272 1273 1274 1275 1276 1277
    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))) {
1278
        ret = VIR_DAEMON_ERR_INIT;
1279 1280 1281 1282 1283
        goto cleanup;
    }
    if (virNetServerAddProgram(srv, remoteProgram) < 0) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1284
    }
1285

1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297
    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;
    }

1298 1299 1300 1301 1302 1303 1304 1305 1306 1307
    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;
1308
    }
1309

1310
    if (!(srvAdm = virNetServerNew("admin", 1,
1311
                                   config->admin_min_workers,
1312 1313 1314 1315 1316 1317
                                   config->admin_max_workers,
                                   0,
                                   config->admin_max_clients,
                                   0,
                                   config->admin_keepalive_interval,
                                   config->admin_keepalive_count,
1318
                                   remoteAdmClientNew,
1319
                                   NULL,
1320
                                   remoteAdmClientFree,
1321 1322 1323 1324 1325
                                   dmn))) {
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
    }

1326
    if (virNetDaemonAddServer(dmn, srvAdm) < 0) {
1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342
        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;
    }

1343 1344
    if (timeout != -1) {
        VIR_DEBUG("Registering shutdown timeout %d", timeout);
1345
        virNetDaemonAutoShutdown(dmn, timeout);
1346
    }
1347

1348
    if ((daemonSetupSignals(dmn)) < 0) {
1349 1350
        ret = VIR_DAEMON_ERR_SIGNAL;
        goto cleanup;
1351
    }
D
Daniel P. Berrange 已提交
1352

1353
    if (config->audit_level) {
1354
        VIR_DEBUG("Attempting to configure auditing subsystem");
1355
        if (virAuditOpen(config->audit_level) < 0) {
1356
            if (config->audit_level > 1) {
1357
                ret = VIR_DAEMON_ERR_AUDIT;
1358
                goto cleanup;
1359
            }
1360
            VIR_DEBUG("Proceeding without auditing");
1361 1362
        }
    }
E
Eric Blake 已提交
1363
    virAuditLog(config->audit_logging > 0);
1364

1365
    /* setup the hooks if any */
1366
    if (virHookInitialize() < 0) {
1367
        ret = VIR_DAEMON_ERR_HOOKS;
1368
        goto cleanup;
1369 1370
    }

1371
    /* Disable error func, now logging is setup */
1372
    virSetErrorFunc(NULL, daemonErrorHandler);
1373
    virSetErrorLogPriorityFunc(daemonErrorLogFilter);
1374

1375 1376 1377 1378 1379 1380
    /*
     * 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,
1381
                0, "start", NULL, NULL);
1382

1383 1384
    if (daemonSetupNetworking(srv, srvAdm,
                              config,
1385 1386 1387 1388
#ifdef WITH_IP
                              ipsock,
                              privileged,
#endif /* !WITH_IP */
1389 1390
                              sock_file,
                              sock_file_ro,
1391
                              sock_file_adm) < 0) {
1392
        ret = VIR_DAEMON_ERR_NETWORK;
1393
        goto cleanup;
1394 1395
    }

1396 1397 1398 1399 1400 1401
    /* 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;
1402
        ignore_value(safewrite(statuswrite, &status, 1));
1403
        VIR_FORCE_CLOSE(statuswrite);
1404 1405
    }

1406
    /* Initialize drivers & then start accepting new clients from network */
1407
    if (daemonStateInit(dmn) < 0) {
1408 1409
        ret = VIR_DAEMON_ERR_INIT;
        goto cleanup;
1410
    }
D
Daniel P. Berrange 已提交
1411

1412
#if defined(__linux__) && defined(NETLINK_ROUTE)
1413 1414
    /* Register the netlink event service for NETLINK_ROUTE */
    if (virNetlinkEventServiceStart(NETLINK_ROUTE, 0) < 0) {
1415 1416 1417
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1418
#endif
1419

1420
#if defined(__linux__) && defined(NETLINK_KOBJECT_UEVENT)
T
Tang Chen 已提交
1421 1422 1423 1424 1425
    /* Register the netlink event service for NETLINK_KOBJECT_UEVENT */
    if (virNetlinkEventServiceStart(NETLINK_KOBJECT_UEVENT, 1) < 0) {
        ret = VIR_DAEMON_ERR_NETWORK;
        goto cleanup;
    }
1426
#endif
T
Tang Chen 已提交
1427

1428
    /* Run event loop. */
1429
    virNetDaemonRun(dmn);
1430

1431 1432
    ret = 0;

1433
    virHookCall(VIR_HOOK_DRIVER_DAEMON, "-", VIR_HOOK_DAEMON_OP_SHUTDOWN,
1434
                0, "shutdown", NULL, NULL);
1435

1436
 cleanup:
1437 1438 1439
    /* Keep cleanup order in inverse order of startup */
    virNetDaemonClose(dmn);

1440
    virNetlinkEventServiceStopAll();
1441 1442 1443 1444 1445 1446 1447 1448

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

1449 1450
    virObjectUnref(adminProgram);
    virObjectUnref(srvAdm);
1451 1452 1453 1454 1455 1456
    virObjectUnref(qemuProgram);
    virObjectUnref(lxcProgram);
    virObjectUnref(remoteProgram);
    virObjectUnref(srv);
    virObjectUnref(dmn);

1457
    virNetlinkShutdown();
1458 1459 1460 1461 1462 1463

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

    VIR_FREE(run_dir);

1464 1465 1466 1467
    if (statuswrite != -1) {
        if (ret != 0) {
            /* Tell parent of daemon what failed */
            char status = ret;
1468
            ignore_value(safewrite(statuswrite, &status, 1));
1469
        }
1470
        VIR_FORCE_CLOSE(statuswrite);
1471
    }
1472 1473 1474

    VIR_FREE(sock_file);
    VIR_FREE(sock_file_ro);
1475
    VIR_FREE(sock_file_adm);
1476

1477
    VIR_FREE(pid_file);
1478

1479
    VIR_FREE(remote_config_file);
1480 1481
    daemonConfigFree(config);

1482
    return ret;
D
Daniel P. Berrange 已提交
1483
}