diff options
Diffstat (limited to 'ot_stats.c')
| -rw-r--r-- | ot_stats.c | 50 |
1 files changed, 28 insertions, 22 deletions
| @@ -320,7 +320,7 @@ typedef struct { | |||
| 320 | /* Fetches stats from tracker */ | 320 | /* Fetches stats from tracker */ |
| 321 | size_t stats_top_txt(char *reply, int amount) { | 321 | size_t stats_top_txt(char *reply, int amount) { |
| 322 | size_t j; | 322 | size_t j; |
| 323 | ot_record top100s[100], top100c[100]; | 323 | ot_record top100s[100], top100c[100], top100l[100]; |
| 324 | char *r = reply, hex_out[42]; | 324 | char *r = reply, hex_out[42]; |
| 325 | int idx, bucket; | 325 | int idx, bucket; |
| 326 | 326 | ||
| @@ -329,14 +329,16 @@ size_t stats_top_txt(char *reply, int amount) { | |||
| 329 | 329 | ||
| 330 | byte_zero(top100s, sizeof(top100s)); | 330 | byte_zero(top100s, sizeof(top100s)); |
| 331 | byte_zero(top100c, sizeof(top100c)); | 331 | byte_zero(top100c, sizeof(top100c)); |
| 332 | byte_zero(top100l, sizeof(top100l)); | ||
| 332 | 333 | ||
| 333 | for (bucket = 0; bucket < OT_BUCKET_COUNT; ++bucket) { | 334 | for (bucket = 0; bucket < OT_BUCKET_COUNT; ++bucket) { |
| 334 | ot_vector *torrents_list = mutex_bucket_lock(bucket); | 335 | ot_vector *torrents_list = mutex_bucket_lock(bucket); |
| 335 | for (j = 0; j < torrents_list->size; ++j) { | 336 | for (j = 0; j < torrents_list->size; ++j) { |
| 336 | ot_torrent *torrent = (ot_torrent *)(torrents_list->data) + j; | 337 | ot_torrent *torrent = (ot_torrent *)(torrents_list->data) + j; |
| 337 | size_t peer_count = torrent->peer_list6->peer_count + torrent->peer_list4->peer_count; | 338 | size_t peer_count = torrent->peer_list6->peer_count + torrent->peer_list4->peer_count; |
| 338 | size_t seed_count = torrent->peer_list6->seed_count + torrent->peer_list4->seed_count; | 339 | size_t seed_count = torrent->peer_list6->seed_count + torrent->peer_list4->seed_count; |
| 339 | idx = amount - 1; | 340 | size_t leech_count = peer_count - seed_count; |
| 341 | idx = amount - 1; | ||
| 340 | while ((idx >= 0) && (peer_count > top100c[idx].val)) | 342 | while ((idx >= 0) && (peer_count > top100c[idx].val)) |
| 341 | --idx; | 343 | --idx; |
| 342 | if (idx++ != amount - 1) { | 344 | if (idx++ != amount - 1) { |
| @@ -352,6 +354,14 @@ size_t stats_top_txt(char *reply, int amount) { | |||
| 352 | memcpy(&top100s[idx].hash, &torrent->hash, sizeof(ot_hash)); | 354 | memcpy(&top100s[idx].hash, &torrent->hash, sizeof(ot_hash)); |
| 353 | top100s[idx].val = seed_count; | 355 | top100s[idx].val = seed_count; |
| 354 | } | 356 | } |
| 357 | idx = amount - 1; | ||
| 358 | while ((idx >= 0) && (leech_count > top100l[idx].val)) | ||
| 359 | --idx; | ||
| 360 | if (idx++ != amount - 1) { | ||
| 361 | memmove(top100l + idx + 1, top100l + idx, (amount - 1 - idx) * sizeof(ot_record)); | ||
| 362 | memcpy(&top100l[idx].hash, &torrent->hash, sizeof(ot_hash)); | ||
| 363 | top100l[idx].val = leech_count; | ||
| 364 | } | ||
| 355 | } | 365 | } |
| 356 | mutex_bucket_unlock(bucket, 0); | 366 | mutex_bucket_unlock(bucket, 0); |
| 357 | if (!g_opentracker_running) | 367 | if (!g_opentracker_running) |
| @@ -366,6 +376,10 @@ size_t stats_top_txt(char *reply, int amount) { | |||
| 366 | for (idx = 0; idx < amount; ++idx) | 376 | for (idx = 0; idx < amount; ++idx) |
| 367 | if (top100s[idx].val) | 377 | if (top100s[idx].val) |
| 368 | r += sprintf(r, "\t%zd\t%s\n", top100s[idx].val, to_hex(hex_out, top100s[idx].hash)); | 378 | r += sprintf(r, "\t%zd\t%s\n", top100s[idx].val, to_hex(hex_out, top100s[idx].hash)); |
| 379 | r += sprintf(r, "Top %d torrents by leechers:\n", amount); | ||
| 380 | for (idx = 0; idx < amount; ++idx) | ||
| 381 | if (top100l[idx].val) | ||
| 382 | r += sprintf(r, "\t%zd\t%s\n", top100l[idx].val, to_hex(hex_out, top100l[idx].hash)); | ||
| 369 | 383 | ||
| 370 | return r - reply; | 384 | return r - reply; |
| 371 | } | 385 | } |
| @@ -476,9 +490,9 @@ static void stats_return_fulllog(int *iovec_entries, struct iovec **iovector, ch | |||
| 476 | return; | 490 | return; |
| 477 | re = r + 32 * OT_STATS_TMPSIZE; | 491 | re = r + 32 * OT_STATS_TMPSIZE; |
| 478 | } | 492 | } |
| 479 | r += sprintf(r, "%08ld: ", loglist->time); | 493 | r += sprintf(r, "%08ld: ", loglist->time); |
| 480 | r += fmt_ip6c(r, loglist->ip); | 494 | r += fmt_ip6c(r, loglist->ip); |
| 481 | *r++ = '\n'; | 495 | *r++ = '\n'; |
| 482 | memcpy(r, loglist->data, loglist->size); | 496 | memcpy(r, loglist->data, loglist->size); |
| 483 | r += loglist->size; | 497 | r += loglist->size; |
| 484 | *r++ = '\n'; | 498 | *r++ = '\n'; |
| @@ -518,10 +532,8 @@ static size_t stats_return_everything(char *reply) { | |||
| 518 | r += sprintf(r, " <completed>\n <count>%llu</count>\n </completed>\n", ot_overall_completed); | 532 | r += sprintf(r, " <completed>\n <count>%llu</count>\n </completed>\n", ot_overall_completed); |
| 519 | r += sprintf(r, " <connections>\n"); | 533 | r += sprintf(r, " <connections>\n"); |
| 520 | r += sprintf(r, " <tcp>\n <accept>%llu</accept>\n <announce>%llu</announce>\n <scrape>%llu</scrape>\n </tcp>\n", | 534 | r += sprintf(r, " <tcp>\n <accept>%llu</accept>\n <announce>%llu</announce>\n <scrape>%llu</scrape>\n </tcp>\n", |
| 521 | ot_overall_tcp_connections, ot_overall_tcp_successfulannounces, ot_overall_tcp_successfulscrapes); | 535 | ot_overall_tcp_connections, ot_overall_tcp_successfulannounces, ot_overall_tcp_successfulscrapes); |
| 522 | r += sprintf( | 536 | r += sprintf(r, " <udp>\n <overall>%llu</overall>\n <connect>%llu</connect>\n <announce>%llu</announce>\n <scrape>%llu</scrape>\n <missmatch>%llu</missmatch>\n </udp>\n", |
| 523 | r, | ||
| 524 | " <udp>\n <overall>%llu</overall>\n <connect>%llu</connect>\n <announce>%llu</announce>\n <scrape>%llu</scrape>\n <missmatch>%llu</missmatch>\n </udp>\n", | ||
| 525 | ot_overall_udp_connections, ot_overall_udp_connects, ot_overall_udp_successfulannounces, ot_overall_udp_successfulscrapes, | 537 | ot_overall_udp_connections, ot_overall_udp_connects, ot_overall_udp_successfulannounces, ot_overall_udp_successfulscrapes, |
| 526 | ot_overall_udp_connectionidmissmatches); | 538 | ot_overall_udp_connectionidmissmatches); |
| 527 | r += sprintf(r, " <livesync>\n <count>%llu</count>\n </livesync>\n", ot_overall_sync_count); | 539 | r += sprintf(r, " <livesync>\n <count>%llu</count>\n </livesync>\n", ot_overall_sync_count); |
| @@ -541,14 +553,10 @@ static size_t stats_return_everything(char *reply) { | |||
| 541 | return r - reply; | 553 | return r - reply; |
| 542 | } | 554 | } |
| 543 | 555 | ||
| 544 | extern const char *g_version_opentracker_c, *g_version_accesslist_c, *g_version_clean_c, *g_version_fullscrape_c, *g_version_http_c, *g_version_iovec_c, | ||
| 545 | *g_version_mutex_c, *g_version_stats_c, *g_version_udp_c, *g_version_vector_c, *g_version_scan_urlencoded_query_c, *g_version_trackerlogic_c, | ||
| 546 | *g_version_livesync_c, *g_version_rijndael_c; | ||
| 547 | |||
| 548 | size_t stats_return_tracker_version(char *reply) { | 556 | size_t stats_return_tracker_version(char *reply) { |
| 549 | return sprintf(reply, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s", g_version_opentracker_c, g_version_accesslist_c, g_version_clean_c, g_version_fullscrape_c, | 557 | #define QUOTE(name) #name |
| 550 | g_version_http_c, g_version_iovec_c, g_version_mutex_c, g_version_stats_c, g_version_udp_c, g_version_vector_c, | 558 | #define SQUOTE(name) QUOTE(name) |
| 551 | g_version_scan_urlencoded_query_c, g_version_trackerlogic_c, g_version_livesync_c, g_version_rijndael_c); | 559 | return sprintf(reply, "https://erdgeist.org/gitweb/opentracker/commit/?id=" SQUOTE(GIT_VERSION) "\n"); |
| 552 | } | 560 | } |
| 553 | 561 | ||
| 554 | size_t return_stats_for_tracker(char *reply, int mode, int format) { | 562 | size_t return_stats_for_tracker(char *reply, int mode, int format) { |
| @@ -775,5 +783,3 @@ void stats_init() { | |||
| 775 | void stats_deinit() { | 783 | void stats_deinit() { |
| 776 | pthread_cancel(thread_id); | 784 | pthread_cancel(thread_id); |
| 777 | } | 785 | } |
| 778 | |||
| 779 | const char *g_version_stats_c = "$Source$: $Revision$\n"; | ||
