summaryrefslogtreecommitdiffstats
path: root/hosts/jenkins/etc/munin
diff options
context:
space:
mode:
Diffstat (limited to 'hosts/jenkins/etc/munin')
-rw-r--r--hosts/jenkins/etc/munin/apache.conf96
-rw-r--r--hosts/jenkins/etc/munin/munin.conf155
-rw-r--r--hosts/jenkins/etc/munin/plugin-conf.d/df6
-rw-r--r--hosts/jenkins/etc/munin/plugin-conf.d/diskstats4
-rw-r--r--hosts/jenkins/etc/munin/plugin-conf.d/jenkins2
-rw-r--r--hosts/jenkins/etc/munin/plugin-conf.d/munin-node117
-rwxr-xr-xhosts/jenkins/etc/munin/plugins/cpu250
-rwxr-xr-xhosts/jenkins/etc/munin/plugins/iostat_ios220
-rwxr-xr-xhosts/jenkins/etc/munin/plugins/jenkins_builds64
-rwxr-xr-xhosts/jenkins/etc/munin/plugins/jenkins_builds_results75
-rwxr-xr-xhosts/jenkins/etc/munin/plugins/jenkins_builds_results_summary70
-rwxr-xr-xhosts/jenkins/etc/munin/plugins/jenkins_builds_running43
-rwxr-xr-xhosts/jenkins/etc/munin/plugins/jenkins_jobs64
-rwxr-xr-xhosts/jenkins/etc/munin/plugins/munin_stats112
-rw-r--r--hosts/jenkins/etc/munin/static/style-new.css257
-rw-r--r--hosts/jenkins/etc/munin/templates/partial/navigation.tmpl30
16 files changed, 1565 insertions, 0 deletions
diff --git a/hosts/jenkins/etc/munin/apache.conf b/hosts/jenkins/etc/munin/apache.conf
new file mode 100644
index 00000000..95786274
--- /dev/null
+++ b/hosts/jenkins/etc/munin/apache.conf
@@ -0,0 +1,96 @@
+# Enable this for template generation
+Alias /munin /var/cache/munin/www
+
+# Enable this for cgi-based templates
+#Alias /munin-cgi/static /var/cache/munin/www/static
+#ScriptAlias /munin-cgi /usr/lib/munin/cgi/munin-cgi-html
+#<Location /munin-cgi>
+# Order allow,deny
+# Allow from localhost 127.0.0.0/8 ::1
+# AuthUserFile /etc/munin/munin-htpasswd
+# AuthName "Munin"
+# AuthType Basic
+# require valid-user
+#</Location>
+
+<Directory /var/cache/munin/www>
+ Require all granted
+ Options None
+
+ # This file can be used as a .htaccess file, or a part of your apache
+ # config file.
+ #
+ # For the .htaccess file option to work the munin www directory
+ # (/var/cache/munin/www) must have "AllowOverride all" or something
+ # close to that set.
+ #
+
+ # AuthUserFile /etc/munin/munin-htpasswd
+ # AuthName "Munin"
+ # AuthType Basic
+ # require valid-user
+
+ # This next part requires mod_expires to be enabled.
+ #
+
+ # Set the default expiration time for files to 5 minutes 10 seconds from
+ # their creation (modification) time. There are probably new files by
+ # that time.
+ #
+
+ <IfModule mod_expires.c>
+ ExpiresActive On
+ ExpiresDefault M310
+ </IfModule>
+
+</Directory>
+
+# Enables fastcgi for munin-cgi-html if present
+#<Location /munin-cgi>
+# <IfModule mod_fastcgi.c>
+# SetHandler fastcgi-script
+# </IfModule>
+#</Location>
+
+#<Location /munin-cgi/static>
+# SetHandler None
+#</Location>
+
+# Enables fastcgi for munin-cgi-graph if present
+ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph
+<Location /munin-cgi/munin-cgi-graph>
+ Require all granted
+ # AuthUserFile /etc/munin/munin-htpasswd
+ # AuthName "Munin"
+ # AuthType Basic
+ # require valid-user
+ <IfModule mod_fastcgi.c>
+ SetHandler fastcgi-script
+ </IfModule>
+</Location>
+
+ScriptAlias /munin-cgi/munin-cgi-html /usr/lib/munin/cgi/munin-cgi-html
+<Location /munin-cgi/munin-cgi-html>
+ Require all granted
+ # AuthUserFile /etc/munin/munin-htpasswd
+ # AuthName "Munin"
+ # AuthType Basic
+ # require valid-user
+ <IfModule mod_fastcgi.c>
+ SetHandler fastcgi-script
+ </IfModule>
+</Location>
+
+ExtendedStatus On
+<IfModule mod_status.c>
+ #
+ # Allow server status reports generated by mod_status,
+ # with the URL of http://servername/server-status
+ # Change the ".example.com" to match your domain to enable.
+ #
+ <Location /server-status>
+ SetHandler server-status
+ Require ip 127.0.0.1 46.16.73.183
+ </Location>
+</IfModule>
+
diff --git a/hosts/jenkins/etc/munin/munin.conf b/hosts/jenkins/etc/munin/munin.conf
new file mode 100644
index 00000000..c979757a
--- /dev/null
+++ b/hosts/jenkins/etc/munin/munin.conf
@@ -0,0 +1,155 @@
+# Example configuration file for Munin, generated by 'make build'
+
+# The next three variables specifies where the location of the RRD
+# databases, the HTML output, logs and the lock/pid files. They all
+# must be writable by the user running munin-cron. They are all
+# defaulted to the values you see here.
+#
+#dbdir /var/lib/munin
+#htmldir /var/cache/munin/www
+#logdir /var/log/munin
+#rundir /var/run/munin
+
+# Where to look for the HTML templates
+#
+#tmpldir /etc/munin/templates
+
+# Where to look for the static www files
+#
+#staticdir /etc/munin/static
+
+# temporary cgi files are here. note that it has to be writable by
+# the cgi user (usually nobody or httpd).
+#
+# cgitmpdir /var/lib/munin/cgi-tmp
+
+# (Exactly one) directory to include all files from.
+includedir /etc/munin/munin-conf.d
+
+# You can choose the time reference for "DERIVE" like graphs, and show
+# "per minute", "per hour" values instead of the default "per second"
+#
+#graph_period second
+
+# Graphics files are generated either via cron or by a CGI process.
+# See http://munin-monitoring.org/wiki/CgiHowto2 for more
+# documentation.
+# Since 2.0, munin-graph has been rewritten to use the cgi code.
+# It is single threaded *by design* now.
+#
+#graph_strategy cron
+
+# munin-cgi-graph is invoked by the web server up to very many times at the
+# same time. This is not optimal since it results in high CPU and memory
+# consumption to the degree that the system can thrash. Again the default is
+# 6. Most likely the optimal number for max_cgi_graph_jobs is the same as
+# max_graph_jobs.
+#
+#munin_cgi_graph_jobs 6
+
+# If the automatic CGI url is wrong for your system override it here:
+#
+#cgiurl_graph /munin-cgi/munin-cgi-graph
+
+# max_size_x and max_size_y are the max size of images in pixel.
+# Default is 4000. Do not make it too large otherwise RRD might use all
+# RAM to generate the images.
+#
+#max_size_x 4000
+#max_size_y 4000
+
+# HTML files are normally generated by munin-html, no matter if the
+# files are used or not. You can change this to on-demand generation
+# by following the instructions in http://munin-monitoring.org/wiki/CgiHowto2
+#
+# Notes:
+# - moving to CGI for HTML means you cannot have graph generated by cron.
+# - cgi html has some bugs, mostly you still have to launch munin-html by hand
+#
+#html_strategy cron
+
+# munin-update runs in parallel.
+#
+# The default max number of processes is 16, and is probably ok for you.
+#
+# If set too high, it might hit some process/ram/filedesc limits.
+# If set too low, munin-update might take more than 5 min.
+#
+# If you want munin-update to not be parallel set it to 0.
+#
+#max_processes 16
+
+# RRD updates are per default, performed directly on the rrd files.
+# To reduce IO and enable the use of the rrdcached, uncomment it and set it to
+# the location of the socket that rrdcached uses.
+#
+#rrdcached_socket /var/run/rrdcached.sock
+
+# Drop somejuser@fnord.comm and anotheruser@blibb.comm an email everytime
+# something changes (OK -> WARNING, CRITICAL -> OK, etc)
+#contact.someuser.command mail -s "Munin notification" somejuser@fnord.comm
+#contact.anotheruser.command mail -s "Munin notification" anotheruser@blibb.comm
+#
+# For those with Nagios, the following might come in handy. In addition,
+# the services must be defined in the Nagios server as well.
+#contact.nagios.command /usr/bin/send_nsca nagios.host.comm -c /etc/nsca.conf
+contacts me
+contact.me.command mail -s "Munin notification ${var:host}" root
+
+# a simple host tree
+[jenkins.debian.net]
+ address 127.0.0.1
+ use_node_name yes
+ df._srv_workspace.warning 75
+ df._srv_workspace.critical 85
+ diskstats_latency.vda.avgwrwait.warning 0:20
+ diskstats_latency.vdb.avgwrwait.warning 0:20
+
+[jenkins-kvm-builder.debian.net]
+ address 78.137.101.153
+ use_node_name yes
+
+[jenkins-2nd-builder.debian.net]
+ address 46.16.77.57
+ use_node_name yes
+
+#
+# A more complex example of a host tree
+#
+## First our "normal" host.
+# [fii.foo.com]
+# address foo
+#
+## Then our other host...
+# [fay.foo.com]
+# address fay
+#
+## Then we want totals...
+# [foo.com;Totals] #Force it into the "foo.com"-domain...
+# update no # Turn off data-fetching for this "host".
+#
+# # The graph "load1". We want to see the loads of both machines...
+# # "fii=fii.foo.com:load.load" means "label=machine:graph.field"
+# load1.graph_title Loads side by side
+# load1.graph_order fii=fii.foo.com:load.load fay=fay.foo.com:load.load
+#
+# # The graph "load2". Now we want them stacked on top of each other.
+# load2.graph_title Loads on top of each other
+# load2.dummy_field.stack fii=fii.foo.com:load.load fay=fay.foo.com:load.load
+# load2.dummy_field.draw AREA # We want area instead the default LINE2.
+# load2.dummy_field.label dummy # This is needed. Silly, really.
+#
+# # The graph "load3". Now we want them summarised into one field
+# load3.graph_title Loads summarised
+# load3.combined_loads.sum fii.foo.com:load.load fay.foo.com:load.load
+# load3.combined_loads.label Combined loads # Must be set, as this is
+# # not a dummy field!
+#
+## ...and on a side note, I want them listen in another order (default is
+## alphabetically)
+#
+# # Since [foo.com] would be interpreted as a host in the domain "com", we
+# # specify that this is a domain by adding a semicolon.
+# [foo.com;]
+# node_order Totals fii.foo.com fay.foo.com
+#
diff --git a/hosts/jenkins/etc/munin/plugin-conf.d/df b/hosts/jenkins/etc/munin/plugin-conf.d/df
new file mode 100644
index 00000000..1f1cb157
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugin-conf.d/df
@@ -0,0 +1,6 @@
+[df*]
+env.exclude none unknown iso9660 squashfs udf romfs ramfs debugfs devtmpfs
+env.exclude_re /srv/workspace/pbuilder /run /dev/disk/by /var/lib/schroot/mount
+env.warning 92
+env.critical 98
+
diff --git a/hosts/jenkins/etc/munin/plugin-conf.d/diskstats b/hosts/jenkins/etc/munin/plugin-conf.d/diskstats
new file mode 100644
index 00000000..8cf14814
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugin-conf.d/diskstats
@@ -0,0 +1,4 @@
+[diskstats]
+env.trim_labels yes
+env.include_only /dev/vda,/dev/vdb
+
diff --git a/hosts/jenkins/etc/munin/plugin-conf.d/jenkins b/hosts/jenkins/etc/munin/plugin-conf.d/jenkins
new file mode 100644
index 00000000..e88a6462
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugin-conf.d/jenkins
@@ -0,0 +1,2 @@
+[jenkins_*]
+env.jenkins_update_interval 45
diff --git a/hosts/jenkins/etc/munin/plugin-conf.d/munin-node b/hosts/jenkins/etc/munin/plugin-conf.d/munin-node
new file mode 100644
index 00000000..e766928f
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugin-conf.d/munin-node
@@ -0,0 +1,117 @@
+# This file is used to configure how the plugins are invoked.
+# Place in /etc/munin/plugin-conf.d/ or corresponding directory.
+#
+# PLEASE NOTE: Changes in the plugin-conf.d directory are only
+# read at munin-node startup, so restart at any changes.
+#
+# user <user> # Set the user to run the plugin as.
+# group <group> # Set the group to run the plugin as.
+# command <command> # Run <command> instead of the plugin. %c expands to
+# what would normally be run.
+# env.<variable> <value> # Sets <variable> in the plugin's environment, see the
+# individual plugins to find out which variables they
+# care about.
+
+
+[amavis]
+group adm
+env.MUNIN_MKTEMP /bin/mktemp -p /tmp/ $1
+env.amavislog /var/log/mail.info
+
+[apt]
+user root
+
+[courier_mta_mailqueue]
+group daemon
+
+[courier_mta_mailstats]
+group adm
+
+[courier_mta_mailvolume]
+group adm
+
+[cps*]
+user root
+
+[exim_mailqueue]
+group adm, (Debian-exim)
+
+[exim_mailstats]
+group adm, (Debian-exim)
+env.logdir /var/log/exim4/
+env.logname mainlog
+
+[fw_conntrack]
+user root
+
+[fw_forwarded_local]
+user root
+
+[hddtemp_smartctl]
+user root
+
+[hddtemp2]
+user root
+
+[if_*]
+user root
+
+[if_err_*]
+user nobody
+
+[ip_*]
+user root
+
+[ipmi_*]
+user root
+
+[mysql*]
+user root
+env.mysqlopts --defaults-file=/etc/mysql/debian.cnf
+env.mysqluser debian-sys-maint
+env.mysqlconnection DBI:mysql:mysql;mysql_read_default_file=/etc/mysql/debian.cnf
+
+[postfix_mailqueue]
+user postfix
+
+[postfix_mailstats]
+group adm
+
+[postfix_mailvolume]
+group adm
+env.logfile mail.log
+
+[smart_*]
+user root
+
+[vlan*]
+user root
+
+[ejabberd*]
+user ejabberd
+env.statuses available away chat xa
+env.days 1 7 30
+
+[dhcpd3]
+user root
+env.leasefile /var/lib/dhcp3/dhcpd.leases
+env.configfile /etc/dhcp3/dhcpd.conf
+
+[jmx_*]
+env.ip 127.0.0.1
+env.port 5400
+
+[samba]
+user root
+
+[munin_stats]
+user munin
+group munin
+
+[postgres_*]
+user postgres
+env.PGUSER postgres
+env.PGPORT 5432
+
+[fail2ban]
+user root
diff --git a/hosts/jenkins/etc/munin/plugins/cpu b/hosts/jenkins/etc/munin/plugins/cpu
new file mode 100755
index 00000000..b66ed381
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugins/cpu
@@ -0,0 +1,250 @@
+#!/bin/sh
+#
+# -- unfinished WORK IN PROGRESS --
+#
+# includes modifications trying to fix #767100
+#
+: <<=cut
+
+=head1 NAME
+
+cpu - Plugin to monitor CPU usage.
+
+=head1 APPLICABLE SYSTEMS
+
+All Linux systems
+
+=head1 CONFIGURATION
+
+The following is default configuration
+
+ [cpu]
+ env.HZ 100
+
+See "BUGS" for a explanation of this setting.
+
+=head2 EXAMPLE WARNING AND CRITICAL SETTINGS
+
+You can also set warning and critical levels for each of the data
+series the plugin reports. The following environment variables are
+used as default for all fields:
+
+ env.warning
+ env.critical
+
+But each field can be controlled separately:
+
+ env.system_warning
+ env.system_critical
+
+ env.user_warning
+ env.user_critical
+
+ env.nice_warning
+ env.nice_critical
+
+ env.idle_warning
+ env.idle_critical
+
+For some kernels there is also the following settings:
+
+ env.iowait_warning
+ env.iowait_critical
+ env.irq_warning
+ env.irq_critical
+ env.softirq_warning
+ env.softirq_critical
+ env.steal_warning
+ env.steal_critical
+ env.guest_warning
+ env.guest_critical
+
+=head1 INTERPRETATION
+
+The plugin shows cpu usage in percent. In case of more than one core
+it displays 100% for each core.
+
+If a core is 100% busy there will be no "iowait" showing, that only
+shows if the CPU has nothing else to do while it waits on IO.
+Therefore a 100% busy core can hide a lot of iowait. Please refer to
+the IO latency and other disk related graphs for further information
+about IO performance.
+
+=head1 MAGIC MARKERS
+
+ #%# family=auto
+ #%# capabilities=autoconf
+
+
+=head1 VERSION
+
+ $Id$
+
+=head1 BUGS
+
+Some combinations of hardware and Linux (probably only 2.4 kernels)
+use 1000 units/second in /proc/stat corresponding to the systems
+HZ. (see /usr/src/linux/include/asm/param.h). But Almost all systems
+use 100 units/second and this is our default. Even if
+Documentation/proc.txt in the kernel source says otherwise. - Finding
+and fix by dz@426.ch
+
+Otherwise none known
+
+=head1 AUTHOR
+
+Unknown
+
+=head1 LICENSE
+
+GPLv2
+
+=cut
+
+
+. $MUNIN_LIBDIR/plugins/plugin.sh
+
+if [ "$1" = "autoconf" ]; then
+ if [ -r /proc/stat ]; then
+ echo yes
+ exit 0
+ else
+ echo no
+ exit 0
+ fi
+fi
+
+HZ=${HZ:-100}
+
+extinfo=""
+
+if egrep -q '^cpu +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+' /proc/stat; then
+ extinfo="iowait irq softirq"
+ if egrep -q '^cpu +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+' /proc/stat; then
+ extextinfo="steal"
+ fi
+ if egrep -q '^cpu +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+ +[0-9]+' /proc/stat; then
+ extextextinfo="guest"
+ fi
+
+fi
+
+if [ "$1" = "config" ]; then
+
+ NCPU=$(egrep '^cpu[0-9]+ ' /proc/stat | wc -l)
+ if [ "$scaleto100" = "yes" ]; then
+ graphlimit=100
+ else
+ graphlimit=$(($NCPU * 100))
+ fi
+ echo 'graph_title CPU usage'
+ echo "graph_order system user nice idle" $extinfo
+ echo "graph_args --base 1000 -r --lower-limit 0 --upper-limit $graphlimit"
+ echo 'graph_vlabel %'
+ echo 'graph_scale no'
+ echo 'graph_info This graph shows how CPU time is spent.'
+ echo 'graph_category system'
+ echo 'graph_period second'
+ echo 'system.label system'
+ echo 'system.draw AREA'
+ echo 'system.min 0'
+ echo 'system.type DERIVE'
+ echo "system.info CPU time spent by the kernel in system activities"
+ echo 'user.label user'
+ echo 'user.draw STACK'
+ echo 'user.min 0'
+ echo 'user.type DERIVE'
+ echo 'user.info CPU time spent by normal programs and daemons'
+ echo 'nice.label nice'
+ echo 'nice.draw STACK'
+ echo 'nice.min 0'
+ echo 'nice.type DERIVE'
+ echo 'nice.info CPU time spent by nice(1)d programs'
+ echo 'idle.label idle'
+ echo 'idle.draw STACK'
+ echo 'idle.min 0'
+ echo 'idle.type DERIVE'
+ echo 'idle.info Idle CPU time'
+
+ for field in system user nice idle; do
+ print_adjusted_thresholds "$field" "$graphlimit"
+ done
+
+ if [ "$scaleto100" = "yes" ]; then
+ echo "system.cdef system,$NCPU,/"
+ echo "user.cdef user,$NCPU,/"
+ echo "nice.cdef nice,$NCPU,/"
+ echo "idle.cdef idle,$NCPU,/"
+ fi
+ if [ ! -z "$extinfo" ]
+ then
+ echo 'iowait.label iowait'
+ echo 'iowait.draw STACK'
+ echo 'iowait.min 0'
+ echo 'iowait.type DERIVE'
+ echo 'iowait.info CPU time spent waiting for I/O operations to finish when there is nothing else to do.'
+ echo 'irq.label irq'
+ echo 'irq.draw STACK'
+ echo 'irq.min 0'
+ echo 'irq.type DERIVE'
+ echo 'irq.info CPU time spent handling interrupts'
+ echo 'softirq.label softirq'
+ echo 'softirq.draw STACK'
+ echo 'softirq.min 0'
+ echo 'softirq.type DERIVE'
+ echo 'softirq.info CPU time spent handling "batched" interrupts'
+ if [ "$scaleto100" = "yes" ]; then
+ echo "iowait.cdef iowait,$NCPU,/"
+ echo "irq.cdef irq,$NCPU,/"
+ echo "softirq.cdef softirq,$NCPU,/"
+ fi
+ for field in iowait irq softirq; do
+ print_adjusted_thresholds "$field" "$graphlimit"
+ done
+ fi
+
+ if [ ! -z "$extextinfo" ]
+ then
+ echo 'steal.label steal'
+ echo 'steal.draw STACK'
+ echo 'steal.min 0'
+ echo 'steal.type DERIVE'
+ echo 'steal.info The time that a virtual CPU had runnable tasks, but the virtual CPU itself was not running'
+ if [ "$scaleto100" = "yes" ]; then
+ echo "steal.cdef steal,$NCPU,/"
+ fi
+ for field in steal; do
+ print_adjusted_thresholds "$field" "$graphlimit"
+ done
+ fi
+
+ if [ ! -z "$extextextinfo" ]
+ then
+ echo 'guest.label guest'
+ echo 'guest.draw STACK'
+ echo 'guest.min 0'
+ echo 'guest.type DERIVE'
+ echo 'guest.info The time spent running a virtual CPU for guest operating systems under the control of the Linux kernel.'
+ if [ "$scaleto100" = "yes" ]; then
+ echo "guest.cdef guest,$NCPU,/"
+ fi
+ for field in guest; do
+ print_adjusted_thresholds "$field" "$graphlimit"
+ done
+ fi
+
+ exit 0
+fi
+
+# Note: Counters/derive need to report integer values. Also we need
+# to avoid 10e+09 and the like %.0f should do this.
+
+if [ ! -z "$extextextinfo" ]; then
+ awk -v hz=$HZ '/^cpu / { printf "user.value %.0f\nnice.value %.0f\nsystem.value %.0f\nidle.value %.0f\niowait.value %.0f\nirq.value %.0f\nsoftirq.value %.0f\nsteal.value %.0f\nguest.value %.0f\n", ($2-$10)*100/hz, $3*100/hz, $4*100/hz, $5*100/hz, $6*100/hz, $7*100/hz, $8*100/hz, $9*100/hz, $10*100/hz }' < /proc/stat
+elif [ ! -z "$extextinfo" ]; then
+ awk -v hz=$HZ '/^cpu / { epoch = systime(); printf "user.value %d:%.0f\nnice.value %d:%.0f\nsystem.value %d:%.0f\nidle.value %d:%.0f\niowait.value %d:%.0f\nirq.value %d:%.0f\nsoftirq.value %d:%.0f\nsteal.value %d:%.0f\n", epoch, $2*100/hz, epoch, $3*100/hz, epoch, $4*100/hz, epoch, $5*100/hz, epoch, $6*100/hz, epoch, $7*100/hz, epoch, $8*100/hz, epoch, $9*100/hz }' < /proc/stat
+elif [ ! -z "$extinfo" ]; then
+ awk -v hz=$HZ '/^cpu / { epoch = systime(); printf "user.value %d:%.0f\nnice.value %d:%.0f\nsystem.value %d:%.0f\nidle.value %d:%.0f\niowait.value %d:%.0f\nirq.value %d:%.0f\nsoftirq.value %d:%.0f\n", epoch, $2*100/hz, epoch, $3*100/hz, epoch, $4*100/hz, epoch, $5*100/hz, epoch, $6*100/hz, epoch, $7*100/hz, epoch, $8*100/hz }' < /proc/stat
+else
+ awk -v hz=$HZ '/^cpu / { epoch = systime(); printf "user.value %d:%.0f\nnice.value %d:%.0f\nsystem.value %d:%.0f\nidle.value %d:%.0f\niowait.value %d:%.0f\nirq.value %d:%.0f\n", epoch, $2*100/hz, epoch, $3*100/hz, epoch, $4*100/hz, epoch, $5*100/hz, epoch, $6*100/hz, epoch, $7*100/hz }' < /proc/stat
+fi
diff --git a/hosts/jenkins/etc/munin/plugins/iostat_ios b/hosts/jenkins/etc/munin/plugins/iostat_ios
new file mode 100755
index 00000000..94c2272e
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugins/iostat_ios
@@ -0,0 +1,220 @@
+#!/usr/bin/perl -w
+# -*- cperl -*-
+=head1 NAME
+
+iostat_ios - Show IO-operation latency pr. device.
+
+=head1 APPLICABLE SYSTEMS
+
+Any Linux system
+
+=head1 CONFIGURATION
+
+None needed
+
+=head1 USAGE
+
+Link this into /etc/munin/plugins/ and restart the munin-node.
+
+=head1 INTERPRETATION
+
+The plugin shows the average time a IO-operation needs to complete for
+each disk or block device on the system.
+
+Simple partitioned disks will only show as the whole disk. When/if
+you use some device layer over that, such as LVM then LV devices will
+show up individualy.
+
+When the IO-operation time here increases it is to be expected that
+the iowait on the CPU graph increases, but please read about how
+iowait reporting works to fully understand that number.
+
+=head1 MAGIC MARKERS
+
+ #%# family=legacy
+ #%# capabilities=autoconf
+
+=head1 VERSION
+
+ $Id$
+
+=head1 BUGS
+
+Should show more useful device names/labels for device-mapper devices,
+such as those used by LVM and so on.
+
+=head1 AUTHOR
+
+(C) 2004 Per Buer. Documentation and some modifications by Nicolai
+Langfeldt.
+
+=head1 LICENSE
+
+GPLv2
+
+=cut
+
+use strict;
+use warnings;
+
+use IO::File;
+use Storable qw(store retrieve);
+use Munin::Plugin;
+
+use constant STATEFILE => "$ENV{MUNIN_PLUGSTATE}/iostat-ios.state";
+
+
+if (defined($ARGV[0]) and $ARGV[0] eq 'autoconf') {
+ if (-r "/proc/diskstats" or -r "/proc/partitions") {
+ print "yes\n";
+ exit 0;
+ } else {
+ print "no (no /proc/diskstats or /proc/partitions)\n";
+ exit 0;
+ }
+}
+
+if (defined($ARGV[0]) and $ARGV[0] eq 'config') {
+ print_config();
+ exit;
+}
+
+my ($r, $old_r);
+my %name;
+
+$r = get_ios();
+
+($old_r) = get_state();
+
+if ($old_r) {
+ cmp_io($old_r, $r);
+} else {
+ warn "iostat_ios: No historic data present\n";
+}
+
+store_state( $r );
+
+sub filter {
+ my ($major, $minor, $tmpnam) = @_;
+ if(defined($major)) {
+ return 0 if ($major == 1); # RAM devices
+ return 0 if ($major == 9); # MD devices
+ return 0 if ($major == 58); # LVM devices
+ return 0 if ($major == 253); # LVM2 devices
+ }
+ if(defined($tmpnam)) {
+ return 0 if ($tmpnam =~ /part\d+$/);
+ return 0 if ($tmpnam =~ /^\s*(?:sd|hd|vd)[a-z]\d+\s*$/);
+ }
+
+ return 1;
+}
+
+
+sub get_ios {
+ my ($opt) = @_;
+
+ my %R;
+ my ($parts, $kernel);
+ my @dev;
+
+ if (-r "/proc/diskstats") {
+ $kernel = 2.6;
+ $parts = new IO::File("/proc/diskstats") || die();
+ } else {
+ $kernel = 2.4;
+ $parts = new IO::File("/proc/partitions");
+ die("kernel $kernel not supported yet\n");
+ }
+
+ unless ($parts) {
+ print "Could not gather statistics\n";
+ return undef;
+ }
+
+ while (<$parts>) {
+ my ($maj, $min, $name, $rio, $rtime, $wio, $wtime) =
+ (split(/\s+/, $_ ))[1,2,3,4,7,8,11];
+
+ next unless (defined($min) && defined($maj));
+ next unless ($wio and $rio and $rtime and $wtime);
+
+ next if (filter($maj, $min, $name) == 0);
+
+ $R{$maj}{$min}{rio} = $rio;
+ $R{$maj}{$min}{rtime} = $rtime;
+
+ $R{$maj}{$min}{wio} = $wio;
+ $R{$maj}{$min}{wtime} = $wtime;
+
+ my $label = "dev${maj}_${min}";
+
+ push(@dev, $label);
+
+ $name{$label} = $name;
+ }
+ $parts->close();
+
+ if ($opt) {
+ return \@dev;
+ } else {
+ return \%R;
+ }
+}
+
+
+sub print_config {
+ print("graph_title IO Service time\n",
+ "graph_args --base 1000 --logarithmic\n",
+ "graph_category disk\n",
+ "graph_vlabel seconds\n",
+ "graph_info For each applicable disk device this plugin shows the latency (or delay) for I/O operations on that disk device. The delay is in part made up of waiting for the disk to flush the data, and if data arrives at the disk faster than it can read or write it then the delay time will include the time needed for waiting in the queue.\n");
+
+ for my $d ( @{ get_ios(1) } ) {
+ print "${d}_rtime.label ",$name{$d}," read\n",
+ "${d}_rtime.type GAUGE\n",
+ "${d}_rtime.cdef ${d}_rtime,1000,/\n",
+ "${d}_wtime.label ",$name{$d}," write\n",
+ "${d}_wtime.type GAUGE\n",
+ "${d}_wtime.cdef ${d}_wtime,1000,/\n";
+ print_thresholds($d);
+ }
+}
+
+
+sub cmp_io {
+ my ($old_io, $new_io) = @_;
+
+ for my $maj (sort keys %{$new_io} ) {
+ for my $min (sort keys %{ $new_io->{$maj} } ) {
+ my $rio_diff = $$new_io{$maj}{$min}{rio} - $$old_io{$maj}{$min}{rio};
+ my $rtime_diff = $$new_io{$maj}{$min}{rtime} - $$old_io{$maj}{$min}{rtime};
+
+ my $wio_diff = $$new_io{$maj}{$min}{wio} - $$old_io{$maj}{$min}{wio};
+ my $wtime_diff = $$new_io{$maj}{$min}{wtime} - $$old_io{$maj}{$min}{wtime};
+
+ my $dev = "dev${maj}_${min}";
+
+ print "${dev}_rtime.value ", ($rio_diff > 0 and $rtime_diff > 0) ? ($rtime_diff / $rio_diff) : 'U', "\n",
+ "${dev}_wtime.value ", ($wio_diff > 0 and $wtime_diff > 0) ? ($wtime_diff / $wio_diff) : 'U', "\n";
+ }
+ }
+
+}
+
+
+sub store_state {
+ my ($R) = @_;
+ store($R, STATEFILE);
+}
+
+
+sub get_state {
+ my ($R);
+ return(undef) unless ( -r STATEFILE);
+ $R = retrieve( STATEFILE );
+ return($R);
+}
+
+
+# vim: ft=perl : ts=4 : sw=4 : et
diff --git a/hosts/jenkins/etc/munin/plugins/jenkins_builds b/hosts/jenkins/etc/munin/plugins/jenkins_builds
new file mode 100755
index 00000000..3010e393
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugins/jenkins_builds
@@ -0,0 +1,64 @@
+#!/bin/sh
+# -*- sh -*-
+
+: << =cut
+
+=head1 NAME
+
+jenkins_builds - Plugin to measure number of jenkins builds
+
+=head1 AUTHOR
+
+Contributed by Holger Levsen
+
+=head1 LICENSE
+
+GPLv2
+
+=head1 MAGIC MARKERS
+
+ #%# family=auto
+ #%# capabilities=autoconf
+
+=cut
+
+. $MUNIN_LIBDIR/plugins/plugin.sh
+
+if [ "$1" = "autoconf" ]; then
+ echo yes
+ exit 0
+fi
+
+STATEFILE=$MUNIN_PLUGSTATE/$(basename $0)
+
+# delete statefile if it's older than ${jenkins_update_interval} set in /etc/munin/plugin-conf.d/jenkins
+if test $(find $STATEFILE -mmin +${jenkins_update_interval}) ; then
+ rm -f $STATEFILE
+fi
+
+if [ -f $STATEFILE ] && [ "$1" = "" ] ; then
+ cat $STATEFILE
+ exit 0
+fi
+
+JOB_PREFIXES=$(ls -1 /var/lib/jenkins/jobs/|cut -d "_" -f1|sort -f -u)
+if [ "$1" = "config" ]; then
+ echo 'graph_title Jenkins Builds in the last 24h'
+ echo 'graph_args --base 1000 -l 0 '
+ echo 'graph_scale no'
+ echo 'graph_total total'
+ echo 'graph_vlabel Jenkins Builds per category in the last 24h'
+ echo 'graph_category jenkins'
+ draw=AREA
+ for PREFIX in $JOB_PREFIXES ; do
+ echo "jenkins_builds_$PREFIX.label $PREFIX builds"
+ echo "jenkins_builds_$PREFIX.draw $draw"
+ if [ "$draw" = "AREA" ] ; then draw=STACK ; fi
+ done
+ exit 0
+fi
+
+for PREFIX in $JOB_PREFIXES ; do
+ NR=$(find /var/lib/jenkins/jobs/$PREFIX*/builds/ -type d -mtime -1 -name "*_*"| wc -l)
+ echo "jenkins_builds_$PREFIX.value $NR" | tee -a $STATEFILE
+done
diff --git a/hosts/jenkins/etc/munin/plugins/jenkins_builds_results b/hosts/jenkins/etc/munin/plugins/jenkins_builds_results
new file mode 100755
index 00000000..596281ff
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugins/jenkins_builds_results
@@ -0,0 +1,75 @@
+#!/bin/sh
+# -*- sh -*-
+
+: << =cut
+
+=head1 NAME
+
+jenkins_builds_results - Plugin to measure number of jenkins builds
+
+=head1 AUTHOR
+
+Contributed by Holger Levsen
+
+=head1 LICENSE
+
+GPLv2
+
+=head1 MAGIC MARKERS
+
+ #%# family=auto
+ #%# capabilities=autoconf
+
+=cut
+
+. $MUNIN_LIBDIR/plugins/plugin.sh
+
+if [ "$1" = "autoconf" ]; then
+ echo yes
+ exit 0
+fi
+
+STATEFILE=$MUNIN_PLUGSTATE/$(basename $0)
+
+# delete statefile if it's older than ${jenkins_update_interval} set in /etc/munin/plugin-conf.d/jenkins
+if test $(find $STATEFILE -mmin +${jenkins_update_interval}) ; then
+ rm -f $STATEFILE
+fi
+
+if [ -f $STATEFILE ] && [ "$1" = "" ] ; then
+ cat $STATEFILE
+ exit 0
+fi
+
+JOB_PREFIXES=$(ls -1 /var/lib/jenkins/jobs/|cut -d "_" -f1|sort -f -u)
+if [ "$1" = "config" ]; then
+ echo 'graph_title Jenkins Builds results'
+ echo 'graph_args --base 1000 -l 0 '
+ echo 'graph_scale no'
+ echo 'graph_total total'
+ echo 'graph_vlabel Jenkins Builds results per category'
+ echo 'graph_category jenkins'
+ draw=AREA
+ for PREFIX in $JOB_PREFIXES ; do
+ for STATE in success unstable failure ; do
+ echo "jenkins_builds_results_${PREFIX}_${STATE}.label ${PREFIX} ${STATE}"
+ echo "jenkins_builds_results_${PREFIX}_${STATE}.draw $draw"
+ if [ "$draw" = "AREA" ] ; then draw=STACK ; fi
+ done
+ done
+ exit 0
+fi
+
+for PREFIX in $JOB_PREFIXES ; do
+ PREFIX_RESULTS=$(for i in /var/lib/jenkins/jobs/${PREFIX}*/builds/*_*/log ; do tail -1 $i 2>/dev/null; echo " \n"; done )
+ for STATE in success unstable failure ; do
+ NR=0
+ if [ "$STATE" = "failure" ] ; then
+ # count aborted as failed
+ NR=$(echo -e "$PREFIX_RESULTS" | egrep -i -c "($STATE|aborted)")
+ else
+ NR=$(echo -e "$PREFIX_RESULTS" | grep -i -c $STATE)
+ fi
+ echo "jenkins_builds_results_${PREFIX}_${STATE}.value $NR" | tee -a $STATEFILE
+ done
+done
diff --git a/hosts/jenkins/etc/munin/plugins/jenkins_builds_results_summary b/hosts/jenkins/etc/munin/plugins/jenkins_builds_results_summary
new file mode 100755
index 00000000..b4f5b540
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugins/jenkins_builds_results_summary
@@ -0,0 +1,70 @@
+#!/bin/sh
+# -*- sh -*-
+
+: << =cut
+
+=head1 NAME
+
+jenkins_builds_results_summary - Plugin to measure results of all jenkins builds
+
+=head1 AUTHOR
+
+Contributed by Holger Levsen
+
+=head1 LICENSE
+
+GPLv2
+
+=head1 MAGIC MARKERS
+
+ #%# family=auto
+ #%# capabilities=autoconf
+
+=cut
+
+. $MUNIN_LIBDIR/plugins/plugin.sh
+
+if [ "$1" = "autoconf" ]; then
+ echo yes
+ exit 0
+fi
+
+STATEFILE=$MUNIN_PLUGSTATE/$(basename $0)
+
+# delete statefile if it's older than ${jenkins_update_interval} set in /etc/munin/plugin-conf.d/jenkins
+if test $(find $STATEFILE -mmin +${jenkins_update_interval}) ; then
+ rm -f $STATEFILE
+fi
+
+if [ -f $STATEFILE ] && [ "$1" = "" ] ; then
+ cat $STATEFILE
+ exit 0
+fi
+
+if [ "$1" = "config" ]; then
+ echo 'graph_title Jenkins Builds results summary'
+ echo 'graph_args --base 1000 -l 0 '
+ echo 'graph_scale no'
+ echo 'graph_total total'
+ echo 'graph_vlabel Jenkins Builds results summary'
+ echo 'graph_category jenkins'
+ draw=AREA
+ for STATE in success unstable failure ; do
+ echo "jenkins_builds_results_all_${STATE}.label ${PREFIX} ${STATE}"
+ echo "jenkins_builds_results_all_${STATE}.draw $draw"
+ if [ "$draw" = "AREA" ] ; then draw=STACK ; fi
+ done
+ exit 0
+fi
+
+RESULTS=$(for i in /var/lib/jenkins/jobs/*/builds/*_*/log ; do tail -1 $i 2>/dev/null; echo " \n"; done )
+for STATE in success unstable failure ; do
+ NR=0
+ if [ "$STATE" = "failure" ] ; then
+ # count aborted as failed
+ NR=$(echo -e "$RESULTS" | egrep -i -c "($STATE|aborted)")
+ else
+ NR=$(echo -e "$RESULTS" | grep -i -c $STATE)
+ fi
+ echo "jenkins_builds_results_all_${STATE}.value $NR" | tee -a $STATEFILE
+done
diff --git a/hosts/jenkins/etc/munin/plugins/jenkins_builds_running b/hosts/jenkins/etc/munin/plugins/jenkins_builds_running
new file mode 100755
index 00000000..24084f10
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugins/jenkins_builds_running
@@ -0,0 +1,43 @@
+#!/bin/sh
+# -*- sh -*-
+
+: << =cut
+
+=head1 NAME
+
+jenkins_builds_running - Plugin to measure number of jenkins builds which are currently running
+
+=head1 AUTHOR
+
+Contributed by Holger Levsen
+
+=head1 LICENSE
+
+GPLv2
+
+=head1 MAGIC MARKERS
+
+ #%# family=auto
+ #%# capabilities=autoconf
+
+=cut
+
+. $MUNIN_LIBDIR/plugins/plugin.sh
+
+if [ "$1" = "autoconf" ]; then
+ echo yes
+ exit 0
+fi
+
+if [ "$1" = "config" ]; then
+ echo 'graph_title Jenkins Builds running'
+ echo 'graph_args --base 1000 -l 0 '
+ echo 'graph_scale no'
+ echo 'graph_vlabel Jenkins Builds currently running'
+ echo 'graph_category jenkins'
+ echo "jenkins_builds_running.label $PREFIX builds_running"
+ echo "jenkins_builds_running.draw AREA"
+ exit 0
+fi
+
+echo "jenkins_builds_running.value $(ps fax|grep /tmp/hudson|grep -v grep|wc -l)"
diff --git a/hosts/jenkins/etc/munin/plugins/jenkins_jobs b/hosts/jenkins/etc/munin/plugins/jenkins_jobs
new file mode 100755
index 00000000..e7f8e219
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugins/jenkins_jobs
@@ -0,0 +1,64 @@
+#!/bin/sh
+# -*- sh -*-
+
+: << =cut
+
+=head1 NAME
+
+jenkins_jobs - Plugin to measure number of jenkins jobs
+
+=head1 AUTHOR
+
+Contributed by Holger Levsen
+
+=head1 LICENSE
+
+GPLv2
+
+=head1 MAGIC MARKERS
+
+ #%# family=auto
+ #%# capabilities=autoconf
+
+=cut
+
+. $MUNIN_LIBDIR/plugins/plugin.sh
+
+if [ "$1" = "autoconf" ]; then
+ echo yes
+ exit 0
+fi
+
+STATEFILE=$MUNIN_PLUGSTATE/$(basename $0)
+
+# delete statefile if it's older than ${jenkins_update_interval} set in /etc/munin/plugin-conf.d/jenkins
+if test $(find $STATEFILE -mmin +${jenkins_update_interval}) ; then
+ rm -f $STATEFILE
+fi
+
+if [ -f $STATEFILE ] && [ "$1" = "" ] ; then
+ cat $STATEFILE
+ exit 0
+fi
+
+JOB_PREFIXES=$(ls -1 /var/lib/jenkins/jobs/|cut -d "_" -f1|sort -f -u)
+if [ "$1" = "config" ]; then
+ echo 'graph_title Jenkins Jobs'
+ echo 'graph_args --base 1000 -l 0 '
+ echo 'graph_scale no'
+ echo 'graph_total total'
+ echo 'graph_vlabel Jenkins Jobs per category'
+ echo 'graph_category jenkins'
+ draw=AREA
+ for PREFIX in $JOB_PREFIXES ; do
+ echo "jenkins_jobs_$PREFIX.label $PREFIX jobs"
+ echo "jenkins_jobs_$PREFIX.draw $draw"
+ if [ "$draw" = "AREA" ] ; then draw=STACK ; fi
+ done
+ exit 0
+fi
+
+for PREFIX in $JOB_PREFIXES ; do
+ NR=$(find /var/lib/jenkins/jobs/ -maxdepth 1 -name "$PREFIX*" -type d | wc -l)
+ echo "jenkins_jobs_$PREFIX.value $NR" | tee -a $STATEFILE
+done
diff --git a/hosts/jenkins/etc/munin/plugins/munin_stats b/hosts/jenkins/etc/munin/plugins/munin_stats
new file mode 100755
index 00000000..8c7c82a2
--- /dev/null
+++ b/hosts/jenkins/etc/munin/plugins/munin_stats
@@ -0,0 +1,112 @@
+#!/usr/bin/perl
+# -*- perl -*-
+# Copyright (C) 2006-2009 Rodolphe Quiedeville <rodolphe@quiedeville.org>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; version 2 dated June,
+# 1991.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# $Id$
+#
+# Magic markers (used by munin-node-configure and some installation scripts):
+#%# family=auto
+#%# capabilities=autoconf
+
+use strict;
+use warnings;
+
+use Munin::Plugin;
+
+my @logs = qw/update html limits/;
+use Munin::Master::GraphOld;
+my $conffile = "$Munin::Common::Defaults::MUNIN_CONFDIR/munin.conf";
+if (! graph_check_cron() ) {
+ push (@logs, "graph");
+}
+
+my $logdir = ($ENV{'logdir'} || $ENV{'MUNIN_LOGDIR'} || '/var/log/munin');
+
+if ($ARGV[0] and $ARGV[0] eq 'autoconf') {
+ my $munin_update_location =
+ "$Munin::Common::Defaults::MUNIN_LIBDIR/munin-update";
+
+ if (! -e $munin_update_location) {
+ print "no (munin-update was not found at $munin_update_location)\n";
+ exit 0;
+ }
+
+ if (! -x $munin_update_location) {
+ print "no ($munin_update_location was found, but is not executable)\n";
+ exit 0;
+ }
+ else {
+ print "yes\n";
+ exit 0;
+ }
+}
+
+if ($ARGV[0] and $ARGV[0] eq "config") {
+ print "graph_title Munin processing time\n";
+ if (! graph_check_cron() ) {
+ print "graph_info This graph shows the run time of the four different processes making up a munin-master run. Munin-master is run from cron every 5 minutes and we want each of the programmes in munin-master to complete before the next instance starts. Especially munin-update and munin-graph are time consuming and their run time bears watching. If munin-update uses too long time to run please see the munin-update graph to determine which host is slowing it down. If munin-graph is running too slow you need to get clever (email the munin-users mailing list) unless you can buy a faster computer with better disks to run munin on.\n";
+ } else {
+ print "graph_info This graph shows the run time of the thre different processes making up a munin-master run. Munin-master is run from cron every 5 minutes and we want each of the programmes in munin-master to complete before the next instance starts. Especially munin-update is time consuming and its run time bears watching. If munin-update uses too long time to run please see the munin-update graph to determine which host is slowing it down.\n";
+ }
+ print "graph_args --base 1000 -l 0\n",
+ "graph_scale yes\n",
+ "graph_vlabel seconds\n",
+ "graph_category munin\n";
+ foreach my $log (@logs) {
+ print "$log.label munin $log\n";
+ print "$log.draw AREASTACK\n";
+ }
+ print "update.warning 240\n";
+ print "update.critical 285\n";
+ if (! graph_check_cron() ) {
+ print "graph.warning 240\n";
+ print "graph.critical 285\n";
+ }
+ exit 0;
+}
+
+my %positions = restore_state();
+my %times;
+
+foreach my $log (@logs) {
+ my $logfile = "$logdir/munin-$log.log";
+ my $time = 'U';
+
+ if (! -r $logfile) {
+ print "$log.extinfo Can't open $logfile for reading\n";
+ print "$log.value $time\n";
+ next;
+ }
+
+ if (exists $positions{$log}) {
+ my ($LOGFILE, undef) = tail_open($logfile, $positions{$log});
+ while (<$LOGFILE>) {
+ $time = $1 if (/finished \((\d+\.\d+)\ssec\)$/);
+ }
+ $positions{$log} = tail_close($LOGFILE);
+ }
+ else {
+ # Do nothing on first run except find the current file end.
+ $positions{$log} = (stat $logfile)[7];
+ }
+
+ print "$log.value $time\n";
+}
+
+save_state(%positions);
+
+# vim: ft=perl : ts=4 : expandtab
diff --git a/hosts/jenkins/etc/munin/static/style-new.css b/hosts/jenkins/etc/munin/static/style-new.css
new file mode 100644
index 00000000..28ecea40
--- /dev/null
+++ b/hosts/jenkins/etc/munin/static/style-new.css
@@ -0,0 +1,257 @@
+/* Overall layout */
+html, body {
+ margin: 0;
+ padding: 0;
+ height: 100%;
+ background: #fdfdfd;
+ font-size: 90%;
+}
+
+select {
+ border: 1px solid #d1d1d1;
+}
+
+body, h1, h2, h3, p, span, div {
+ font-family: "vera sans","dejavu sans",helvetica,verdana,arial,sans-serif;
+ color: #666666;
+}
+
+h3 {
+ margin-top: 1em;
+ margin-bottom: 0px;
+ font-size: 110%;
+ letter-spacing: 0.05em;
+ margin-left: 0px;
+ padding-left: 10px;
+ padding-bottom: 0px;
+ padding-top: 0px;
+ text-decoration: underline;
+}
+
+a:link, a:visited, a:link:active, a:link:hover { color: #486aaf; text-decoration: none; }
+a:link:hover { text-decoration: underline;}
+
+.warntext {
+ font-weight: bold;
+ background-color: #cccc00;
+ padding: 0px;
+ margin: -1px;
+ border: 1px solid #b9b900;
+}
+
+.crittext {
+ font-weight: bold;
+ background-color: #ff6f22;
+ padding: 0px;
+ margin: -1px;
+ border: 1px solid #f16722;
+}
+
+a.unkn:link { color: #ffaa00; }
+a.unkn:visited { color: #ffaa00; }
+a.unkn:active { color: #ffaa00; }
+a.unkn:hover { color: #ffaa00; }
+
+a.warn:link { color: #ffd300; }
+a.warn:visited { color: #ffd300; }
+a.warn:active { color: #ffd300; }
+a.warn:hover { color: #ffd300; }
+
+a.crit:link { color: #ff0000; }
+a.crit:visited { color: #ff0000; }
+a.crit:active { color: #ff0000; }
+a.crit:hover { color: #ff0000; }
+
+img { border: 0px; }
+img.i { border: 1px solid #a0a0a0; }
+img.iwarn { border: 1px solid #ffd300; }
+img.icrit { border: 1px solid #ff0000; }
+img.iunkn { border: 1px solid #ffaa00; }
+
+/* Header */
+#header {
+ width: 90%;
+ margin: 0 auto;
+ background-color: #fbfbfb;
+ border: 1px solid #cfd6f8;
+ border-bottom-left-radius: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ border-top: 0;
+ padding: 3px;
+ height: 40px;
+}
+
+#header p {
+ margin: 0;
+}
+
+h1, h2 {
+ margin: 0;
+ padding: 0;
+ font-size: 110%;
+ font-weight: bold;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+#nav h2 {
+ margin-top: 0.4em;
+ }
+
+h1 .logo {
+ display: block;
+ float: left;
+ background-image: url(logo-h.png);
+ background-repeat: no-repeat;
+ width: 115px;
+ height: 30px;
+ padding-right: 10px;
+ margin-top: 7px;
+ padding-bottom: 6px;
+}
+
+/* Main */
+#main {
+ width: 97%;
+ margin: 0 auto;
+}
+
+.contentpusher {
+ clear: both;
+}
+
+/* Navigation */
+#nav {
+ float: left;
+ width: 100px;
+}
+
+#nav ul li {
+ list-style-type: none;
+ margin: 0 0 0 3px;
+ padding: 2px;
+}
+
+#nav ul {
+ margin: 0.2em 0 0.8em 0;
+ padding: 0;
+}
+
+.navigationjump {
+ display: none;
+}
+
+/* Content */
+#content {
+ border-left: 1px solid #cfd6f8;
+ margin-left: 120px;
+ padding: 1em;
+}
+
+#content li {
+ margin-left: -20px;
+ }
+
+#content > ul:first-of-type {
+ margin-left: 2em;
+ }
+
+.comparison #content {
+ margin-left: 0;
+}
+
+#content h2 {
+ display: none;
+}
+
+ul.groupview li.last {
+ margin-bottom: 1em;
+}
+
+/* Content: comparison */
+td {
+ vertical-align: top;
+}
+.node {
+ width: 500px;
+}
+
+/* Content: service view */
+#legend {
+ margin: 2px;
+ border-collapse: collapse;
+}
+
+#legend tr, #legend td{
+ padding: 3px 2px 3px 2px;
+ margin: 1px;
+}
+
+#legend th{
+ border-bottom: 1px solid #999999;
+}
+
+#legend .oddrow{
+ background-color: #f8f8f8;
+}
+
+#legend .oddrow td{
+ border-bottom: 1px solid #d8d8d8;
+}
+
+#legend .evenrow{
+ background-color: #fdfdfd;
+}
+
+#legend .evenrow td{
+ border-bottom: 1px solid #d8d8d8;
+}
+
+#legend .lastrow td{
+ border-bottom: 0px solid transparent !important;
+}
+
+#legend .field, #legend .internal {
+ width: 20em;
+ text-align: left;
+}
+
+#legend .type {
+ width: 7em;
+ text-align: center;
+}
+
+#legend .warn, #legend .crit {
+ width: 5em;
+ text-align: center;
+}
+
+
+
+/* Footer */
+#footer {
+ width: 90%;
+ margin: 0 auto;
+ background-color: #fbfbfb;
+ border: 1px solid #cfd6f8;
+ padding: 5px;
+ clear: both;
+}
+
+#footer p.navigation {
+ margin: 0;
+}
+
+#footer p.tagline {
+ margin: 0;
+ font-size: 80%;
+ text-align: left;
+}
+
+.categoryview .node {
+ display: inline-block;
+}
diff --git a/hosts/jenkins/etc/munin/templates/partial/navigation.tmpl b/hosts/jenkins/etc/munin/templates/partial/navigation.tmpl
new file mode 100644
index 00000000..d1cbe07e
--- /dev/null
+++ b/hosts/jenkins/etc/munin/templates/partial/navigation.tmpl
@@ -0,0 +1,30 @@
+<div id="nav">
+ <p class="navigationjump"><a href="#content">Skip navigation</a></p>
+ <h2>Problems</h2>
+ <ul>
+ <li><a href="<TMPL_VAR NAME="R_PATH">/problems.html#critical">Critical</a> (<TMPL_VAR NAME="NCRITICAL">)</li>
+ <li><a href="<TMPL_VAR NAME="R_PATH">/problems.html#warnings">Warning</a> (<TMPL_VAR NAME="NWARNING">)</li>
+ <li><a href="<TMPL_VAR NAME="R_PATH">/problems.html#unknowns">Unknown</a> (<TMPL_VAR NAME="NUNKNOWN">)</li>
+ </ul>
+ <h2>Groups</h2>
+ <ul>
+ <TMPL_LOOP NAME="ROOTGROUPS">
+ <li><a href="<TMPL_VAR NAME="R_PATH">/<TMPL_VAR NAME="URL">"><TMPL_VAR NAME="NAME"></a></li>
+ </TMPL_LOOP>
+ </ul>
+ <h2>Categories</h2>
+ <ul>
+ <TMPL_LOOP NAME="GLOBALCATS">
+ <li>
+ <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_VAR NAME="URLDAY">"><TMPL_VAR NAME="NAME"></a><br />
+ [
+ <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_VAR NAME="URLDAY">">d</a>
+ <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_VAR NAME="URLWEEK">">w</a>
+ <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_VAR NAME="URLMONTH">">m</a>
+ <a href="<TMPL_VAR NAME="R_PATH">/<TMPL_VAR NAME="URLYEAR">">y</a>
+ ]
+ </li>
+ </TMPL_LOOP>
+ </ul>
+</div>
+