vnstatd
Console-based network traffic monitor that keeps statistics of network usage
Server
Edit 'vnstati-generate.sh' - Set active network interfrace under interface, use below command for print active nic
ip addr | awk '/state UP/ {print $2}' | sed 's/.$//'
Add below line to cronie: (will execute script every 5 minutes)
*/5 * * * * /path/to/www/vnstati-generate.sh
Create a folder in your webroot and copy index.html into it
mkdir -p /path/to/www/vnstati
Create vnstat.html
cat << "EOF" > /path/to/www/vnstat.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Nr1 - Bandwidth Dashboard</title>
<style>
body {
text-align: center;
}
</style>
</head>
<body>
<h3>Overview</h3>
<img src="/path/to/www/vnstat-summary.png">
<h3>Five minutes</h3>
<img src="/path/to/www/vnstat-fiveminutes.png">
<h3>Hourly</h3>
<img src="/path/to/www/vnstat-hourly.png">
<h3>Hourly - Graph</h3>
<img src="/path/to/www/vnstat-hourly-graph.png">
<h3>Daily</h3>
<img src="/path/to/www/vnstat-daily.png">
<h3>Monthly</h4>
<img src="/path/to/www/vnstat-monthly.png">
<h3>Yearly</h4>
<img src="/path/to/www/vnstat-yearly.png">
</body>
</html>
EOF
Execute script manually for create your pictures
bash /var/www/localhost/htdocs/vnstati
- Browse to http://server/vnstati
Installation
Install `vnstat``
gd useflag gives us vnstati binary
echo "net-analyzer/vnstat gd" > /etc/portage/package.use/vnstat
emerge --ask vnstat
Modify configuration file
cat <<"EOF" > /etc/vnstat.conf
Interface "eno1"
DatabaseDir "/var/lib/vnstat"
Locale "-"
DayFormat "%Y-%m-%d"
MonthFormat "%Y-%m"
TopFormat "%Y-%m-%d"
RXCharacter "%"
TXCharacter ":"
RXHourCharacter "r"
TXHourCharacter "t"
UnitMode 2
RateUnit 0
RateUnitMode 1
OutputStyle 3
DefaultDecimals 2
HourlyDecimals 1
HourlySectionStyle 2
Sampletime 5
QueryMode 0
List5Mins 24
ListHours 24
ListDays 30
ListMonths 12
ListYears 0
ListTop 10
DaemonUser "vnstat"
DaemonGroup "vnstat"
BandwidthDetection 1
MaxBandwidth 1024
MaxBWethnone 8
5MinuteHours 48
HourlyDays 4
DailyDays 62
MonthlyMonths 25
YearlyYears -1
TopDayEntries 20
UpdateInterval 20
PollInterval 5
SaveInterval 5
OfflineSaveInterval 30
MonthRotate 1
MonthRotateAffectsYears 0
CheckDiskSpace 1
BootVariation 15
TrafficlessEntries 1
TimeSyncWait 5
BandwidthDetectionInterval 5
SaveOnStatusChange 1
UseLogging 2
CreateDirs 1
UpdateFileOwner 1
LogFile "/var/log/vnstat/vnstat.log"
PidFile "/run/vnstat/vnstat.pid"
64bitInterfaceCounters -2
DatabaseWriteAheadLogging 0
DatabaseSynchronous -1
HeaderFormat "%Y-%m-%d %H:%M"
HourlyRate 1
SummaryRate 1
TransparentBg 0
Background "23252D"
CEdge "332F41"
CHeader "606060"
CHeaderTitle "FFFFFF"
CHeaderDate "FFFFFF"
CText "000000"
CLine "B0B0B0"
CLineL "-"
CRx "92CF00"
CTx "606060"
CRxD "-"
CTxD "-"
EOF
Usage
Show 5 minutes
vnstat --fiveminutes [limit]
Show hours
vnstat --hours [limit]
Show hours graph
vnstat --hoursgraph
Show days
vnstat --days [limit]
Show months
vnstat --months [limit]
Show years
vnstat --years [limit]
Show top days
vnstat --top [limit]
Set list begin date
vnstat --begin <date>
Set list end date
vnstat --end <date>
Show 95th percentile
vnstat --95th
Show simple parsable format
vnstat --oneline [mode]
Show database in json format
vnstat --json [mode] [limit]
Show database in xml format
vnstat --xml [mode] [limit]
Alert if limit is exceeded
vnstat --alert <output> <exit> <type> <condition> <limit> <unit>
Calculate traffic
vnstat --traffic [time]
Show transfer rate in real time
vnstat --live [mode]
Select interface (default: eno1)
vnstat --iface <interface>
Vnstati Generate Html Page
cat <<"EOF" > ~/vnstati-generate.sh
#!/bin/bash
INTERFACE="eno1"
VNSTATI="/usr/bin/vnstati"
FILENAME="vnstat"
PATH="/mnt/usb/git2/vnstati"
check_requirements() {
for requirements in crontab vnstat vnstati vnstatd; do
hash "$requirements" &>/dev/null ||
echo "$requirements is required to be installed, exiting..."
exit 1
done
}
check_paths() {
DIR="/tmp/vnstat"
if [[ ! -d "$DIR" ]]; then
echo "Creating /tmp/vnstat"
mkdir -vp /tmp/vnstat
fi
}
check_permissions() {
vnstatOwner=$(/usr/bin/stat -c '%U:%G' /tmp/vnstat)
if [[ $vnstatOwner != "vnstat:vnstat" ]]; then
chown -R vnstat:vnstat /tmp/vnstat/
fi
}
check_root() {
if [[ ${EUID} -ne 0 ]]; then
printf "%s\n" "$0: internal error -- root privileges is required for this script"
exit
fi
}
# - NOTICE FOR CRONIE FUNCTION
# -
# Lets skip this part for public script until later, lazy cow
# -
#check_cronie() {
# if [[ $(crontab -l | grep -iq "vnstat"; echo $?) == 1 ]]; then
# set -f
# echo $(crontab -l ; echo '*/5 * * * * /path/vnstati-generate.sh') | crontab -
# set +f
# fi
#}
#check_requirements
check_paths
check_permissions
check_root
##########################################################
# yay, now vnstati will do the real real job ####
##########################################################
${VNSTATI} -s -i "$INTERFACE" -o "${PATH}/${FILENAME}-summary.png"
${VNSTATI} -m -i "$INTERFACE" -o "${PATH}/${FILENAME}-top-days.png"
${VNSTATI} -5 -i "$INTERFACE" -o "${PATH}/${FILENAME}-fiveminutes.png"
${VNSTATI} -h -i "$INTERFACE" -o "${PATH}/${FILENAME}-hourly.png"
${VNSTATI} -hg -i "$INTERFACE" -o "${PATH}/${FILENAME}-hourly-graph.png"
${VNSTATI} -d -i "$INTERFACE" -o "${PATH}/${FILENAME}-daily.png"
${VNSTATI} -m -i "$INTERFACE" -o "${PATH}/${FILENAME}-monthly.png"
${VNSTATI} -y -i "$INTERFACE" -o "${PATH}/${FILENAME}-yearly.png"
Create vnstatd for /etc/vnstat.conf
cat << "EOF" > ~/vnstatd
# /etc/conf.d/vnstatd: config file for /etc/init.d/vnstatd
VNSTATD_CONFIGFILE="/etc/vnstat.conf"
VNSTATD_PIDFILE="/run/vnstat/vnstatd.pid"
VNSTATD_OPTS=""
SSD_STARTWAIT=500
EOF
Make the file executable and run it
chmod +x ~/vnstati-generate.sh
bash ~/vnstati-generate.sh