Example #1
0
static void
on_service_action_done (GObject *object,
                        GAsyncResult *res,
                        gpointer user_data)
{
  ServiceActionData *data = user_data;
  GError *error = NULL;

  gs_unref_variant GVariant *result = g_dbus_proxy_call_finish (G_DBUS_PROXY (object), res, &error);
  if (error)
    {
      end_invocation_take_gerror (data->invocation, error);
      g_free (data);
      return;
    }

  if (data->flags & FOR_FILES)
    {
      gboolean carries_install_info;
      gs_unref_variant GVariant *changes;
      if (data->flags & INSTALL_INFO)
        g_variant_get (result, "(b@a(sss))", &carries_install_info, &changes);
      else
        g_variant_get (result, "(@a(sss))", &changes);

      if ((data->flags & INSTALL_INFO) && !carries_install_info)
        {
          g_dbus_method_invocation_return_error (data->invocation,
                                                 COCKPIT_ERROR, COCKPIT_ERROR_FAILED,
                                                 "Service has not been designed to be enabled or disabled.");
          g_free (data);
          return;
        }

      g_dbus_proxy_call (data->services->systemd,
                         "Reload",
                         NULL,
                         G_DBUS_CALL_FLAGS_NONE,
                         G_MAXINT,
                         NULL,
                         on_reload_done,
                         data);
    }
  else
    {
      cockpit_services_complete_service_action (COCKPIT_SERVICES (data->services),
                                                data->invocation);
      g_free (data);
    }
}
Example #2
0
static gboolean
handle_service_action (CockpitServices *object,
                       GDBusMethodInvocation *invocation,
                       const gchar *arg_name,
                       const gchar *arg_action)
{
  GError *error;
  Services *services = SERVICES (object);
  const gchar *argv[6];
  int i;
  gint status;

  const gchar *method = arg_action;
  gboolean force = FALSE;

  if (g_str_has_prefix (arg_action, "force-"))
    {
      force = TRUE;
      method = arg_action + strlen ("force-");
    }

  i = 0;
  argv[i++] = "pkexec";
  argv[i++] = "systemctl";
  if (force)
    argv[i++] = "--force";
  argv[i++] = method;
  argv[i++] = arg_name;
  argv[i++] = NULL;

  error = NULL;
  if (g_spawn_sync (NULL, (gchar**)argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, &status, &error))
    g_spawn_check_exit_status (status, &error);

  if (error)
    end_invocation_take_gerror (invocation, error);
  else
    cockpit_services_complete_service_action (COCKPIT_SERVICES (services), invocation);

  return TRUE;
}
Example #3
0
static void
on_reload_done (GObject *object,
                GAsyncResult *res,
                gpointer user_data)
{
  ServiceActionData *data = user_data;
  GError *error = NULL;

  GVariant *result = g_dbus_proxy_call_finish (G_DBUS_PROXY (object), res, &error);
  if (error)
    {
      end_invocation_take_gerror (data->invocation, error);
      g_free (data);
      return;
    }

  g_variant_unref (result);
  cockpit_services_complete_service_action (COCKPIT_SERVICES (data->services),
                                            data->invocation);
  g_free (data);
}