connman.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
From: Michael Nazzareno Trimarchi <michael@amarulasolutions.com>
To: connman@lists.linux.dev, Daniel Wagner <wagi@monom.org>
Cc: Jan.Ryll@bshg.com, Simon.Holesch@bshg.com
Subject: Re: [PATCH V2] Add GetKnownServices api to connaman
Date: Wed, 27 Oct 2021 17:25:32 +0000	[thread overview]
Message-ID: <CAOf5uwmcmkUNO0P3mZOC94bWRpodqLeJ4kmBTSu2N0j9xw_WQQ@mail.gmail.com> (raw)
In-Reply-To: <20211027140141.9267-1-michael@amarulasolutions.com>

Hi Daniel

I even have the patch to remove known-networks. I have few question:

- what should be the behavior for an ethernet on?
- for wifi, it's removed and if you are connected it's disconnected is
that correct?

Apart of that:

I'm working on a patch that allow to store network configuration using
the config storage
but I have few questions:

- I have added autoconnect as a configuration option. I would like to
store networks but not have them
in auto connect mode. This should allow me to connect when they are
visible. (ethernet??)
- I have add an option to store if I want it immutable or not. The
stored configuration should be applied
if it's valid but I would like to connect using a different way from
connect call

--- a/src/config.c
+++ b/src/config.c
@@ -61,6 +61,8 @@ struct connman_config_service {
        GSList *service_identifiers;
        char *config_ident; /* file prefix */
        char *config_entry; /* entry name */
+       bool autoconnect;
+       bool immutable;
        bool hidden;
        bool virtual;
        char *virtual_file;
@@ -115,6 +117,8 @@ static bool cleanup = false;
 #define SERVICE_KEY_SECURITY           "Security"
 #define SERVICE_KEY_HIDDEN             "Hidden"
 #define SERVICE_KEY_MDNS               "mDNS"
+#define SERVICE_KEY_AUTOCONNECT        "Autoconnect"
+#define SERVICE_KEY_IMMUTABLE          "Immutable"

 #define SERVICE_KEY_IPv4               "IPv4"
 #define SERVICE_KEY_IPv6               "IPv6"
@@ -162,6 +166,8 @@ static const char *service_possible_keys[] = {
        SERVICE_KEY_SEARCH_DOMAINS,
        SERVICE_KEY_TIMESERVERS,
        SERVICE_KEY_DOMAIN,
+       SERVICE_KEY_AUTOCONNECT,
+       SERVICE_KEY_IMMUTABLE,
        NULL,
 };

@@ -229,7 +235,7 @@ static void unregister_service(gpointer data)
                        }
                }

-               if (!__connman_storage_remove_service(service_id))
+               if (config_service->autoconnect &&
!__connman_storage_remove_service(service_id))
                        DBG("Could not remove all files for service %s",
                                                                service_id);
        }
@@ -599,6 +605,12 @@ static bool load_service(GKeyFile *keyfile, const
char *group,
                return true;
        }

+       service->autoconnect = __connman_config_get_bool(keyfile, group,
+                                               SERVICE_KEY_AUTOCONNECT, NULL);
+
+       service->immutable = __connman_config_get_bool(keyfile, group,
+                                               SERVICE_KEY_IMMUTABLE, NULL);
+
        str = __connman_config_get_string(keyfile, group,
SERVICE_KEY_NAME, NULL);
        if (str) {
                g_free(service->name);
@@ -1180,6 +1192,8 @@ static void provision_service_wifi(struct
connman_config_service *config,

        if (config->hidden)
                __connman_service_set_hidden(service);
+
+       __connman_service_set_auto_connect(service, config->autoconnect);

Michael

On Wed, Oct 27, 2021 at 2:01 PM Michael Trimarchi
<michael@amarulasolutions.com> wrote:
>
> Add a way to retrieve all the networks that were configured
> using connman and not all the ones visible
>
> ---
> Changes V1->V2:
>         - remove SoB
>         - Add documentation
>         - remove LOG print
>         - Avoid check null on functions that assert
>         - adjust the function the look for service
>         - clean up a bit variable name
>         - remove initialization of variables that are not needed
> ---
>  client/commands.c    | 14 +++++++++++
>  doc/manager-api.txt  | 12 ++++++++++
>  src/connman.h        |  1 +
>  src/manager.c        | 23 ++++++++++++++++++
>  src/service.c        | 55 ++++++++++++++++++++++++++++++++++++++++++++
>  tools/manager-api.c  | 30 ++++++++++++++++++++++++
>  tools/session-test.h |  1 +
>  7 files changed, 136 insertions(+)
>
> diff --git a/client/commands.c b/client/commands.c
> index 53cc14c8..f4366e8c 100644
> --- a/client/commands.c
> +++ b/client/commands.c
> @@ -420,6 +420,18 @@ static int cmd_services(char *args[], int num, struct connman_option *options)
>                         object_properties, path, NULL, NULL);
>  }
>
> +static int cmd_known_services(char *args[], int num, struct connman_option *options)
> +{
> +       if (num > 1)
> +               return -E2BIG;
> +
> +       return __connmanctl_dbus_method_call(connection,
> +                        CONNMAN_SERVICE, CONNMAN_PATH,
> +                        "net.connman.Manager",
> +                        "GetKnownServices",
> +                        services_list, NULL, NULL, NULL);
> +}
> +
>  static int cmd_peers(char *args[], int num, struct connman_option *options)
>  {
>         char *peer_name = NULL;
> @@ -2808,6 +2820,8 @@ static const struct {
>           "Display tethering clients", NULL },
>         { "services",     "[<service>]",  service_options, cmd_services,
>           "Display services", lookup_service_arg },
> +       { "known-services", NULL,  NULL, cmd_known_services,
> +         "Display known services", NULL },
>         { "peers",        "[peer]",       NULL,            cmd_peers,
>           "Display peers", lookup_peer_arg },
>         { "scan",         "<technology>", NULL,            cmd_scan,
> diff --git a/doc/manager-api.txt b/doc/manager-api.txt
> index 6eaa0a38..093b25c1 100644
> --- a/doc/manager-api.txt
> +++ b/doc/manager-api.txt
> @@ -39,6 +39,18 @@ Methods              dict GetProperties()
>
>                         Possible Errors: [service].Error.InvalidArguments
>
> +               array{object,dict} GetKnownServices()
> +
> +                       Returns a sorted list of tuples with service
> +                       object path and dictionary of service propertiesa
> +                       Those are all the services including the one that
> +                       are registered but not visible or not in use.
> +
> +                       This list will not contain sensitive information
> +                       like passphrases etc.
> +
> +                       Possible Errors: [service].Error.InvalidArguments
> +
>                 array{object,dict} GetPeers() [experimental]
>
>                         Returns a sorted list of tuples with peer object path
> diff --git a/src/connman.h b/src/connman.h
> index 68176086..cdc88532 100644
> --- a/src/connman.h
> +++ b/src/connman.h
> @@ -682,6 +682,7 @@ int __connman_service_move(struct connman_service *service,
>                                 struct connman_service *target, bool before);
>  int __connman_service_load_modifiable(struct connman_service *service);
>
> +void __connman_known_service_list_struct(DBusMessageIter *iter);
>  void __connman_service_list_struct(DBusMessageIter *iter);
>
>  int __connman_service_compare(const struct connman_service *a,
> diff --git a/src/manager.c b/src/manager.c
> index 892d3a42..b196109a 100644
> --- a/src/manager.c
> +++ b/src/manager.c
> @@ -175,6 +175,11 @@ static const struct connman_notifier technology_notifier = {
>         .idle_state     = idle_state,
>  };
>
> +static void append_known_service_structs(DBusMessageIter *iter, void *user_data)
> +{
> +       __connman_known_service_list_struct(iter);
> +}
> +
>  static void append_service_structs(DBusMessageIter *iter, void *user_data)
>  {
>         __connman_service_list_struct(iter);
> @@ -195,6 +200,21 @@ static DBusMessage *get_services(DBusConnection *conn,
>         return reply;
>  }
>
> +static DBusMessage *get_known_services(DBusConnection *conn,
> +                                  DBusMessage *msg, void *data)
> +{
> +       DBusMessage *reply;
> +
> +       reply = dbus_message_new_method_return(msg);
> +       if (!reply)
> +               return NULL;
> +
> +       __connman_dbus_append_objpath_dict_array(reply,
> +                                append_known_service_structs, NULL);
> +
> +       return reply;
> +}
> +
>  static void append_peer_structs(DBusMessageIter *iter, void *user_data)
>  {
>         __connman_peer_list_struct(iter);
> @@ -534,6 +554,9 @@ static const GDBusMethodTable manager_methods[] = {
>         { GDBUS_DEPRECATED_METHOD("RemoveProvider",
>                         GDBUS_ARGS({ "provider", "o" }), NULL,
>                         remove_provider) },
> +       { GDBUS_METHOD("GetKnownServices",
> +                       NULL, GDBUS_ARGS({"knownServices", "a(oa{sv})" }),
> +                       get_known_services) },
>         { GDBUS_METHOD("GetServices",
>                         NULL, GDBUS_ARGS({ "services", "a(oa{sv})" }),
>                         get_services) },
> diff --git a/src/service.c b/src/service.c
> index 8d3c75a5..da8304cc 100644
> --- a/src/service.c
> +++ b/src/service.c
> @@ -2705,6 +2705,61 @@ static void append_struct(gpointer value, gpointer user_data)
>         append_struct_service(iter, append_dict_properties, service);
>  }
>
> +void __connman_known_service_list_struct(DBusMessageIter *iter)
> +{
> +       gchar **services;
> +       gchar **srv_id_parts;
> +       guint i;
> +       struct connman_service *service;
> +
> +       services = connman_storage_get_services();
> +       if (!services)
> +               return;
> +
> +       for (i = 0; i < g_strv_length(services); i++) {
> +               struct connman_service *srv;
> +
> +               service = connman_service_create();
> +               if (!service) {
> +                       connman_error("connman_service_create() allocation failed");
> +                       return;
> +               }
> +
> +               service->identifier = g_strdup(services[i]);
> +               srv_id_parts = g_strsplit(services[i], "_", -1);
> +               if (srv_id_parts == NULL) {
> +                       g_free(service);
> +                       continue;
> +               }
> +
> +               service->type = __connman_service_string2type(srv_id_parts[0]);
> +               service->path = g_strdup_printf("%s/%s", STORAGEDIR, service->identifier);
> +               if (service->type == CONNMAN_SERVICE_TYPE_WIFI)
> +                       service->security = __connman_service_string2security(srv_id_parts[g_strv_length(srv_id_parts) - 1]);
> +
> +               srv = find_service(service->path);
> +               if (srv)
> +                       service->state = srv->state;
> +
> +               if (service->type == CONNMAN_SERVICE_TYPE_ETHERNET && srv)
> +                       service->name = srv->name;
> +
> +               if (service_load(service)) {
> +                       connman_error("service_load() returned error");
> +                       g_free(service);
> +                       g_strfreev(srv_id_parts);
> +                       g_strfreev(services);
> +                       return;
> +               }
> +
> +               append_struct_service(iter, append_dict_properties, service);
> +               g_strfreev(srv_id_parts);
> +               g_free(service);
> +       }
> +
> +       g_strfreev(services);
> +}
> +
>  void __connman_service_list_struct(DBusMessageIter *iter)
>  {
>         g_list_foreach(service_list, append_struct, iter);
> diff --git a/tools/manager-api.c b/tools/manager-api.c
> index e082962d..8668ca9e 100644
> --- a/tools/manager-api.c
> +++ b/tools/manager-api.c
> @@ -64,6 +64,36 @@ static DBusMessage *set_property(DBusConnection *connection,
>         return reply;
>  }
>
> +DBusMessage *manager_get_known_services(DBusConnection *connection)
> +{
> +       DBusMessage *message, *reply;
> +       DBusError error;
> +
> +       message = dbus_message_new_method_call(CONNMAN_SERVICE,
> +                                  CONNMAN_MANAGER_PATH,
> +                                  CONNMAN_MANAGER_INTERFACE,
> +                                  "GetKnownServices");
> +
> +       if (!message)
> +               return NULL;
> +
> +       dbus_error_init(&error);
> +
> +       reply = dbus_connection_send_with_reply_and_block(connection,
> +                                 message, -1, &error);
> +       if (!reply) {
> +               if (dbus_error_is_set(&error))
> +                       dbus_error_free(&error);
> +
> +               dbus_message_unref(message);
> +               return NULL;
> +       }
> +
> +       dbus_message_unref(message);
> +
> +       return reply;
> +}
> +
>  DBusMessage *manager_get_services(DBusConnection *connection)
>  {
>         DBusMessage *message, *reply;
> diff --git a/tools/session-test.h b/tools/session-test.h
> index 2c068bd7..ab89f8c5 100644
> --- a/tools/session-test.h
> +++ b/tools/session-test.h
> @@ -114,6 +114,7 @@ DBusMessage *session_disconnect(DBusConnection *connection,
>                                         struct test_session *session);
>
>  /* manager-api.c */
> +DBusMessage *manager_get_known_services(DBusConnection *connection);
>  DBusMessage *manager_get_services(DBusConnection *connection);
>  DBusMessage *manager_get_properties(DBusConnection *connection);
>  DBusMessage *manager_create_session(DBusConnection *connection,
> --
> 2.25.1
>


-- 
Michael Nazzareno Trimarchi
Co-Founder & Chief Executive Officer
M. +39 347 913 2170
michael@amarulasolutions.com
__________________________________

Amarula Solutions BV
Joop Geesinkweg 125, 1114 AB, Amsterdam, NL
T. +31 (0)85 111 9172
info@amarulasolutions.com
www.amarulasolutions.com

  reply	other threads:[~2021-10-27 17:25 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-27 14:01 [PATCH V2] Add GetKnownServices api to connaman Michael Trimarchi
2021-10-27 17:25 ` Michael Nazzareno Trimarchi [this message]
2021-10-28  6:31   ` Daniel Wagner
2023-08-18  6:38     ` Michael Nazzareno Trimarchi
2021-10-28  6:16 ` Daniel Wagner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAOf5uwmcmkUNO0P3mZOC94bWRpodqLeJ4kmBTSu2N0j9xw_WQQ@mail.gmail.com \
    --to=michael@amarulasolutions.com \
    --cc=Jan.Ryll@bshg.com \
    --cc=Simon.Holesch@bshg.com \
    --cc=connman@lists.linux.dev \
    --cc=wagi@monom.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).