From cbc0ae46d80f74f2a6fab4e43d30ed1c60a38139 Mon Sep 17 00:00:00 2001 From: "Thomas B. Ruecker" Date: Fri, 26 Dec 2014 11:02:10 +0000 Subject: [PATCH 1/4] Favicon was missing from the Makefile --- web/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/web/Makefile.am b/web/Makefile.am index 3d6f3d4b..995b9356 100644 --- a/web/Makefile.am +++ b/web/Makefile.am @@ -4,6 +4,7 @@ AUTOMAKE_OPTIONS = foreign webdir = $(pkgdatadir)/web dist_web_DATA = status.xsl \ + favicon.ico \ icecast.png \ style.css \ auth.xsl \ From dfc30122ca496641783b091b4a6905e24dd6101d Mon Sep 17 00:00:00 2001 From: "Thomas B. Ruecker" Date: Fri, 26 Dec 2014 11:04:22 +0000 Subject: [PATCH 2/4] height-adjusted logo2 for NSIS installer --- win32/icecast2logo3.bmp | Bin 0 -> 30150 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 win32/icecast2logo3.bmp diff --git a/win32/icecast2logo3.bmp b/win32/icecast2logo3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cbd51c46853aa75418ffe04949111dc16b54072f GIT binary patch literal 30150 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 GH~$Bvi!^iq literal 0 HcmV?d00001 From b638d3c93943967de94b054b7cca86430227c6c8 Mon Sep 17 00:00:00 2001 From: Philipp Schafft Date: Fri, 26 Dec 2014 21:57:50 +0000 Subject: [PATCH 3/4] Fix: Added support to admin/ interface to list s This adds support to list global and per mount roles on stats.xsl. This isn't nicest formated but works. This also adds -like with s to root node. Closes: #2133 --- admin/manageauth.xsl | 7 ------- admin/stats.xsl | 36 +++++++++++++++++++++++++++++++++++ src/admin.c | 34 ++++++++++++++++++++------------- src/admin.h | 2 ++ src/stats.c | 45 ++++++++++++++++++++++---------------------- 5 files changed, 81 insertions(+), 43 deletions(-) diff --git a/admin/manageauth.xsl b/admin/manageauth.xsl index aff56f54..0732101b 100644 --- a/admin/manageauth.xsl +++ b/admin/manageauth.xsl @@ -34,13 +34,6 @@ - diff --git a/admin/stats.xsl b/admin/stats.xsl index fbd8c343..85556a88 100644 --- a/admin/stats.xsl +++ b/admin/stats.xsl @@ -38,6 +38,24 @@
+ + + +
+
@@ -89,6 +107,24 @@ + + + +
+
diff --git a/src/admin.c b/src/admin.c index 9ef7f0bb..9060d3c3 100644 --- a/src/admin.c +++ b/src/admin.c @@ -775,6 +775,26 @@ static void command_buildm3u(client_t *client, const char *mount) fserve_add_client (client, NULL); } +xmlNodePtr admin_add_role_to_authentication(auth_t *auth, xmlNodePtr parent) { + xmlNodePtr rolenode = xmlNewChild(parent, NULL, XMLSTR("role"), NULL); + char idbuf[32]; + + snprintf(idbuf, sizeof(idbuf), "%lu", auth->id); + xmlSetProp(rolenode, XMLSTR("id"), XMLSTR(idbuf)); + + if (auth->type) + xmlSetProp(rolenode, XMLSTR("type"), XMLSTR(auth->type)); + if (auth->role) + xmlSetProp(rolenode, XMLSTR("name"), XMLSTR(auth->role)); + if (auth->management_url) + xmlSetProp(rolenode, XMLSTR("management-url"), XMLSTR(auth->management_url)); + + xmlSetProp(rolenode, XMLSTR("can-adduser"), XMLSTR(auth->adduser ? "true" : "false")); + xmlSetProp(rolenode, XMLSTR("can-deleteuser"), XMLSTR(auth->deleteuser ? "true" : "false")); + xmlSetProp(rolenode, XMLSTR("can-listuser"), XMLSTR(auth->listuser ? "true" : "false")); + + return rolenode; +} static void command_manageauth(client_t *client, int response) { xmlDocPtr doc; @@ -789,7 +809,6 @@ static void command_manageauth(client_t *client, int response) { long unsigned int id; ice_config_t *config = config_get_config(); auth_t *auth; - char idbuf[32]; do { @@ -871,19 +890,8 @@ static void command_manageauth(client_t *client, int response) { doc = xmlNewDoc(XMLSTR("1.0")); node = xmlNewDocNode(doc, NULL, XMLSTR("icestats"), NULL); - rolenode = xmlNewChild(node, NULL, XMLSTR("role"), NULL); - snprintf(idbuf, sizeof(idbuf), "%lu", auth->id); - xmlSetProp(rolenode, XMLSTR("id"), XMLSTR(idbuf)); - - if (auth->type) - xmlSetProp(rolenode, XMLSTR("type"), XMLSTR(auth->type)); - if (auth->role) - xmlSetProp(rolenode, XMLSTR("name"), XMLSTR(auth->role)); - - xmlSetProp(rolenode, XMLSTR("can-adduser"), XMLSTR(auth->adduser ? "true" : "false")); - xmlSetProp(rolenode, XMLSTR("can-deleteuser"), XMLSTR(auth->deleteuser ? "true" : "false")); - xmlSetProp(rolenode, XMLSTR("can-listuser"), XMLSTR(auth->listuser ? "true" : "false")); + rolenode = admin_add_role_to_authentication(auth, node); if (message) { msgnode = xmlNewChild(node, NULL, XMLSTR("iceresponse"), NULL); diff --git a/src/admin.h b/src/admin.h index ef9d1d24..17392f18 100644 --- a/src/admin.h +++ b/src/admin.h @@ -19,6 +19,7 @@ #include "refbuf.h" #include "client.h" #include "source.h" +#include "auth.h" /* types */ #define ADMINTYPE_ERROR (-1) @@ -40,6 +41,7 @@ void admin_send_response(xmlDocPtr doc, client_t *client, int response, const char *xslt_template); void admin_add_listeners_to_mount(source_t *source, xmlNodePtr parent, operation_mode mode); +xmlNodePtr admin_add_role_to_authentication(auth_t *auth, xmlNodePtr parent); int admin_get_command(const char *command); int admin_get_command_type(int command); diff --git a/src/stats.c b/src/stats.c index 77aa99c3..a64c9609 100644 --- a/src/stats.c +++ b/src/stats.c @@ -815,16 +815,29 @@ static int _send_event_to_client(stats_event_t *event, client_t *client) return 0; } +static inline void __add_authstack (auth_stack_t *stack, xmlNodePtr parent) { + xmlNodePtr authentication; + authentication = xmlNewTextChild(parent, NULL, XMLSTR("authentication"), NULL); -static xmlNodePtr _dump_stats_to_doc (xmlNodePtr root, const char *show_mount, int hidden) -{ + auth_stack_addref(stack); + + while (stack) { + auth_t *auth = auth_stack_get(stack); + admin_add_role_to_authentication(auth, authentication); + auth_release(auth); + auth_stack_next(&stack); + } +} +static xmlNodePtr _dump_stats_to_doc (xmlNodePtr root, const char *show_mount, int hidden) { avl_node *avlnode; xmlNodePtr ret = NULL; + ice_config_t *config; thread_mutex_lock(&_stats_mutex); /* general stats first */ avlnode = avl_get_first(_stats.global_tree); - while (avlnode) + +while (avlnode) { stats_node_t *stat = avlnode->key; if (stat->hidden <= hidden) @@ -833,6 +846,10 @@ static xmlNodePtr _dump_stats_to_doc (xmlNodePtr root, const char *show_mount, i } /* now per mount stats */ avlnode = avl_get_first(_stats.source_tree); + config = config_get_config(); + __add_authstack(config->authstack, root); + config_release_config(); + while (avlnode) { stats_source_t *source = (stats_source_t *)avlnode->key; @@ -840,11 +857,9 @@ static xmlNodePtr _dump_stats_to_doc (xmlNodePtr root, const char *show_mount, i if (source->hidden <= hidden && (show_mount == NULL || strcmp (show_mount, source->source) == 0)) { - xmlNodePtr metadata, authentication, role; + xmlNodePtr metadata; source_t *source_real; - ice_config_t *config; mount_proxy *mountproxy; - auth_stack_t *stack; int i; avl_node *avlnode2 = avl_get_first (source->stats_tree); @@ -870,25 +885,9 @@ static xmlNodePtr _dump_stats_to_doc (xmlNodePtr root, const char *show_mount, i } avl_tree_unlock(global.source_tree); - authentication = xmlNewTextChild(xmlnode, NULL, XMLSTR("authentication"), NULL); config = config_get_config(); mountproxy = config_find_mount(config, source->source, MOUNT_TYPE_NORMAL); - auth_stack_addref(stack = mountproxy->authstack); - while (stack) { - auth_t *auth = auth_stack_get(stack); - char idbuf[32]; - snprintf(idbuf, sizeof(idbuf), "%lu", auth->id); - role = xmlNewTextChild(authentication, NULL, XMLSTR("role"), NULL); - xmlSetProp(role, XMLSTR("id"), XMLSTR(idbuf)); - if (auth->type) - xmlSetProp(role, XMLSTR("type"), XMLSTR(auth->type)); - if (auth->role) - xmlSetProp(role, XMLSTR("name"), XMLSTR(auth->role)); - if (auth->management_url) - xmlSetProp(role, XMLSTR("management-url"), XMLSTR(auth->management_url)); - auth_release(auth); - auth_stack_next(&stack); - } + __add_authstack(mountproxy->authstack, xmlnode); config_release_config(); } avlnode = avl_get_next (avlnode); From 5f962c9bdf6b33973afb2eb212a6f0c9a5cea0db Mon Sep 17 00:00:00 2001 From: Philipp Schafft Date: Thu, 25 Dec 2014 12:45:46 +0000 Subject: [PATCH 4/4] Feature: Nicer display of This adds a little bit nicer display of to the stats.xsl page and avoids broken display of and . --- admin/stats.xsl | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/admin/stats.xsl b/admin/stats.xsl index 85556a88..2e31dd28 100644 --- a/admin/stats.xsl +++ b/admin/stats.xsl @@ -100,11 +100,24 @@ - - - - + + + + + + + + + + + + + + + + +
Extra metadata