## $Revision: 1.7 $ ## @(#) newsinfo.awk falcon@cats.ucsc.edu (jon r. luini) 7/4/92 ## Modified by Robert Elz to understand more reports. ## Modified by Rich $alz for consistent formatting. ## Modified by Chris Schmidt to sort output. BEGIN { unknowns = 0; batcher = 0; client_timeout = 0; ctlinnd_new = 0; ctlinnd_rmg = 0; ctlinnd_seen = 0; innd = 0; innd_bad_ihaves = 0; innd_bad_msgids = 0; innd_bad_sendmes = 0; innd_blockeds = 0; innd_change_groups = 0; innd_newgroups = 0; innd_pauses = 0; innd_points = 0; innd_reloads = 0; innd_restarts = 0; innd_rmgroups = 0; innd_shutdowns = 0; innd_throttles = 0; innxmit = 0; invalid = "~~~~~~~~~~~~~~~~~~~~~~~~" mthreads = 0; mthreads_added = 0; mthreads_expired = 0; mthreads_started = 0; mthreads_turned_off = 0; mthreads_turned_on = 0; nnrp = 0; nnrp_gethostfails = 0; nnrp_noperms = 0; nnrp_readers = 0; nnrp_unrecs = 0; nntplink = 0; rnews_bad = 0; rnews_bad_date = 0; rnews_bad_dist = 0; rnews_bad_ng = 0; rnews_host = 0; rnews_host = 0; rnews_rejects = 0; server_timeout = 0; ctlinnd["a"] = "addhist"; ctlinnd["D"] = "allow"; ctlinnd["b"] = "begin"; ctlinnd["c"] = "cancel"; ctlinnd["u"] = "changegroup"; ctlinnd["d"] = "checkfile"; ctlinnd["e"] = "drop"; ctlinnd["f"] = "flush"; ctlinnd["g"] = "flushlogs"; ctlinnd["h"] = "go"; ctlinnd["i"] = "hangup"; ctlinnd["s"] = "mode"; ctlinnd["j"] = "name"; ctlinnd["k"] = "newgroup"; ctlinnd["l"] = "param"; ctlinnd["m"] = "pause"; ctlinnd["v"] = "readers"; ctlinnd["t"] = "refile"; ctlinnd["C"] = "reject"; ctlinnd["o"] = "reload"; ctlinnd["n"] = "renumber"; ctlinnd["z"] = "reserve"; ctlinnd["p"] = "rmgroup"; ctlinnd["A"] = "send"; ctlinnd["q"] = "shutdown"; ctlinnd["B"] = "signal"; ctlinnd["r"] = "throttle"; ctlinnd["w"] = "trace"; ctlinnd["x"] = "xabort"; ctlinnd["y"] = "xexec"; } ## ## SYSLOG ## $5 == "last" && $6 == "message" && $7 == "repeated" { ## Skip. next; } ## ## NNRP ## $5 ~ /nnrpd.*/ { host = $6; if ($7 == "connect") { nnrp_connect[host]++; nnrp = 1; next; } if ($7 == "exit") { nnrp_articles[host] += $9; nnrp_groups[host] += $11; next; } if ($7 == "posts") { nnrp_posts[host] += $9; nnrp_rejected[host] += $11; next; } if ($7 == "times") { nnrp_times_user[host] += $9; nnrp_times_sys[host] += $11; nnrp_times_elapsed[host] += $13; next; } if ($7 == "group") { nnrp_readers = 1; nnrp_group_request[$8]++; next; } if ($7 == "post") { ## Skip; handled in "posts" above. next; } if ($7 == "unrecognized") { nnrp_unrecs = 1; nnrp_unrec[host]++; next; } if ($7 == "no_permission") { nnrp_noperms = 1; nnrp_noperm[host]++; next; } if ($7 == "timeout") { client_timeout = 1; nnrp_timeout[host]++; next; } if ($6 == "gethostbyaddr:") { nnrp_gethostfails = 1; nnrp_gethostfail[$7]++; next; } if ($7 == "cant" && $8 == "gethostbyaddr") { ## Skip; handled in "gethostbyaddr:" above. next; } } ## ## INND ## $5 == "innd:" { innd = 1; if ( $6 ~ /^[a-zA-Z]:.*/ || $6 ~ /^[dgs]$/ ) { ## A ctlinnd command. ## Note that the last parameter in $6 may be continued in $7 etc n = split($6, ctl, ":"); if (ctlinnd[ctl[1]] == "") { ## Unknown; update this script! print; next; } ctlinnd_type[ctl[1]]++; ctlinnd_seen++; if (ctl[1] == "k") { ## Newgroup. Process it here so we can get the creator. ctlinnd_new++; ctlinnd_newgroups[ctl[2]] = ctl[4]; next; } if (ctl[1] == "p") { ## Rmgroup. Process it here for symmetry. ctlinnd_rmg++; ctlinnd_rmgroups[ctl[2]] = 1; next; } ## Skip others for now. next; } if ( $6 ~ /.*:.*/ ) { n = split($6, path, ":"); host = path[1]; } else host = $6; if ($7 == "connected") { ## Account for the fact that innd says "local connected ##" ## and then "localhost:## closed" if (host == "local") { host = "localhost"; } innd_connect[host]++; next; } if ($7 == "closed") { innd_seconds[host] += $9; innd_accepted[host] += $11; innd_refused[host] += $13; innd_rejected[host] += $15; innd_chkp[host] = 0; if (cp_innd_chkp[host] == 1) { cp_innd_chkp[host] = 0; innd_points--; } next; } if ($7 == "checkpoint") { cp_innd_seconds[host] = $9; cp_innd_accepted[host] = $11; cp_innd_refused[host] = $13; cp_innd_rejected[host] = $15; if (cp_innd_chkp[host] == 0) { cp_innd_chkp[host] = 1; innd_points++; } next; } if ($6 ~ /\/.*/) { ## Skip; handled by "opened/spawned" below. next; } if ($7 == "flush") { innd_flush[host]++; next; } if ($7 == "timeout") { innd_timeout[host]++; next; } if ($7 == "opened" || $7 == "spawned") { n = split($8, blarg, ":"); innd_feed[host] = blarg[n]; next; } if ($7 == "newgroup") { innd_newgroups++; next; } if ($7 == "rmgroup") { innd_rmgroups++; next; } if ($7 == "paused") { innd_pauses++; next; } if ($7 == "throttled") { innd_throttles++; next; } if ($7 == "reload") { innd_reloads++; next; } if ($7 == "change_group") { innd_change_groups++; next; } if ($7 == "shutdown") { innd_shutdowns++; next; } if ($7 == "starting") { innd_restarts++; if (innd_points != 0) { ## Unfinished checkpoints from before; something crashed. for (s in cp_innd_chkp) { if (cp_innd_chkp[s] == 0) continue; innd_seconds[s] += cp_innd_seconds[s]; innd_accepted[s] += cp_innd_accepted[s]; innd_refused[s] += cp_innd_refused[s]; innd_rejected[s] += cp_innd_rejected[s]; cp_innd_chkp[s] = 0; } innd_points = 0; } next; } if ($7 == "bad_ihave") { innd_bad_ihave[host]++; innd_bad_ihaves = 1; next; } if ($7 == "ihave_from_me") { next; } if ($7 == "bad_messageid") { innd_bad_msgid[host]++; innd_bad_msgids = 1; next; } if ($7 == "bad_sendme") { innd_bad_sendme[host]++; innd_bad_sendmes = 1; next; } if ($7 == "blocked" && $8 == "sleeping") { innd_blocked[host]++; innd_blockeds = 1; next; } if ($7 == "exit" && $8 == "0") { ## Program or process finished normally; don't care. next; } if ($7 == "wakeup" || ($7 == "cant" && ($8 == "write" || $8 == "read"))) { ## Skip; handled by "blocked/sleeping" above. next; } if ($7 == "inactive" || $7 == "descriptors" \ || $7 == "outgoing" || $7 == "running" \ || $7 == "lcsetup" || $7 == "ccsetup" \ || $7 == "rcsetup" || $7 == "readclose" \ || $7 == "flush_all" \ ) { ## Skip; for now. next; } } ## ## BATCHER ## $5 ~ /batcher.*/ { host = $7; ## Since times lines are always followed by stats lines, we ## only do the batcher_site[host]++ and batcher=1 once if ($8 == "times") { batcher_times_user[host] += $10; batcher_times_sys[host] += $12; batcher_times_elapsed[host] += $14; batcher_site[host]++; batcher = 1; next; } if ($8 == "stats") { batcher_num[host] += $10; batcher_articles[host] += $12; batcher_bytes[host] += $14; next; } } ## ## INNXMIT ## $5 ~ /innxmit.*/ { if ( $6 ~ /:/ ) { n = split($6, path, ":"); host = path[1]; } else host = $6; if ($7 == "ihave" && $8 == "failed") { ## ihave failed occurs when the server rejects an article, ## and requests it to be resent at the ihave stage - this ## always indicates a server problem (all it has of the article ## is its message-id) most commonly "out of space" - in that ## case we don't really want to count this as an offered ## article, so remember this happened so we can reduce the ## offered count below. innxmit_ihfail[host] = 1; if ($9 == "436" && $11 == "NNTP" && $13 == "out" && $15 ~ /space/) { innxmit_nospace[host]++; next; } } ## Since stats lines are always followed by times lines we ## only do the innxmit_site[host]++ and innxmit=1 once if ($7 == "stats") { innxmit_offered[host] += $9 - innxmit_ihfail[host]; innxmit_accepted[host] += $11; innxmit_rejected[host] += $13; innxmit_failed[host] += $15; innxmit_ihfail[host] = 0; innxmit_site[host]++; innxmit = 1; next; } if ($7 == "times") { innxmit_times_user[host] += $9; innxmit_times_sys[host] += $11; innxmit_times_elapsed[host] += $13; next; } if ($7 == "requeued") { r = $9; for (i = 10; i < NF; i++) r = r " " $i; innxmit_reQ_host[host]++; innxmit_reQ_reason[r]++; next; } if ($7 == "connect" && $9 == "400" \ && (($10 == "No" && $11 == "space") \ || ($11 == "NNTP" && $13 == "out" && $15 ~ /space/))) { ## There is no startup marked for this. innxmit_site[host]++; innxmit_nospace[host]++; next; } if ($7 == "connect" && $9 == "400" && $10 == "loadav") { ## There is no startup marked for this. innxmit_site[host]++; innxmit_hiload[host]++; next; } if ($7 == "connect" && $9 == "400" && $0 ~ /[Ee][Xx][Pp][Ii][Rr]/) { ## There is no startup marked for this. innxmit_site[host]++; innxmit_expire[host]++; next; } if ($7 == "connect" && $9 == "400") { ## There is no startup marked for this. innxmit_site[host]++; innxmit_crefused[host]++; next; } if ($7 == "connect" && $8 == "failed") { ## There is no startup marked for this. innxmit_site[host]++; innxmit_cfail_host[host]++; ## Later, maybe. #r = $9; #for (i = 10; i < NF; i++) # r = r " " $i; #innxmit_cfail_reason[r]++; next; } if ($7 == "authenticate" && $8 == "failed") { ## There is no startup marked for this. innxmit_site[host]++; innxmit_afail_host[host]++; ## Later, maybe. #r = $9; #for (i = 10; i < NF; i++) # r = r " " $i; #innxmit_afail_reason[r]++; next; } } $5 ~ /rnews.*/ { if ($6 == "rejected") { if ($7 == "connection") { rnews_rejects++; i = 8; if ($8 == "400") i++; n = $i; for (i++; i <= NF; i++) n = n " " $i; rnews_r_reject[n]++; next; } if ($7 == "437") { rnews_bad++; if ($8 == "Unwanted" && $9 == "newsgroup") { rnews_bad_ng++; rnews_bng[$10]++; next; } if ($8 == "Unwanted" && $9 == "distribution") { rnews_bad_dist++; rnews_bdist[$10]++; next; } if ($8 == "Bad" && $9 == "\"Date\"") { rnews_bad_date++; next; } } } if ($6 == "offered") { rnews_hosts[$8]++; rnews_host = 1; next; } } ## ## NNTPLINK ## $5 ~ /.*nntplink.*/ { if ( $6 ~ /:/ ) { n = split($6, path, ":"); host = path[1]; } else host = $6; if ($7 == "EOF") { ## There is no startup marked for this. nntplink_site[host]++; nntplink_eof[host]++; next; } if ($10 == "Broken" && $11 == "pipe") { ## There is no startup marked for this. nntplink_site[host]++; nntplink_bpipe[host]++; next; } if ($7 == "greeted" && $10 == "400" \ && (($11 == "No" && $12 == "space") \ || ($12 == "NNTP" && $14 == "out" && $16 ~ /space/))) { ## There is no startup marked for this. nntplink_site[host]++; nntplink_nospace[host]++; next; } if ($7 == "greeted" && $10 == "400" && $11 == "loadav") { ## There is no startup marked for this. nntplink_site[host]++; nntplink_hiload[host]++; next; } if ($7 == "greeted" && $10 == "400" && $0 ~ /[Ee][Xx][Pp][Ii][Rr]/) { ## There is no startup marked for this. nntplink_site[host]++; nntplink_expire[host]++; next; } if ($7 == "greeted" && $10 == "400") { ## Some other failure, or innd throttle for some local reason. ## There is no startup marked for this. nntplink_site[host]++; nntplink_fail[host]++; next; } if ($7 == "socket():") { ## There is no startup marked for this. nntplink_site[host]++; nntplink_sockerr[host]++; next; } if ($7 == "connection" && $8 == "timed" && $9 == "out") { ## There is no startup marked for this. Fake reason. nntplink_bpipe[host]++; nntplink_site[host]++; next; } if ($7 == "sent" && $8 == "authinfo" && $10 == "exiting") { ## There is no startup marked for this. nntplink_site[host]++; nntplink_auth[host]++; } if ($7 == "sent" && $8 == "IHAVE") { ## An "ihave failure": site rejected the article after the ## IHAVE command; most likely it was out of space. Don't ## count this as an offered article, so remember it. Since ## nntplink keeps trying to send we could get many such ## failures in a single connection. For counting purposes ## we pretend that there were several separate connections. nntplink_ihfail[host]++; if ($11 == "436" && $13 == "NNTP" && $15 == "out" && $17 ~ /space/) { nntplink_fake_connects[host]++; nntplink_nospace[host]++; next; } } ## Since stats lines are always followed by xmit lines, we ## only do the nntplink_site[host]++ and nntplink=1 once if ($7 == "stats") { nntplink_offered[host] += $8 - nntplink_ihfail[host]; nntplink_accepted[host] += $10; nntplink_rejected[host] += $12; nntplink_failed[host] += $14; nntplink_ihfail[host] = 0; if (nntplink_fake_connects[host]) { nntplink_site[host] += nntplink_fake_connects[host]; nntplink_fake_connects[host] = 0; } else { nntplink_site[host]++; } nntplink = 1; next; } if ($7 == "xmit") { nntplink_times_user[host] += $9; nntplink_times_sys[host] += $11; nntplink_times_elapsed[host] += $13; next; } if ($7 == "xfer") { ## We can compute this if we need it, but there isn't ## space in the output table for it #nntplink_offer_min[host] += $9; #nntplink_accept_min[host] += $11; next; } ## 503 is the code for timeouts. if ($11 == "503" || $12 == "Timeout") { nntplink_timeout[host]++; timeout = 1; next; } } ## ## NNTPD ## $5 ~ /nntpd.*/ { if ( $6 ~ /.*:.*/ ) { n = split($6, path, ":"); host = path[1]; } else host = $6; if ($7 == "connect") { nntpd_connect[host]++; nntpd = 1; next; } if ($7 == "times") { nntpd_seconds[host] += $9 + $11; nntpd_elapsed[host] += $13; if (nntpd_connect[host] == 0) nntpd_connect[host]++; nntpd_done[host]++; next; } if ($7 == "ihave_stats") { nntpd_accepted[host] += $9; nntpd_refused[host] += $11; nntpd_rejected[host] += $13; next; } if ($7 == "no" && $8 == "space") { nntpd_nospace[host]++; if (nntpd_connect[host] == 0) nntpd_connect[host]++; nntpd_done[host]++; next; } if ($6 == "no" && $7 == "space") next; ## Rest is likely to be reader stuff; skip for now. } ## ## MTHREADS ## $5 ~ /mthreads.*/ { if ($6 == "Started" && $7 == "mthreads") { mthreads = 1; mthreads_started++; next; } if ($6 == "Processed" && $9 == "added" && $12 == "expired") { mthreads = 1; mthreads_added += $10; mthreads_expired += $13; next; } if ($6 == "Turned" && $8 == "groups" && $9 == "on.") { mthreads = 1; mthreads_turned_on += $7; next; } if ($6 == "Turned" && $8 == "groups" && $9 == "off.") { mthreads = 1; mthreads_turned_off += $7; next; } } ## ## UNKNOWN ## { if (unknowns == 0) { printf("Unknown entries from news log file:\n"); unknowns = 1; } print; } ## ## SUMMARIZE DATA ## NOTE: the following are collected but not used right now: ## innd_flush ## innd_feed ## innd_pauses ## innd_throttles ## innd_newgroups ## innd_rmgroups ## innd_reloads ## innd_timeout ## innd_change_groups ## END { printf("\n"); if (innd) { ## INND control statistics. if (ctlinnd_seen) { printf("Control commands to INND\t(%d total)\n\n", ctlinnd_seen); i = 0; for (m in ctlinnd_type) { printf("\t%13s %4d", ctlinnd[m], ctlinnd_type[m]); if (++i == 3) { i = 0; printf("\n"); } } if (i != 0) printf("\n"); printf("\n"); if (ctlinnd_new) { printf("Newsgroups created:\n"); for (m in ctlinnd_newgroups) printf("\t%-30.30s by %s\n", m, ctlinnd_newgroups[m]); printf("\n"); } if (ctlinnd_rmg) { printf("Newsgroups removed:\n"); for (m in ctlinnd_rmgroups) printf("\t%s\n", m); printf("\n"); } } ## INND exchange statistics. printf("Articles received by server\n"); printf("System Connects Offered Took Refuse Rejct Accpt Elapsed\n"); for ( ; ; ) { s = invalid; for (sortindex in innd_connect) if (innd_connect[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; ninnd_connect += innd_connect[s]; ninnd_accept += innd_accepted[s]; ninnd_refuse += innd_refused[s]; ninnd_reject += innd_rejected[s]; ninnd_ela += innd_seconds[s]; offered = innd_accepted[s] + innd_refused[s] + innd_rejected[s]; ninnd_offered += offered; if (offered == 0) offered = 1; percent_accpt = (innd_accepted[s] * 100) / offered; e_hours = innd_seconds[s] / 3600; e_sec = innd_seconds[s] % 3600; e_min = e_sec / 60; e_sec %= 60; printf("%-20.20s %5d %6d %6d %6d %5d %3d%% %3d:%02d:%02d\n", \ s, innd_connect[s], \ innd_accepted[s] + innd_refused[s] + innd_rejected[s], \ innd_accepted[s], innd_refused[s], innd_rejected[s], \ percent_accpt, e_hours, e_min, e_sec); innd_connect[s] = -1; } e_hours = ninnd_ela / 3600; e_sec = ninnd_ela % 3600; e_min = e_sec / 60; e_sec %= 60; they_offered = ninnd_offered; if (they_offered == 0) they_offered = 1; percent_accpt = (ninnd_accept * 100.0)/ (they_offered + 0.1); printf("\n%-20s %5d %6d %6d %6d %5d %3d%% %3d:%02d:%02d\n\n", \ "TOTALS", ninnd_connect, ninnd_offered, ninnd_accept, \ ninnd_refuse, ninnd_reject, percent_accpt, e_hours, e_min, \ e_sec); } ## Miscellaneous innd statistics. if (innd_bad_msgids) { printf("Bad Message-ID's offered\n"); for ( ; ; ) { s = invalid; for (sortindex in innd_bad_msgid) if (innd_bad_msgid[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("%-20.20s %5d\n", s, innd_bad_msgid[s]); innd_bad_msgid[s] = -1; } printf("\n"); } if (innd_bad_ihaves) { printf("Bad ihave control messages received\n"); for ( ; ; ) { s = invalid; for (sortindex in innd_bad_ihave) if (innd_bad_ihave[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("%-20.20s %5d\n", s, innd_bad_ihave[s]); innd_bad_ihave[s] = -1; } printf("\n"); } if (innd_bad_sendmes) { printf("Ignored sendme control messages received\n"); for ( ; ; ) { s = invalid; for (sortindex in innd_bad_sendme) if (innd_bad_sendme[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("%-20.20s %5d\n", s, innd_bad_sendme[s]); innd_bad_sendme[s] = -1; } printf("\n"); } if (innd_blockeds) { printf("Blocked server feeds\n"); for ( ; ; ) { s = invalid; for (sortindex in innd_blocked) if (innd_blocked[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("%-20.20s %5d\n", s, innd_blocked[s]); innd_blocked[s] = -1; } printf("\n"); } ## NNTPD statistics. if (nntpd) { printf("Articles received by NNTPD\n"); printf("System Connects NSpc Fail Offered Took Refuse Rejct Accpt Elapsed\n"); for ( ; ; ) { s = invalid; for (sortindex in nntpd_connect) if (nntpd_connect[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; nnntpd_connect += nntpd_connect[s]; nnntpd_nospace += nntpd_nospace[s]; nnntpd_accept += nntpd_accepted[s]; nnntpd_refuse += nntpd_refused[s]; nnntpd_reject += nntpd_rejected[s]; nnntpd_ela += nntpd_elapsed[s]; nnntpd_done += nntpd_done[s]; offered = nntpd_accepted[s] + nntpd_refused[s] + nntpd_rejected[s]; nnntpd_offered += offered; if (offered == 0) offered = 1; percent_accpt = (nntpd_accepted[s] * 100) / offered; e_hours = nntpd_elapsed[s] / 3600; e_sec = nntpd_elapsed[s] % 3600; e_min = e_sec / 60; e_sec %= 60; printf("%-20.20s %5d %4d %4d %6d %6d %6d %5d %3d%% %3d:%02d:%02d\n", \ s, nntpd_connect[s], nntpd_nospace[s], \ nntpd_connect[s] - nntpd_done[s], \ nntpd_accepted[s] + nntpd_refused[s] + nntpd_rejected[s], \ nntpd_accepted[s], nntpd_refused[s], nntpd_rejected[s], \ percent_accpt, e_hours, e_min, e_sec); nntpd_connect[s] = -1; } e_hours = nnntpd_ela / 3600; e_sec = nnntpd_ela % 3600; e_min = e_sec / 60; e_sec %= 60; they_offered = nnntpd_offered; if (they_offered == 0) they_offered = 1; percent_accpt = (nnntpd_accept * 100.0)/ (they_offered + 0.1); printf("\n%-20s %5d %4d %4d %6d %6d %6d %5d %3d%% %3d:%02d:%02d\n\n", \ "TOTALS", nnntpd_connect, nnntpd_nospace, \ nnntpd_connect - nnntpd_done, \ nnntpd_offered, nnntpd_accept, nnntpd_refuse, nnntpd_reject, \ percent_accpt, e_hours, e_min, e_sec); } ## Innxmit statistics. if (innxmit) { printf("Articles sent by innxmit\n"); printf("System Offrd Took Toss Fail Pct Elapsed CPU Pct\n"); for ( ; ; ) { s = invalid; for (sortindex in innxmit_site) if (innxmit_offered[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; we_offered = innxmit_offered[s]; if (we_offered == 0) we_offered = 1; they_take = (innxmit_accepted[s] * 100.0) / we_offered; e_hours = innxmit_times_elapsed[s] / 3600; e_sec = innxmit_times_elapsed[s] % 3600; e_min = e_sec / 60; e_sec %= 60; c_hours = (innxmit_times_user[s] + innxmit_times_sys[host]) / 3600; c_sec = (innxmit_times_user[s] + innxmit_times_sys[s]) % 3600; c_min = c_sec / 60; c_sec %= 60; elapsed = innxmit_times_elapsed[s]; if (elapsed == 0) elapsed = 1; pct = ((innxmit_times_user[s] + innxmit_times_sys[s]) * 100.0) / elapsed; printf("%-20.20s %6d %6d %6d %5d %3d%% %3d:%02d:%02d %3d:%02d:%02d %3d%%\n", \ s, innxmit_offered[s], innxmit_accepted[s], \ innxmit_rejected[s], innxmit_failed[s], they_take, \ e_hours, e_min, e_sec, c_hours, c_min, c_sec, pct); ixmt += innxmit_offered[s]; ixmt_accept += innxmit_accepted[s]; ixmt_reject += innxmit_rejected[s]; ixmt_failed += innxmit_failed[s]; ixmt_ela += innxmit_times_elapsed[s]; ixmt_cpu += innxmit_times_user[s] + innxmit_times_sys[s]; innxmit_offered[s] = -1; } we_offered = ixmt; if (we_offered == 0) we_offered = 1; they_take = (ixmt_accept * 100) / we_offered; e_hours = ixmt_ela / 3600; e_sec = ixmt_ela % 3600; e_min = e_sec / 60; e_sec %= 60; c_hours = ixmt_cpu / 3600; c_sec = ixmt_cpu % 3600; c_min = c_sec / 60; c_sec %= 60; if (ixmt_ela == 0) ixmt_ela = 1; pct = (ixmt_cpu * 100.0) / ixmt_ela; printf("\n%-20.20s %6d %6d %6d %5d %3d%% %3d:%02d:%02d %3d:%02d:%02d %3d%%\n\n", \ "TOTALS", ixmt, ixmt_accept, ixmt_reject, ixmt_failed, \ they_take, e_hours, e_min, e_sec, c_hours, c_min, c_sec, pct); printf("\n"); printf("Transmission Connection Attempts ------errors-------------------\n"); printf("System Conn Ok Auth Load Space Expire Connct Other Pct\n"); for ( ; ; ) { s = invalid; for (sortindex in innxmit_site) if (innxmit_site[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; tot = innxmit_site[s]; if (tot == 0) tot = 1; errs = innxmit_afail_host[s] + innxmit_hiload[s] + \ innxmit_nospace[s] + innxmit_cfail_host[s] + \ innxmit_expire[s] + innxmit_crefused[s]; ok = (innxmit_site[s] - errs); printf("%-20.20s %4d %4d %4d %4d %5d %5d %5d %5d %3d%%\n", \ s, innxmit_site[s], ok, innxmit_afail_host[s], \ innxmit_hiload[s], innxmit_nospace[s], innxmit_expire[s], \ innxmit_cfail_host[s], innxmit_crefused[s], \ (100.0 * ok / tot)); ict_tot += innxmit_site[s]; ict_ok += ok; ict_afail += innxmit_afail_host[s]; ict_hiload += innxmit_hiload[s]; ict_nospace += innxmit_nospace[s]; ict_expire += innxmit_expire[s]; ict_crefused += innxmit_crefused[s]; ict_cfail += innxmit_cfail_host[s]; innxmit_site[s] = -1; } tot = ict_tot; if (tot == 0) tot = 1; errs = ict_afail + ict_nospace + ict_hiload + ict_cfail + ict_crefused; printf("\n%-20.20s %4d %4d %4d %4d %5d %5d %5d %5d %3d%%\n\n", \ "TOTALS", ict_tot, ict_ok, ict_afail, ict_hiload, \ ict_nospace, ict_expire, ict_cfail, ict_crefused, \ (100.0 * ict_ok / tot)); } ## Nntplink statistics. if (nntplink) { printf("Articles sent by nntplink\n"); printf("System Offrd Took Toss Fail Pct Elapsed CPU Pct\n"); for ( ; ; ) { s = invalid; for (sortindex in nntplink_site) if (nntplink_offered[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; we_offered = nntplink_offered[s]; if (we_offered == 0) we_offered = 1; they_take = (nntplink_accepted[s] * 100.0) / we_offered; e_hours = nntplink_times_elapsed[s] / 3600; e_sec = nntplink_times_elapsed[s] % 3600; e_min = e_sec / 60; e_sec %= 60; c_hours = (nntplink_times_user[s] + nntplink_times_sys[host]) / 3600; c_sec = (nntplink_times_user[s] + nntplink_times_sys[s]) % 3600; c_min = c_sec / 60; c_sec %= 60; elapsed = nntplink_times_elapsed[s]; if (elapsed == 0) elapsed = 1; pct = ((nntplink_times_user[s] + nntplink_times_sys[s]) * 100.0) / elapsed; printf("%-20.20s %6d %6d %6d %5d %3d%% %3d:%02d:%02d %3d:%02d:%02d %3d%%\n", \ s, nntplink_offered[s], nntplink_accepted[s], \ nntplink_rejected[s], nntplink_failed[s], they_take, \ e_hours, e_min, e_sec, c_hours, c_min, c_sec, pct); nxmt += nntplink_offered[s]; nxmt_accept += nntplink_accepted[s]; nxmt_reject += nntplink_rejected[s]; nxmt_failed += nntplink_failed[s]; nxmt_ela += nntplink_times_elapsed[s]; nxmt_cpu += nntplink_times_user[s] + nntplink_times_sys[s]; nntplink_offered[s] = -1; } we_offered = nxmt; if (we_offered == 0) we_offered = 1; they_take = (nxmt_accept * 100) / we_offered; e_hours = nxmt_ela / 3600; e_sec = nxmt_ela % 3600; e_min = e_sec / 60; e_sec %= 60; c_hours = nxmt_cpu / 3600; c_sec = nxmt_cpu % 3600; c_min = c_sec / 60; c_sec %= 60; if (nxmt_ela == 0) nxmt_ela = 1; pct = (nxmt_cpu * 100.0) / nxmt_ela; printf("\n%-20.20s %6d %6d %6d %5d %3d%% %3d:%02d:%02d %3d:%02d:%02d %3d%%\n\n", \ "TOTALS", nxmt, nxmt_accept, nxmt_reject, nxmt_failed, \ they_take, e_hours, e_min, e_sec, c_hours, c_min, c_sec, pct); printf("Transmission Connection Attempts ------errors-------\n"); printf("System Conn Ok EOF Sock Load Bpipe Space Exp Auth Other Pct\n"); for ( ; ; ) { s = invalid; for (sortindex in nntplink_site) if (nntplink_site[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; tot = nntplink_site[s]; if (tot == 0) tot = 1; errs = nntplink_eof[s] + nntplink_sockerr[s] + \ nntplink_hiload[s] + nntplink_bpipe[s] + \ nntplink_nospace[s] + nntplink_auth[s] + \ nntplink_expire[s] + nntplink_fail[s]; ok = (nntplink_site[s] - errs); printf("%-20.20s %4d %4d %3d %4d %4d %5d %5d %4d %4d %5d %3d%%\n", \ s, nntplink_site[s], ok, nntplink_eof[s], \ nntplink_sockerr[s], nntplink_hiload[s], \ nntplink_bpipe[s], nntplink_nospace[s], \ nntplink_expire[s], nntplink_auth[s], nntplink_fail[s], \ (100.0 * ok / tot)); ct_tot += nntplink_site[s]; ct_ok += ok; ct_eof += nntplink_eof[s]; ct_sockerr += nntplink_sockerr[s]; ct_hiload += nntplink_hiload[s]; ct_bpipe += nntplink_bpipe[s]; ct_nospace += nntplink_nospace[s]; ct_auth += nntplink_auth[s]; ct_expire += nntplink_expire[s]; ct_fail += nntplink_fail[s]; nntplink_site[s] = -1; } tot = ct_tot; if (tot == 0) tot = 1; printf("\n%-20.20s %4d %4d %3d %4d %4d %5d %5d %4d %4d %5d %3d%%\n\n", \ "TOTALS", ct_tot, ct_ok, ct_eof, ct_sockerr, ct_hiload, \ ct_bpipe, ct_nospace, ct_expire, ct_auth, ct_fail, \ (100.0 * ct_ok / tot)); } ## Batcher statistics. if (batcher) { printf("UUCP batches created\n"); printf("System Offrd Arts Bytes Elapsed Cpu Pct\n"); for ( ; ; ) { s = invalid; for (sortindex in batcher_site) if (batcher_site[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; e_hours = batcher_times_elapsed[s] / 3600; e_sec = batcher_times_elapsed[s] % 3600; e_min = e_sec / 60; e_sec %= 60; c_hours = (batcher_times_user[s] + batcher_times_sys[s]) / 3600; c_sec = (batcher_times_user[s] + batcher_times_sys[s]) % 3600; c_min = c_sec / 60; c_sec %= 60; elapsed = batcher_times_elapsed[s]; if (elapsed == 0) elapsed = 1; pct = ((batcher_times_user[s] + batcher_times_sys[s]) * 100.0) / elapsed; printf("%-20.20s %6d %6d %10d %3d:%02d:%02d %3d:%02d:%02d %3d%%\n",\ s, batcher_num[s], batcher_articles[s], batcher_bytes[s], \ e_hours, e_min, e_sec, c_hours, c_min, c_sec, pct); nbatch += batcher_num[s]; nbatch_articles += batcher_articles[s]; nbatch_bytes += batcher_bytes[s]; nbatch_ela += batcher_times_elapsed[s]; nbatch_cpu += batcher_times_user[s] + batcher_times_sys[s]; batcher_site[s] = -1; } e_hours = nbatch_ela / 3600; e_sec = nbatch_ela % 3600; e_min = e_sec / 60; e_sec %= 60; c_hours = nbatch_cpu / 3600; c_sec = nbatch_cpu % 3600; c_min = c_sec / 60; c_sec %= 60; if (nbatch_ela == 0) nbatch_ela = 1; pct = (nbatch_cpu * 100.0) / nbatch_ela; printf("\n%-20.20s %6d %6d %10d %3d:%02d:%02d %3d:%02d:%02d %3d%%\n\n",\ "TOTALS", nbatch, nbatch_articles, nbatch_bytes,\ e_hours, e_min, e_sec, c_hours, c_min, c_sec, pct); } ## Rnews statistics. if (rnews_host) { printf("Rnews articles offered from:\n"); for ( ; ; ) { s = invalid; for (sortindex in rnews_hosts) if (rnews_hosts[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("\t%6d\t%s\n", rnews_hosts[s], s); rnews_hosts[s] = -1; } printf("\n"); } if (rnews_rejects) { printf("Rnews connections rejected %d times\n", rnews_rejects); for ( ; ; ) { s = invalid; for (sortindex in rnews_r_reject) if (rnews_r_reject[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("\t%6d\t%s\n", rnews_r_reject[s], s); rnews_r_reject[s] = -1; } printf("\n"); } if (rnews_bad) { printf("Rnews bad articles: (Total %d)\n", rnews_bad); if (rnews_bad_ng) { printf("Bad newsgroup: %d\n", rnews_bad_ng); for ( ; ; ) { s = invalid; for (sortindex in rnews_bng) if (rnews_bng[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("\t%5d: %s\n", rnews_bng[s], s); rnews_bng[s] = -1; } } if (rnews_bad_dist) { printf("Bad distribution: %d\n", rnews_bad_dist); for ( ; ; ) { s = invalid; for (sortindex in rnews_bdist) if (rnews_bdist[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("\t%5d: %s\n", rnews_bdist[s], s); rnews_bdist[s] = -1; } } if (rnews_bad_date) { printf("Bad date: %d\n", rnews_bad_date); } printf("\n"); } ## NNRP statistics. if (nnrp) { printf("NNRP readership statistics\n"); printf("System Conn Articles Groups Post Rej Elapsed CPU Pct\n"); for ( ; ; ) { s = invalid; for (sortindex in nnrp_connect) if (nnrp_connect[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; ## Report curious pokers elsewhere. if (nnrp_groups[s] == 0 \ && nnrp_articles[s] == 0 \ && nnrp_posts[s] == 0) { nnrp_curious[s] += nnrp_connect[s]; curious = 1; nnrp_connect[s] = -1; continue; } nconn += nnrp_connect[s]; nart += nnrp_articles[s]; ngrp += nnrp_groups[s]; npost += nnrp_posts[s]; nrej += nnrp_rejected[s]; ncpu += (nnrp_times_user[s] + nnrp_times_sys[s]); nela += nnrp_times_elapsed[s]; e_hours = nnrp_times_elapsed[s] / 3600; e_sec = nnrp_times_elapsed[s] % 3600; e_min = e_sec / 60; e_sec %= 60; c_hours = (nnrp_times_user[s] + nnrp_times_sys[s]) / 3600; c_sec = (nnrp_times_user[s] + nnrp_times_sys[s]) % 3600; c_min = c_sec / 60; c_sec %= 60; elapsed = nnrp_times_elapsed[s]; if (elapsed == 0) elapsed = 1; pct = ((nnrp_times_user[s] + nnrp_times_sys[s]) * 100.0) / elapsed; printf("%-20.20s %5d %8d %6d %4d %4d %3d:%02d:%02d %3d:%02d:%02d %3d%%\n",\ s, nnrp_connect[s], nnrp_articles[s], nnrp_groups[s],\ nnrp_posts[s], nnrp_rejected[s], e_hours, e_min, e_sec,\ c_hours, c_min, c_sec, pct); nnrp_connect[s] = -1; } e_hours = nela / 3600; e_sec = nela % 3600; e_min = e_sec / 60; e_sec %= 60; c_hours = ncpu / 3600; c_sec = ncpu % 3600; c_min = c_sec / 60; c_sec %= 60; if (nela == 0) nela = 1; pct = (ncpu * 100.0) / nela; printf("\n%-20.20s %5d %8d %6d %4d %4d %3d:%02d:%02d %3d:%02d:%02d %3d%%\n\n",\ "TOTALS", nconn, nart, ngrp, npost, nrej, e_hours, e_min, \ e_sec, c_hours, c_min, c_sec, pct); } ## Miscellaneous NNRP statistics. if (curious) { printf("Curious NNRP server explorers\n"); printf("System Conn\n"); for ( ; ; ) { s = invalid; for (sortindex in nnrp_curious) if (nnrp_curious[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("%-20.20s %5d\n", s, nnrp_curious[s]); nnrp_curious[s] = -1; } printf("\n"); } if (nnrp_noperms) { printf("NNRP no permission clients\n"); printf("System Conn\n"); for ( ; ; ) { s = invalid; for (sortindex in nnrp_noperm) if (nnrp_noperm[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("%-20.20s %5d\n", s, nnrp_noperm[s]); nnrp_noperm[s] = -1; } printf("\n"); } if (nnrp_unrecs) { printf("NNRP unrecognized commands\n"); printf("System Conn\n"); for ( ; ; ) { s = invalid; for (sortindex in nnrp_unrec) if (nnrp_unrec[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("%-20.20s %5d\n", s, nnrp_unrec[s]); nnrp_unrec[s] = -1; } printf("\n"); } if (nnrp_gethostfails) { printf("NNRP gethostbyname failures\n"); printf("IP Conn\n"); for ( ; ; ) { s = invalid; for (sortindex in nnrp_gethostfail) if (nnrp_gethostfail[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("%-20.20s %5d\n", s, nnrp_gethostfail[s]); nnrp_gethostfail[s] = -1; } printf("\n"); } if (client_timeout) { printf("NNRP client timeouts\n"); printf("System Conn\n"); for ( ; ; ) { s = invalid; for (sortindex in nnrp_timeout) if (nnrp_timeout[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("%-20.20s %5d\n", s, nnrp_timeout[s]); nnrp_timeout[s] = -1; } printf("\n"); } if (server_timeout) { printf("NNTPLINK remote server timeouts\n"); printf("System Conn\n"); for ( ; ; ) { s = invalid; for (sortindex in nntplink_timeout) if (nntplink_timeout[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf("%-20.20s %5d\n", s, nntplink_timeout[s]); nntplink_timeout[s] = -1; } printf("\n"); } ## MTHREADS statistics. if (mthreads) { printf("Mthreads: Starts Groups on Groups off Articles Expired\n"); printf("%18d%12d%12d%12d%12d\n", mthreads_started, mthreads_turned_on, \ mthreads_turned_off, mthreads_added, mthreads_expired); printf("\n"); } ## Group readership statistics. if (nnrp_readers) { for (g in nnrp_group_request) { x = length(g); if (x > max) max = x; i = index(g, "."); if (i > 0) top = substr(g, 1, i - 1); else top = g; category[top] += nnrp_group_request[g]; } fmt = sprintf("%%-%ds %%5d\n", max); printf("Newsgroup request counts (by category)\n"); for ( ; ; ) { s = invalid; for (sortindex in category) if (category[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf(fmt, s, category[s]); category[s] = -1; } printf("\n"); printf("Newsgroup request counts (by newsgroup)\n"); for ( ; ; ) { s = invalid; for (sortindex in nnrp_group_request) if (nnrp_group_request[sortindex] >= 0 && sortindex < s) s = sortindex; if (s == invalid) break; printf(fmt, s, nnrp_group_request[s]); nnrp_group_request[s] = -1; } printf("\n"); } printf("\n"); }