Example #1
0
static osync_bool empty(Command *cmd, OSyncError **error)
{
	int i;
	GList *c;
	//const char *objtype = cmd->arg;
	
	/* Perform slowync - if objtype is set for this objtype, otherwise slowsync for ALL */
	if (!get_changes(cmd, SYNCTYPE_FORCE_SLOWSYNC, error))
		goto error;


	for (i=0, c = changesList; c; c = c->next, i++) {
		OSyncChange *change = c->data;
		osync_change_set_changetype(change, OSYNC_CHANGE_TYPE_DELETED);

		if (!commit(cmd, change, error))
			goto error;

	}

	return TRUE;

 error:
	return FALSE;
}
Example #2
0
static gboolean
send_package_action (const gchar *macaroon,
                     gchar **discharges,
                     const gchar *name,
                     const gchar *action,
                     GsSnapdProgressCallback callback,
                     gpointer user_data,
                     GCancellable *cancellable,
                     GError **error)
{
    g_autofree gchar *content = NULL, *path = NULL;
    guint status_code;
    g_autofree gchar *reason_phrase = NULL;
    g_autofree gchar *response_type = NULL;
    g_autofree gchar *response = NULL;
    g_autofree gchar *status = NULL;
    g_autoptr(JsonParser) parser = NULL;
    JsonObject *root, *result;
    const gchar *type;

    content = g_strdup_printf ("{\"action\": \"%s\"}", action);
    path = g_strdup_printf ("/v2/snaps/%s", name);
    if (!send_request ("POST", path, content,
                       macaroon, discharges,
                       &status_code, &reason_phrase,
                       &response_type, &response, NULL,
                       cancellable, error))
        return FALSE;

    if (status_code == SOUP_STATUS_UNAUTHORIZED) {
        g_set_error_literal (error,
                             GS_PLUGIN_ERROR,
                             GS_PLUGIN_ERROR_AUTH_REQUIRED,
                             "Requires authentication with @snapd");
        return FALSE;
    }

    if (status_code != SOUP_STATUS_ACCEPTED) {
        g_set_error (error,
                     GS_PLUGIN_ERROR,
                     GS_PLUGIN_ERROR_FAILED,
                     "snapd returned status code %u: %s",
                     status_code, reason_phrase);
        return FALSE;
    }

    parser = parse_result (response, response_type, error);
    if (parser == NULL)
        return FALSE;

    root = json_node_get_object (json_parser_get_root (parser));
    type = json_object_get_string_member (root, "type");

    if (g_strcmp0 (type, "async") == 0) {
        const gchar *change_id;

        change_id = json_object_get_string_member (root, "change");

        while (TRUE) {
            /* Wait for a little bit before polling */
            g_usleep (100 * 1000);

            result = get_changes (macaroon, discharges, change_id, cancellable, error);
            if (result == NULL)
                return FALSE;

            status = g_strdup (json_object_get_string_member (result, "status"));

            if (g_strcmp0 (status, "Done") == 0)
                break;

            callback (result, user_data);
        }
    }

    if (g_strcmp0 (status, "Done") != 0) {
        g_set_error (error,
                     GS_PLUGIN_ERROR,
                     GS_PLUGIN_ERROR_NOT_SUPPORTED,
                     "snapd operation finished with status %s", status);
        return FALSE;
    }

    return TRUE;
}
Example #3
0
/*
 * Sync Flow
 */
static osync_bool run_command(Command *cmd, void **plugin_data, OSyncError **error) {

	assert(cmd);

	if (cmd->cmd != CMD_INITIALIZE && *plugin_data == NULL) {
		fprintf(stderr, "WARNING: Got Plugin initialized? plugin_data is NULL.\n");
		goto error;
	}


	switch (cmd->cmd) {
	case CMD_EMPTY:
		if (!empty(cmd, error))
			goto error;
		break;
	case CMD_INITIALIZE:
		if (!(*plugin_data = plugin_initialize(error)))
			goto error;
		break;
	case CMD_FINALIZE:
		finalize_plugin(plugin_data);
		break;
	case CMD_CONNECT:
		if (!connect_plugin(cmd, error))
			goto error;
		break;
	case CMD_DISCONNECT:
		if (!disconnect(cmd, error))
			goto error;
		break;
	case CMD_SLOWSYNC:
		if (!get_changes(cmd, SYNCTYPE_FORCE_SLOWSYNC, error))
			goto error;
		break;
	case CMD_FASTSYNC:
		if (!get_changes(cmd, SYNCTYPE_FORCE_FASTSYNC, error))
			goto error;
		break;
	case CMD_SYNC:
		if (!get_changes(cmd, SYNCTYPE_NORMAL, error))
			goto error;
		break;
	case CMD_COMMIT:
		fprintf(stderr, "COMMIT not yet implemented\n");
		break;
	case CMD_COMMITTEDALL:
		if (!committedall(cmd, error))
			goto error;
		break;
	case CMD_READ:
		fprintf(stderr, "READ not yet implemented\n");
		break;
	case CMD_WRITE:
		fprintf(stderr, "WRITE not yet implemented\n");
		break;
	case CMD_SYNCDONE:
		if (!syncdone(cmd, error))
			goto error;
		break;
	case CMD_DISCOVER:
		fprintf(stderr, "DISCOVER not yet implemented\n");
		break;
	}


	printf("%s: %u - sink: %p\n", __func__, cmd->cmd, cmd->sink);
	switch (cmd->cmd) {
	case CMD_INITIALIZE:
	case CMD_FINALIZE:
	case CMD_DISCOVER:
		break;

	case CMD_EMPTY:
	case CMD_CONNECT:
	case CMD_DISCONNECT:
	case CMD_SLOWSYNC:
	case CMD_FASTSYNC:
	case CMD_SYNC:
	case CMD_COMMIT:
	case CMD_COMMITTEDALL:
	case CMD_READ:
	case CMD_WRITE:
	case CMD_SYNCDONE:
		printf("waiting .....\n");
		if (!cmd->done)
			g_cond_wait(cmd->cond, cmd->mutex);
		printf("DONE\n");
		break;
	}

	return TRUE;

 error:
	return FALSE;
}