static gboolean
handle_remove_devices (CockpitStorageMDRaid *object,
                       GDBusMethodInvocation *invocation,
                       const gchar *const *arg_devices)
{
    StorageMDRaid *mdraid = STORAGE_MDRAID(object);
    StorageProvider *provider = storage_object_get_provider (mdraid->object);
    Daemon *daemon = storage_provider_get_daemon (provider);
    GDBusObjectManagerServer *object_manager_server = daemon_get_object_manager (daemon);
    GDBusObjectManager *object_manager = G_DBUS_OBJECT_MANAGER (object_manager_server);
    GError *error = NULL;

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

    int n_devices = 0;
    for (int i = 0; arg_devices[i]; i++)
        n_devices += 1;

    const gchar *udisks_devices[n_devices + 1];

    for (int i = 0; arg_devices[i]; i++)
    {
        StorageObject *stobj =
            STORAGE_OBJECT(g_dbus_object_manager_get_object (object_manager, arg_devices[i]));
        UDisksBlock *block = storage_object_get_udisks_block (stobj);
        if (block)
            udisks_devices[i] = g_dbus_proxy_get_object_path (G_DBUS_PROXY(block));
        else
            udisks_devices[i] = "XXX";
    }
    udisks_devices[n_devices] = NULL;

    for (int i = 0; udisks_devices[i]; i++)
    {
        GVariantBuilder options;
        g_variant_builder_init (&options, G_VARIANT_TYPE("a{sv}"));
        g_variant_builder_add (&options, "{sv}", "wipe", g_variant_new_boolean (TRUE));

        if (!udisks_mdraid_call_remove_device_sync (mdraid->udisks_mdraid,
                udisks_devices[i],
                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);
            return TRUE;
        }
    }

    cockpit_storage_mdraid_complete_remove_devices (object, invocation);
    return TRUE;
}
Beispiel #2
0
static gboolean
handle_empty_device (CockpitStorageVolumeGroup *object,
                     GDBusMethodInvocation *invocation,
                     const gchar *arg_objpath)
{
  StorageVolumeGroup *group = STORAGE_VOLUME_GROUP(object);
  GError *error = NULL;
  const gchar *block_path = "/";

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

  StorageProvider *provider = storage_object_get_provider (group->object);
  Daemon *daemon = storage_provider_get_daemon (provider);
  GDBusObjectManagerServer *object_manager_server = daemon_get_object_manager (daemon);
  GDBusObjectManager *object_manager = G_DBUS_OBJECT_MANAGER (object_manager_server);

  StorageObject *block_object =
    STORAGE_OBJECT (g_dbus_object_manager_get_object (object_manager, arg_objpath));
  UDisksBlock *udisks_block = storage_object_get_udisks_block (block_object);

  if (udisks_block)
    block_path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (udisks_block));

  g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (group->lvm_volume_group),
                                    G_MAXINT);

  if (!lvm_volume_group_call_empty_device_sync (group->lvm_volume_group,
                                                block_path,
                                                null_asv (),
                                                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_volume_group_complete_empty_device (object, invocation);

  g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (group->lvm_volume_group),
                                    -1);

  return TRUE;
}
Beispiel #3
0
static void
storage_block_constructed (GObject *object)
{
  StorageBlock *block = STORAGE_BLOCK (object);

  block->udisks_block = g_object_ref (storage_object_get_udisks_block (block->object));
  g_signal_connect (block->udisks_block,
                    "notify",
                    G_CALLBACK (on_udisks_block_notify),
                    block);

  storage_block_update (block);

  if (G_OBJECT_CLASS (storage_block_parent_class)->constructed != NULL)
    G_OBJECT_CLASS (storage_block_parent_class)->constructed (object);
}
Beispiel #4
0
static gboolean
handle_volume_group_create (CockpitStorageManager *object,
                            GDBusMethodInvocation *invocation,
                            const gchar *arg_name,
                            const gchar *const *arg_blocks)
{
  StorageManager *storage_manager = STORAGE_MANAGER(object);
  GDBusObjectManagerServer *object_manager_server = daemon_get_object_manager (storage_manager->daemon);
  GDBusObjectManager *object_manager = G_DBUS_OBJECT_MANAGER (object_manager_server);

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

  GError *error = NULL;

  int n_blocks = 0;
  for (int i = 0; arg_blocks[i]; i++)
    n_blocks += 1;

  const gchar *udisks_blocks[n_blocks + 1];

  for (int i = 0; arg_blocks[i]; i++)
    {
      StorageObject *stobj =
        STORAGE_OBJECT (g_dbus_object_manager_get_object (object_manager, arg_blocks[i]));
      UDisksBlock *block = storage_object_get_udisks_block (stobj);
      if (block)
        udisks_blocks[i] = g_dbus_proxy_get_object_path (G_DBUS_PROXY(block));
      else
        udisks_blocks[i] = "XXX";
    }

  udisks_blocks[n_blocks] = NULL;

  if (storage_manager->lvm_manager == NULL)
    {
      g_dbus_method_invocation_return_error (invocation,
                                             COCKPIT_ERROR,
                                             COCKPIT_ERROR_FAILED,
                                             "storaged daemon is not running");
      return TRUE;
    }

  if (!lvm_manager_call_volume_group_create_sync (storage_manager->lvm_manager,
                                                  arg_name,
                                                  udisks_blocks,
                                                  null_asv (),
                                                  NULL,
                                                  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);
      return TRUE;
    }

  cockpit_storage_manager_complete_volume_group_create (object, invocation);
  return TRUE;
}
Beispiel #5
0
static gboolean
handle_mdraid_create (CockpitStorageManager *object,
                      GDBusMethodInvocation *invocation,
                      const gchar *const *arg_blocks,
                      const gchar *arg_level,
                      const gchar *arg_name,
                      guint64 arg_chunk)
{
  StorageManager *storage_manager = STORAGE_MANAGER(object);
  GDBusObjectManagerServer *object_manager_server = daemon_get_object_manager (storage_manager->daemon);
  GDBusObjectManager *object_manager = G_DBUS_OBJECT_MANAGER (object_manager_server);

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

  GError *error = NULL;

  int n_blocks = 0;
  for (int i = 0; arg_blocks[i]; i++)
    n_blocks += 1;

  const gchar *udisks_blocks[n_blocks + 1];

  for (int i = 0; arg_blocks[i]; i++)
    {
      StorageObject *stobj =
        STORAGE_OBJECT (g_dbus_object_manager_get_object (object_manager, arg_blocks[i]));
      UDisksBlock *block = storage_object_get_udisks_block (stobj);
      if (block)
        udisks_blocks[i] = g_dbus_proxy_get_object_path (G_DBUS_PROXY(block));
      else
        udisks_blocks[i] = "XXX";
    }

  udisks_blocks[n_blocks] = NULL;

  UDisksManager *manager = udisks_client_get_manager (storage_manager->udisks);
  if (manager == NULL)
    {
      g_dbus_method_invocation_return_error (invocation,
                                             COCKPIT_ERROR,
                                             COCKPIT_ERROR_FAILED,
                                             "UDisks daemon is not running");
      return TRUE;
    }

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

  if (!udisks_manager_call_mdraid_create_sync (manager,
                                               udisks_blocks,
                                               arg_level,
                                               arg_name,
                                               arg_chunk,
                                               null_asv (),
                                               NULL,
                                               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);
      return TRUE;
    }

  cockpit_storage_manager_complete_mdraid_create (object, invocation);
  return TRUE;
}