示例#1
0
static gboolean
handle_stop (CockpitStorageMDRaid *object,
             GDBusMethodInvocation *invocation)
{
    StorageMDRaid *mdraid = STORAGE_MDRAID(object);
    GError *error = NULL;

    if (!auth_check_sender_role (invocation, COCKPIT_ROLE_STORAGE_ADMIN))
        return TRUE;

    GVariantBuilder options;
    g_variant_builder_init (&options, G_VARIANT_TYPE("a{sv}"));

    if (!udisks_mdraid_call_stop_sync (mdraid->udisks_mdraid,
                                       g_variant_builder_end (&options),
                                       NULL,
                                       &error))
    {
        g_dbus_error_strip_remote_error (error);
        g_dbus_method_invocation_return_error (invocation,
                                               COCKPIT_ERROR,
                                               COCKPIT_ERROR_FAILED,
                                               "%s", error->message);
        g_error_free (error);
    }
    else
        cockpit_storage_mdraid_complete_stop (object, invocation);

    return TRUE;
}
示例#2
0
static gboolean
handle_delete (CockpitStorageMDRaid *object,
               GDBusMethodInvocation *invocation)
{
  StorageMDRaid *mdraid = STORAGE_MDRAID(object);
  StorageProvider *provider = storage_object_get_provider (mdraid->object);
  UDisksClient *udisks_client = storage_provider_get_udisks_client (provider);
  gs_unref_object UDisksBlock *block = NULL;
  GList *members = NULL;
  GError *error = NULL;

  /* Delete is Stop followed by wiping of all member devices.
   */

  block = udisks_client_get_block_for_mdraid (udisks_client, mdraid->udisks_mdraid);
  if (block)
    {
      if (!storage_cleanup_block (provider, block, &error))
        goto out;
    }

  GVariantBuilder options;
  g_variant_builder_init (&options, G_VARIANT_TYPE("a{sv}"));

  if (!udisks_mdraid_call_stop_sync (mdraid->udisks_mdraid,
                                     g_variant_builder_end (&options),
                                     NULL,
                                     &error))
    goto out;

  members = udisks_client_get_members_for_mdraid (udisks_client,
                                                  mdraid->udisks_mdraid);
  for (GList *m = members; m; m = m->next)
    {
      UDisksBlock *block = m->data;
      GVariantBuilder options;
      g_variant_builder_init (&options, G_VARIANT_TYPE("a{sv}"));
      udisks_block_call_format_sync (block,
                                     "empty",
                                     g_variant_builder_end (&options),
                                     NULL,
                                     error ? NULL : &error);
    }

out:
  if (error)
    {
      g_dbus_error_strip_remote_error (error);
      g_dbus_method_invocation_return_error (invocation,
                                             COCKPIT_ERROR,
                                             COCKPIT_ERROR_FAILED,
                                             "%s", error->message);
    }
  else
    cockpit_storage_mdraid_complete_stop (object, invocation);

  g_list_free_full (members, g_object_unref);
  g_clear_error (&error);
  return TRUE;
}