mirror of
https://gitlab.xiph.org/xiph/icecast-server.git
synced 2025-06-30 22:18:19 -04:00
Added 'lagcay' mode stats.xml.
Add '?omode=legacy' to any URI or <resource ... omode="legacy" />. Please test. closes #2097
This commit is contained in:
parent
dc016bc017
commit
4a0c399bf3
18
src/admin.c
18
src/admin.c
@ -657,7 +657,7 @@ static void command_move_clients(client_t *client, source_t *source,
|
|||||||
xmlFreeDoc(doc);
|
xmlFreeDoc(doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline xmlNodePtr __add_listener(client_t *client, xmlNodePtr parent, time_t now) {
|
static inline xmlNodePtr __add_listener(client_t *client, xmlNodePtr parent, time_t now, operation_mode mode) {
|
||||||
const char *tmp;
|
const char *tmp;
|
||||||
xmlNodePtr node;
|
xmlNodePtr node;
|
||||||
char buf[22];
|
char buf[22];
|
||||||
@ -675,13 +675,13 @@ static inline xmlNodePtr __add_listener(client_t *client, xmlNodePtr parent, tim
|
|||||||
memset(buf, '\000', sizeof(buf));
|
memset(buf, '\000', sizeof(buf));
|
||||||
snprintf(buf, sizeof(buf)-1, "%lu", client->con->id);
|
snprintf(buf, sizeof(buf)-1, "%lu", client->con->id);
|
||||||
xmlSetProp(node, XMLSTR("id"), XMLSTR(buf));
|
xmlSetProp(node, XMLSTR("id"), XMLSTR(buf));
|
||||||
xmlNewChild(node, NULL, XMLSTR("ID"), XMLSTR(buf));
|
xmlNewChild(node, NULL, XMLSTR(mode == OMODE_LEGACY ? "ID" : "id"), XMLSTR(buf));
|
||||||
|
|
||||||
xmlNewChild(node, NULL, XMLSTR("IP"), XMLSTR(client->con->ip));
|
xmlNewChild(node, NULL, XMLSTR(mode == OMODE_LEGACY ? "IP" : "ip"), XMLSTR(client->con->ip));
|
||||||
|
|
||||||
tmp = httpp_getvar(client->parser, "user-agent");
|
tmp = httpp_getvar(client->parser, "user-agent");
|
||||||
if (tmp)
|
if (tmp)
|
||||||
xmlNewChild(node, NULL, XMLSTR("UserAgent"), XMLSTR(tmp));
|
xmlNewChild(node, NULL, XMLSTR(mode == OMODE_LEGACY ? "UserAgent" : "useragent"), XMLSTR(tmp));
|
||||||
|
|
||||||
tmp = httpp_getvar(client->parser, "referer");
|
tmp = httpp_getvar(client->parser, "referer");
|
||||||
if (tmp)
|
if (tmp)
|
||||||
@ -689,7 +689,7 @@ static inline xmlNodePtr __add_listener(client_t *client, xmlNodePtr parent, tim
|
|||||||
|
|
||||||
memset(buf, '\000', sizeof(buf));
|
memset(buf, '\000', sizeof(buf));
|
||||||
snprintf(buf, sizeof(buf), "%lu", (unsigned long)(now - client->con->con_time));
|
snprintf(buf, sizeof(buf), "%lu", (unsigned long)(now - client->con->con_time));
|
||||||
xmlNewChild(node, NULL, XMLSTR("Connected"), XMLSTR(buf));
|
xmlNewChild(node, NULL, XMLSTR(mode == OMODE_LEGACY ? "Connected" : "connected"), XMLSTR(buf));
|
||||||
|
|
||||||
if (client->username)
|
if (client->username)
|
||||||
xmlNewChild(node, NULL, XMLSTR("username"), XMLSTR(client->username));
|
xmlNewChild(node, NULL, XMLSTR("username"), XMLSTR(client->username));
|
||||||
@ -700,14 +700,14 @@ static inline xmlNodePtr __add_listener(client_t *client, xmlNodePtr parent, tim
|
|||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
void admin_add_listeners_to_mount(source_t *source, xmlNodePtr parent) {
|
void admin_add_listeners_to_mount(source_t *source, xmlNodePtr parent, operation_mode mode) {
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
avl_node *client_node;
|
avl_node *client_node;
|
||||||
|
|
||||||
avl_tree_rlock(source->client_tree);
|
avl_tree_rlock(source->client_tree);
|
||||||
client_node = avl_get_first(source->client_tree);
|
client_node = avl_get_first(source->client_tree);
|
||||||
while(client_node) {
|
while(client_node) {
|
||||||
__add_listener((client_t *)client_node->key, parent, now);
|
__add_listener((client_t *)client_node->key, parent, now, mode);
|
||||||
client_node = avl_get_next(client_node);
|
client_node = avl_get_next(client_node);
|
||||||
}
|
}
|
||||||
avl_tree_unlock(source->client_tree);
|
avl_tree_unlock(source->client_tree);
|
||||||
@ -730,7 +730,7 @@ static void command_show_listeners(client_t *client, source_t *source,
|
|||||||
snprintf (buf, sizeof(buf), "%lu", source->listeners);
|
snprintf (buf, sizeof(buf), "%lu", source->listeners);
|
||||||
xmlNewChild(srcnode, NULL, XMLSTR("Listeners"), XMLSTR(buf));
|
xmlNewChild(srcnode, NULL, XMLSTR("Listeners"), XMLSTR(buf));
|
||||||
|
|
||||||
admin_add_listeners_to_mount(source, srcnode);
|
admin_add_listeners_to_mount(source, srcnode, client->mode);
|
||||||
|
|
||||||
admin_send_response(doc, client, response,
|
admin_send_response(doc, client, response,
|
||||||
LISTCLIENTS_TRANSFORMED_REQUEST);
|
LISTCLIENTS_TRANSFORMED_REQUEST);
|
||||||
@ -1078,7 +1078,7 @@ static void command_stats(client_t *client, const char *mount, int response) {
|
|||||||
|
|
||||||
ICECAST_LOG_DEBUG("Stats request, sending xml stats");
|
ICECAST_LOG_DEBUG("Stats request, sending xml stats");
|
||||||
|
|
||||||
doc = stats_get_xml(1, mount);
|
doc = stats_get_xml(1, mount, client->mode);
|
||||||
admin_send_response(doc, client, response, STATS_TRANSFORMED_REQUEST);
|
admin_send_response(doc, client, response, STATS_TRANSFORMED_REQUEST);
|
||||||
xmlFreeDoc(doc);
|
xmlFreeDoc(doc);
|
||||||
return;
|
return;
|
||||||
|
@ -39,7 +39,7 @@ void admin_handle_request(client_t *client, const char *uri);
|
|||||||
void admin_send_response(xmlDocPtr doc, client_t *client,
|
void admin_send_response(xmlDocPtr doc, client_t *client,
|
||||||
int response, const char *xslt_template);
|
int response, const char *xslt_template);
|
||||||
|
|
||||||
void admin_add_listeners_to_mount(source_t *source, xmlNodePtr parent);
|
void admin_add_listeners_to_mount(source_t *source, xmlNodePtr parent, operation_mode mode);
|
||||||
|
|
||||||
int admin_get_command(const char *command);
|
int admin_get_command(const char *command);
|
||||||
int admin_get_command_type(int command);
|
int admin_get_command_type(int command);
|
||||||
|
@ -108,6 +108,22 @@ static void _parse_events(event_registration_t **events, xmlNodePtr node);
|
|||||||
static void merge_mounts(mount_proxy * dst, mount_proxy * src);
|
static void merge_mounts(mount_proxy * dst, mount_proxy * src);
|
||||||
static inline void _merge_mounts_all(ice_config_t *c);
|
static inline void _merge_mounts_all(ice_config_t *c);
|
||||||
|
|
||||||
|
operation_mode config_str_to_omode(const char *str) {
|
||||||
|
if (!str || !*str)
|
||||||
|
return OMODE_DEFAULT;
|
||||||
|
|
||||||
|
if (strcasecmp(str, "default") == 0) {
|
||||||
|
return OMODE_DEFAULT;
|
||||||
|
} else if (strcasecmp(str, "normal") == 0) {
|
||||||
|
return OMODE_NORMAL;
|
||||||
|
} else if (strcasecmp(str, "legacy-compat") == 0 || strcasecmp(str, "legacy") == 0) {
|
||||||
|
return OMODE_LEGACY;
|
||||||
|
} else {
|
||||||
|
ICECAST_LOG_ERROR("Unknown operation mode \"%s\", falling back to DEFAULT.", str);
|
||||||
|
return OMODE_DEFAULT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void create_locks(void) {
|
static void create_locks(void) {
|
||||||
thread_mutex_create(&_locks.relay_lock);
|
thread_mutex_create(&_locks.relay_lock);
|
||||||
thread_rwlock_create(&_locks.config_lock);
|
thread_rwlock_create(&_locks.config_lock);
|
||||||
@ -1696,6 +1712,13 @@ static void _parse_paths(xmlDocPtr doc, xmlNodePtr node,
|
|||||||
alias->port = -1;
|
alias->port = -1;
|
||||||
alias->bind_address = (char *)xmlGetProp(node, XMLSTR("bind-address"));
|
alias->bind_address = (char *)xmlGetProp(node, XMLSTR("bind-address"));
|
||||||
alias->vhost = (char *)xmlGetProp(node, XMLSTR("vhost"));
|
alias->vhost = (char *)xmlGetProp(node, XMLSTR("vhost"));
|
||||||
|
temp = (char *)xmlGetProp(node, XMLSTR("omode"));
|
||||||
|
if (temp) {
|
||||||
|
alias->omode = config_str_to_omode(temp);
|
||||||
|
xmlFree(temp);
|
||||||
|
} else {
|
||||||
|
alias->omode = OMODE_DEFAULT;
|
||||||
|
}
|
||||||
current = configuration->aliases;
|
current = configuration->aliases;
|
||||||
last = NULL;
|
last = NULL;
|
||||||
while (current) {
|
while (current) {
|
||||||
|
@ -32,6 +32,12 @@ struct _mount_proxy;
|
|||||||
|
|
||||||
#define XMLSTR(str) ((xmlChar *)(str))
|
#define XMLSTR(str) ((xmlChar *)(str))
|
||||||
|
|
||||||
|
typedef enum _operation_mode {
|
||||||
|
OMODE_DEFAULT = 0,
|
||||||
|
OMODE_NORMAL,
|
||||||
|
OMODE_LEGACY
|
||||||
|
} operation_mode;
|
||||||
|
|
||||||
typedef enum _http_header_type {
|
typedef enum _http_header_type {
|
||||||
/* static: headers are passed as is to the client. */
|
/* static: headers are passed as is to the client. */
|
||||||
HTTP_HEADER_TYPE_STATIC
|
HTTP_HEADER_TYPE_STATIC
|
||||||
@ -125,6 +131,7 @@ typedef struct _aliases {
|
|||||||
int port;
|
int port;
|
||||||
char *bind_address;
|
char *bind_address;
|
||||||
char *vhost;
|
char *vhost;
|
||||||
|
operation_mode omode;
|
||||||
struct _aliases *next;
|
struct _aliases *next;
|
||||||
} aliases;
|
} aliases;
|
||||||
|
|
||||||
@ -220,6 +227,8 @@ typedef struct {
|
|||||||
void config_initialize(void);
|
void config_initialize(void);
|
||||||
void config_shutdown(void);
|
void config_shutdown(void);
|
||||||
|
|
||||||
|
operation_mode config_str_to_omode(const char *str);
|
||||||
|
|
||||||
void config_reread_config(void);
|
void config_reread_config(void);
|
||||||
int config_parse_file(const char *filename, ice_config_t *configuration);
|
int config_parse_file(const char *filename, ice_config_t *configuration);
|
||||||
int config_initial_parse_file(const char *filename);
|
int config_initial_parse_file(const char *filename);
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "connection.h"
|
#include "connection.h"
|
||||||
#include "refbuf.h"
|
#include "refbuf.h"
|
||||||
#include "acl.h"
|
#include "acl.h"
|
||||||
|
#include "cfgfile.h"
|
||||||
#include "common/httpp/httpp.h"
|
#include "common/httpp/httpp.h"
|
||||||
|
|
||||||
typedef enum _protocol_tag {
|
typedef enum _protocol_tag {
|
||||||
@ -31,6 +32,9 @@ typedef enum _protocol_tag {
|
|||||||
|
|
||||||
typedef struct _client_tag
|
typedef struct _client_tag
|
||||||
{
|
{
|
||||||
|
/* mode of operation for this client */
|
||||||
|
operation_mode mode;
|
||||||
|
|
||||||
/* the client's connection */
|
/* the client's connection */
|
||||||
connection_t *con;
|
connection_t *con;
|
||||||
/* the client's http headers */
|
/* the client's http headers */
|
||||||
|
@ -1270,6 +1270,8 @@ static int _handle_aliases(client_t *client, char **uri) {
|
|||||||
(alias->bind_address == NULL || (serverhost != NULL && strcmp(alias->bind_address, serverhost) == 0)) &&
|
(alias->bind_address == NULL || (serverhost != NULL && strcmp(alias->bind_address, serverhost) == 0)) &&
|
||||||
(alias->vhost == NULL || (vhost != NULL && strcmp(alias->vhost, vhost) == 0)) ) {
|
(alias->vhost == NULL || (vhost != NULL && strcmp(alias->vhost, vhost) == 0)) ) {
|
||||||
new_uri = strdup(alias->destination);
|
new_uri = strdup(alias->destination);
|
||||||
|
if (alias->omode != OMODE_DEFAULT)
|
||||||
|
client->mode = alias->omode;
|
||||||
ICECAST_LOG_DEBUG("alias has made %s into %s", *uri, new_uri);
|
ICECAST_LOG_DEBUG("alias has made %s into %s", *uri, new_uri);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1508,6 +1510,8 @@ static void _handle_connection(void)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
client->mode = config_str_to_omode(httpp_get_query_param(client->parser, "omode"));
|
||||||
|
|
||||||
if (_handle_aliases(client, &uri) != 0) {
|
if (_handle_aliases(client, &uri) != 0) {
|
||||||
client_destroy (client);
|
client_destroy (client);
|
||||||
continue;
|
continue;
|
||||||
|
@ -495,7 +495,7 @@ int fserve_client_create (client_t *httpclient, const char *path)
|
|||||||
char *eol = strrchr (reference, '.');
|
char *eol = strrchr (reference, '.');
|
||||||
if (eol)
|
if (eol)
|
||||||
*eol = '\0';
|
*eol = '\0';
|
||||||
doc = stats_get_xml (0, reference);
|
doc = stats_get_xml (0, reference, httpclient->mode);
|
||||||
free (reference);
|
free (reference);
|
||||||
admin_send_response (doc, httpclient, TRANSFORMED, xslt_playlist_requested);
|
admin_send_response (doc, httpclient, TRANSFORMED, xslt_playlist_requested);
|
||||||
xmlFreeDoc(doc);
|
xmlFreeDoc(doc);
|
||||||
|
@ -978,7 +978,7 @@ void stats_transform_xslt(client_t *client, const char *uri)
|
|||||||
char *xslpath = util_get_path_from_normalised_uri(uri);
|
char *xslpath = util_get_path_from_normalised_uri(uri);
|
||||||
const char *mount = httpp_get_query_param(client->parser, "mount");
|
const char *mount = httpp_get_query_param(client->parser, "mount");
|
||||||
|
|
||||||
doc = stats_get_xml(0, mount);
|
doc = stats_get_xml(0, mount, client->mode);
|
||||||
|
|
||||||
xslt_transform(doc, xslpath, client);
|
xslt_transform(doc, xslpath, client);
|
||||||
|
|
||||||
@ -1009,7 +1009,7 @@ static void __add_metadata(xmlNodePtr node, const char *tag) {
|
|||||||
free(name);
|
free(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
xmlDocPtr stats_get_xml(int show_hidden, const char *show_mount)
|
xmlDocPtr stats_get_xml(int show_hidden, const char *show_mount, operation_mode mode)
|
||||||
{
|
{
|
||||||
xmlDocPtr doc;
|
xmlDocPtr doc;
|
||||||
xmlNodePtr node;
|
xmlNodePtr node;
|
||||||
@ -1029,7 +1029,7 @@ xmlDocPtr stats_get_xml(int show_hidden, const char *show_mount)
|
|||||||
source = source_find_mount_raw(show_mount);
|
source = source_find_mount_raw(show_mount);
|
||||||
for (i = 0; i < source->format->vc.comments; i++)
|
for (i = 0; i < source->format->vc.comments; i++)
|
||||||
__add_metadata(metadata, source->format->vc.user_comments[i]);
|
__add_metadata(metadata, source->format->vc.user_comments[i]);
|
||||||
admin_add_listeners_to_mount(source, node);
|
admin_add_listeners_to_mount(source, node, mode);
|
||||||
avl_tree_unlock(global.source_tree);
|
avl_tree_unlock(global.source_tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ void stats_callback (client_t *client, void *notused);
|
|||||||
|
|
||||||
void stats_transform_xslt(client_t *client, const char *uri);
|
void stats_transform_xslt(client_t *client, const char *uri);
|
||||||
void stats_sendxml(client_t *client);
|
void stats_sendxml(client_t *client);
|
||||||
xmlDocPtr stats_get_xml(int show_hidden, const char *show_mount);
|
xmlDocPtr stats_get_xml(int show_hidden, const char *show_mount, operation_mode mode);
|
||||||
char *stats_get_value(const char *source, const char *name);
|
char *stats_get_value(const char *source, const char *name);
|
||||||
|
|
||||||
#endif /* __STATS_H__ */
|
#endif /* __STATS_H__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user