diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/db/cdb.c | 28 | ||||
-rw-r--r-- | src/analysis/db/client.c | 153 | ||||
-rw-r--r-- | src/analysis/db/client.h | 6 | ||||
-rw-r--r-- | src/analysis/db/misc/snapshot.c | 52 | ||||
-rw-r--r-- | src/analysis/db/misc/snapshot.h | 6 | ||||
-rw-r--r-- | src/analysis/db/protocol.h | 59 | ||||
-rw-r--r-- | src/analysis/db/snapshot.c | 135 | ||||
-rw-r--r-- | src/analysis/db/snapshot.h | 6 |
8 files changed, 416 insertions, 29 deletions
diff --git a/src/analysis/db/cdb.c b/src/analysis/db/cdb.c index d569719..125f69d 100644 --- a/src/analysis/db/cdb.c +++ b/src/analysis/db/cdb.c @@ -1007,6 +1007,8 @@ static void *g_cdb_archive_process(GCdbArchive *archive) case DBC_GET_SNAPSHOTS: + force_snapshots_update: + init_packed_buffer(&out_pbuf); status = extend_packed_buffer(&out_pbuf, (uint32_t []) { DBC_SNAPSHOTS_UPDATED }, @@ -1060,6 +1062,32 @@ static void *g_cdb_archive_process(GCdbArchive *archive) case DBC_SET_CUR_SNAPSHOT: + + + break; + + case DBC_SET_SNAPSHOT_NAME: + + error = g_db_snapshot_set_name(archive->snapshot, &in_pbuf); + + if (error == DBE_NONE) + goto force_snapshots_update; + + else if (error == DBE_BAD_EXCHANGE) + goto gcap_bad_exchange; + + break; + + case DBC_SET_SNAPSHOT_DESC: + + error = g_db_snapshot_set_desc(archive->snapshot, &in_pbuf); + + if (error == DBE_NONE) + goto force_snapshots_update; + + else if (error == DBE_BAD_EXCHANGE) + goto gcap_bad_exchange; + break; default: diff --git a/src/analysis/db/client.c b/src/analysis/db/client.c index 15ec27f..9558f85 100644 --- a/src/analysis/db/client.c +++ b/src/analysis/db/client.c @@ -92,6 +92,11 @@ struct _GHubClientClass { GObjectClass parent; /* A laisser en premier */ + /* Signaux */ + + void (* snapshots_updated) (GHubClient *); + void (* snapshot_changed) (GHubClient *); + }; @@ -152,6 +157,22 @@ static void g_hub_client_class_init(GHubClientClass *klass) object->dispose = (GObjectFinalizeFunc/* ! */)g_hub_client_dispose; object->finalize = (GObjectFinalizeFunc)g_hub_client_finalize; + g_signal_new("snapshots-updated", + G_TYPE_HUB_CLIENT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GHubClientClass, snapshots_updated), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + g_signal_new("snapshot-changed", + G_TYPE_HUB_CLIENT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GHubClientClass, snapshot_changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + } @@ -188,6 +209,7 @@ static void g_hub_client_init(GHubClient *client) client->snap_count = 0; g_mutex_init(&client->snap_lock); + setup_empty_snapshot_id(&client->current); client->has_current = false; g_mutex_init(&client->cur_lock); @@ -857,6 +879,12 @@ static void *g_hub_client_update(GHubClient *client) client->can_get_updates = (tmp8 == 0x1); break; + case DBC_GET_SNAPSHOTS: + log_variadic_message(LMT_INFO, + _("This command is not available on this side: 0x%08x"), command); + goto gdcu_bad_exchange; + break; + case DBC_SNAPSHOTS_UPDATED: status = g_hub_client_update_snapshots(client, &in_pbuf); @@ -878,6 +906,8 @@ static void *g_hub_client_update(GHubClient *client) break; case DBC_SET_CUR_SNAPSHOT: + case DBC_SET_SNAPSHOT_NAME: + case DBC_SET_SNAPSHOT_DESC: log_variadic_message(LMT_INFO, _("This command is not available on this side: 0x%08x"), command); goto gdcu_bad_exchange; @@ -987,6 +1017,9 @@ static bool g_hub_client_update_snapshots(GHubClient *client, packed_buffer *pbu g_mutex_unlock(&client->snap_lock); + if (result) + g_signal_emit_by_name(client, "snapshots-updated"); + return result; } @@ -1023,6 +1056,8 @@ static bool g_hub_client_update_current_snapshot(GHubClient *client, packed_buff g_mutex_unlock(&client->cur_lock); + g_signal_emit_by_name(client, "snapshot-changed"); + } return result; @@ -1416,3 +1451,121 @@ bool g_hub_client_set_current_snapshot(GHubClient *client, const snapshot_id_t * return result; } + + +/****************************************************************************** +* * +* Paramètres : client = client pour les accès distants à manipuler. * +* id = identifiant d'instantané à traiter. * +* name = désignation humaine pour l'instantané. * +* * +* Description : Définit la désignation d'un instantané donné. * +* * +* Retour : true si la commande a bien été envoyée, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_hub_client_set_snapshot_name(GHubClient *client, const snapshot_id_t *id, const char *name) +{ + bool result; /* Bilan partiel à remonter */ + packed_buffer out_pbuf; /* Tampon d'émission */ + SSL *tls_fd; /* Canal de communication SSL */ + rle_string string; /* Chaîne à transmettre */ + + init_packed_buffer(&out_pbuf); + + tls_fd = g_hub_client_get_ssl_fd(client); + + if (tls_fd == NULL) + result = false; + + else + { + result = extend_packed_buffer(&out_pbuf, (uint32_t []) { DBC_SET_SNAPSHOT_NAME }, sizeof(uint32_t), true); + + if (result) + result = pack_snapshot_id(id, &out_pbuf); + + if (result) + { + init_static_rle_string(&string, name); + + result = pack_rle_string(&string, &out_pbuf); + + exit_rle_string(&string); + + } + + if (result) + result = ssl_send_packed_buffer(&out_pbuf, tls_fd); + + g_hub_client_put_ssl_fd(client, tls_fd); + + } + + exit_packed_buffer(&out_pbuf); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : client = client pour les accès distants à manipuler. * +* id = identifiant d'instantané à traiter. * +* desc = description humaine pour l'instantané. * +* * +* Description : Définit la description d'un instantané donné. * +* * +* Retour : true si la commande a bien été envoyée, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_hub_client_set_snapshot_desc(GHubClient *client, const snapshot_id_t *id, const char *desc) +{ + bool result; /* Bilan partiel à remonter */ + packed_buffer out_pbuf; /* Tampon d'émission */ + SSL *tls_fd; /* Canal de communication SSL */ + rle_string string; /* Chaîne à transmettre */ + + init_packed_buffer(&out_pbuf); + + tls_fd = g_hub_client_get_ssl_fd(client); + + if (tls_fd == NULL) + result = false; + + else + { + result = extend_packed_buffer(&out_pbuf, (uint32_t []) { DBC_SET_SNAPSHOT_DESC }, sizeof(uint32_t), true); + + if (result) + result = pack_snapshot_id(id, &out_pbuf); + + if (result) + { + init_static_rle_string(&string, desc); + + result = pack_rle_string(&string, &out_pbuf); + + exit_rle_string(&string); + + } + + if (result) + result = ssl_send_packed_buffer(&out_pbuf, tls_fd); + + g_hub_client_put_ssl_fd(client, tls_fd); + + } + + exit_packed_buffer(&out_pbuf); + + return result; + +} diff --git a/src/analysis/db/client.h b/src/analysis/db/client.h index 039631e..5ad4ed0 100644 --- a/src/analysis/db/client.h +++ b/src/analysis/db/client.h @@ -83,6 +83,12 @@ bool g_hub_client_get_current_snapshot(GHubClient *, snapshot_id_t *); /* Définit l'identifiant de l'instantané courant. */ bool g_hub_client_set_current_snapshot(GHubClient *, const snapshot_id_t *); +/* Définit la désignation d'un instantané donné. */ +bool g_hub_client_set_snapshot_name(GHubClient *, const snapshot_id_t *, const char *); + +/* Définit la description d'un instantané donné. */ +bool g_hub_client_set_snapshot_desc(GHubClient *, const snapshot_id_t *, const char *); + #endif /* _ANALYSIS_DB_CLIENT_H */ diff --git a/src/analysis/db/misc/snapshot.c b/src/analysis/db/misc/snapshot.c index c441ead..723ba75 100644 --- a/src/analysis/db/misc/snapshot.c +++ b/src/analysis/db/misc/snapshot.c @@ -509,3 +509,55 @@ bool pack_snapshot_info(const snapshot_info_t *info, packed_buffer *pbuf) return result; } + + +/****************************************************************************** +* * +* Paramètres : info = informations à mettre à jour. * +* name = nouvelle désignation à considérer. * +* * +* Description : Change la désignation dans les informations d'un instantané. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void set_snapshot_info_name(snapshot_info_t *info, const char *name) +{ + if (info->name == NULL) + free(info->name); + + if (name == NULL) + info->name = NULL; + else + info->name = strdup(name); + +} + + +/****************************************************************************** +* * +* Paramètres : info = informations à mettre à jour. * +* desc = nouvelle description à considérer. * +* * +* Description : Change la description dans les informations d'un instantané. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void set_snapshot_info_desc(snapshot_info_t *info, const char *desc) +{ + if (info->desc == NULL) + free(info->desc); + + if (desc == NULL) + info->desc = NULL; + else + info->desc = strdup(desc); + +} diff --git a/src/analysis/db/misc/snapshot.h b/src/analysis/db/misc/snapshot.h index 8f9a598..3f55b50 100644 --- a/src/analysis/db/misc/snapshot.h +++ b/src/analysis/db/misc/snapshot.h @@ -122,6 +122,12 @@ bool unpack_snapshot_info(snapshot_info_t *, packed_buffer *); /* Exporte la description d'un identifiant d'instantané. */ bool pack_snapshot_info(const snapshot_info_t *, packed_buffer *); +/* Change la désignation dans les informations d'un instantané. */ +void set_snapshot_info_name(snapshot_info_t *, const char *); + +/* Change la description dans les informations d'un instantané. */ +void set_snapshot_info_desc(snapshot_info_t *, const char *); + #endif /* _ANALYSIS_DB_MISC_SNAPSHOT_H */ diff --git a/src/analysis/db/protocol.h b/src/analysis/db/protocol.h index 273be8e..b57c25c 100644 --- a/src/analysis/db/protocol.h +++ b/src/analysis/db/protocol.h @@ -129,11 +129,6 @@ typedef enum _DBCommand * [ Ordre de sauvegarde : DBC_SAVE ] * [ Statut d'exécution ; cf. DBError ] * - * Les traitements se réalisent dans : - * - g_db_client_save() pour la partie client en émission ; - * - g_cdb_archive_process() pour la partie serveur ; - * - g_db_client_update() pour la partie client en réception. - * */ DBC_SAVE, /* Enregistrement de l'archive */ @@ -167,10 +162,6 @@ typedef enum _DBCommand * [ Notification de maj : DBC_SET_ALL_ITEMS ] * [ marqueur de fin : octet 0x0 ] * - * Les traitements se réalisent dans : - * - g_db_client_update() pour la partie client ; - * - g_cdb_archive_process() pour la partie serveur. - * */ DBC_GET_ALL_ITEMS, /* Mise à jour à la connexion */ @@ -191,10 +182,6 @@ typedef enum _DBCommand * [ Action : DBA_CHANGE_STATE ] * [ <élément dont le statut a évolué> ] * - * Les traitements se réalisent dans : - * - g_db_collection_disable_at() pour la partie serveur ; - * - g_db_collection_update_item_state() pour la partie client. - * */ DBC_SET_LAST_ACTIVE, /* Définition du dernier actif */ // REMME @@ -208,9 +195,6 @@ typedef enum _DBCommand * * [ Gestion d'instantané : DBC_GET_SNAPSHOTS ] * - * La définition d'un nouvel identifiant d'instantané courant se réalise dans : - * - g_hub_client_update() pour la partie client ; - * - g_cdb_archive_process() pour la partie serveur. */ DBC_GET_SNAPSHOTS, @@ -224,9 +208,6 @@ typedef enum _DBCommand * [ <liste de descriptions d'instantanés> ] * [ Marqueur de fin : SNAPSHOT_END_MARK ] * - * La définition d'un nouvel identifiant d'instantané courant se réalise dans : - * - g_cdb_archive_process() pour la partie serveur ; - * - g_hub_client_update() pour la partie client. */ DBC_SNAPSHOTS_UPDATED, /* Identification d'instantanés*/ @@ -238,9 +219,6 @@ typedef enum _DBCommand * * [ Gestion d'instantané : DBC_GET_CUR_SNAPSHOT ] * - * La définition d'un nouvel identifiant d'instantané courant se réalise dans : - * - g_hub_client_update() pour la partie client ; - * - g_cdb_archive_process() pour la partie serveur. */ DBC_GET_CUR_SNAPSHOT, /* Demande d'identification */ @@ -253,9 +231,6 @@ typedef enum _DBCommand * [ Gestion d'instantané : DBC_CUR_SNAPSHOT_UPDATED ] * [ <identifiant d'instantané> ] * - * La définition d'un nouvel identifiant d'instantané courant se réalise dans : - * - g_cdb_archive_process() pour la partie serveur ; - * - g_hub_client_update() pour la partie client. */ DBC_CUR_SNAPSHOT_UPDATED, /* Mise à jour de l'instantané */ @@ -268,13 +243,40 @@ typedef enum _DBCommand * [ Gestion d'instantané : DBC_SET_CUR_SNAPSHOT ] * [ <identifiant d'instantané> ] * - * La définition d'un nouvel identifiant d'instantané courant se réalise dans : - * - g_hub_client_set_current_snapshot() pour la partie client ; - * - */ DBC_SET_CUR_SNAPSHOT, /* Définition de l'instantané */ + /** + * Gestion de la commande 'DBC_SET_SNAPSHOT_NAME'. + * + * Le client connecté envoie un paquet de la forme suivante : + * + * [ Gestion d'instantané : DBC_SET_SNAPSHOT_NAME ] + * [ <identifiant d'instantané> ] + * [ <chaîne de caractères> ] + * + * Le serveur renvoie ensuite automatiquement un paquet + * de type 'DBC_SNAPSHOTS_UPDATED'. + */ + + DBC_SET_SNAPSHOT_NAME, /* Désignation de l'instantané */ + + /** + * Gestion de la commande 'DBC_SET_SNAPSHOT_DESC'. + * + * Le client connecté envoie un paquet de la forme suivante : + * + * [ Gestion d'instantané : DBC_SET_SNAPSHOT_DESC ] + * [ <identifiant d'instantané> ] + * [ <chaîne de caractères> ] + * + * Le serveur renvoie ensuite automatiquement un paquet + * de type 'DBC_SNAPSHOTS_UPDATED'. + */ + + DBC_SET_SNAPSHOT_DESC, /* Description de l'instantané */ + DBC_COUNT } DBCommand; @@ -300,6 +302,7 @@ typedef enum _DBError DBE_DB_LOADING_ERROR, /* Erreur pendant le chargement*/ DBE_XML_ERROR, /* Erreur lors d'une définition*/ + DBE_SNAPSHOT_NOT_FOUND, /* Instantané non trouvé */ DBE_COUNT diff --git a/src/analysis/db/snapshot.c b/src/analysis/db/snapshot.c index 79128ef..2cd50f6 100644 --- a/src/analysis/db/snapshot.c +++ b/src/analysis/db/snapshot.c @@ -942,6 +942,9 @@ bool g_db_snapshot_fill(GDbSnapshot *snap, struct archive *archive) node = find_snapshot_node(snap->nodes, &node_id); + if (node == NULL) + break; + if (!setup_snapshot_node_db_path(node, snap->tmpdir, snap->hash)) break; @@ -1059,7 +1062,7 @@ sqlite3 *g_db_snapshot_get_database(const GDbSnapshot *snap, const snapshot_id_t if (node == NULL) { - log_variadic_message(LMT_ERROR, _("Snapshot not found for id '%s'"), *id); + log_variadic_message(LMT_ERROR, _("Snapshot not found for id '%s'"), snapshot_id_as_string(id)); result = NULL; } @@ -1105,3 +1108,133 @@ bool g_db_snapshot_pack_all(const GDbSnapshot *snap, packed_buffer *pbuf) return result; } + + +/****************************************************************************** +* * +* Paramètres : snap = gestionnaire d'instantanés à consulter. * +* pbuf = paquet de données où venir puiser les infos. * +* * +* Description : Actualise la désignation d'un instantané donné. * +* * +* Retour : Bilan de l'opération sous forme de code d'erreur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +DBError g_db_snapshot_set_name(const GDbSnapshot *snap, packed_buffer *pbuf) +{ + DBError result; /* Conclusion à retourner */ + snapshot_id_t id; /* Identifiant d'instantané */ + bool status; /* Bilan d'une récupération */ + rle_string string; /* Chaîne à transmettre */ + snapshot_node_t *node; /* Instantané trouvé */ + + result = DBE_NONE; + + /* Lecture des arguments */ + + setup_empty_snapshot_id(&id); + + status = unpack_snapshot_id(&id, pbuf); + if (!status) + { + result = DBE_BAD_EXCHANGE; + goto bad_exchange; + } + + setup_empty_rle_string(&string); + + status = unpack_rle_string(&string, pbuf); + if (!status) + { + result = DBE_BAD_EXCHANGE; + goto bad_exchange; + } + + /* Traitement */ + + node = find_snapshot_node(snap->nodes, &id); + + if (node == NULL) + { + log_variadic_message(LMT_ERROR, _("Snapshot not found for id '%s'"), snapshot_id_as_string(&id)); + result = DBE_SNAPSHOT_NOT_FOUND; + } + + else + set_snapshot_info_name(&node->info, get_rle_string(&string)); + + exit_rle_string(&string); + + bad_exchange: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : snap = gestionnaire d'instantanés à consulter. * +* pbuf = paquet de données où venir puiser les infos. * +* * +* Description : Actualise la description d'un instantané donné. * +* * +* Retour : Bilan de l'opération sous forme de code d'erreur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +DBError g_db_snapshot_set_desc(const GDbSnapshot *snap, packed_buffer *pbuf) +{ + DBError result; /* Conclusion à retourner */ + snapshot_id_t id; /* Identifiant d'instantané */ + bool status; /* Bilan d'une récupération */ + rle_string string; /* Chaîne à transmettre */ + snapshot_node_t *node; /* Instantané trouvé */ + + result = DBE_NONE; + + /* Lecture des arguments */ + + setup_empty_snapshot_id(&id); + + status = unpack_snapshot_id(&id, pbuf); + if (!status) + { + result = DBE_BAD_EXCHANGE; + goto bad_exchange; + } + + setup_empty_rle_string(&string); + + status = unpack_rle_string(&string, pbuf); + if (!status) + { + result = DBE_BAD_EXCHANGE; + goto bad_exchange; + } + + /* Traitement */ + + node = find_snapshot_node(snap->nodes, &id); + + if (node == NULL) + { + log_variadic_message(LMT_ERROR, _("Snapshot not found for id '%s'"), snapshot_id_as_string(&id)); + result = DBE_SNAPSHOT_NOT_FOUND; + } + + else + set_snapshot_info_desc(&node->info, get_rle_string(&string)); + + exit_rle_string(&string); + + bad_exchange: + + return result; + +} diff --git a/src/analysis/db/snapshot.h b/src/analysis/db/snapshot.h index 543d184..457e8c2 100644 --- a/src/analysis/db/snapshot.h +++ b/src/analysis/db/snapshot.h @@ -77,6 +77,12 @@ sqlite3 *g_db_snapshot_get_database(const GDbSnapshot *, const snapshot_id_t *); /* Collecte les descriptions de l'ensemble des instantanés. */ bool g_db_snapshot_pack_all(const GDbSnapshot *, packed_buffer *); +/* Actualise la désignation d'un instantané donné. */ +DBError g_db_snapshot_set_name(const GDbSnapshot *, packed_buffer *); + +/* Actualise la description d'un instantané donné. */ +DBError g_db_snapshot_set_desc(const GDbSnapshot *, packed_buffer *); + #endif /* _ANALYSIS_DB_SNAPSHOT_H */ |