From: Lennart Poettering Date: Fri, 22 Sep 2023 20:41:56 +0000 (+0200) Subject: tree-wide: make all our Varlink APIs introspectable X-Git-Tag: v255-rc1~305^2~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=abef4a7b3c4625e85e4c4f8b5a17a04260b845b2;p=thirdparty%2Fsystemd.git tree-wide: make all our Varlink APIs introspectable --- diff --git a/src/core/core-varlink.c b/src/core/core-varlink.c index 1ff4a93cced..b0b15d242cc 100644 --- a/src/core/core-varlink.c +++ b/src/core/core-varlink.c @@ -5,6 +5,8 @@ #include "strv.h" #include "user-util.h" #include "varlink.h" +#include "varlink-io.systemd.UserDatabase.h" +#include "varlink-io.systemd.ManagedOOM.h" typedef struct LookupParameters { const char *user_name; @@ -600,6 +602,13 @@ int manager_setup_varlink_server(Manager *m, VarlinkServer **ret) { varlink_server_set_userdata(s, m); + r = varlink_server_add_interface_many( + s, + &vl_interface_io_systemd_UserDatabase, + &vl_interface_io_systemd_ManagedOOM); + if (r < 0) + return log_error_errno(r, "Failed to add interfaces to varlink server: %m"); + r = varlink_server_bind_method_many( s, "io.systemd.UserDatabase.GetUserRecord", vl_method_get_user_record, diff --git a/src/home/homed-manager.c b/src/home/homed-manager.c index 903207b50f0..c4525310fc2 100644 --- a/src/home/homed-manager.c +++ b/src/home/homed-manager.c @@ -53,6 +53,7 @@ #include "user-record-util.h" #include "user-record.h" #include "user-util.h" +#include "varlink-io.systemd.UserDatabase.h" /* Where to look for private/public keys that are used to sign the user records. We are not using * CONF_PATHS_NULSTR() here since we want to insert /var/lib/systemd/home/ in the middle. And we insert that @@ -1003,6 +1004,10 @@ static int manager_bind_varlink(Manager *m) { varlink_server_set_userdata(m->varlink_server, m); + r = varlink_server_add_interface(m->varlink_server, &vl_interface_io_systemd_UserDatabase); + if (r < 0) + return log_error_errno(r, "Failed to add UserDatabase interface to varlink server: %m"); + r = varlink_server_bind_method_many( m->varlink_server, "io.systemd.UserDatabase.GetUserRecord", vl_method_get_user_record, diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index 615b3c6c6b1..371338211aa 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -58,6 +58,7 @@ #include "syslog-util.h" #include "uid-alloc-range.h" #include "user-util.h" +#include "varlink-io.systemd.Journal.h" #define USER_JOURNALS_MAX 1024 @@ -2224,6 +2225,10 @@ static int server_open_varlink(Server *s, const char *socket, int fd) { varlink_server_set_userdata(s->varlink_server, s); + r = varlink_server_add_interface(s->varlink_server, &vl_interface_io_systemd_Journal); + if (r < 0) + return log_error_errno(r, "Failed to add Journal interface to varlink server: %m"); + r = varlink_server_bind_method_many( s->varlink_server, "io.systemd.Journal.Synchronize", vl_method_synchronize, diff --git a/src/machine/machined-varlink.c b/src/machine/machined-varlink.c index ec625ad7b4f..4b72ee9b0a3 100644 --- a/src/machine/machined-varlink.c +++ b/src/machine/machined-varlink.c @@ -5,6 +5,7 @@ #include "mkdir.h" #include "user-util.h" #include "varlink.h" +#include "varlink-io.systemd.UserDatabase.h" typedef struct LookupParameters { const char *user_name; @@ -392,6 +393,10 @@ int manager_varlink_init(Manager *m) { varlink_server_set_userdata(s, m); + r = varlink_server_add_interface(s, &vl_interface_io_systemd_UserDatabase); + if (r < 0) + return log_error_errno(r, "Failed to add UserDatabase interface to varlink server: %m"); + r = varlink_server_bind_method_many( s, "io.systemd.UserDatabase.GetUserRecord", vl_method_get_user_record, diff --git a/src/oom/oomd-manager.c b/src/oom/oomd-manager.c index 49896ea7f11..75918a5fe7e 100644 --- a/src/oom/oomd-manager.c +++ b/src/oom/oomd-manager.c @@ -15,6 +15,7 @@ #include "oomd-manager.h" #include "path-util.h" #include "percent-util.h" +#include "varlink-io.systemd.oom.h" typedef struct ManagedOOMMessage { ManagedOOMMode mode; @@ -733,6 +734,10 @@ static int manager_varlink_init(Manager *m, int fd) { varlink_server_set_userdata(s, m); + r = varlink_server_add_interface(s, &vl_interface_io_systemd_oom); + if (r < 0) + return log_error_errno(r, "Failed to add oom interface to varlink server: %m"); + r = varlink_server_bind_method(s, "io.systemd.oom.ReportManagedOOMCGroups", process_managed_oom_request); if (r < 0) return log_error_errno(r, "Failed to register varlink method: %m"); diff --git a/src/resolve/resolved-varlink.c b/src/resolve/resolved-varlink.c index 83b8e52807b..c9bb616acbf 100644 --- a/src/resolve/resolved-varlink.c +++ b/src/resolve/resolved-varlink.c @@ -5,6 +5,8 @@ #include "resolved-dns-synthesize.h" #include "resolved-varlink.h" #include "socket-netlink.h" +#include "varlink-io.systemd.Resolve.h" +#include "varlink-io.systemd.Resolve.Monitor.h" typedef struct LookupParameters { int ifindex; @@ -699,6 +701,10 @@ static int varlink_monitor_server_init(Manager *m) { varlink_server_set_userdata(server, m); + r = varlink_server_add_interface(server, &vl_interface_io_systemd_Resolve_Monitor); + if (r < 0) + return log_error_errno(r, "Failed to add Resolve.Monitor interface to varlink server: %m"); + r = varlink_server_bind_method_many( server, "io.systemd.Resolve.Monitor.SubscribeQueryResults", vl_method_subscribe_query_results, @@ -741,6 +747,10 @@ static int varlink_main_server_init(Manager *m) { varlink_server_set_userdata(s, m); + r = varlink_server_add_interface(s, &vl_interface_io_systemd_Resolve); + if (r < 0) + return log_error_errno(r, "Failed to add Resolve interface to varlink server: %m"); + r = varlink_server_bind_method_many( s, "io.systemd.Resolve.ResolveHostname", vl_method_resolve_hostname, diff --git a/src/shared/meson.build b/src/shared/meson.build index 429789b0452..9d29c32dff7 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -168,6 +168,12 @@ shared_sources = files( 'varlink.c', 'varlink-idl.c', 'varlink-io.systemd.c', + 'varlink-io.systemd.Journal.c', + 'varlink-io.systemd.ManagedOOM.c', + 'varlink-io.systemd.Resolve.Monitor.c', + 'varlink-io.systemd.Resolve.c', + 'varlink-io.systemd.UserDatabase.c', + 'varlink-io.systemd.oom.c', 'varlink-org.varlink.service.c', 'verb-log-control.c', 'verbs.c', diff --git a/src/shared/varlink-io.systemd.Journal.c b/src/shared/varlink-io.systemd.Journal.c new file mode 100644 index 00000000000..b93fb72acad --- /dev/null +++ b/src/shared/varlink-io.systemd.Journal.c @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "varlink-io.systemd.Journal.h" + +static VARLINK_DEFINE_METHOD(Synchronize); +static VARLINK_DEFINE_METHOD(Rotate); +static VARLINK_DEFINE_METHOD(FlushToVar); +static VARLINK_DEFINE_METHOD(RelinquishVar); + +static VARLINK_DEFINE_ERROR(NotSupportedByNamespaces); + +VARLINK_DEFINE_INTERFACE( + io_systemd_Journal, + "io.systemd.Journal", + &vl_method_Synchronize, + &vl_method_Rotate, + &vl_method_FlushToVar, + &vl_method_RelinquishVar, + &vl_error_NotSupportedByNamespaces); diff --git a/src/shared/varlink-io.systemd.Journal.h b/src/shared/varlink-io.systemd.Journal.h new file mode 100644 index 00000000000..0bc94a775ca --- /dev/null +++ b/src/shared/varlink-io.systemd.Journal.h @@ -0,0 +1,6 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include "varlink-idl.h" + +extern const VarlinkInterface vl_interface_io_systemd_Journal; diff --git a/src/shared/varlink-io.systemd.ManagedOOM.c b/src/shared/varlink-io.systemd.ManagedOOM.c new file mode 100644 index 00000000000..7cc5721dc2e --- /dev/null +++ b/src/shared/varlink-io.systemd.ManagedOOM.c @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "varlink-io.systemd.ManagedOOM.h" + +/* Pull in vl_type_ControlGroup, since both interfaces need it */ +#include "varlink-io.systemd.oom.h" + +/* This is PID1's Varlink service, where PID 1 is the server and oomd is the client. + * + * Compare with io.systemd.oom where the client/server roles of oomd and the service manager are swapped! */ + +static VARLINK_DEFINE_METHOD( + SubscribeManagedOOMCGroups, + VARLINK_DEFINE_OUTPUT_BY_TYPE(cgroups, ControlGroup, VARLINK_ARRAY)); + +VARLINK_DEFINE_INTERFACE( + io_systemd_ManagedOOM, + "io.systemd.ManagedOOM", + &vl_method_SubscribeManagedOOMCGroups, + &vl_type_ControlGroup); diff --git a/src/shared/varlink-io.systemd.ManagedOOM.h b/src/shared/varlink-io.systemd.ManagedOOM.h new file mode 100644 index 00000000000..2c8bf54c4e0 --- /dev/null +++ b/src/shared/varlink-io.systemd.ManagedOOM.h @@ -0,0 +1,6 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include "varlink-idl.h" + +extern const VarlinkInterface vl_interface_io_systemd_ManagedOOM; diff --git a/src/shared/varlink-io.systemd.Resolve.Monitor.c b/src/shared/varlink-io.systemd.Resolve.Monitor.c new file mode 100644 index 00000000000..179b9bcf1e2 --- /dev/null +++ b/src/shared/varlink-io.systemd.Resolve.Monitor.c @@ -0,0 +1,136 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "varlink-io.systemd.Resolve.Monitor.h" + +VARLINK_DEFINE_STRUCT_TYPE( + ResourceKey, + VARLINK_DEFINE_FIELD(class, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(type, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(name, VARLINK_STRING, 0)); + +VARLINK_DEFINE_STRUCT_TYPE( + ResourceRecord, + VARLINK_DEFINE_FIELD_BY_TYPE(key, ResourceKey, 0), + VARLINK_DEFINE_FIELD(priority, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(weight, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(port, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(name, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(cpu, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(os, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(items, VARLINK_STRING, VARLINK_NULLABLE|VARLINK_ARRAY), + VARLINK_DEFINE_FIELD(address, VARLINK_INT, VARLINK_NULLABLE|VARLINK_ARRAY), + VARLINK_DEFINE_FIELD(mname, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(rname, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(serial, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(refresh, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(expire, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(minimum, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(exchange, VARLINK_STRING, VARLINK_NULLABLE)); + +VARLINK_DEFINE_STRUCT_TYPE( + Answer, + VARLINK_DEFINE_FIELD_BY_TYPE(rr, ResourceRecord, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(raw, VARLINK_STRING, 0), + VARLINK_DEFINE_FIELD(ifindex, VARLINK_INT, VARLINK_NULLABLE)); + +VARLINK_DEFINE_METHOD( + SubscribeQueryResults, + /* First reply */ + VARLINK_DEFINE_OUTPUT(ready, VARLINK_BOOL, VARLINK_NULLABLE), + /* Subsequent replies */ + VARLINK_DEFINE_OUTPUT(state, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_OUTPUT(rcode, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_OUTPUT(errno, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_OUTPUT_BY_TYPE(question, ResourceKey, VARLINK_NULLABLE|VARLINK_ARRAY), + VARLINK_DEFINE_OUTPUT_BY_TYPE(collectedQuestions, ResourceKey, VARLINK_NULLABLE|VARLINK_ARRAY), + VARLINK_DEFINE_OUTPUT_BY_TYPE(answer, Answer, VARLINK_NULLABLE|VARLINK_ARRAY)); + +VARLINK_DEFINE_STRUCT_TYPE( + CacheEntry, + VARLINK_DEFINE_FIELD_BY_TYPE(key, ResourceKey, 0), + VARLINK_DEFINE_FIELD_BY_TYPE(rrs, ResourceRecord, VARLINK_NULLABLE|VARLINK_ARRAY), + VARLINK_DEFINE_FIELD(type, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(until, VARLINK_INT, 0)); + +VARLINK_DEFINE_STRUCT_TYPE( + ScopeCache, + VARLINK_DEFINE_FIELD(protocol, VARLINK_STRING, 0), + VARLINK_DEFINE_FIELD(family, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(ifindex, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(ifname, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD_BY_TYPE(cache, CacheEntry, VARLINK_ARRAY)); + +VARLINK_DEFINE_METHOD( + DumpCache, + VARLINK_DEFINE_OUTPUT_BY_TYPE(dump, ScopeCache, VARLINK_ARRAY)); + +VARLINK_DEFINE_STRUCT_TYPE( + ServerState, + VARLINK_DEFINE_FIELD(Server, VARLINK_STRING, 0), + VARLINK_DEFINE_FIELD(Type, VARLINK_STRING, 0), + VARLINK_DEFINE_FIELD(Interface, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(InterfaceIndex, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(VerifiedFeatureLevel, VARLINK_STRING, 0), + VARLINK_DEFINE_FIELD(PossibleFeatureLevel, VARLINK_STRING, 0), + VARLINK_DEFINE_FIELD(DNSSECMode, VARLINK_STRING, 0), + VARLINK_DEFINE_FIELD(DNSSECSupported, VARLINK_BOOL, 0), + VARLINK_DEFINE_FIELD(ReceivedUDPFragmentMax, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(FailedUDPAttempts, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(FailedTCPAttempts, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(PacketTruncated, VARLINK_BOOL, 0), + VARLINK_DEFINE_FIELD(PacketBadOpt, VARLINK_BOOL, 0), + VARLINK_DEFINE_FIELD(PacketRRSIGMissing, VARLINK_BOOL, 0), + VARLINK_DEFINE_FIELD(PacketInvalid, VARLINK_BOOL, 0), + VARLINK_DEFINE_FIELD(PacketDoOff, VARLINK_BOOL, 0)); + +VARLINK_DEFINE_METHOD( + DumpServerState, + VARLINK_DEFINE_OUTPUT_BY_TYPE(dump, ServerState, VARLINK_ARRAY)); + +VARLINK_DEFINE_STRUCT_TYPE( + TransactionStatistics, + VARLINK_DEFINE_FIELD(currentTransactions, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(totalTransactions, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(totalTimeouts, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(totalTimeoutsServedStale, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(totalFailedResponses, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(totalFailedResponsesServedStale, VARLINK_INT, 0)); + +VARLINK_DEFINE_STRUCT_TYPE( + CacheStatistics, + VARLINK_DEFINE_FIELD(size, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(hits, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(misses, VARLINK_INT, 0)); + +VARLINK_DEFINE_STRUCT_TYPE( + DnssecStatistics, + VARLINK_DEFINE_FIELD(secure, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(insecure, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(bogus, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(indeterminate, VARLINK_INT, 0)); + +VARLINK_DEFINE_METHOD( + DumpStatistics, + VARLINK_DEFINE_OUTPUT_BY_TYPE(transactions, TransactionStatistics, 0), + VARLINK_DEFINE_OUTPUT_BY_TYPE(cache, CacheStatistics, 0), + VARLINK_DEFINE_OUTPUT_BY_TYPE(dnssec, DnssecStatistics, 0)); + +VARLINK_DEFINE_METHOD(ResetStatistics); + +VARLINK_DEFINE_INTERFACE( + io_systemd_Resolve_Monitor, + "io.systemd.Resolve.Monitor", + &vl_method_SubscribeQueryResults, + &vl_method_DumpCache, + &vl_method_DumpServerState, + &vl_method_DumpStatistics, + &vl_method_ResetStatistics, + &vl_type_ResourceKey, + &vl_type_ResourceRecord, + &vl_type_Answer, + &vl_type_CacheEntry, + &vl_type_ScopeCache, + &vl_type_TransactionStatistics, + &vl_type_CacheStatistics, + &vl_type_DnssecStatistics, + &vl_type_ServerState); diff --git a/src/shared/varlink-io.systemd.Resolve.Monitor.h b/src/shared/varlink-io.systemd.Resolve.Monitor.h new file mode 100644 index 00000000000..a133ec30a56 --- /dev/null +++ b/src/shared/varlink-io.systemd.Resolve.Monitor.h @@ -0,0 +1,6 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include "varlink-idl.h" + +extern const VarlinkInterface vl_interface_io_systemd_Resolve_Monitor; diff --git a/src/shared/varlink-io.systemd.Resolve.c b/src/shared/varlink-io.systemd.Resolve.c new file mode 100644 index 00000000000..0d8ad281fa6 --- /dev/null +++ b/src/shared/varlink-io.systemd.Resolve.c @@ -0,0 +1,76 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "varlink-io.systemd.Resolve.h" + +static VARLINK_DEFINE_STRUCT_TYPE( + ResolvedAddress, + VARLINK_DEFINE_FIELD(ifindex, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(family, VARLINK_INT, 0), + VARLINK_DEFINE_FIELD(address, VARLINK_INT, VARLINK_ARRAY)); + +static VARLINK_DEFINE_METHOD( + ResolveHostname, + VARLINK_DEFINE_INPUT(ifindex, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_INPUT(name, VARLINK_STRING, 0), + VARLINK_DEFINE_INPUT(family, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_INPUT(flags, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_OUTPUT_BY_TYPE(addresses, ResolvedAddress, VARLINK_ARRAY), + VARLINK_DEFINE_OUTPUT(name, VARLINK_STRING, 0), + VARLINK_DEFINE_OUTPUT(flags, VARLINK_INT, 0)); + +static VARLINK_DEFINE_STRUCT_TYPE( + ResolvedName, + VARLINK_DEFINE_FIELD(ifindex, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_FIELD(name, VARLINK_STRING, 0)); + +static VARLINK_DEFINE_METHOD( + ResolveAddress, + VARLINK_DEFINE_INPUT(ifindex, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_INPUT(family, VARLINK_INT, 0), + VARLINK_DEFINE_INPUT(address, VARLINK_INT, VARLINK_ARRAY), + VARLINK_DEFINE_INPUT(flags, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_OUTPUT_BY_TYPE(names, ResolvedName, VARLINK_ARRAY), + VARLINK_DEFINE_OUTPUT(flags, VARLINK_INT, 0)); + +static VARLINK_DEFINE_ERROR(NoNameServers); +static VARLINK_DEFINE_ERROR(NoSuchResourceRecord); +static VARLINK_DEFINE_ERROR(QueryTimedOut); +static VARLINK_DEFINE_ERROR(MaxAttemptsReached); +static VARLINK_DEFINE_ERROR(InvalidReply); +static VARLINK_DEFINE_ERROR(QueryAborted); +static VARLINK_DEFINE_ERROR( + DNSSECValidationFailed, + VARLINK_DEFINE_FIELD(result, VARLINK_STRING, 0)); +static VARLINK_DEFINE_ERROR(NoTrustAnchor); +static VARLINK_DEFINE_ERROR(ResourceRecordTypeUnsupported); +static VARLINK_DEFINE_ERROR(NetworkDown); +static VARLINK_DEFINE_ERROR(NoSource); +static VARLINK_DEFINE_ERROR(StubLoop); +static VARLINK_DEFINE_ERROR( + DNSError, + VARLINK_DEFINE_FIELD(rcode, VARLINK_INT, 0)); +static VARLINK_DEFINE_ERROR(CNAMELoop); +static VARLINK_DEFINE_ERROR(BadAddressSize); + +VARLINK_DEFINE_INTERFACE( + io_systemd_Resolve, + "io.systemd.Resolve", + &vl_method_ResolveHostname, + &vl_method_ResolveAddress, + &vl_type_ResolvedAddress, + &vl_type_ResolvedName, + &vl_error_NoNameServers, + &vl_error_NoSuchResourceRecord, + &vl_error_QueryTimedOut, + &vl_error_MaxAttemptsReached, + &vl_error_InvalidReply, + &vl_error_QueryAborted, + &vl_error_DNSSECValidationFailed, + &vl_error_NoTrustAnchor, + &vl_error_ResourceRecordTypeUnsupported, + &vl_error_NetworkDown, + &vl_error_NoSource, + &vl_error_StubLoop, + &vl_error_DNSError, + &vl_error_CNAMELoop, + &vl_error_BadAddressSize); diff --git a/src/shared/varlink-io.systemd.Resolve.h b/src/shared/varlink-io.systemd.Resolve.h new file mode 100644 index 00000000000..5c7ed39d0d3 --- /dev/null +++ b/src/shared/varlink-io.systemd.Resolve.h @@ -0,0 +1,6 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include "varlink-idl.h" + +extern const VarlinkInterface vl_interface_io_systemd_Resolve; diff --git a/src/shared/varlink-io.systemd.UserDatabase.c b/src/shared/varlink-io.systemd.UserDatabase.c new file mode 100644 index 00000000000..a640d2e29a4 --- /dev/null +++ b/src/shared/varlink-io.systemd.UserDatabase.c @@ -0,0 +1,46 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "varlink-io.systemd.UserDatabase.h" + +static VARLINK_DEFINE_METHOD( + GetUserRecord, + VARLINK_DEFINE_INPUT(uid, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_INPUT(userName, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_INPUT(service, VARLINK_STRING, 0), + VARLINK_DEFINE_OUTPUT(record, VARLINK_OBJECT, 0), + VARLINK_DEFINE_OUTPUT(incomplete, VARLINK_BOOL, 0)); + +static VARLINK_DEFINE_METHOD( + GetGroupRecord, + VARLINK_DEFINE_INPUT(gid, VARLINK_INT, VARLINK_NULLABLE), + VARLINK_DEFINE_INPUT(groupName, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_INPUT(service, VARLINK_STRING, 0), + VARLINK_DEFINE_OUTPUT(record, VARLINK_OBJECT, 0), + VARLINK_DEFINE_OUTPUT(incomplete, VARLINK_BOOL, 0)); + +static VARLINK_DEFINE_METHOD( + GetMemberships, + VARLINK_DEFINE_INPUT(userName, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_INPUT(groupName, VARLINK_STRING, VARLINK_NULLABLE), + VARLINK_DEFINE_INPUT(service, VARLINK_STRING, 0), + VARLINK_DEFINE_OUTPUT(userName, VARLINK_STRING, 0), + VARLINK_DEFINE_OUTPUT(groupName, VARLINK_STRING, 0)); + +static VARLINK_DEFINE_ERROR(NoRecordFound); +static VARLINK_DEFINE_ERROR(BadService); +static VARLINK_DEFINE_ERROR(ServiceNotAvailable); +static VARLINK_DEFINE_ERROR(ConflictingRecordNotFound); +static VARLINK_DEFINE_ERROR(EnumerationNotSupported); + +/* As per https://systemd.io/USER_GROUP_API/ */ +VARLINK_DEFINE_INTERFACE( + io_systemd_UserDatabase, + "io.systemd.UserDatabase", + &vl_method_GetUserRecord, + &vl_method_GetGroupRecord, + &vl_method_GetMemberships, + &vl_error_NoRecordFound, + &vl_error_BadService, + &vl_error_ServiceNotAvailable, + &vl_error_ConflictingRecordNotFound, + &vl_error_EnumerationNotSupported); diff --git a/src/shared/varlink-io.systemd.UserDatabase.h b/src/shared/varlink-io.systemd.UserDatabase.h new file mode 100644 index 00000000000..346ca848acf --- /dev/null +++ b/src/shared/varlink-io.systemd.UserDatabase.h @@ -0,0 +1,6 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include "varlink-idl.h" + +extern const VarlinkInterface vl_interface_io_systemd_UserDatabase; diff --git a/src/shared/varlink-io.systemd.oom.c b/src/shared/varlink-io.systemd.oom.c new file mode 100644 index 00000000000..e1da3fa5278 --- /dev/null +++ b/src/shared/varlink-io.systemd.oom.c @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "varlink-io.systemd.oom.h" + +/* This is oomd's Varlink service, where oomd is server and systemd --user is the client. + * + * Compare with io.systemd.ManagedOOM where the client/server roles of the service manager and oomd are + * swapped! */ + +VARLINK_DEFINE_STRUCT_TYPE( + ControlGroup, + VARLINK_DEFINE_FIELD(mode, VARLINK_STRING, 0), + VARLINK_DEFINE_FIELD(path, VARLINK_STRING, 0), + VARLINK_DEFINE_FIELD(property, VARLINK_STRING, 0), + VARLINK_DEFINE_FIELD(limit, VARLINK_INT, VARLINK_NULLABLE)); + +static VARLINK_DEFINE_METHOD( + ReportManagedOOMCGroups, + VARLINK_DEFINE_INPUT_BY_TYPE(cgroups, ControlGroup, VARLINK_ARRAY)); + +VARLINK_DEFINE_INTERFACE( + io_systemd_oom, + "io.systemd.oom", + &vl_method_ReportManagedOOMCGroups, + &vl_type_ControlGroup); diff --git a/src/shared/varlink-io.systemd.oom.h b/src/shared/varlink-io.systemd.oom.h new file mode 100644 index 00000000000..911dbc29e6a --- /dev/null +++ b/src/shared/varlink-io.systemd.oom.h @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +#include "varlink-idl.h" + +extern const VarlinkSymbol vl_type_ControlGroup; +extern const VarlinkInterface vl_interface_io_systemd_oom; diff --git a/src/userdb/userwork.c b/src/userdb/userwork.c index 9fccadc9501..7413378bcba 100644 --- a/src/userdb/userwork.c +++ b/src/userdb/userwork.c @@ -18,6 +18,7 @@ #include "user-util.h" #include "userdb.h" #include "varlink.h" +#include "varlink-io.systemd.UserDatabase.h" #define ITERATIONS_MAX 64U #define RUNTIME_MAX_USEC (5 * USEC_PER_MINUTE) @@ -483,6 +484,10 @@ static int run(int argc, char *argv[]) { if (r < 0) return log_error_errno(r, "Failed to allocate server: %m"); + r = varlink_server_add_interface(server, &vl_interface_io_systemd_UserDatabase); + if (r < 0) + return log_error_errno(r, "Failed to add UserDatabase interface to varlink server: %m"); + r = varlink_server_bind_method_many( server, "io.systemd.UserDatabase.GetUserRecord", vl_method_get_user_record,