[libvirt] [PATCH v2 02/13] Import stripped down virtlockd code as basis of virtlogd

Peter Krempa pkrempa at redhat.com
Wed Nov 18 14:54:37 UTC 2015


On Thu, Nov 12, 2015 at 17:18:59 +0000, Daniel Berrange wrote:
> Copy the virtlockd codebase across to form the initial virlogd
> code. Simple search & replace of s/lock/log/ and gut the remote
> protocol & dispatcher. This gives us a daemon that starts up
> and listens for connections, but does nothing with them.
> 
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---

[...]

> diff --git a/src/logging/log_daemon.c b/src/logging/log_daemon.c
> new file mode 100644
> index 0000000..184076c
> --- /dev/null
> +++ b/src/logging/log_daemon.c
> @@ -0,0 +1,1177 @@
> +/*
> + * log_daemon.c: log management daemon
> + *
> + * Copyright (C) 2006-2015 Red Hat, Inc.

Um 2006? Here and in every other header.

[...]

> +
> +struct _virLogDaemon {
> +    virMutex lock;
> +    virNetDaemonPtr dmn;
> +    virNetServerPtr srv;
> +};
> +
> +virLogDaemonPtr logDaemon = NULL;
> +
> +static bool execRestart;
> +
> +enum {
> +    VIR_LOG_DAEMON_ERR_NONE = 0,
> +    VIR_LOG_DAEMON_ERR_PIDFILE,
> +    VIR_LOG_DAEMON_ERR_RUNDIR,
> +    VIR_LOG_DAEMON_ERR_INIT,
> +    VIR_LOG_DAEMON_ERR_SIGNAL,
> +    VIR_LOG_DAEMON_ERR_PRIVS,
> +    VIR_LOG_DAEMON_ERR_NETWORK,
> +    VIR_LOG_DAEMON_ERR_CONFIG,
> +    VIR_LOG_DAEMON_ERR_HOOKS,
> +    VIR_LOG_DAEMON_ERR_REEXEC,
> +
> +    VIR_LOG_DAEMON_ERR_LAST
> +};
> +
> +VIR_ENUM_DECL(virDaemonErr)
> +VIR_ENUM_IMPL(virDaemonErr, VIR_LOG_DAEMON_ERR_LAST,
> +              "Initialization successful",
> +              "Unable to obtain pidfile",
> +              "Unable to create rundir",
> +              "Unable to initialize libvirt",

Will this need to call libvirt? Or should this be 'virtlogd'?

> +              "Unable to setup signal handlers",
> +              "Unable to drop privileges",
> +              "Unable to initialize network sockets",
> +              "Unable to load configuration file",
> +              "Unable to look for hook scripts",
> +              "Unable to re-execute daemon");
> +

[...]

> +
> +
> +static void
> +virLogDaemonErrorHandler(void *opaque ATTRIBUTE_UNUSED,
> +                         virErrorPtr err ATTRIBUTE_UNUSED)
> +{
> +    /* Don't do anything, since logging infrastructure already
> +     * took care of reporting the error */
> +}
> +
> +
> +/*
> + * Set up the logging environment
> + * By default if daemonized all errors go to the logfile libvirtd.log,
> + * but if verbose or error debugging is asked for then also output
> + * informational and debug messages. Default size if 64 kB.

The logging ring buffer isn't present any more.

> + */
> +static int
> +virLogDaemonSetupLogging(virLogDaemonConfigPtr config,
> +                         bool privileged,
> +                         bool verbose,
> +                         bool godaemon)
> +{
> +    virLogReset();
> +
> +    /*
> +     * Libvirtd's order of precedence is:

libvirtd?

[...]

> +
> +static void
> +virLogDaemonUsage(const char *argv0, bool privileged)
> +{
> +    fprintf(stderr,
> +            _("\n"
> +              "Usage:\n"
> +              "  %s [options]\n"
> +              "\n"
> +              "Options:\n"
> +              "  -h | --help            Display program help:\n"
> +              "  -v | --verbose         Verbose messages.\n"
> +              "  -d | --daemon          Run as a daemon & write PID file.\n"
> +              "  -t | --timeout <secs>  Exit after timeout period.\n"
> +              "  -f | --config <file>   Configuration file.\n"
> +              "  -V | --version         Display version information.\n"
> +              "  -p | --pid-file <file> Change name of PID file.\n"
> +              "\n"
> +              "libvirt lock management daemon:\n"), argv0);

Log management.

[...]

> +#define MAX_LISTEN 5

This macro isn't used in this patch.

> +int main(int argc, char **argv) {


[...]


> diff --git a/src/logging/log_daemon_config.c b/src/logging/log_daemon_config.c
> new file mode 100644
> index 0000000..98d4c89
> --- /dev/null
> +++ b/src/logging/log_daemon_config.c
> @@ -0,0 +1,203 @@

[...]

> +/* Read the config file if it exists.
> + * Only used in the remote case, hence the name.

name?

> + */
> +int
> +virLogDaemonConfigLoadFile(virLogDaemonConfigPtr data,
> +                           const char *filename,
> +                           bool allow_missing)
> +{
> +    virConfPtr conf;
> +    int ret;
> +
> +    if (allow_missing &&
> +        access(filename, R_OK) == -1 &&
> +        errno == ENOENT)
> +        return 0;
> +
> +    conf = virConfReadFile(filename, 0);
> +    if (!conf)
> +        return -1;
> +
> +    ret = virLogDaemonConfigLoadOptions(data, filename, conf);
> +    virConfFree(conf);
> +    return ret;
> +}

[...]

> diff --git a/src/logging/log_protocol.x b/src/logging/log_protocol.x
> new file mode 100644
> index 0000000..9b8fa41
> --- /dev/null
> +++ b/src/logging/log_protocol.x
> @@ -0,0 +1,22 @@
> +/* -*- c -*-
> + */
> +
> +%#include "internal.h"
> +
> +typedef opaque virLogManagerProtocolUUID[VIR_UUID_BUFLEN];
> +
> +/* Length of long, but not unbounded, strings.
> + * This is an arbitrary limit designed to stop the decoder from trying
> + * to allocate unbounded amounts of memory when fed with a bad message.
> + */
> +const VIR_LOG_MANAGER_PROTOCOL_STRING_MAX = 65536;

This is going to be modified in the next patch. Shouldn't you use the
right value directly here?

[...]


> diff --git a/src/logging/test_virtlogd.aug.in b/src/logging/test_virtlogd.aug.in
> new file mode 100644
> index 0000000..cc659d2
> --- /dev/null
> +++ b/src/logging/test_virtlogd.aug.in
> @@ -0,0 +1,12 @@
> +module Test_virtlogd =
> +  let conf = "log_level = 3
> +log_filters=\"3:remote 4:event\"
> +log_outputs=\"3:syslog:libvirtd\"

libvirtd?

> +log_buffer_size = 64
> +"
> +
> +   test Virtlogd.lns get conf =
> +        { "log_level" = "3" }
> +        { "log_filters" = "3:remote 4:event" }
> +        { "log_outputs" = "3:syslog:libvirtd" }
> +        { "log_buffer_size" = "64" }

^^ see below.

> diff --git a/src/logging/virtlogd.conf b/src/logging/virtlogd.conf
> new file mode 100644
> index 0000000..609f67a
> --- /dev/null
> +++ b/src/logging/virtlogd.conf
> @@ -0,0 +1,67 @@
> +# Master virtlogd daemon configuration file
> +#
> +
> +#################################################################
> +#
> +# Logging controls
> +#
> +
> +# Logging level: 4 errors, 3 warnings, 2 information, 1 debug
> +# basically 1 will log everything possible
> +#log_level = 3
> +
> +# Logging filters:
> +# A filter allows to select a different logging level for a given category
> +# of logs
> +# The format for a filter is one of:
> +#    x:name
> +#    x:+name
> +#      where name is a string which is matched against source file name,
> +#      e.g., "remote", "qemu", or "util/json", the optional "+" prefix
> +#      tells libvirt to log stack trace for each message matching name,
> +#      and x is the minimal level where matching messages should be logged:
> +#    1: DEBUG
> +#    2: INFO
> +#    3: WARNING
> +#    4: ERROR
> +#
> +# Multiple filter can be defined in a single @filters, they just need to be
> +# separated by spaces.
> +#
> +# e.g. to only get warning or errors from the remote layer and only errors
> +# from the event layer:
> +#log_filters="3:remote 4:event"
> +
> +# Logging outputs:
> +# An output is one of the places to save logging information
> +# The format for an output can be:
> +#    x:stderr
> +#      output goes to stderr
> +#    x:syslog:name
> +#      use syslog for the output and use the given name as the ident
> +#    x:file:file_path
> +#      output to a file, with the given filepath

journald is used as default when initializing, so it should be
docummented here.

> +# In all case the x prefix is the minimal level, acting as a filter
> +#    1: DEBUG
> +#    2: INFO
> +#    3: WARNING
> +#    4: ERROR
> +#
> +# Multiple output can be defined, they just need to be separated by spaces.
> +# e.g. to log all warnings and errors to syslog under the virtlogd ident:
> +#log_outputs="3:syslog:virtlogd"
> +#
> +
> +# Log debug buffer size:
> +#
> +# This configuration option is no longer used, since the global
> +# log buffer functionality has been removed. Please configure
> +# suitable log_outputs/log_filters settings to obtain logs.
> +#log_buffer_size = 64a

If it's not used, it should not be part of the new daemon any more.

> +
> +# The maximum number of concurrent client connections to allow
> +# over all sockets combined.
> +# Each running virtual machine will require one open connection
> +# to virtlogd. So 'max_clients' will affect how many VMs can
> +# be run on a host
> +#max_clients = 1024

Should we mention this also in the libvirtd config file?

> diff --git a/src/logging/virtlogd.pod.in b/src/logging/virtlogd.pod.in
> new file mode 100644
> index 0000000..bba7714
> --- /dev/null
> +++ b/src/logging/virtlogd.pod.in
> @@ -0,0 +1,162 @@

[...]

> +
> +=head1 COPYRIGHT
> +
> +Copyright (C) 2006-2015 Red Hat, Inc., and the authors listed in the
> +libvirt AUTHORS file.

2006?

ACK, with suggesed cleanups.
I wasn't entirely thorough when reviewing this since it is 75k of new
stuff.

Peter

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20151118/b8ebed49/attachment-0001.sig>


More information about the libvir-list mailing list