From 024bfec03ca1cba93f2dfe57982be4908df1e52f Mon Sep 17 00:00:00 2001 From: sr Date: Wed, 19 Sep 2012 21:22:13 +0200 Subject: [SERVER] IPC: Add calls to add/remove trusted namespaces and servers --- src/server/ipc.c | 62 +++++++++++++++++++++++++++++++++++++++++++-------- src/server/ipc.h | 12 +++++----- src/server/job.c | 3 +-- src/server/saveload.c | 34 ++++++++++++++++++++++++++++ src/server/saveload.h | 1 + 5 files changed, 96 insertions(+), 16 deletions(-) diff --git a/src/server/ipc.c b/src/server/ipc.c index b455c44..76c3ff5 100644 --- a/src/server/ipc.c +++ b/src/server/ipc.c @@ -336,6 +336,8 @@ static int ipc_receive(int client_sock) } if (!recv_data(client_sock, payload, header.size)) return 0; + + docRequest = xmlReadMemory(payload, header.size, "noname.xml", NULL, 0); } switch (cmd) @@ -495,15 +497,6 @@ get_info_reply_cleanup: case IPC_ADDIMG: case IPC_DELIMG: - if (header.size == 0) - { - header.size = htonl(0); - header.error = htonl(ERROR_MISSING_ARGUMENT); - return_value = send_data(client_sock, &header, sizeof(header)); - break; - } - docRequest = xmlReadMemory(payload, header.size, "noname.xml", NULL, 0); - if (docRequest) { if (!is_password_correct(docRequest)) @@ -551,6 +544,57 @@ get_info_reply_cleanup: return_value = send_data(client_sock, &header, sizeof(header)); break; + case IPC_ADDNS: + case IPC_DELNS: + if (docRequest) + { + if (!is_password_correct(docRequest)) + { + header.error = htonl(ERROR_WRONG_PASSWORD); + header.size = htonl(0); + return_value = send_data(client_sock, &header, sizeof(header)); + break; + } + + xmlNodePtr cur = NULL; + + FOR_EACH_NODE(docRequest, "/data/namespaces/namespace", cur) + { + if (cur->type != XML_ELEMENT_NODE) + continue; + NEW_POINTERLIST; + char *host = (char *)XML_GETPROP(cur, "server"); + char *ns = (char *)XML_GETPROP(cur, "name"); + char *flags = (char *)XML_GETPROP(cur, "flags"); + char *comment = (char *)XML_GETPROP(cur, "comment"); + pthread_spin_lock(&_spinlock); + if (host && ns) + { + if (cmd == IPC_ADDNS) + { + dnbd3_trusted_server_t *server = dnbd3_get_trusted_server(host, TRUE, comment); + if (server) + dnbd3_add_trusted_namespace(server, ns, flags); + } + else + { + dnbd3_trusted_server_t *server = dnbd3_get_trusted_server(host, FALSE, comment); + if (server) + dnbd3_del_trusted_namespace(server, ns); + } + } + pthread_spin_unlock(&_spinlock); + FREE_POINTERLIST; + } END_FOR_EACH; + + } + else + header.error = htonl(ERROR_INVALID_XML); + + header.size = htonl(0); + return_value = send_data(client_sock, &header, sizeof(header)); + break; + default: memlogf("[ERROR] Unknown IPC command: %u", (unsigned int)header.cmd); header.size = htonl(0); diff --git a/src/server/ipc.h b/src/server/ipc.h index fb29efc..87722d8 100644 --- a/src/server/ipc.h +++ b/src/server/ipc.h @@ -23,11 +23,13 @@ #include -#define IPC_EXIT 0 -#define IPC_RELOAD 1 -#define IPC_INFO 2 -#define IPC_ADDIMG 3 -#define IPC_DELIMG 4 +#define IPC_EXIT 0 +#define IPC_RELOAD 1 +#define IPC_INFO 2 +#define IPC_ADDIMG 3 +#define IPC_DELIMG 4 +#define IPC_ADDNS 5 +#define IPC_DELNS 6 void *dnbd3_ipc_mainloop(); diff --git a/src/server/job.c b/src/server/job.c index fc3211a..7612573 100644 --- a/src/server/job.c +++ b/src/server/job.c @@ -521,6 +521,7 @@ static void query_servers() if (trust == NULL) { // Namespace of image is not trusted pthread_spin_unlock(&_spinlock); + printf("[DEBUG] No NS match: '%s'\n", xmlbuffer); goto free_current_image; } dnbd3_image_t *local_image = dnbd3_get_image(xmlbuffer, rid, FALSE); @@ -528,7 +529,6 @@ static void query_servers() { pthread_spin_unlock(&_spinlock); // Image is NEW, add it! - // TODO: Check if replication is requested for this namespace dnbd3_image_t newimage; char cachefile[90]; memset(&newimage, 0, sizeof(newimage)); @@ -549,7 +549,6 @@ static void query_servers() else if (local_image != NULL) { // Image is already KNOWN, add alt server if appropriate - // TODO: Check if requested for namespace if (size != local_image->filesize) printf("[DEBUG] Ignoring remote image '%s' because it has a different size from the local version!\n", local_image->config_group); else diff --git a/src/server/saveload.c b/src/server/saveload.c index 7dc5455..18dbae9 100644 --- a/src/server/saveload.c +++ b/src/server/saveload.c @@ -144,6 +144,15 @@ void dnbd3_load_config() int dnbd3_add_image(dnbd3_image_t *image) { + if (image->file) + { + if (strncmp(image->file, "/dev/dnbd", 9) == 0) + return ERROR_IMAGE_NOT_FOUND; + int fh = open(image->file, O_RDONLY); + if (fh < 0) + return ERROR_IMAGE_NOT_FOUND; + close(fh); + } // Lock here to prevent concurrent add calls to mess rids up. Cannot happen currently // as IPC clients are not threaded and they're the only place where this is called, // but better be safe for the future... @@ -678,6 +687,31 @@ int dnbd3_add_trusted_namespace(dnbd3_trusted_server_t *server, char *namespace, return TRUE; } +/** + * Remove trusted namespace from given trusted server. + * !! Lock before calling this function !! + */ +int dnbd3_del_trusted_namespace(dnbd3_trusted_server_t *server, char *namespace) +{ + int nslen = strlen(namespace) + 1; + char nslow[nslen]; + memcpy(nslow, namespace, nslen); + remove_trailing_slash(nslow); + strtolower(nslow); + GSList *iterator; + for (iterator = server->namespaces; iterator; iterator = iterator->next) + { + dnbd3_namespace_t *cmp = iterator->data; + if (strcmp(nslow, cmp->name) == 0) + { + free(cmp->name); + server->namespaces = g_slist_remove(server->namespaces, cmp); + return TRUE; + } + } + return FALSE; +} + /** * Gives the closest match of a namespace rule that can be applied to * the given namespace diff --git a/src/server/saveload.h b/src/server/saveload.h index 7436cef..e45a41a 100644 --- a/src/server/saveload.h +++ b/src/server/saveload.h @@ -53,6 +53,7 @@ dnbd3_image_t *dnbd3_get_image(char *name, int rid, const char do_lock); dnbd3_trusted_server_t *dnbd3_get_trusted_server(char *address, char create_if_not_found, char *comment); int dnbd3_add_trusted_namespace(dnbd3_trusted_server_t *server, char *namespace, char *flags); +int dnbd3_del_trusted_namespace(dnbd3_trusted_server_t *server, char *namespace); dnbd3_namespace_t *dnbd3_get_trust_level(dnbd3_host_t *host, char *namespace); void dnbd3_handle_sigpipe(int signum); -- cgit v1.2.3-55-g7522