[systemd-devel] [RFC 1/6] proxy-discoveryd: Basic core added

Tom Gundersen teg at jklm.no
Fri Apr 10 06:06:52 PDT 2015


On Fri, Apr 10, 2015 at 2:17 PM, Tomasz Bursztyka
<tomasz.bursztyka at linux.intel.com> wrote:
> This currently does nothing besides providing the basic skeleton for the
> daemon to be developped.
>
> proxy-discoveryd is a daemon that will manage the network proxy
> configuration per-network interface. It will provide those through DBus,
> and thus it will be possible for any application to know what proxies to
> use, if any, when relevant.
> ---
>  .gitignore                                     |  1 +
>  Makefile.am                                    | 26 +++++++++++
>  configure.ac                                   | 11 +++++
>  src/proxy-discovery/proxy-discoveryd-manager.c | 65 ++++++++++++++++++++++++++
>  src/proxy-discovery/proxy-discoveryd.c         | 65 ++++++++++++++++++++++++++
>  src/proxy-discovery/proxy-discoveryd.h         | 38 +++++++++++++++
>  units/.gitignore                               |  1 +
>  units/systemd-proxy-discoveryd.service.in      | 18 +++++++
>  8 files changed, 225 insertions(+)
>  create mode 100644 src/proxy-discovery/proxy-discoveryd-manager.c
>  create mode 100644 src/proxy-discovery/proxy-discoveryd.c
>  create mode 100644 src/proxy-discovery/proxy-discoveryd.h
>  create mode 100644 units/systemd-proxy-discoveryd.service.in
>
> diff --git a/.gitignore b/.gitignore
> index 875ada5..f479d37 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -108,6 +108,7 @@
>  /systemd-notify
>  /systemd-nspawn
>  /systemd-path
> +/systemd-proxy-discoveryd
>  /systemd-pull
>  /systemd-quotacheck
>  /systemd-random-seed
> diff --git a/Makefile.am b/Makefile.am
> index 0a57389..3f4e4d3 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -5889,6 +5889,32 @@ EXTRA_DIST += \
>  endif
>
>  # ------------------------------------------------------------------------------
> +if ENABLE_PROXY_DISCOVERYD
> +
> +rootlibexec_PROGRAMS += \
> +       systemd-proxy-discoveryd
> +
> +systemd_proxy_discoveryd_SOURCES = \
> +       src/proxy-discovery/proxy-discoveryd.c \
> +       src/proxy-discovery/proxy-discoveryd.h \
> +       src/proxy-discovery/proxy-discoveryd-manager.c
> +
> +systemd_proxy_discoveryd_LDADD = \
> +       libsystemd-internal.la \
> +       libsystemd-shared.la
> +
> +nodist_systemunit_DATA += \
> +       units/systemd-proxy-discoveryd.service
> +
> +EXTRA_DIST += \
> +       units/systemd-proxy-discoveryd.service.in
> +
> +CLEANFILES += \
> +       units/systemd-proxy-discoveryd.service
> +
> +endif
> +
> +# ------------------------------------------------------------------------------
>  if ENABLE_LOGIND
>  systemd_logind_SOURCES = \
>         src/login/logind.c \
> diff --git a/configure.ac b/configure.ac
> index 960b15d..3db3230 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1139,6 +1139,16 @@ AS_IF([test "x$enable_networkd" != "xno"], [
>  AM_CONDITIONAL(ENABLE_NETWORKD, [test "x$have_networkd" = "xyes"])
>
>  # ------------------------------------------------------------------------------
> +have_proxy_discoveryd=no
> +AC_ARG_ENABLE(proxy-discoveryd, AS_HELP_STRING([--disable-proxy-discoveryd], [disable proxy-discoveryd]))
> +AS_IF([test "x$enable_proxy_discoveryd" != "xno"], [
> +       AC_DEFINE(ENABLE_PROXY_DISCOVERYD, 1, [Define if proxy-discoveryd support is to be enabled])
> +       have_proxy_discoveryd=yes
> +       M4_DEFINES="$M4_DEFINES -DENABLE_PROXY_DISCOVERYD"
> +])
> +AM_CONDITIONAL(ENABLE_PROXY_DISCOVERYD, [test "x$have_proxy_discoveryd" = "xyes"])
> +
> +# ------------------------------------------------------------------------------
>  have_efi=no
>  AC_ARG_ENABLE(efi, AS_HELP_STRING([--disable-efi], [disable EFI support]))
>  if test "x$enable_efi" != "xno"; then
> @@ -1560,6 +1570,7 @@ AC_MSG_RESULT([
>          localed:                 ${have_localed}
>          networkd:                ${have_networkd}
>          resolved:                ${have_resolved}
> +       proxy-discoveryd:        ${have_proxy_discoveryd}
>          default DNS servers:     ${DNS_SERVERS}
>          coredump:                ${have_coredump}
>          polkit:                  ${have_polkit}
> diff --git a/src/proxy-discovery/proxy-discoveryd-manager.c b/src/proxy-discovery/proxy-discoveryd-manager.c
> new file mode 100644
> index 0000000..3aaec68
> --- /dev/null
> +++ b/src/proxy-discovery/proxy-discoveryd-manager.c
> @@ -0,0 +1,65 @@
> +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
> +
> +/***
> + This file is part of systemd.
> +
> + Copyright (C) 2015 Intel Corporation. All rights reserved.
> +
> + systemd 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.
> +
> + systemd 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 License
> + along with systemd; If not, see <http://www.gnu.org/licenses/>.
> +***/
> +
> +#include "proxy-discoveryd.h"
> +
> +int manager_new(Manager **ret) {
> +        _cleanup_manager_free_ Manager *m = NULL;
> +        int r;
> +
> +        assert(ret);
> +
> +        m = new0(Manager, 1);
> +        if (!m)
> +                return -ENOMEM;
> +
> +        r = sd_event_default(&m->event);
> +        if (r < 0)
> +                return r;
> +
> +        r = sd_event_set_watchdog(m->event, true);
> +        if (r < 0)
> +                return r;
> +
> +        r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
> +        if (r < 0)
> +                return r;
> +
> +        r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
> +        if (r < 0)
> +                return r;
> +
> +        *ret = m;
> +        m = NULL;
> +
> +        return 0;
> +}
> +
> +Manager *manager_free(Manager *m) {
> +        if (!m)
> +                return NULL;
> +
> +        sd_event_unref(m->event);
> +
> +        free(m);
> +
> +        return NULL;
> +}
> diff --git a/src/proxy-discovery/proxy-discoveryd.c b/src/proxy-discovery/proxy-discoveryd.c
> new file mode 100644
> index 0000000..f023312
> --- /dev/null
> +++ b/src/proxy-discovery/proxy-discoveryd.c
> @@ -0,0 +1,65 @@
> +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
> +
> +/***
> + This file is part of systemd.
> +
> + Copyright (C) 2015 Intel Corporation. All rights reserved.
> +
> + systemd 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.
> +
> + systemd 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 License
> + along with systemd; If not, see <http://www.gnu.org/licenses/>.
> +***/
> +
> +#include "sd-event.h"
> +#include "sd-daemon.h"
> +
> +#include "proxy-discoveryd.h"
> +
> +int main(int argc, char *argv[]) {
> +        _cleanup_manager_free_ Manager *m = NULL;
> +        int r;
> +
> +        log_set_target(LOG_TARGET_AUTO);
> +        log_parse_environment();
> +        log_open();
> +
> +        if (argc != 1) {
> +                log_error("This program takes no arguments.");
> +                r = -EINVAL;
> +                goto out;
> +        }
> +
> +        r = manager_new(&m);
> +        if (r < 0) {
> +                log_error_errno(r, "Could not create manager: %m");
> +                goto out;
> +        }
> +
> +        sd_notify(false,
> +                  "READY=1\n"
> +                  "STATUS=Processing requests...");
> +
> +        r = sd_event_loop(m->event);
> +        if (r < 0) {
> +                log_error_errno(r, "Event loop failed: %m");
> +                goto out;
> +        }
> +
> +        sd_event_get_exit_code(m->event, &r);
> +
> +out:
> +        sd_notify(false,
> +                  "STOPPING=1\n"
> +                  "STATUS=Shutting down...");
> +
> +        return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
> +}
> diff --git a/src/proxy-discovery/proxy-discoveryd.h b/src/proxy-discovery/proxy-discoveryd.h
> new file mode 100644
> index 0000000..125abc0
> --- /dev/null
> +++ b/src/proxy-discovery/proxy-discoveryd.h
> @@ -0,0 +1,38 @@
> +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
> +
> +#pragma once
> +
> +/***
> + This file is part of systemd.
> +
> + Copyright (C) 2015 Intel Corporation. All rights reserved.
> +
> + systemd 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.
> +
> + systemd 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 License
> + along with systemd; If not, see <http://www.gnu.org/licenses/>.
> +***/
> +
> +#include "sd-event.h"
> +
> +#include "util.h"
> +
> +typedef struct Manager Manager;
> +
> +struct Manager {
> +        sd_event *event;
> +};
> +
> +int manager_new(Manager **ret);
> +Manager *manager_free(Manager *m);
> +
> +DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
> +#define _cleanup_manager_free_ _cleanup_(manager_freep)

We generally try to avoid this define in internal code, and just use
_cleanup_(manager_freep) inline.

> diff --git a/units/.gitignore b/units/.gitignore
> index ad469c1..63ae1af 100644
> --- a/units/.gitignore
> +++ b/units/.gitignore
> @@ -51,6 +51,7 @@
>  /systemd-networkd.service
>  /systemd-nspawn at .service
>  /systemd-poweroff.service
> +/systemd-proxy-discoveryd.service
>  /systemd-quotacheck.service
>  /systemd-random-seed.service
>  /systemd-reboot.service
> diff --git a/units/systemd-proxy-discoveryd.service.in b/units/systemd-proxy-discoveryd.service.in
> new file mode 100644
> index 0000000..7ac02e0
> --- /dev/null
> +++ b/units/systemd-proxy-discoveryd.service.in
> @@ -0,0 +1,18 @@
> +# This file is part of systemd.
> +#
> +# systemd 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.
> +
> +[Unit]
> +Description=Proxy service
> +DefaultDependencies=no
> +Requires=dbus.socket
> +After=dbus.socket
> +Before=remote-fs.target
> +
> +[Service]
> +Restart=on-failure
> +ExecStart=@rootlibexecdir@/systemd-proxy-discoveryd
> +StandardOutput=null

Why this special handling of stdout? Is it the JS engine? Probably
should have a comment as it is a bit odd.

> --
> 2.0.5
>
> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel


More information about the systemd-devel mailing list