vnStat & vnStati¶
Installation¶
apt install vnstat vnstati
Webseite¶
Um die Statistik auf dem Server anzuzeigen ändern wir in den Dateien /etc/apache2/sites-available/000-default.conf
und /etc/apache2/sites-available/default-ssl.conf
die Dokumentenwurzel vom Webserver.
DocumentRoot /var/www/vnstat
Nun legen wir noch das Verzeichnis /var/www/vnstat
mit mkdir -p /var/www/vnstat
an.
Aktualisierung¶
Um die Grafiken für die Statistiken zu aktualisieren lassen wir einen Cronjob alle 5 Minuten ein Script ausführen.
Mit crontab -e
legen wir einen Cronjob an und tragen dort folgendes ein.
*/5 * * * * /root/scripts/update-vnstat-graphs.sh
Wir erstellen ein Script unter /root/scripts
mit dem Namen update-vnstat-graphs.sh
mit folgendem Inhalt.
Achtung
Das Script mit chmod +x update-vnstat-graphs.sh
ausführbar machen!
#!/usr/bin/env bash
# Copyright 2016 - 2016 Tobias Benzin tbenzin@digital-nerv.net
# Rally Vincent rvincent@digital-nerv.net
# This file is managed by Salt, do not edit.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
interfaces=$(ls /var/lib/vnstat/)
webroot=/var/www/vnstat
for interface in ${interfaces[@]}; do
vnstati -i ${interface} -h -o ${webroot}/${interface}_hourly.png
vnstati -i ${interface} -d -o ${webroot}/${interface}_daily.png
vnstati -i ${interface} -m -o ${webroot}/${interface}_monthly.png
vnstati -i ${interface} -t -o ${webroot}/${interface}_top10.png
vnstati -i ${interface} -s -o ${webroot}/${interface}_summary.png
done
cat > ${webroot}/index.html <<EOT
<!DOCTYPE html>
<html lang="en">
<head>
<title>Network Traffic</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style>
body {
margin: 0;
padding: 0;
white-space: nowrap;
}
div {
display: inline-block;
vertical-align: top;
}
img {
max-width: 100%;
height: auto;
}
</style>
</head>
<body>
EOT
for interface in ${interfaces[@]}; do
sed s/interface/${interface}/g >> ${webroot}/index.html <<EOT
<div>
<img src="interface_summary.png" alt="Traffic Summary" /><br>
<img src="interface_monthly.png" alt="Traffic per Month" /><br>
<img src="interface_hourly.png" alt="Traffic per Hour" /><br>
<img src="interface_top10.png" alt="Traffic Top 10" /><br>
<img src="interface_daily.png" alt="Traffic per Day" />
</div>
EOT
done
cat >> ${webroot}/index.html <<EOT
</body>
</html>
EOT
Salt State File¶
vnstat.sls
# vnStat & vnStati
{% set vnstat = salt['grains.filter_by']({
'Debian': {'pkg': 'vnstat', 'srv': 'vnstat'}
}, default='Debian') %}
{{ vnstat.pkg }}:
pkg.installed:
- name: {{ vnstat.pkg }}
service.running:
- name: {{ vnstat.srv }}
- enable: True
- watch:
- file: /etc/vnstat.conf
- cmd: init-vnstat-{{ pillar['network']['primary']['interface'] }}
- cmd: init-vnstat-{{ pillar['network']['bridge']['interface'] }}
{% if pillar['network']['mesh']['hwaddress'] is defined %}
- cmd: init-vnstat-{{ pillar['network']['batman']['interface'] }}
- cmd: init-vnstat-{{ pillar['network']['mesh']['interface'] }}
{% endif %}
{% if pillar['exit']['type'] != 'gre' %}
- cmd: init-vnstat-{{ pillar['network']['exit']['interface'] }}
{% endif %}
/etc/vnstat.conf:
file.managed:
- name: /etc/vnstat.conf
- source: salt://gateway/etc/vnstat.conf
- user: root
- group: vnstat
- mode: 644
- template: jinja
- defaults:
primary: {{ pillar['network']['primary']['interface'] }}
- require:
- pkg: {{ vnstat.pkg }}
init-vnstat-{{ pillar['network']['primary']['interface'] }}:
cmd.run:
- name: |
if [ -n "$(ip a | grep {{ pillar['network']['primary']['interface'] }})" ]; then vnstat -u -i {{ pillar['network']['primary']['interface'] }}; fi
- unless: test -f /var/lib/vnstat/{{ pillar['network']['primary']['interface'] }}
- runas: vnstat
- require:
- pkg: {{ vnstat.pkg }}
init-vnstat-{{ pillar['network']['bridge']['interface'] }}:
cmd.run:
- name: |
if [ -n "$(ip a | grep {{ pillar['network']['bridge']['interface'] }})" ]; then vnstat -u -i {{ pillar['network']['bridge']['interface'] }}; fi
- unless: test -f /var/lib/vnstat/{{ pillar['network']['bridge']['interface'] }}
- runas: vnstat
- require:
- pkg: {{ vnstat.pkg }}
{% if pillar['network']['mesh']['hwaddress'] is defined %}
init-vnstat-{{ pillar['network']['batman']['interface'] }}:
cmd.run:
- name: |
if [ -n "$(ip a | grep {{ pillar['network']['batman']['interface'] }})" ]; then vnstat -u -i {{ pillar['network']['batman']['interface'] }}; fi
- unless: test -f /var/lib/vnstat/{{ pillar['network']['batman']['interface'] }}
- runas: vnstat
- require:
- pkg: {{ vnstat.pkg }}
init-vnstat-{{ pillar['network']['mesh']['interface'] }}:
cmd.run:
- name: |
if [ -n "$(ip a | grep {{ pillar['network']['mesh']['interface'] }})" ]; then vnstat -u -i {{ pillar['network']['mesh']['interface'] }}; fi
- unless: test -f /var/lib/vnstat/{{ pillar['network']['mesh']['interface'] }}
- runas: vnstat
- require:
- pkg: {{ vnstat.pkg }}
{% endif %}
{% if pillar['exit']['type'] != 'gre' %}
init-vnstat-{{ pillar['network']['exit']['interface'] }}:
cmd.run:
- name: |
if [ -n "$(ip a | grep {{ pillar['network']['exit']['interface'] }})" ]; then vnstat -u -i {{ pillar['network']['exit']['interface'] }}; fi
- unless: test -f /var/lib/vnstat/{{ pillar['network']['exit']['interface'] }}
- runas: vnstat
- require:
- pkg: {{ vnstat.pkg }}
{% endif %}
# /var/lib/vnstat:
# file.directory:
# - name: /var/lib/vnstat
# - user: vnstat
# - group: vnstat
# - file_mode: 644
# - recurse:
# - mode
# - user
# - group
# - require:
# - pkg: {{ vnstat.pkg }}
{% set vnstati = salt['grains.filter_by']({
'Debian': {'pkg': 'vnstati'}
}, default='Debian') %}
{{ vnstati.pkg }}:
pkg.installed:
- name: {{ vnstati.pkg }}
/var/www/vnstat:
file.directory:
- name: /var/www/vnstat
/root/scripts/update-vnstat-graphs.sh:
file.managed:
- name: /root/scripts/update-vnstat-graphs.sh
- source: salt://gateway/root/scripts/update-vnstat-graphs.sh
- user: root
- group: root
- mode: 755
- makedirs: True
- require:
- pkg: {{ vnstat.pkg }}
- pkg: {{ vnstati.pkg }}
# Show Cron: crontab -l
vnstat-cron:
cron.present:
- name: /root/scripts/update-vnstat-graphs.sh
- identifier: update-vnstati-graphs
- user: root
- minute: '*/5'
- comment: 'Update vnStat Graphs every 5 Minutes'
- require:
- file: /var/www/vnstat
- file: /root/scripts/update-vnstat-graphs.sh
# change-documentroot:
# file.replace:
# - name: /etc/apache2/sites-available/000-default.conf
# - pattern: 'DocumentRoot\ (.*)$'
# - repl: 'DocumentRoot /var/www/vnstat'
# - not_found_content: 'DocumentRoot /var/www/vnstat'
# - append_if_not_found: True
# - require:
# - file: /var/www/vnstat
#
# change-documentroot-ssl:
# file.replace:
# - name: /etc/apache2/sites-available/default-ssl.conf
# - pattern: 'DocumentRoot\ (.*)$'
# - repl: 'DocumentRoot /var/www/vnstat'
# - not_found_content: 'DocumentRoot /var/www/vnstat'
# - append_if_not_found: True
# - require:
# - file: /var/www/vnstat
{% set apache = salt['grains.filter_by']({
'Debian': {'pkg': 'apache2', 'srv': 'apache2'},
}, default='Debian') %}
{% if grains['os_family'] == 'Debian' %}
/etc/apache2/sites-available/{{ grains['id'] }}.ffhf.conf:
file.managed:
- name: /etc/apache2/sites-available/{{ grains['id'] }}.ffhf.conf
- source: salt://gateway/etc/apache2/sites-available/gw.ffhf.conf
- template: jinja
/etc/apache2/sites-enabled/{{ grains['id'] }}.ffhf.conf:
file.symlink:
- name: /etc/apache2/sites-enabled/{{ grains['id'] }}.ffhf.conf
- target: /etc/apache2/sites-available/{{ grains['id'] }}.ffhf.conf
service.running:
- name: {{ apache.srv }}
- enable: True
- watch:
- file: /etc/apache2/sites-enabled/{{ grains['id'] }}.ffhf.conf
{% endif %}
{% if grains['os_family'] == 'Debian' %}
# /etc/apache2/sites-available/{{ grains['id'] }}.ffhf.conf:
# apache.configfile:
# - name: /etc/apache2/sites-available/{{ grains['id'] }}.ffhf.conf
# - config:
# - VirtualHost:
# this: '*:80'
# ServerName:
# - {{ grains['id'] }}.ffhf
# ServerAlias:
# - {{ grains['id'] }}.*
# DocumentRoot: /var/www/vnstat
# Directory:
# this: /var/www/vnstat
# Order: Deny,Allow
# Allow from: all
# AllowOverride: All
{% endif %}