mirror of
git://erdgeist.org/opentracker
synced 2025-03-12 21:51:11 +00:00
Add some subnet debugging features
This commit is contained in:
parent
20955311d1
commit
6073127ad0
64
ot_http.c
64
ot_http.c
@ -16,6 +16,7 @@
|
|||||||
#include "array.h"
|
#include "array.h"
|
||||||
#include "iob.h"
|
#include "iob.h"
|
||||||
#include "ip6.h"
|
#include "ip6.h"
|
||||||
|
#include "scan.h"
|
||||||
|
|
||||||
/* Opentracker */
|
/* Opentracker */
|
||||||
#include "trackerlogic.h"
|
#include "trackerlogic.h"
|
||||||
@ -168,7 +169,7 @@ static const ot_keywords keywords_mode[] =
|
|||||||
{ "busy", TASK_STATS_BUSY_NETWORKS }, { "torr", TASK_STATS_TORRENTS }, { "fscr", TASK_STATS_FULLSCRAPE },
|
{ "busy", TASK_STATS_BUSY_NETWORKS }, { "torr", TASK_STATS_TORRENTS }, { "fscr", TASK_STATS_FULLSCRAPE },
|
||||||
{ "s24s", TASK_STATS_SLASH24S }, { "tpbs", TASK_STATS_TPB }, { "herr", TASK_STATS_HTTPERRORS }, { "completed", TASK_STATS_COMPLETED },
|
{ "s24s", TASK_STATS_SLASH24S }, { "tpbs", TASK_STATS_TPB }, { "herr", TASK_STATS_HTTPERRORS }, { "completed", TASK_STATS_COMPLETED },
|
||||||
{ "top10", TASK_STATS_TOP10 }, { "renew", TASK_STATS_RENEW }, { "syncs", TASK_STATS_SYNCS }, { "version", TASK_STATS_VERSION },
|
{ "top10", TASK_STATS_TOP10 }, { "renew", TASK_STATS_RENEW }, { "syncs", TASK_STATS_SYNCS }, { "version", TASK_STATS_VERSION },
|
||||||
{ "everything", TASK_STATS_EVERYTHING }, { "statedump", TASK_FULLSCRAPE_TRACKERSTATE }, { NULL, -3 } };
|
{ "everything", TASK_STATS_EVERYTHING }, { "statedump", TASK_FULLSCRAPE_TRACKERSTATE }, { "fulllog", TASK_STATS_FULLLOG }, { NULL, -3 } };
|
||||||
static const ot_keywords keywords_format[] =
|
static const ot_keywords keywords_format[] =
|
||||||
{ { "bin", TASK_FULLSCRAPE_TPB_BINARY }, { "ben", TASK_FULLSCRAPE }, { "url", TASK_FULLSCRAPE_TPB_URLENCODED },
|
{ { "bin", TASK_FULLSCRAPE_TPB_BINARY }, { "ben", TASK_FULLSCRAPE }, { "url", TASK_FULLSCRAPE_TPB_URLENCODED },
|
||||||
{ "txt", TASK_FULLSCRAPE_TPB_ASCII }, { NULL, -3 } };
|
{ "txt", TASK_FULLSCRAPE_TPB_ASCII }, { NULL, -3 } };
|
||||||
@ -306,6 +307,9 @@ static ot_keywords keywords_announce[] = { { "port", 1 }, { "left", 2 }, { "even
|
|||||||
#ifdef WANT_IP_FROM_QUERY_STRING
|
#ifdef WANT_IP_FROM_QUERY_STRING
|
||||||
{ "ip", 7 },
|
{ "ip", 7 },
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef WANT_FULLLOG_NETWORKS
|
||||||
|
{ "lognet", 8 },
|
||||||
|
#endif
|
||||||
{ NULL, -3 } };
|
{ NULL, -3 } };
|
||||||
static ot_keywords keywords_announce_event[] = { { "completed", 1 }, { "stopped", 2 }, { NULL, -3 } };
|
static ot_keywords keywords_announce_event[] = { { "completed", 1 }, { "stopped", 2 }, { NULL, -3 } };
|
||||||
static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, char *read_ptr ) {
|
static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, char *read_ptr ) {
|
||||||
@ -411,6 +415,37 @@ static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws,
|
|||||||
OT_SETIP( &peer, tmp_buf1 );
|
OT_SETIP( &peer, tmp_buf1 );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef WANT_FULLLOG_NETWORKS
|
||||||
|
case 8: /* matched "lognet" */
|
||||||
|
{
|
||||||
|
//if( accesslist_isblessed( cookie->ip, OT_PERMISSION_MAY_STAT ) ) {
|
||||||
|
char *tmp_buf = ws->reply;
|
||||||
|
ot_net net;
|
||||||
|
signed short parsed, bits;
|
||||||
|
|
||||||
|
len = scan_urlencoded_query( &read_ptr, tmp_buf, SCAN_SEARCHPATH_VALUE );
|
||||||
|
tmp_buf[len] = 0;
|
||||||
|
if( len <= 0 ) HTTPERROR_400_PARAM;
|
||||||
|
if( *tmp_buf == '-' ) {
|
||||||
|
loglist_reset( );
|
||||||
|
return ws->reply_size = sprintf( ws->reply, "Successfully removed.\n" );
|
||||||
|
}
|
||||||
|
parsed = scan_ip6( tmp_buf, net.address );
|
||||||
|
if( !parsed ) HTTPERROR_400_PARAM;
|
||||||
|
if( tmp_buf[parsed++] != '/' )
|
||||||
|
bits = 128;
|
||||||
|
else {
|
||||||
|
parsed = scan_short( tmp_buf + parsed, &bits );
|
||||||
|
if( !parsed ) HTTPERROR_400_PARAM;
|
||||||
|
if( ip6_isv4mapped( net.address ) )
|
||||||
|
bits += 96;
|
||||||
|
}
|
||||||
|
net.bits = bits;
|
||||||
|
loglist_add_network( &net );
|
||||||
|
return ws->reply_size = sprintf( ws->reply, "Successfully added.\n" );
|
||||||
|
//}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -437,6 +472,31 @@ ssize_t http_handle_request( const int64 sock, struct ot_workstruct *ws ) {
|
|||||||
ssize_t reply_off, len;
|
ssize_t reply_off, len;
|
||||||
char *read_ptr = ws->request, *write_ptr;
|
char *read_ptr = ws->request, *write_ptr;
|
||||||
|
|
||||||
|
#ifdef WANT_FULLLOG_NETWORKS
|
||||||
|
struct http_data *cookie = io_getcookie( sock );
|
||||||
|
if( loglist_check_address( cookie->ip ) ) {
|
||||||
|
ot_log *log = malloc( sizeof( ot_log ) );
|
||||||
|
printf( "Hello World\n" );
|
||||||
|
if( log ) {
|
||||||
|
log->size = ws->request_size;
|
||||||
|
log->data = malloc( ws->request_size );
|
||||||
|
log->next = 0;
|
||||||
|
log->time = g_now_seconds;
|
||||||
|
memcpy( log->ip, cookie->ip, sizeof(ot_ip6));
|
||||||
|
if( log->data ) {
|
||||||
|
memcpy( log->data, ws->request, ws->request_size );
|
||||||
|
if( !g_logchain_first )
|
||||||
|
g_logchain_first = g_logchain_last = log;
|
||||||
|
else {
|
||||||
|
g_logchain_last->next = log;
|
||||||
|
g_logchain_last = log;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
free( log );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _DEBUG_HTTPERROR
|
#ifdef _DEBUG_HTTPERROR
|
||||||
reply_off = ws->request_size;
|
reply_off = ws->request_size;
|
||||||
if( ws->request_size >= G_DEBUGBUF_SIZE )
|
if( ws->request_size >= G_DEBUGBUF_SIZE )
|
||||||
@ -444,7 +504,7 @@ ssize_t http_handle_request( const int64 sock, struct ot_workstruct *ws ) {
|
|||||||
memcpy( ws->debugbuf, ws->request, reply_off );
|
memcpy( ws->debugbuf, ws->request, reply_off );
|
||||||
ws->debugbuf[ reply_off ] = 0;
|
ws->debugbuf[ reply_off ] = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Tell subroutines where to put reply data */
|
/* Tell subroutines where to put reply data */
|
||||||
ws->reply = ws->outbuf + SUCCESS_HTTP_HEADER_LENGTH;
|
ws->reply = ws->outbuf + SUCCESS_HTTP_HEADER_LENGTH;
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@ typedef enum {
|
|||||||
TASK_STATS_SLASH24S = 0x0103,
|
TASK_STATS_SLASH24S = 0x0103,
|
||||||
TASK_STATS_TOP10 = 0x0104,
|
TASK_STATS_TOP10 = 0x0104,
|
||||||
TASK_STATS_EVERYTHING = 0x0105,
|
TASK_STATS_EVERYTHING = 0x0105,
|
||||||
|
TASK_STATS_FULLLOG = 0x0106,
|
||||||
|
|
||||||
TASK_FULLSCRAPE = 0x0200, /* Default mode */
|
TASK_FULLSCRAPE = 0x0200, /* Default mode */
|
||||||
TASK_FULLSCRAPE_TPB_BINARY = 0x0201,
|
TASK_FULLSCRAPE_TPB_BINARY = 0x0201,
|
||||||
|
37
ot_stats.c
37
ot_stats.c
@ -26,6 +26,7 @@
|
|||||||
#include "ot_mutex.h"
|
#include "ot_mutex.h"
|
||||||
#include "ot_iovec.h"
|
#include "ot_iovec.h"
|
||||||
#include "ot_stats.h"
|
#include "ot_stats.h"
|
||||||
|
#include "ot_accesslist.h"
|
||||||
|
|
||||||
#ifndef NO_FULLSCRAPE_LOGGING
|
#ifndef NO_FULLSCRAPE_LOGGING
|
||||||
#define LOG_TO_STDERR( ... ) fprintf( stderr, __VA_ARGS__ )
|
#define LOG_TO_STDERR( ... ) fprintf( stderr, __VA_ARGS__ )
|
||||||
@ -477,6 +478,38 @@ static size_t stats_return_completed_mrtg( char * reply ) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WANT_FULLLOG_NETWORKS
|
||||||
|
static void stats_return_fulllog( int *iovec_entries, struct iovec **iovector, char *r ) {
|
||||||
|
ot_log *loglist = g_logchain_first, *llnext;
|
||||||
|
char * re = r + OT_STATS_TMPSIZE;
|
||||||
|
|
||||||
|
g_logchain_first = g_logchain_last = 0;
|
||||||
|
|
||||||
|
while( loglist ) {
|
||||||
|
if( r + ( loglist->size + 64 ) >= re ) {
|
||||||
|
r = iovec_fix_increase_or_free( iovec_entries, iovector, r, 32 * OT_STATS_TMPSIZE );
|
||||||
|
if( !r ) return;
|
||||||
|
re = r + 32 * OT_STATS_TMPSIZE;
|
||||||
|
}
|
||||||
|
r += sprintf( r, "%08ld: ", loglist->time );
|
||||||
|
r += fmt_ip6c( r, loglist->ip );
|
||||||
|
*r++ = '\n';
|
||||||
|
memcpy( r, loglist->data, loglist->size );
|
||||||
|
r += loglist->size;
|
||||||
|
*r++ = '\n';
|
||||||
|
*r++ = '*';
|
||||||
|
*r++ = '\n';
|
||||||
|
*r++ = '\n';
|
||||||
|
|
||||||
|
llnext = loglist->next;
|
||||||
|
free( loglist->data );
|
||||||
|
free( loglist );
|
||||||
|
loglist = llnext;
|
||||||
|
}
|
||||||
|
iovec_fixlast( iovec_entries, iovector, r );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static size_t stats_return_everything( char * reply ) {
|
static size_t stats_return_everything( char * reply ) {
|
||||||
torrent_stats stats = {0,0,0};
|
torrent_stats stats = {0,0,0};
|
||||||
int i;
|
int i;
|
||||||
@ -570,6 +603,10 @@ static void stats_make( int *iovec_entries, struct iovec **iovector, ot_tasktype
|
|||||||
case TASK_STATS_SLASH24S: r += stats_slash24s_txt( r, 128 ); break;
|
case TASK_STATS_SLASH24S: r += stats_slash24s_txt( r, 128 ); break;
|
||||||
case TASK_STATS_TOP10: r += stats_top10_txt( r ); break;
|
case TASK_STATS_TOP10: r += stats_top10_txt( r ); break;
|
||||||
case TASK_STATS_EVERYTHING: r += stats_return_everything( r ); break;
|
case TASK_STATS_EVERYTHING: r += stats_return_everything( r ); break;
|
||||||
|
#ifdef WANT_FULLLOG_NETWORKS
|
||||||
|
case TASK_STATS_FULLLOG: stats_return_fulllog( iovec_entries, iovector, r );
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
iovec_free(iovec_entries, iovector);
|
iovec_free(iovec_entries, iovector);
|
||||||
return;
|
return;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user