summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsr2012-09-19 21:22:13 +0200
committersr2012-09-19 21:22:13 +0200
commit024bfec03ca1cba93f2dfe57982be4908df1e52f (patch)
tree937e3e5f4a978346ff2f46bd3fa3ed5c764eb690
parent[SERVER] Check trust settings before replicating image or adding alt server (diff)
downloaddnbd3-024bfec03ca1cba93f2dfe57982be4908df1e52f.tar.gz
dnbd3-024bfec03ca1cba93f2dfe57982be4908df1e52f.tar.xz
dnbd3-024bfec03ca1cba93f2dfe57982be4908df1e52f.zip
[SERVER] IPC: Add calls to add/remove trusted namespaces and servers
-rw-r--r--src/server/ipc.c62
-rw-r--r--src/server/ipc.h12
-rw-r--r--src/server/job.c3
-rw-r--r--src/server/saveload.c34
-rw-r--r--src/server/saveload.h1
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 <stdint.h>
-#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...
@@ -679,6 +688,31 @@ int dnbd3_add_trusted_namespace(dnbd3_trusted_server_t *server, char *namespace,
}
/**
+ * 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
* Returns NULL if none
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);