From 6e194652b8a2843883e717319ead18b0b98ec65e Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 19 Nov 2021 06:49:25 +0900 Subject: [PATCH 1/3] network: use BusObjectImplementation --- src/network/networkd-dhcp-server-bus.c | 12 ++++++++---- src/network/networkd-dhcp-server-bus.h | 6 ++++-- src/network/networkd-link-bus.c | 9 ++++++++- src/network/networkd-link-bus.h | 3 ++- src/network/networkd-manager-bus.c | 11 ++++++++++- src/network/networkd-manager-bus.h | 4 +++- src/network/networkd-manager.c | 24 ++---------------------- src/network/networkd-network-bus.c | 9 ++++++++- src/network/networkd-network-bus.h | 4 +++- 9 files changed, 48 insertions(+), 34 deletions(-) diff --git a/src/network/networkd-dhcp-server-bus.c b/src/network/networkd-dhcp-server-bus.c index 81f4a6706b..cc132da8b7 100644 --- a/src/network/networkd-dhcp-server-bus.c +++ b/src/network/networkd-dhcp-server-bus.c @@ -1,7 +1,5 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ -#include "sd-dhcp-server.h" - #include "alloc-util.h" #include "bus-common-errors.h" #include "bus-util.h" @@ -106,11 +104,17 @@ void dhcp_server_callback(sd_dhcp_server *s, uint64_t event, void *data) { (void) dhcp_server_emit_changed(l, "Leases", NULL); } - -const sd_bus_vtable dhcp_server_vtable[] = { +static const sd_bus_vtable dhcp_server_vtable[] = { SD_BUS_VTABLE_START(0), SD_BUS_PROPERTY("Leases", "a(uayayayayt)", property_get_leases, 0, SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_VTABLE_END }; + +const BusObjectImplementation dhcp_server_object = { + "/org/freedesktop/network1/link", + "org.freedesktop.network1.DHCPServer", + .fallback_vtables = BUS_FALLBACK_VTABLES({dhcp_server_vtable, link_object_find}), + .node_enumerator = link_node_enumerator, +}; diff --git a/src/network/networkd-dhcp-server-bus.h b/src/network/networkd-dhcp-server-bus.h index 7191478200..f52be8253e 100644 --- a/src/network/networkd-dhcp-server-bus.h +++ b/src/network/networkd-dhcp-server-bus.h @@ -2,8 +2,10 @@ #pragma once #include "sd-bus.h" -#include "networkd-link.h" +#include "sd-dhcp-server.h" -extern const sd_bus_vtable dhcp_server_vtable[]; +#include "bus-object.h" + +extern const BusObjectImplementation dhcp_server_object; void dhcp_server_callback(sd_dhcp_server *server, uint64_t event, void *data); diff --git a/src/network/networkd-link-bus.c b/src/network/networkd-link-bus.c index f4e3556517..47e0d40d57 100644 --- a/src/network/networkd-link-bus.c +++ b/src/network/networkd-link-bus.c @@ -709,7 +709,7 @@ int bus_link_method_describe(sd_bus_message *message, void *userdata, sd_bus_err return sd_bus_send(NULL, reply, NULL); } -const sd_bus_vtable link_vtable[] = { +static const sd_bus_vtable link_vtable[] = { SD_BUS_VTABLE_START(0), SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state, offsetof(Link, operstate), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), @@ -914,3 +914,10 @@ int link_send_changed(Link *link, const char *property, ...) { return link_send_changed_strv(link, properties); } + +const BusObjectImplementation link_object = { + "/org/freedesktop/network1/link", + "org.freedesktop.network1.Link", + .fallback_vtables = BUS_FALLBACK_VTABLES({link_vtable, link_object_find}), + .node_enumerator = link_node_enumerator, +}; diff --git a/src/network/networkd-link-bus.h b/src/network/networkd-link-bus.h index e8fa84b4e5..924d9976b5 100644 --- a/src/network/networkd-link-bus.h +++ b/src/network/networkd-link-bus.h @@ -3,11 +3,12 @@ #include "sd-bus.h" +#include "bus-object.h" #include "macro.h" typedef struct Link Link; -extern const sd_bus_vtable link_vtable[]; +extern const BusObjectImplementation link_object; char *link_bus_path(Link *link); int link_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error); diff --git a/src/network/networkd-manager-bus.c b/src/network/networkd-manager-bus.c index 8a5ad8eac3..4c517d829a 100644 --- a/src/network/networkd-manager-bus.c +++ b/src/network/networkd-manager-bus.c @@ -8,11 +8,13 @@ #include "bus-common-errors.h" #include "bus-message-util.h" #include "bus-polkit.h" +#include "networkd-dhcp-server-bus.h" #include "networkd-json.h" #include "networkd-link-bus.h" #include "networkd-link.h" #include "networkd-manager-bus.h" #include "networkd-manager.h" +#include "networkd-network-bus.h" #include "path-util.h" #include "strv.h" #include "user-util.h" @@ -285,7 +287,7 @@ static int property_get_namespace_id( return sd_bus_message_append(reply, "t", id); } -const sd_bus_vtable manager_vtable[] = { +static const sd_bus_vtable manager_vtable[] = { SD_BUS_VTABLE_START(0), SD_BUS_PROPERTY("OperationalState", "s", property_get_operational_state, offsetof(Manager, operational_state), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), @@ -418,3 +420,10 @@ int manager_send_changed_strv(Manager *manager, char **properties) { "org.freedesktop.network1.Manager", properties); } + +const BusObjectImplementation manager_object = { + "/org/freedesktop/network1", + "org.freedesktop.network1.Manager", + .vtables = BUS_VTABLES(manager_vtable), + .children = BUS_IMPLEMENTATIONS(&dhcp_server_object, &link_object, &network_object), +}; diff --git a/src/network/networkd-manager-bus.h b/src/network/networkd-manager-bus.h index 08ddfbdb73..5cd7f16761 100644 --- a/src/network/networkd-manager-bus.h +++ b/src/network/networkd-manager-bus.h @@ -3,8 +3,10 @@ #include "sd-bus.h" +#include "bus-object.h" + typedef struct Manager Manager; -extern const sd_bus_vtable manager_vtable[]; +extern const BusObjectImplementation manager_object; int manager_send_changed_strv(Manager *m, char **properties); diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index e25092058b..2141e20622 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -123,29 +123,9 @@ static int manager_connect_bus(Manager *m) { if (r < 0) return log_error_errno(r, "Failed to connect to bus: %m"); - r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable, m); + r = bus_add_implementation(m->bus, &manager_object, m); if (r < 0) - return log_error_errno(r, "Failed to add manager object vtable: %m"); - - r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", link_vtable, link_object_find, m); - if (r < 0) - return log_error_errno(r, "Failed to add link object vtable: %m"); - - r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/network1/link", "org.freedesktop.network1.DHCPServer", dhcp_server_vtable, link_object_find, m); - if (r < 0) - return log_error_errno(r, "Failed to add link object vtable: %m"); - - r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/network1/link", link_node_enumerator, m); - if (r < 0) - return log_error_errno(r, "Failed to add link enumerator: %m"); - - r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/network1/network", "org.freedesktop.network1.Network", network_vtable, network_object_find, m); - if (r < 0) - return log_error_errno(r, "Failed to add network object vtable: %m"); - - r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/network1/network", network_node_enumerator, m); - if (r < 0) - return log_error_errno(r, "Failed to add network enumerator: %m"); + return r; r = bus_log_control_api_register(m->bus); if (r < 0) diff --git a/src/network/networkd-network-bus.c b/src/network/networkd-network-bus.c index e265277f60..4f141c3c29 100644 --- a/src/network/networkd-network-bus.c +++ b/src/network/networkd-network-bus.c @@ -39,7 +39,7 @@ static int property_get_ether_addrs( return sd_bus_message_close_container(reply); } -const sd_bus_vtable network_vtable[] = { +static const sd_bus_vtable network_vtable[] = { SD_BUS_VTABLE_START(0), SD_BUS_PROPERTY("Description", "s", NULL, offsetof(Network, description), SD_BUS_VTABLE_PROPERTY_CONST), @@ -134,3 +134,10 @@ int network_object_find(sd_bus *bus, const char *path, const char *interface, vo return 1; } + +const BusObjectImplementation network_object = { + "/org/freedesktop/network1/network", + "org.freedesktop.network1.Network", + .fallback_vtables = BUS_FALLBACK_VTABLES({network_vtable, network_object_find}), + .node_enumerator = network_node_enumerator, +}; diff --git a/src/network/networkd-network-bus.h b/src/network/networkd-network-bus.h index cca1e0af33..68ed951425 100644 --- a/src/network/networkd-network-bus.h +++ b/src/network/networkd-network-bus.h @@ -3,9 +3,11 @@ #include "sd-bus.h" +#include "bus-object.h" + typedef struct Link Link; -extern const sd_bus_vtable network_vtable[]; +extern const BusObjectImplementation network_object; int network_node_enumerator(sd_bus *bus, const char *path, void *userdata, char ***nodes, sd_bus_error *error); int network_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error); From 6b4c1c9f3c4d5edafbbf4ebf4b06e6dc74f126a1 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 19 Nov 2021 06:49:50 +0900 Subject: [PATCH 2/3] network: support --bus-introspect option --- src/network/networkd.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/network/networkd.c b/src/network/networkd.c index 7d63786f48..d61769d9f3 100644 --- a/src/network/networkd.c +++ b/src/network/networkd.c @@ -7,13 +7,16 @@ #include "sd-daemon.h" #include "sd-event.h" +#include "bus-log-control-api.h" #include "capability-util.h" #include "daemon-util.h" #include "firewall-util.h" #include "main-func.h" #include "mkdir-label.h" #include "networkd-conf.h" +#include "networkd-manager-bus.h" #include "networkd-manager.h" +#include "service-util.h" #include "signal-util.h" #include "user-util.h" @@ -24,6 +27,13 @@ static int run(int argc, char *argv[]) { log_setup(); + r = service_parse_argv("systemd-networkd.service", + "Manage and configure network devices, create virtual network devices", + BUS_IMPLEMENTATIONS(&manager_object, &log_control_object), + argc, argv); + if (r <= 0) + return r; + umask(0022); if (argc != 1) From 558434a4aa062711230ff7d2ac1ff23cb259662d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 19 Nov 2021 07:23:40 +0900 Subject: [PATCH 3/3] man: add new man page org.freedesktop.network1 --- man/org.freedesktop.network1.xml | 507 +++++++++++++++++++++++++++++++ man/rules/meson.build | 1 + 2 files changed, 508 insertions(+) create mode 100644 man/org.freedesktop.network1.xml diff --git a/man/org.freedesktop.network1.xml b/man/org.freedesktop.network1.xml new file mode 100644 index 0000000000..2531a4737b --- /dev/null +++ b/man/org.freedesktop.network1.xml @@ -0,0 +1,507 @@ + + + +%entities; +]> + + + + + org.freedesktop.network1 + systemd + + + + org.freedesktop.network1 + 5 + + + + org.freedesktop.network1 + The D-Bus interface of systemd-networkd + + + + Introduction + + + systemd-networkd.service8 + is a system service that manages and configures network interfaces. This page describes the D-Bus + interface. + + + + The Manager Object + + The service exposes the following interfaces on the Manager object on the bus: + + +node /org/freedesktop/network1 { + interface org.freedesktop.network1.Manager { + methods: + ListLinks(out a(iso) links); + GetLinkByName(in s name, + out i ifindex, + out o path); + GetLinkByIndex(in i ifindex, + out s name, + out o path); + SetLinkNTP(in i ifindex, + in as servers); + SetLinkDNS(in i ifindex, + in a(iay) addresses); + SetLinkDNSEx(in i ifindex, + in a(iayqs) addresses); + SetLinkDomains(in i ifindex, + in a(sb) domains); + SetLinkDefaultRoute(in i ifindex, + in b enable); + SetLinkLLMNR(in i ifindex, + in s mode); + SetLinkMulticastDNS(in i ifindex, + in s mode); + SetLinkDNSOverTLS(in i ifindex, + in s mode); + SetLinkDNSSEC(in i ifindex, + in s mode); + SetLinkDNSSECNegativeTrustAnchors(in i ifindex, + in as names); + RevertLinkNTP(in i ifindex); + RevertLinkDNS(in i ifindex); + RenewLink(in i ifindex); + ForceRenewLink(in i ifindex); + ReconfigureLink(in i ifindex); + Reload(); + DescribeLink(in i ifindex, + out s json); + Describe(out s json); + properties: + readonly s OperationalState = '...'; + readonly s CarrierState = '...'; + readonly s AddressState = '...'; + readonly s IPv4AddressState = '...'; + readonly s IPv6AddressState = '...'; + readonly s OnlineState = '...'; + @org.freedesktop.DBus.Property.EmitsChangedSignal("const") + readonly t NamespaceId = ...; + }; + interface org.freedesktop.DBus.Peer { ... }; + interface org.freedesktop.DBus.Introspectable { ... }; + interface org.freedesktop.DBus.Properties { ... }; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provides information about the manager. + + + + + Link Object + + +node /org/freedesktop/network1/link/_1 { + interface org.freedesktop.network1.Link { + methods: + SetNTP(in as servers); + SetDNS(in a(iay) addresses); + SetDNSEx(in a(iayqs) addresses); + SetDomains(in a(sb) domains); + SetDefaultRoute(in b enable); + SetLLMNR(in s mode); + SetMulticastDNS(in s mode); + SetDNSOverTLS(in s mode); + SetDNSSEC(in s mode); + SetDNSSECNegativeTrustAnchors(in as names); + RevertNTP(); + RevertDNS(); + Renew(); + ForceRenew(); + Reconfigure(); + Describe(out s json); + properties: + readonly s OperationalState = '...'; + readonly s CarrierState = '...'; + readonly s AddressState = '...'; + readonly s IPv4AddressState = '...'; + readonly s IPv6AddressState = '...'; + readonly s OnlineState = '...'; + readonly s AdministrativeState = '...'; + @org.freedesktop.DBus.Property.EmitsChangedSignal("false") + readonly (tt) BitRates = ...; + }; + interface org.freedesktop.DBus.Peer { ... }; + interface org.freedesktop.DBus.Introspectable { ... }; + interface org.freedesktop.DBus.Properties { ... }; + interface org.freedesktop.network1.DHCPServer { ... }; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provides information about interfaces. + + + + + Network Object + + +node /org/freedesktop/network1/network/_1 { + interface org.freedesktop.network1.Network { + properties: + @org.freedesktop.DBus.Property.EmitsChangedSignal("const") + readonly s Description = '...'; + @org.freedesktop.DBus.Property.EmitsChangedSignal("const") + readonly s SourcePath = '...'; + @org.freedesktop.DBus.Property.EmitsChangedSignal("const") + readonly as MatchMAC = ['...', ...]; + @org.freedesktop.DBus.Property.EmitsChangedSignal("const") + readonly as MatchPath = ['...', ...]; + @org.freedesktop.DBus.Property.EmitsChangedSignal("const") + readonly as MatchDriver = ['...', ...]; + @org.freedesktop.DBus.Property.EmitsChangedSignal("const") + readonly as MatchType = ['...', ...]; + @org.freedesktop.DBus.Property.EmitsChangedSignal("const") + readonly as MatchName = ['...', ...]; + }; + interface org.freedesktop.DBus.Peer { ... }; + interface org.freedesktop.DBus.Introspectable { ... }; + interface org.freedesktop.DBus.Properties { ... }; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Provides information about .network files. + + + + + DHCP Server Object + + +node /org/freedesktop/network1/link/_1 { + interface org.freedesktop.network1.DHCPServer { + properties: + readonly a(uayayayayt) Leases = [...]; + }; + interface org.freedesktop.DBus.Peer { ... }; + interface org.freedesktop.DBus.Introspectable { ... }; + interface org.freedesktop.DBus.Properties { ... }; +}; + + + + + + + + + + + + + + + + Provides information about leases. + + + + + Examples + + + Introspect <interfacename>org.freedesktop.network1.Manager</interfacename> on the bus + + +$ gdbus introspect --system \ + --dest org.freedesktop.network1 \ + --object-path /org/freedesktop/network1 + + + + + Introspect <interfacename>org.freedesktop.network1.Link</interfacename> on the bus + + +$ gdbus introspect --system \ + --dest org.freedesktop.network1 \ + --object-path /org/freedesktop/network1/link/_11 + + + + + + Versioning + + These D-Bus interfaces follow + the usual interface versioning guidelines. + + diff --git a/man/rules/meson.build b/man/rules/meson.build index 88e5b7ce31..3efc1880ac 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -57,6 +57,7 @@ manpages = [ ['org.freedesktop.locale1', '5', [], 'ENABLE_LOCALED'], ['org.freedesktop.login1', '5', [], 'ENABLE_LOGIND'], ['org.freedesktop.machine1', '5', [], 'ENABLE_MACHINED'], + ['org.freedesktop.network1', '5', [], 'ENABLE_NETWORKD'], ['org.freedesktop.oom1', '5', [], 'ENABLE_OOMD'], ['org.freedesktop.portable1', '5', [], 'ENABLE_PORTABLED'], ['org.freedesktop.resolve1', '5', [], 'ENABLE_RESOLVE'],