sessions page

This commit is contained in:
mom040267 2015-01-15 08:37:48 +00:00
parent 827b1db525
commit 3ff446b90e
3 changed files with 207 additions and 15 deletions

View File

@ -312,6 +312,13 @@ void str_buffer_append_sz(struct str_buffer* sb, size_t sz)
str_buffer_append(sb,ssz);
}
void str_buffer_append_sid(struct str_buffer* sb, turnsession_id sid)
{
char ssz[129];
snprintf(ssz,sizeof(ssz)-1,"%018llu",(unsigned long long)sid);
str_buffer_append(sb,ssz);
}
const char* str_buffer_get_str(const struct str_buffer *sb)
{
if(sb) {

View File

@ -73,6 +73,7 @@ struct str_buffer;
struct str_buffer* str_buffer_new(void);
void str_buffer_append(struct str_buffer* sb, const char* str);
void str_buffer_append_sz(struct str_buffer* sb, size_t sz);
void str_buffer_append_sid(struct str_buffer* sb, turnsession_id sid);
const char* str_buffer_get_str(const struct str_buffer *sb);
size_t str_buffer_get_str_len(const struct str_buffer *sb);
void str_buffer_free(struct str_buffer *sb);

View File

@ -1358,6 +1358,7 @@ enum _AS_FORM {
AS_FORM_HOME,
AS_FORM_TOGGLE,
AS_FORM_UPDATE,
AS_FORM_PS,
AS_FORM_UNKNOWN
};
@ -1379,6 +1380,7 @@ static struct form_name form_names[] = {
{AS_FORM_HOME,"/home"},
{AS_FORM_TOGGLE,"/toggle"},
{AS_FORM_UPDATE,"/update"},
{AS_FORM_PS,"/ps"},
{AS_FORM_UNKNOWN,NULL}
};
@ -1460,22 +1462,31 @@ static void write_https_home_page(ioa_socket_handle s)
str_buffer_append(sb,"<br><br>\r\n");
str_buffer_append(sb,logout_link);
str_buffer_append(sb,"<form action=\"");
str_buffer_append(sb,form_names[AS_FORM_HOME].name);
str_buffer_append(sb,"\" method=\"POST\">\r\n");
str_buffer_append(sb," <fieldset><legend>Actions:</legend>\r\n");
str_buffer_append(sb," Realm name: <input type=\"text\" name=\"");
str_buffer_append(sb,HR_REALM);
str_buffer_append(sb,"\" value=\"");
str_buffer_append(sb,current_socket->as_eff_realm);
str_buffer_append(sb,"\"");
if(!is_superuser()) {
str_buffer_append(sb,"<a href=\"");
str_buffer_append(sb,form_names[AS_FORM_PC].name);
str_buffer_append(sb,"\">Config Parameters</a><br>\r\n");
} else {
str_buffer_append(sb,"<form action=\"");
str_buffer_append(sb,form_names[AS_FORM_PC].name);
str_buffer_append(sb,"\" method=\"POST\">\r\n");
str_buffer_append(sb," <fieldset><legend>Current realm:</legend> name:<br><input type=\"text\" name=\"");
str_buffer_append(sb,HR_REALM);
str_buffer_append(sb,"\" value=\"");
str_buffer_append(sb,current_socket->as_eff_realm);
str_buffer_append(sb,"\"><br>");
str_buffer_append(sb,"<br><input type=\"submit\" value=\"Config Parameters\"></fieldset>\r\n");
str_buffer_append(sb,"</form>\r\n");
str_buffer_append(sb," disabled ");
}
str_buffer_append(sb,"><br>");
str_buffer_append(sb,"<br><input type=\"submit\" value=\"Configuration Parameters\" formaction=\"");
str_buffer_append(sb,form_names[AS_FORM_PC].name);
str_buffer_append(sb,"\">");
str_buffer_append(sb,"<br><input type=\"submit\" value=\"TURN sessions\" formaction=\"");
str_buffer_append(sb,form_names[AS_FORM_PS].name);
str_buffer_append(sb,"\">");
str_buffer_append(sb,"</fieldset>\r\n");
str_buffer_append(sb,"</form>\r\n");
str_buffer_append(sb,"\r\n </body>\r\n</html>\r\n");
@ -1655,7 +1666,7 @@ static void write_pc_page(ioa_socket_handle s)
str_buffer_append(sb,"<br>\r\n");
str_buffer_append(sb,home_link);
str_buffer_append(sb,"<br>\r\n");
str_buffer_append(sb,"Config Parameters:<br><table style=\"width:100%\">\r\n");
str_buffer_append(sb,"Configuration Parameters:<br><table style=\"width:100%\">\r\n");
str_buffer_append(sb,"<tr><th>Parameter</th><th>Current Value</th><th>");
if(is_superuser()) {
str_buffer_append(sb,"New (ephemeral) Value");
@ -1884,6 +1895,165 @@ static void write_pc_page(ioa_socket_handle s)
}
}
struct https_ps_arg {
struct str_buffer* sb;
size_t counter;
turn_time_t ct;
};
static int https_print_session(ur_map_key_type key, ur_map_value_type value, void *arg)
{
if(key && value && arg) {
struct https_ps_arg *csarg = (struct https_ps_arg*)arg;
struct str_buffer* sb = csarg->sb;
struct turn_session_info *tsi = (struct turn_session_info *)value;
if(current_socket->as_eff_realm[0] && strcmp(current_socket->as_eff_realm,tsi->realm))
return 0;
if((unsigned long)csarg->counter<(unsigned long)cli_max_output_sessions) {
str_buffer_append(sb,"<tr><td>");
str_buffer_append_sz(sb,(size_t)(csarg->counter+1));
str_buffer_append(sb,"</td><td>");
str_buffer_append_sid(sb,tsi->id);
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,(char*)tsi->username);
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,tsi->realm);
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,tsi->origin);
str_buffer_append(sb,"</td><td>");
if(turn_time_before(csarg->ct, tsi->start_time)) {
str_buffer_append(sb,"undefined time\n");
} else {
str_buffer_append_sz(sb,(size_t)(csarg->ct - tsi->start_time));
}
str_buffer_append(sb,"</td><td>");
if(turn_time_before(tsi->expiration_time,csarg->ct)) {
str_buffer_append(sb,"expired");
} else {
str_buffer_append_sz(sb,(size_t)(tsi->expiration_time - csarg->ct));
}
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,pname(tsi->client_protocol));
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,pname(tsi->peer_protocol));
str_buffer_append(sb,"</td><td>");
{
if(!tsi->local_addr_data.saddr[0])
addr_to_string(&(tsi->local_addr_data.addr),(u08bits*)tsi->local_addr_data.saddr);
if(!tsi->remote_addr_data.saddr[0])
addr_to_string(&(tsi->remote_addr_data.addr),(u08bits*)tsi->remote_addr_data.saddr);
if(!tsi->relay_addr_data_ipv4.saddr[0])
addr_to_string(&(tsi->relay_addr_data_ipv4.addr),(u08bits*)tsi->relay_addr_data_ipv4.saddr);
if(!tsi->relay_addr_data_ipv6.saddr[0])
addr_to_string(&(tsi->relay_addr_data_ipv6.addr),(u08bits*)tsi->relay_addr_data_ipv6.saddr);
str_buffer_append(sb,tsi->remote_addr_data.saddr);
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,tsi->local_addr_data.saddr);
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,tsi->relay_addr_data_ipv4.saddr);
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,tsi->relay_addr_data_ipv6.saddr);
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,get_flag(tsi->enforce_fingerprints));
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,get_flag(tsi->is_mobile));
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,tsi->tls_method);
str_buffer_append(sb,"</td><td>");
str_buffer_append(sb,tsi->tls_cipher);
str_buffer_append(sb,"</td><td>");
str_buffer_append_sz(sb,(size_t)tsi->bps);
str_buffer_append(sb,"</td><td>");
{
char str[1025];
snprintf(str,sizeof(str)-1,"rp=%lu, rb=%lu, sp=%lu, sb=%lu\n",(unsigned long)(tsi->received_packets), (unsigned long)(tsi->received_bytes),(unsigned long)(tsi->sent_packets),(unsigned long)(tsi->sent_bytes));
str_buffer_append(sb,str);
str_buffer_append(sb,"</td><td>");
}
{
char str[1025];
snprintf(str,sizeof(str)-1,"r=%lu, s=%lu, total=%lu (bytes per sec)\n",(unsigned long)(tsi->received_rate), (unsigned long)(tsi->sent_rate),(unsigned long)(tsi->total_rate));
str_buffer_append(sb,str);
str_buffer_append(sb,"</td><td>");
}
if(tsi->main_peers_size) {
size_t i;
for(i=0;i<tsi->main_peers_size;++i) {
if(!(tsi->main_peers_data[i].saddr[0]))
addr_to_string(&(tsi->main_peers_data[i].addr),(u08bits*)tsi->main_peers_data[i].saddr);
str_buffer_append(sb," ");
str_buffer_append(sb,tsi->main_peers_data[i].saddr);
str_buffer_append(sb," ");
}
if(tsi->extra_peers_size && tsi->extra_peers_data) {
for(i=0;i<tsi->extra_peers_size;++i) {
if(!(tsi->extra_peers_data[i].saddr[0]))
addr_to_string(&(tsi->extra_peers_data[i].addr),(u08bits*)tsi->extra_peers_data[i].saddr);
str_buffer_append(sb," ");
str_buffer_append(sb,tsi->extra_peers_data[i].saddr);
str_buffer_append(sb," ");
}
}
}
str_buffer_append(sb,"</td>");
}
}
csarg->counter += 1;
}
return 0;
}
static void https_print_sessions(struct str_buffer* sb)
{
struct https_ps_arg arg = {sb,0,0};
arg.ct = turn_time();
ur_map_foreach_arg(cliserver.sessions, (foreachcb_arg_type)https_print_session, &arg);
}
static void write_ps_page(ioa_socket_handle s)
{
if(s && !ioa_socket_tobeclosed(s)) {
if(!(s->as_ok)) {
write_https_logon_page(s);
} else {
struct str_buffer* sb = str_buffer_new();
str_buffer_append(sb,"<!DOCTYPE html>\r\n<html>\r\n <head>\r\n <title>");
str_buffer_append(sb,admin_title);
str_buffer_append(sb,"</title>\r\n <style> table, th, td { border: 1px solid black; } </style> </head>\r\n <body>\r\n ");
str_buffer_append(sb,admin_title);
str_buffer_append(sb,"<br>\r\n");
str_buffer_append(sb,home_link);
str_buffer_append(sb,"<br>\r\n");
str_buffer_append(sb,"TURN Sessions:<br><table>\r\n");
str_buffer_append(sb,"<tr><th>N</th><th>Session ID</th><th>User</th><th>Realm</th><th>Origin</th><th>Age, secs</th><th>Expires, secs</th><th>Client protocol</th><th>Relay protocol</th><th>Client addr</th><th>Server addr</th><th>Relay addr (IPv4)</th><th>Relay addr (IPv6)</th><th>Fingerprints</th><th>Mobile</th><th>TLS method</th><th>TLS cipher</th><th>BPS (allocated)</th><th>Packets</th><th>Rate</th><th>Peers</th></tr>\r\n");
https_print_sessions(sb);
str_buffer_append(sb,"\r\n</table> </body>\r\n</html>\r\n");
send_str_from_ioa_socket_tcp(s,"HTTP/1.1 200 OK\r\nServer: ");
send_str_from_ioa_socket_tcp(s,TURN_SOFTWARE);
send_str_from_ioa_socket_tcp(s,"\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Length: ");
send_ulong_from_ioa_socket_tcp(s,str_buffer_get_str_len(sb));
send_str_from_ioa_socket_tcp(s,"\r\n\r\n");
send_str_from_ioa_socket_tcp(s,str_buffer_get_str(sb));
str_buffer_free(sb);
}
}
}
static void handle_toggle_request(ioa_socket_handle s, struct http_request* hr)
{
if(s && hr) {
@ -1977,6 +2147,20 @@ static void handle_https(ioa_socket_handle s, ioa_network_buffer_handle nbh)
}
break;
}
case AS_FORM_PS: {
if(s->as_ok) {
const char *realm0 = get_http_header_value(hr, HR_REALM);
if(!realm0 || !realm0[0])
realm0=get_realm(NULL)->options.name;
if(!is_superuser())
realm0 = current_socket->as_realm;
STRCPY(current_socket->as_eff_realm,realm0);
write_ps_page(s);
} else {
write_https_logon_page(s);
}
break;
}
case AS_FORM_TOGGLE:
if(s->as_ok) {
handle_toggle_request(s,hr);