<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hurlster.com/wiki/index.php?action=history&amp;feed=atom&amp;title=MRTG</id>
	<title>MRTG - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://hurlster.com/wiki/index.php?action=history&amp;feed=atom&amp;title=MRTG"/>
	<link rel="alternate" type="text/html" href="https://hurlster.com/wiki/index.php?title=MRTG&amp;action=history"/>
	<updated>2026-05-27T18:57:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://hurlster.com/wiki/index.php?title=MRTG&amp;diff=2568&amp;oldid=prev</id>
		<title>Gqwill69: /* 95.pl */</title>
		<link rel="alternate" type="text/html" href="https://hurlster.com/wiki/index.php?title=MRTG&amp;diff=2568&amp;oldid=prev"/>
		<updated>2014-02-24T20:28:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;95.pl&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Multi Router Traffic Grapher&lt;br /&gt;
&lt;br /&gt;
== 95th Percentile ==&lt;br /&gt;
=== Patch ===&lt;br /&gt;
Below is the patch to apply to the main &amp;#039;&amp;#039;mrtg&amp;#039;&amp;#039; file.&lt;br /&gt;
 # cd /usr/bin&lt;br /&gt;
 # nano mrtg-2.17.3_95patch&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--- mrtg   2014-02-24 10:07:34.000000000 -0600&lt;br /&gt;
+++ mrtg.95        2014-02-24 11:13:58.497671950 -0600&lt;br /&gt;
@@ -1445,7 +1445,7 @@&lt;br /&gt;
        $avin, $avout, $avmxin, $avmxout, $avpercent, &lt;br /&gt;
        $cuin, $cuout, $cupercent, $uptime, $name, $LOC) = @_;&lt;br /&gt;
   &lt;br /&gt;
-    my($VERSION,$Today,$peri);&lt;br /&gt;
+    my($VERSION,$Today,$peri,$nf);&lt;br /&gt;
   &lt;br /&gt;
     my($persec);&lt;br /&gt;
 &lt;br /&gt;
@@ -1505,6 +1505,8 @@&lt;br /&gt;
 &lt;br /&gt;
     $Today=&amp;amp;$LOC(datestr(time));&lt;br /&gt;
     $VERSION = &amp;quot;2.17.3&amp;quot;;&lt;br /&gt;
+    open NF, &amp;quot;$$cfg{&amp;#039;workdir&amp;#039;}${main::SL}$$rcfg{&amp;#039;directory&amp;#039;}{$router}$router.95&amp;quot; or die &amp;quot;Could not open percentile file, $!&amp;quot;;&lt;br /&gt;
+    $nf=&amp;lt;NF&amp;gt;;&lt;br /&gt;
     open (HTML,&amp;quot;&amp;gt;$$cfg{&amp;#039;htmldir&amp;#039;}$$rcfg{&amp;#039;directory&amp;#039;}{$router}$router.$$rcfg{&amp;#039;extension&amp;#039;}{$router}&amp;quot;) || &lt;br /&gt;
       do { warn (&amp;quot;$NOW: WARNING: Writing $router.$$rcfg{&amp;#039;extension&amp;#039;}{$router}: $!&amp;quot;);&lt;br /&gt;
           next };&lt;br /&gt;
@@ -1679,6 +1681,7 @@&lt;br /&gt;
           &amp;quot;,&amp;lt;br /&amp;gt;\n&amp;quot;.&lt;br /&gt;
         &amp;amp;$LOC(&amp;quot;at which time $namestring had been up for &amp;lt;strong&amp;gt;$uptime&amp;lt;/strong&amp;gt;.&amp;quot;)&lt;br /&gt;
     }&lt;br /&gt;
+    print HTML &amp;quot;&amp;lt;br&amp;gt;Last 30 days usage (Metered 95%):&amp;lt;font color=\&amp;quot;red\&amp;quot;&amp;gt; $nf kb/sec&amp;lt;/font&amp;gt;&amp;quot;;&lt;br /&gt;
     print HTML &amp;quot;&amp;lt;/p&amp;gt;\n&amp;lt;!-- End Head --&amp;gt;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
     my %sample= (&amp;#039;d&amp;#039; =&amp;gt; &amp;quot;`Daily&amp;#039; Graph (&amp;quot;.$interval.&amp;#039; Minute&amp;#039;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 # patch &amp;lt; mrtg-2.17.3_95patch&lt;br /&gt;
&lt;br /&gt;
=== 95.pl ===&lt;br /&gt;
 # cd /var/www/mrtg&lt;br /&gt;
 # nano 95.pl&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
#  For more info about this script, see http://www.seanadams.com&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$basedir=  &amp;quot;/var/www/mrtg/$ARGV[0]&amp;quot;;             # This directory where mrtg saves its .log and .html files&lt;br /&gt;
$snapshots=&amp;quot;/var/www/mrtg/$ARGV[0]/snapshots&amp;quot;;   # Where 95.pl will save a daily copy of the .log files&lt;br /&gt;
&lt;br /&gt;
$today=`date +\%Y\%m\%d`;&lt;br /&gt;
chop $today;&lt;br /&gt;
$snapdir=&amp;quot;$snapshots/$today&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if (-d $basedir) { &lt;br /&gt;
 } else {&lt;br /&gt;
        print &amp;quot;\t$basedir does not exist or is a file!\n&amp;quot;;&lt;br /&gt;
        exit 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
`mkdir $snapshots` if (!-d$snapshots);&lt;br /&gt;
`mkdir $snapdir` if (!-d$snapdir);&lt;br /&gt;
&lt;br /&gt;
opendir WWW, $basedir;&lt;br /&gt;
foreach $logname (readdir(WWW)) {&lt;br /&gt;
  next if (!($logname=~/\.log$/));&lt;br /&gt;
  #print &amp;quot;$logname\n&amp;quot;;&lt;br /&gt;
  open INFILE, &amp;quot;$basedir/$logname&amp;quot; || die &amp;quot;Couldn&amp;#039;t read $basedir/$logname&amp;quot;;&lt;br /&gt;
  open OUTFILE, &amp;quot;&amp;gt;$snapdir/$logname&amp;quot; || die &amp;quot;Couldn&amp;#039;t write to $snapdir/$logname&amp;quot;;&lt;br /&gt;
  $now=&amp;lt;INFILE&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
  for ($i=1;$i&amp;lt;=288;$i++) {          # 288 five minute samples for a 24hr window&lt;br /&gt;
    $sample=&amp;lt;INFILE&amp;gt;;&lt;br /&gt;
    chop $sample;&lt;br /&gt;
    $sample=~/(\d+) \d+ \d+ (\d+) (\d+)/ || die &amp;quot;Couldn&amp;#039;t parse $basedir/$logname&amp;quot;;&lt;br /&gt;
    print OUTFILE &amp;quot;$1 $2 $3\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  close INFILE;&lt;br /&gt;
  close OUTFILE;&lt;br /&gt;
  } &lt;br /&gt;
&lt;br /&gt;
opendir SNAPSHOTS, &amp;quot;$snapshots&amp;quot;;&lt;br /&gt;
foreach $date (readdir(SNAPSHOTS)) {&lt;br /&gt;
  next if ($date eq &amp;#039;.&amp;#039;);&lt;br /&gt;
  next if ($date eq &amp;#039;..&amp;#039;);&lt;br /&gt;
  push @dates,$date;&lt;br /&gt;
  }&lt;br /&gt;
@dates=sort {$a&amp;lt;=&amp;gt;$b} @dates;&lt;br /&gt;
while ((@dates)&amp;gt;30) {&lt;br /&gt;
  shift(@dates);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
foreach $date (@dates) {&lt;br /&gt;
  opendir SNAPSHOTS, &amp;quot;$snapshots/$date&amp;quot;;&lt;br /&gt;
  foreach $log (readdir(SNAPSHOTS)) {&lt;br /&gt;
    next if ($log eq &amp;#039;.&amp;#039;);&lt;br /&gt;
    next if ($log eq &amp;#039;..&amp;#039;);&lt;br /&gt;
    open LOG, &amp;quot;$snapshots/$date/$log&amp;quot;;&lt;br /&gt;
    $log=~s/\.log//;&lt;br /&gt;
    $data{$log}.=join(&amp;#039;&amp;#039;,&amp;lt;LOG&amp;gt;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
foreach $target (keys(%data)) {&lt;br /&gt;
  @lines=split(/\n/,$data{$target});&lt;br /&gt;
  @samples=();&lt;br /&gt;
  %samples=();&lt;br /&gt;
  foreach $line (@lines) {&lt;br /&gt;
    ($time,$in,$out)=split(/\s+/,$line);&lt;br /&gt;
    if ($in&amp;gt;$out) {&lt;br /&gt;
      $samples{$time}=$in;                 #filter identical times using a hash&lt;br /&gt;
      } else {    &lt;br /&gt;
      $samples{$time}=$out;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  foreach $key (keys(%samples)) {&lt;br /&gt;
    push @samples,$samples{$key};&lt;br /&gt;
    }&lt;br /&gt;
  $nfindex=int((@samples)*.95);&lt;br /&gt;
  @sorted=sort {$a&amp;lt;=&amp;gt;$b} @samples;&lt;br /&gt;
  $nf=int($sorted[$nfindex]*8/1024*100)/100;  &lt;br /&gt;
  open DATA95, &amp;quot;&amp;gt;$basedir/$target.95&amp;quot;;&lt;br /&gt;
  print DATA95 &amp;quot;$nf&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cron ===&lt;br /&gt;
 # nano /etc/cron.d/mrtg&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Run MRTG every five minutes:&lt;br /&gt;
*/5  *  *  *  *  root  /usr/bin/mrtg  /etc/mrtg.cfg&lt;br /&gt;
&lt;br /&gt;
# Run 95.pl every hour, at one minute past the hour&lt;br /&gt;
1    *  *  *  *  root  /var/www/mrtg/95.pl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Gqwill69</name></author>
	</entry>
</feed>