Whatis Gnuplot:
As defined the Wikipedia. …
Gnuplot is a command-line program that can generate two- and three-dimensional plots of functions, data, and data fits. It is frequently used for publication-quality graphics as well as education. The program runs on all major computers and operating systems (GNU/Linux, Unix, Microsoft Windows, Mac OS X, and others).
I remember when I got in love with the MRTG and I spent many nights in mastering this giant. MRTG is overall a very good graphing too graph about any device but it usually works with snmp (and in some cases with shell scripts too). But what if I have data in a file with simple human readable format and I want to plot different columns in it? MRTG will not help in such cases, Gnuplot will come to rescue :)
I used Gnuplot to graph user download for the current month, In this example user data is taken from MYSQL radius DB and then graphed/plotted with Gnuplot.
As always being a duffer , dumber and incompetent, It took me 2-3 Days of continuous efforts to make it as a single script to make it bundled package.
Requirements for this script:
[You can modify it as per your requirements very easily, I just made it as per my own requirements : D ]
- Linux / Ubuntu
- Mysql with Radius DB
- Gnuplot
What this script will do ?
This script will take accounting data for the specified users for the current month by auto detecting the month/year.The file will look something like following
2015-03-01 1688961371 937706875
2015-03-02 2989190965 2974464964
2015-03-04 534479492 31747041
2015-03-05 809968366 170112567
2015-03-06 2189812711 1555484772
First column is DATE
Second column is user DOWNLOADED data in bytes
Third column is user UPLOADED data in bytes
Then it will save this accounting data in /tmp/USERNAME.TXT (Username is what supplied by the user)
Then gnuplot will start its magic and will graph the data based on the supplied data.
To install Gnuplot on Ubuntu , issue following command
apt-get install -y gnuplot
Now create bash script as follows
mkdir /temp touch /temp/usergraph.sh nano /temp/usergraph.sh
and paste following. Make sure to change things according to your network
#!/bin/sh # Freeradius / Mysql user graph ON THE FLY using GNUPLOT # It will also detect current year and current month and will pull only current time data # You can modify this function by providing $2 function in the sql command # By Syed Jahanzaib / aacable [at] hotmail.com # Last modified on 5th June, 2015 # Defining BASH Variables SQLUSER="root" SQLPASS="sqlpassword" SQLHOST="localhost" # Date functions to find current date, month year NOW=$(date) MONTH=$(date +"-%m") CMONTH=`echo $MONTH | sed -e 's/-//g'` YEAR=$(date +"-%Y") CYEAR=`echo $YEAR | sed -e 's/-//g'` FMONTH=$(date +"%B") FULLMONTH=`echo $FMONTH # | sed -e 's/-//g'` # Name of file in which mysql will dump the user accounting data for the current month TMP="/tmp/$1.txt" # Fetch Accounting Data from MYSQL Freeradius radius DB, by using current Year/Month using username provide with the script , and output to file mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST -e "use radius; SELECT SQL_CALC_FOUND_ROWS date, SUM(allbytesdl) - COALESCE(SUM(specbytesdl), 0), SUM(allbytesul) - COALESCE(SUM(specbytesul), 0), SUM(alltime) - COALESCE(SUM(spectime), 0) FROM ( SELECT LEFT(radacct.acctstarttime, 10) AS date, acctoutputoctets AS allbytesdl, SUM(dlbytes) AS specbytesdl, acctinputoctets AS allbytesul, SUM(ulbytes) AS specbytesul, radacct.acctsessiontime AS alltime, SUM(rm_radacct.acctsessiontime) AS spectime FROM radacct LEFT JOIN rm_radacct ON rm_radacct.radacctid = radacct.radacctid WHERE LEFT(radacct.acctstarttime, 7) LIKE '$CYEAR-$CMONTH%' AND radacct.username LIKE '$1' AND FramedIPAddress LIKE '%' AND CallingStationId LIKE '%' GROUP BY radacct.radacctid ) AS tmp GROUP BY date LIMIT 0, 50;" |awk '{print $1,$2,$3}' > $TMP sed '1d' -i $TMP # Run GNUPLOT SCRIPT on the FLY / by zaib gnuplot << EOF reset set terminal jpeg size 1600,600 # Set output according to your requirement, like you can create file with the username for easier identification set output "/var/www/radius.jpg" set xdata time set timefmt "%Y-%m-%d" set format x "%d/%m" set xtics 86400 set xtics rotate by -45 set xlabel "Date (day/month)" set ylabel "Data Downloaded in GB" set title "$1 - Download/Upload Report $FULLMONTH $YEAR\nThis report was created on $NOW\nPowered by Syed Jahanzaib / aacable@hotmail.com" set key outside set grid set style data histogram set style histogram cluster gap 1 set style fill solid set boxwidth 0.9 plot "$TMP" using 1:(\$2/2**30):(sprintf("%.2f", \$2/2**30)) w boxes title "Download" lw 10, \ "$TMP" using 1:(\$3/2**30):(sprintf("%.2f", \$3/2**30)) w boxes lw 6 title "Upload", \ "$TMP" using 1:(\$2/2**30):(sprintf("%.2f", \$2/2**30)) w labels notitle tc rgb 'red', \ "$TMP" using 1:(\$3/2**30):(sprintf("%.2f", \$3/2**30)) w labels notitle tc rgb 'green' EOF # GNUPLOT Script ends here # Thank you : )
Running the SCRIPT
Now execute the script by
/temp/usergraph.sh USERNAME
(like usergraph.sh zaib)
If everything goes well and you dont’ see any errors after executing this script, then you can view the output by
That’s it …
I showed the very basic usage of Gnuplot. Very Very Basic Level of it. This is only what I have learned so far. But Gnuplot can do things beyond your imagination. Look at this gallery.
http://commons.wikimedia.org/wiki/Category:Gnuplot_diagrams
Gnuplot is a very good and customizable tool which is used all over the world to create simple OR very complex graphs in a go. Above all good part is that it can take data from local files and all can be done via scripting or terminal.
You should give it a try :)
Regard’s
Syed Jahanzaib
Filed under: Linux Related, Radius Manager
