home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Tools / statgen / slowhosts.awk < prev    next >
Encoding:
AWK Script  |  1991-12-18  |  3.2 KB  |  144 lines

  1. #! /bin/sh
  2.  
  3. #
  4. # Find who is the slowest of the slow...
  5. #
  6. #
  7. nawk '
  8. BEGIN { FS = "|" 
  9.     days[0] = 0
  10.     days[1] = 31
  11.     days[2] = days[1] + 28
  12.     days[3] = days[2] + 31
  13.     days[4] = days[3] + 30
  14.     days[5] = days[4] + 31
  15.     days[6] = days[5] + 30
  16.     days[7] = days[6] + 31
  17.     days[8] = days[7] + 31
  18.     days[9] = days[8] + 30
  19.     days[10] = days[9] + 31
  20.     days[11] = days[10] + 30
  21.     days[12] = days[11] + 31
  22. }
  23.     { ctime = $1
  24.       if(!starttime)
  25.         starttime = ctime
  26.     }
  27. $2 == "Deliv" {
  28. # Format
  29. # date-time|Deliv|msgid|inchan|outchan|p1id|size|sender|inmta|recip|outmta|
  30. # 1         2     3     4      5       6    7    8      9     10    11
  31. # sub-time|queue-time
  32. # 12       13
  33.     next
  34. }
  35. $2 == "DR" {
  36. # Format
  37. # date-time|DR|type|msgid|p1id|size|inchan|dest|inhost|outchan|src|host|
  38. # 1         2  3    4     5    6    7      8    9      10      11  12
  39. # cchan|reason|diag|mesg
  40. # 13    14     15   16
  41. # cchan|submit-time|queued-time
  42. # 13    14        15
  43.  
  44.     next
  45. }
  46. $2 == "ok" {
  47. # Format
  48. # date-time|ok|msgid|inchan|outchan|p1id|size|sender|inmta|recip|outmta|
  49. # 1        2  3     4        5        6     7    8         9     10    11
  50. # msg|submit-time
  51. # 12  13
  52.     inmta = $9
  53.     msgid= $3
  54.     subtime = $13
  55.     if (inmtamsg[inmta msgid] == 0) {
  56.         inmtamsg[inmta msg] = 1
  57.         t1 = tdiff(subtime, ctime)
  58.         if (! (inmta in mintime)) {
  59.             mintime[inmta] = 999999999
  60.             if (length(inmta) > maxmtalen)
  61.                 maxmtalen = length(inmta)
  62.         }
  63.         if (t1 < mintime[inmta])
  64.             mintime[inmta] = t1
  65.         if (t1 > maxtime[inmta])
  66.             maxtime[inmta] = t1
  67.         countmta[inmta] ++
  68.         avrgtime[inmta] = \
  69.             (avrgtime[inmta] * (countmta[inmta]-1) / countmta[inmta])\
  70.             + t1/countmta[inmta]
  71.     }
  72.     next
  73. }
  74.     { error( "ignore line " NR $0) }
  75. func error(mesg) {
  76.     print mesg | "cat 1>&2"
  77. }
  78.  
  79. func line(c, n,        i, str) {
  80.     for (i = 0; i < n; i++)
  81.         str = str c
  82.     print str
  83. }
  84. func tdiff(t1,t2,    time1,time2) {
  85.     split(t1, t1pts, ":")
  86.     split(t2, t2pts, ":")
  87.     time1 = days[t1pts[1]-1] * 24 * 3600
  88.     time1 += t1pts[2] * 24 * 3600
  89.     time1 += t1pts[3] * 3600
  90.     time1 += t1pts[4] * 60
  91.     time1 += t1pts[5]
  92.     time2 = days[t2pts[1]-1] * 24 * 3600
  93.     time2 += t2pts[2] * 24 * 3600
  94.     time2 += t2pts[3] * 3600
  95.     time2 += t2pts[4] * 60
  96.     time2 += t2pts[5]
  97.     return time2 - time1
  98. }
  99. func totime(secs,    strtime) {
  100.     if (secs < 0) {
  101.         strtime = "-"
  102.         secs = -secs
  103.     }
  104.     else strtime = ""
  105.     if (secs > 60*60*24) {
  106.         strtime = strtime sprintf("%2d ", secs/(60*60*24))
  107.         secs %= 60*60*24
  108.     }
  109.     if (secs > 60*60) {
  110.         strtime = strtime sprintf("%2d:", secs/(60*60))
  111.         secs %= 60*60
  112.     }
  113.     if (secs > 60) {
  114.         strtime = strtime sprintf(strtime ? "%02d:" : "%2d:", secs/60)
  115.         secs %= 60
  116.     }
  117.     strtime = strtime sprintf(strtime ? "%02d" : "%2d", secs)
  118.     return strtime
  119. }    
  120. END {
  121.     line("=", 80)
  122.     split(starttime, part1, ":")
  123.     split(ctime, part2, ":")
  124.     msg = sprintf(\
  125.         "Statistics from %s/%s %d:%02d:%02d to %s/%s %d:%02d:%02d",\
  126.         part1[1], part1[2], part1[3], part1[4], part1[5],\
  127.         part2[1], part2[2], part2[3], part2[4], part2[5])
  128.     printf "%" (length(msg) - 80) / 2 "s%s\n", "", msg
  129.     line("=",80)
  130.  
  131.     printf "\n\t\tDelay time in receiving messages"
  132.  
  133.     printf "\n\n%-" maxmtalen "s %5s %12s %12s %12s\n",\
  134.         "MTA", "Msgs", "Min", "Max", "Avrg"
  135.     line("-", 80)
  136.     for (i in countmta)
  137.         printf "%-" maxmtalen "s %5d %12s %12s %12s\n", \
  138.             i, countmta[i], \
  139.             totime(mintime[i]), \
  140.             totime(maxtime[i]), \
  141.             totime(avrgtime[i])
  142. }
  143. ' $*
  144.