<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.openvz.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Benko</id>
	<title>OpenVZ Virtuozzo Containers Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.openvz.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Benko"/>
	<link rel="alternate" type="text/html" href="https://wiki.openvz.org/Special:Contributions/Benko"/>
	<updated>2026-06-10T02:04:03Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=6741</id>
		<title>Monitoring /proc/user beancounters with nagios</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=6741"/>
		<updated>2008-11-27T10:17:54Z</updated>

		<summary type="html">&lt;p&gt;Benko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Monitoring /proc/user_beancounters with nagios}}&lt;br /&gt;
To be added locally on the VZ HN to &amp;lt;code&amp;gt;/etc/nagios/nrpe_local.conf&amp;lt;/code&amp;gt; and as a standalone script run with cron.&lt;br /&gt;
&lt;br /&gt;
Works as nagios-plugin with option '-c' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-i'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks.&lt;br /&gt;
&lt;br /&gt;
The most current version of this script is available at http://github.com/peletiah/openvz/tree/master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alternative Script==&lt;br /&gt;
&lt;br /&gt;
Here is an alternative script, also written in python:&lt;br /&gt;
[http://www.kbrandt.com/2008/10/openvz-beancounters-nagios-script.html OpenVZ Nagios Bean Counters Script]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Monitoring]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=6728</id>
		<title>Monitoring /proc/user beancounters with nagios</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=6728"/>
		<updated>2008-11-24T11:21:05Z</updated>

		<summary type="html">&lt;p&gt;Benko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Monitoring /proc/user_beancounters with nagios}}&lt;br /&gt;
To be added locally on the VZ HN to &amp;lt;code&amp;gt;/etc/nagios/nrpe_local.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Works as nagios-plugin with option '-f' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-t'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks.&lt;br /&gt;
&lt;br /&gt;
The most current version of this script is available at http://github.com/peletiah/openvz/tree/master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Alternative Script==&lt;br /&gt;
&lt;br /&gt;
Here is an alternative script, also written in python:&lt;br /&gt;
[http://www.kbrandt.com/2008/10/openvz-beancounters-nagios-script.html OpenVZ Nagios Bean Counters Script]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Monitoring]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=6500</id>
		<title>Monitoring /proc/user beancounters with nagios</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=6500"/>
		<updated>2008-10-06T18:11:04Z</updated>

		<summary type="html">&lt;p&gt;Benko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Monitoring /proc/user_beancounters with nagios}}&lt;br /&gt;
To be added locally on the VZ HN to &amp;lt;code&amp;gt;/etc/nagios/nrpe_local.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Works as nagios-plugin with option '-f' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-t'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.2 2008-04-04&lt;br /&gt;
# Christian Benke &amp;lt;c.benke  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=None&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        if int(veid) != 0:&lt;br /&gt;
                for line in veid_conf:&lt;br /&gt;
                        if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                                quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                                line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                                linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                                line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                                fqdn=re.split('=',line)&lt;br /&gt;
                                hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                                return hostname&lt;br /&gt;
        else:&lt;br /&gt;
                hostname='OpenVZ HN'&lt;br /&gt;
                return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        sendmail = &amp;quot;/usr/lib/sendmail&amp;quot; # sendmail location&lt;br /&gt;
        import os&lt;br /&gt;
        p = os.popen(&amp;quot;%s -t&amp;quot; % sendmail, &amp;quot;w&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;From: root\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;To: to@example.com\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;Subject: Beancounters changed in the last 5 minutes\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;\n&amp;quot;) # blank line separating headers from body&lt;br /&gt;
        p.write(&amp;quot;The Beancounter-failcnt value of the following veid(s) and resource(s) has \n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;increased in the last 5 minutes:\n\n&amp;quot;)&lt;br /&gt;
        p.write(count_change)&lt;br /&gt;
        sts = p.close()&lt;br /&gt;
        if sts is not None:&lt;br /&gt;
                print &amp;quot;Sendmail exit status&amp;quot;, sts&lt;br /&gt;
&lt;br /&gt;
#---------- compare the failcnt-values&lt;br /&gt;
&lt;br /&gt;
def cntcheck(data_read,current_data,veid,fields,count,count_change):&lt;br /&gt;
        if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                        hostname=find_veid(veid)&lt;br /&gt;
                        count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5] + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
        return count_change&lt;br /&gt;
&lt;br /&gt;
#---------- compare the current value with barrier/limit value&lt;br /&gt;
&lt;br /&gt;
def barriercheck(data_read,current_data,veid,fields,count,barrier_break):&lt;br /&gt;
        if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                else:&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        return barrier_break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#------------ read user_beancounter and handle the result of the comparison subroutines&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
&lt;br /&gt;
                # ------ check barrier/limit&lt;br /&gt;
                        barrier_break=barriercheck(data_read,current_data,veid,fields,count,barrier_break)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                # ------ check failcnt&lt;br /&gt;
                        count_change=cntcheck(data_read,current_data,veid,fields,count,count_change)&lt;br /&gt;
&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounter.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounter.py : Check if failcounters increase or resource-values break barriers or limits&lt;br /&gt;
&lt;br /&gt;
 check_beancounter.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Monitoring]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5473</id>
		<title>Monitoring /proc/user beancounters with nagios</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5473"/>
		<updated>2008-04-07T09:54:41Z</updated>

		<summary type="html">&lt;p&gt;Benko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Monitoring /proc/user_beancounters with nagios ====&lt;br /&gt;
&lt;br /&gt;
To be added locally on the VZ HN to /etc/nagios/nrpe_local.conf&amp;lt;br&amp;gt;&lt;br /&gt;
Works as nagios-plugin with option '-f' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-t'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.2 2008-04-04&lt;br /&gt;
# Christian Benke &amp;lt;benkokakao  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=None&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        if int(veid) != 0:&lt;br /&gt;
                for line in veid_conf:&lt;br /&gt;
                        if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                                quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                                line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                                linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                                line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                                fqdn=re.split('=',line)&lt;br /&gt;
                                hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                                return hostname&lt;br /&gt;
        else:&lt;br /&gt;
                hostname='OpenVZ HN'&lt;br /&gt;
                return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        sendmail = &amp;quot;/usr/lib/sendmail&amp;quot; # sendmail location&lt;br /&gt;
        import os&lt;br /&gt;
        p = os.popen(&amp;quot;%s -t&amp;quot; % sendmail, &amp;quot;w&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;From: root\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;To: to@example.com\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;Subject: Beancounters changed in the last 5 minutes\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;\n&amp;quot;) # blank line separating headers from body&lt;br /&gt;
        p.write(&amp;quot;The Beancounter-failcnt value of the following veid(s) and resource(s) has \n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;increased in the last 5 minutes:\n\n&amp;quot;)&lt;br /&gt;
        p.write(count_change)&lt;br /&gt;
        sts = p.close()&lt;br /&gt;
        if sts is not None:&lt;br /&gt;
                print &amp;quot;Sendmail exit status&amp;quot;, sts&lt;br /&gt;
&lt;br /&gt;
#---------- compare the failcnt-values&lt;br /&gt;
&lt;br /&gt;
def cntcheck(data_read,current_data,veid,fields,count,count_change):&lt;br /&gt;
        if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                        hostname=find_veid(veid)&lt;br /&gt;
                        count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5] + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
        return count_change&lt;br /&gt;
&lt;br /&gt;
#---------- compare the current value with barrier/limit value&lt;br /&gt;
&lt;br /&gt;
def barriercheck(data_read,current_data,veid,fields,count,barrier_break):&lt;br /&gt;
        if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                else:&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        return barrier_break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#------------ read user_beancounter and handle the result of the comparison subroutines&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
&lt;br /&gt;
                # ------ check barrier/limit&lt;br /&gt;
                        barrier_break=barriercheck(data_read,current_data,veid,fields,count,barrier_break)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                # ------ check failcnt&lt;br /&gt;
                        count_change=cntcheck(data_read,current_data,veid,fields,count,count_change)&lt;br /&gt;
&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounter.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounter.py : Check if failcounters increase or resource-values break barriers or limits&lt;br /&gt;
&lt;br /&gt;
 check_beancounter.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Monitoring]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5472</id>
		<title>Monitoring /proc/user beancounters with nagios</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5472"/>
		<updated>2008-04-07T08:17:04Z</updated>

		<summary type="html">&lt;p&gt;Benko: /* Monitoring /proc/user_beancounters with nagios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Monitoring /proc/user_beancounters with nagios ====&lt;br /&gt;
&lt;br /&gt;
To be added locally on the VZ HN to /etc/nagios/nrpe_local.conf&amp;lt;br&amp;gt;&lt;br /&gt;
Works as nagios-plugin with option '-f' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-t'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.2 2008-04-04&lt;br /&gt;
# Christian Benke &amp;lt;benkokakao  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
import smtplib&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        if int(veid) != 0:&lt;br /&gt;
                for line in veid_conf:&lt;br /&gt;
                        if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                                quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                                line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                                linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                                line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                                fqdn=re.split('=',line)&lt;br /&gt;
                                hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                                return hostname&lt;br /&gt;
        else:&lt;br /&gt;
                hostname='OpenVZ HN'&lt;br /&gt;
                return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        sendmail = &amp;quot;/usr/lib/sendmail&amp;quot; # sendmail location&lt;br /&gt;
        import os&lt;br /&gt;
        p = os.popen(&amp;quot;%s -t&amp;quot; % sendmail, &amp;quot;w&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;From: root\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;To: to@example.com\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;Subject: Beancounters changed in the last 5 minutes\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;\n&amp;quot;) # blank line separating headers from body&lt;br /&gt;
        p.write(&amp;quot;The Beancounter-failcnt value of the following veid(s) and resource(s) has \n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;increased in the last 5 minutes:\n\n&amp;quot;)&lt;br /&gt;
        p.write(count_change)&lt;br /&gt;
        sts = p.close()&lt;br /&gt;
        if sts is not None:&lt;br /&gt;
                print &amp;quot;Sendmail exit status&amp;quot;, sts&lt;br /&gt;
&lt;br /&gt;
#---------- compare the failcnt-values&lt;br /&gt;
&lt;br /&gt;
def cntcheck(data_read,current_data,veid,fields,count,count_change):&lt;br /&gt;
        if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                        hostname=find_veid(veid)&lt;br /&gt;
                        count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5] + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
        return count_change&lt;br /&gt;
&lt;br /&gt;
#---------- compare the current value with barrier/limit value&lt;br /&gt;
&lt;br /&gt;
def barriercheck(data_read,current_data,veid,fields,count,barrier_break):&lt;br /&gt;
        if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                else:&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        return barrier_break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#------------ read user_beancounter and handle the result of the comparison subroutines&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
&lt;br /&gt;
                # ------ check barrier/limit&lt;br /&gt;
                        barrier_break=barriercheck(data_read,current_data,veid,fields,count,barrier_break)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                # ------ check failcnt&lt;br /&gt;
                        count_change=cntcheck(data_read,current_data,veid,fields,count,count_change)&lt;br /&gt;
&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                print 'sending mail'&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                print 'mail sent'&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounter.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounter.py : Check if failcounters increase or resource-values break barriers or limits&lt;br /&gt;
&lt;br /&gt;
 check_beancounter.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Monitoring]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5467</id>
		<title>Monitoring /proc/user beancounters with nagios</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5467"/>
		<updated>2008-04-04T15:55:21Z</updated>

		<summary type="html">&lt;p&gt;Benko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Monitoring /proc/user_beancounters with nagios ====&lt;br /&gt;
&lt;br /&gt;
To be added locally on the VZ HN to /etc/nagios/nrpe_local.conf&amp;lt;br&amp;gt;&lt;br /&gt;
Works as nagios-plugin with option '-f' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-t'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.2 2008-04-04&lt;br /&gt;
# Christian Benke &amp;lt;benkokakao  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
import smtplib&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        if int(veid) != 0:&lt;br /&gt;
                for line in veid_conf:&lt;br /&gt;
                        if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                                quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                                line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                                linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                                line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                                fqdn=re.split('=',line)&lt;br /&gt;
                                hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                                return hostname&lt;br /&gt;
        else:&lt;br /&gt;
                hostname='OpenVZ HN'&lt;br /&gt;
                return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        sendmail = &amp;quot;/usr/lib/sendmail&amp;quot; # sendmail location&lt;br /&gt;
        import os&lt;br /&gt;
        p = os.popen(&amp;quot;%s -t&amp;quot; % sendmail, &amp;quot;w&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;From: root\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;To: to@example.com\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;Subject: Beancounters changed in the last 5 minutes\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;\n&amp;quot;) # blank line separating headers from body&lt;br /&gt;
        p.write(&amp;quot;The Beancounter-failcnt value of the following veid(s) and resource(s) has \n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;increased in the last 5 minutes:\n\n&amp;quot;)&lt;br /&gt;
        p.write(count_change)&lt;br /&gt;
        sts = p.close()&lt;br /&gt;
        if sts is not None:&lt;br /&gt;
                print &amp;quot;Sendmail exit status&amp;quot;, sts&lt;br /&gt;
&lt;br /&gt;
#---------- compare the failcnt-values&lt;br /&gt;
&lt;br /&gt;
def cntcheck(data_read,current_data,veid,fields,count,count_change):&lt;br /&gt;
        if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                        hostname=find_veid(veid)&lt;br /&gt;
                        count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5] + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
        return count_change&lt;br /&gt;
&lt;br /&gt;
#---------- compare the current value with barrier/limit value&lt;br /&gt;
&lt;br /&gt;
def barriercheck(data_read,current_data,veid,fields,count,barrier_break):&lt;br /&gt;
        if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                else:&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        return barrier_break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#------------ read user_beancounter and handle the result of the comparison subroutines&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
&lt;br /&gt;
                # ------ check failcnt&lt;br /&gt;
                        barrier_break=barriercheck(data_read,current_data,veid,fields,count,barrier_break)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                # ------ check barrier/limit&lt;br /&gt;
                        count_change=cntcheck(data_read,current_data,veid,fields,count,count_change)&lt;br /&gt;
&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                print 'sending mail'&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                print 'mail sent'&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounter.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounter.py : Check if failcounters increase or resource-values break barriers or limits&lt;br /&gt;
&lt;br /&gt;
 check_beancounter.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Monitoring]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5465</id>
		<title>Monitoring /proc/user beancounters with nagios</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5465"/>
		<updated>2008-04-04T15:48:49Z</updated>

		<summary type="html">&lt;p&gt;Benko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Monitoring /proc/user_beancounters with nagios ====&lt;br /&gt;
&lt;br /&gt;
To be added locally on the VZ HN to /etc/nagios/nrpe_local.conf&amp;lt;br&amp;gt;&lt;br /&gt;
Works as nagios-plugin with option '-f' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-t'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.2 2008-04-04&lt;br /&gt;
# Christian Benke &amp;lt;benkokakao  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
import smtplib&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        if int(veid) != 0:&lt;br /&gt;
                for line in veid_conf:&lt;br /&gt;
                        if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                                quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                                line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                                linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                                line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                                fqdn=re.split('=',line)&lt;br /&gt;
                                hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                                return hostname&lt;br /&gt;
        else:&lt;br /&gt;
                hostname='OpenVZ HN'&lt;br /&gt;
                return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        sendmail = &amp;quot;/usr/lib/sendmail&amp;quot; # sendmail location&lt;br /&gt;
        import os&lt;br /&gt;
        p = os.popen(&amp;quot;%s -t&amp;quot; % sendmail, &amp;quot;w&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;From: root\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;To: benke@inqnet.at\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;Subject: Beancounters changed in the last 5 minutes\n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;\n&amp;quot;) # blank line separating headers from body&lt;br /&gt;
        p.write(&amp;quot;The Beancounter-failcnt value of the following veid(s) and resource(s) has \n&amp;quot;)&lt;br /&gt;
        p.write(&amp;quot;increased in the last 5 minutes:\n\n&amp;quot;)&lt;br /&gt;
        p.write(count_change)&lt;br /&gt;
        sts = p.close()&lt;br /&gt;
        if sts is not None:&lt;br /&gt;
                print &amp;quot;Sendmail exit status&amp;quot;, sts&lt;br /&gt;
&lt;br /&gt;
#---------- compare the failcnt-values&lt;br /&gt;
&lt;br /&gt;
def cntcheck(data_read,current_data,veid,fields,count,count_change):&lt;br /&gt;
        if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                        hostname=find_veid(veid)&lt;br /&gt;
                        count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5] + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
        return count_change&lt;br /&gt;
&lt;br /&gt;
#---------- compare the current value with barrier/limit value&lt;br /&gt;
&lt;br /&gt;
def barriercheck(data_read,current_data,veid,fields,count,barrier_break):&lt;br /&gt;
        if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                else:&lt;br /&gt;
                        if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                hostname=find_veid(veid)&lt;br /&gt;
                                barrier_break = str(barrier_break) + str(hostname) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        return barrier_break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#------------ read user_beancounter and handle the result of the comparison subroutines&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
&lt;br /&gt;
                # ------ check failcnt&lt;br /&gt;
                        barrier_break=barriercheck(data_read,current_data,veid,fields,count,barrier_break)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                # ------ check barrier/limit&lt;br /&gt;
                        count_change=cntcheck(data_read,current_data,veid,fields,count,count_change)&lt;br /&gt;
&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                print 'sending mail'&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                print 'mail sent'&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounter.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounter.py : Check if failcounters increase or resource-values break barriers or limits&lt;br /&gt;
&lt;br /&gt;
 check_beancounter.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Monitoring]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5437</id>
		<title>Monitoring /proc/user beancounters with nagios</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5437"/>
		<updated>2008-04-04T08:54:01Z</updated>

		<summary type="html">&lt;p&gt;Benko: Nagios beancounters monitoring moved to Monitoring /proc/user beancounters with nagios: adapted to what seems to be the convention for monitoring articles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Monitoring /proc/user_beancounters with nagios ====&lt;br /&gt;
&lt;br /&gt;
To be added locally on the VZ HN to /etc/nagios/nrpe_local.conf&amp;lt;br&amp;gt;&lt;br /&gt;
Works as nagios-plugin with option '-f' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-t'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.1 2008-04-03&lt;br /&gt;
# Christian Benke &amp;lt;benkokakao  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
import smtplib&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        for line in veid_conf:&lt;br /&gt;
                if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                        quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                        line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                        line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        fqdn=re.split('=',line)&lt;br /&gt;
                        hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                        return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        mailfrom = 'root@' + str(host)&lt;br /&gt;
        mailto = 'to@example.com'&lt;br /&gt;
        mailsubject = 'Beancounters changed in the last 5 minutes'&lt;br /&gt;
        mailbody = 'The Beancounter-failcnt value of the following veid(s) and resource(s) has \nincreased in the last 5 minutes:\n\n'&lt;br /&gt;
        server = smtplib.SMTP('localhost')&lt;br /&gt;
        server.sendmail(mailfrom, [mailto], '''\&lt;br /&gt;
From:''' + mailfrom + '''\&lt;br /&gt;
\nTo:''' + mailto + '''\&lt;br /&gt;
\nSubject:''' + mailsubject + '''\&lt;br /&gt;
&lt;br /&gt;
\n''' + mailbody + count_change)&lt;br /&gt;
        server.quit()&lt;br /&gt;
&lt;br /&gt;
#------------read raw and compare data from user_beancounters&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                        if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                                if int(veid) != 0:&lt;br /&gt;
                                        hostname=find_veid(veid)&lt;br /&gt;
                                else:&lt;br /&gt;
                                        hostname='OpenVZ Hardware Node'&lt;br /&gt;
                                count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5]&lt;br /&gt;
 + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
&lt;br /&gt;
                if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                        if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        else:&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounters.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounters.py : Check if resource-values break barriers or limits and failcounters increase&lt;br /&gt;
&lt;br /&gt;
 check_beancounters.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Monitoring]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Nagios_beancounters_monitoring&amp;diff=5438</id>
		<title>Nagios beancounters monitoring</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Nagios_beancounters_monitoring&amp;diff=5438"/>
		<updated>2008-04-04T08:54:01Z</updated>

		<summary type="html">&lt;p&gt;Benko: Nagios beancounters monitoring moved to Monitoring /proc/user beancounters with nagios: adapted to what seems to be the convention for monitoring articles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Monitoring /proc/user beancounters with nagios]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5436</id>
		<title>Monitoring /proc/user beancounters with nagios</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_/proc/user_beancounters_with_nagios&amp;diff=5436"/>
		<updated>2008-04-04T08:52:16Z</updated>

		<summary type="html">&lt;p&gt;Benko: New page: ==== Monitoring /proc/user_beancounters with nagios ====  To be added locally on the VZ HN to /etc/nagios/nrpe_local.conf&amp;lt;br&amp;gt; Works as nagios-plugin with option '-f' or reports an increase...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Monitoring /proc/user_beancounters with nagios ====&lt;br /&gt;
&lt;br /&gt;
To be added locally on the VZ HN to /etc/nagios/nrpe_local.conf&amp;lt;br&amp;gt;&lt;br /&gt;
Works as nagios-plugin with option '-f' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-t'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.1 2008-04-03&lt;br /&gt;
# Christian Benke &amp;lt;benkokakao  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
import smtplib&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        for line in veid_conf:&lt;br /&gt;
                if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                        quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                        line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                        line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        fqdn=re.split('=',line)&lt;br /&gt;
                        hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                        return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        mailfrom = 'root@' + str(host)&lt;br /&gt;
        mailto = 'to@example.com'&lt;br /&gt;
        mailsubject = 'Beancounters changed in the last 5 minutes'&lt;br /&gt;
        mailbody = 'The Beancounter-failcnt value of the following veid(s) and resource(s) has \nincreased in the last 5 minutes:\n\n'&lt;br /&gt;
        server = smtplib.SMTP('localhost')&lt;br /&gt;
        server.sendmail(mailfrom, [mailto], '''\&lt;br /&gt;
From:''' + mailfrom + '''\&lt;br /&gt;
\nTo:''' + mailto + '''\&lt;br /&gt;
\nSubject:''' + mailsubject + '''\&lt;br /&gt;
&lt;br /&gt;
\n''' + mailbody + count_change)&lt;br /&gt;
        server.quit()&lt;br /&gt;
&lt;br /&gt;
#------------read raw and compare data from user_beancounters&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                        if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                                if int(veid) != 0:&lt;br /&gt;
                                        hostname=find_veid(veid)&lt;br /&gt;
                                else:&lt;br /&gt;
                                        hostname='OpenVZ Hardware Node'&lt;br /&gt;
                                count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5]&lt;br /&gt;
 + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
&lt;br /&gt;
                if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                        if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        else:&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounters.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounters.py : Check if resource-values break barriers or limits and failcounters increase&lt;br /&gt;
&lt;br /&gt;
 check_beancounters.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;br /&gt;
&lt;br /&gt;
[[Category: Monitoring]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5435</id>
		<title>Monitoring openvz resources using nagios and snmp</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5435"/>
		<updated>2008-04-04T08:48:22Z</updated>

		<summary type="html">&lt;p&gt;Benko: /* nagios plugin/failcnt locally, without snmp */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== snmpd configuration ==&lt;br /&gt;
Debian Etch example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install snmpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''/etc/default/snmpd''' : remove ''-u snmp'' and replace ''127.0.0.1'' with your ip, Full'''/etc/default/snmpd''' example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid 207.46.250.119'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Debian 4.x:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create user(my_username) and add new mib. Password need a min. of 8 charactes. Username only characters:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/init.d/snmpd stop&lt;br /&gt;
echo rouser my_username priv &amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.51  beancounters  /bin/cat /proc/user_beancounters&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.52  vzquota  /bin/cat /proc/vz/vzquota&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo  createUser my_username MD5 my_password DES &amp;gt;&amp;gt; /var/lib/snmp/snmpd.conf&lt;br /&gt;
/etc/init.d/snmpd start &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testing snmp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snmpwalk   -v 3  -u my_usrname -l authPriv   -a MD5 -A my_password -x DES -X my_password  207.46.250.119&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning: the minimum pass phrase length is 8 characters.&lt;br /&gt;
&lt;br /&gt;
== nagios configuration ==&lt;br /&gt;
=== example nagios configuration ===&lt;br /&gt;
add to configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define command {&lt;br /&gt;
command_name check_snmp_openvz_on_port&lt;br /&gt;
# command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ PORT    USER    PASSWORD&lt;br /&gt;
command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ $ARG1$  $ARG2$  $ARG3$&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define host {&lt;br /&gt;
        host_name   openvz-server&lt;br /&gt;
        alias       Serwer Openvz&lt;br /&gt;
        address     207.46.250.119&lt;br /&gt;
        use         generic-host&lt;br /&gt;
        contact_groups  admins&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define service{&lt;br /&gt;
        use                             generic-service&lt;br /&gt;
        host_name                       openvz-server&lt;br /&gt;
        service_description             Virtual Machines Limits&lt;br /&gt;
        check_command                   check_snmp_openvz_on_port!161!my_username!my_password&lt;br /&gt;
        max_check_attempts              1&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== nagios plugin ===&lt;br /&gt;
It is shell script:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# cat /usr/local/bin/check_snmp_openvz.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
HOST=$1&lt;br /&gt;
PORT=$2&lt;br /&gt;
USER=$3&lt;br /&gt;
PASS=$4&lt;br /&gt;
export FILE=/tmp/$HOST.beancounters&lt;br /&gt;
RET=0&lt;br /&gt;
&lt;br /&gt;
DATA_TMP=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.51.4`&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DATA=`echo &amp;quot;$DATA_TMP&amp;quot;| perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ -f $FILE ]; then&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
use Data::Dumper;&lt;br /&gt;
my $file=$ENV{&amp;quot;FILE&amp;quot;};&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $resource ;&lt;br /&gt;
my $held ;&lt;br /&gt;
my $maxheld ;&lt;br /&gt;
my $barrier ;&lt;br /&gt;
my $limit ;&lt;br /&gt;
my $failcnt ;&lt;br /&gt;
my %beancounters ;&lt;br /&gt;
my %beancounters_old ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
                if ( ($held  &amp;gt; $barrier) &amp;amp;&amp;amp; ($barrier != 0) ) {&lt;br /&gt;
                        print &amp;quot;WARNING: Limits on $vid: $resource  held-&amp;gt;$held , barrier-&amp;gt;$barrier ( limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# read and parse old data&lt;br /&gt;
open(MYINPUTFILE, &amp;quot;&amp;lt;$file&amp;quot;);&lt;br /&gt;
while(&amp;lt;MYINPUTFILE&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters_old{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters_old{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach my $vmachine_id (keys %beancounters) {&lt;br /&gt;
        foreach my $resource (keys %{$beancounters{$vmachine_id}} ) {&lt;br /&gt;
                if ( defined($beancounters{$vmachine_id}{$resource}[4]) &amp;amp;&amp;amp; defined($beancounters_old{$vmachine_id}{$resource}[4]) ){&lt;br /&gt;
                        my $failcnt=$beancounters{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $failcnt_old=$beancounters_old{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $held=$beancounters{$vmachine_id}{$resource}[0];&lt;br /&gt;
                        my $maxheld=$beancounters{$vmachine_id}{$resource}[1];&lt;br /&gt;
                        my $barrier=$beancounters{$vmachine_id}{$resource}[2];&lt;br /&gt;
                        my $limit=$beancounters{$vmachine_id}{$resource}[3];&lt;br /&gt;
                        if ( $failcnt_old &amp;lt; $failcnt ){&lt;br /&gt;
                                print &amp;quot;CRITICAL: Incrased failcnt  $vmachine_id: $resource from $failcnt_old to $failcnt (held-&amp;gt;$held , maxheld-&amp;gt;$maxheld , barrier-&amp;gt;$barrier , limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                                $ret=2;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# if ($ret == 0 ) { print &amp;quot;Ok. \n&amp;quot; ; }&lt;br /&gt;
# print Dumper(%beancounters_old) ;&lt;br /&gt;
# print &amp;quot;\n&amp;quot;;&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
&lt;br /&gt;
RET1=$?&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; &amp;gt; $FILE&lt;br /&gt;
#####################################################################################&lt;br /&gt;
######### quota check&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
DATA=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.52.4 \&lt;br /&gt;
|  perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vid;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; }&lt;br /&gt;
        if ( /\s*(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ){&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $usage=$2 ;&lt;br /&gt;
                $softlimit=$3 ;&lt;br /&gt;
                $hardlimit=$4 ;&lt;br /&gt;
                $time=$5 ;&lt;br /&gt;
                $expire=$6 ;&lt;br /&gt;
                if ( $usage &amp;gt;= $softlimit ){&lt;br /&gt;
                        print &amp;quot;WARNING: VZquota limit exceeded on $vid: $resource  usage-&amp;gt;$usage, softlimit-&amp;gt;$softlimit, hardlimit-&amp;gt;$hardlimit, time-&amp;gt;$time, expire-&amp;gt;$expire  &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
RET2=$?&lt;br /&gt;
&lt;br /&gt;
#####################################################################################&lt;br /&gt;
########### return&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
if [  $RET1  -gt $RET2  ]; then&lt;br /&gt;
        RET=$RET1&lt;br /&gt;
        else&lt;br /&gt;
        RET=$RET2&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [  $RET  = 0  ]; then&lt;br /&gt;
        echo Ok.&lt;br /&gt;
fi&lt;br /&gt;
exit $RET&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5434</id>
		<title>Monitoring openvz resources using nagios and snmp</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5434"/>
		<updated>2008-04-03T23:19:59Z</updated>

		<summary type="html">&lt;p&gt;Benko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== snmpd configuration ==&lt;br /&gt;
Debian Etch example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install snmpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''/etc/default/snmpd''' : remove ''-u snmp'' and replace ''127.0.0.1'' with your ip, Full'''/etc/default/snmpd''' example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid 207.46.250.119'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Debian 4.x:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create user(my_username) and add new mib. Password need a min. of 8 charactes. Username only characters:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/init.d/snmpd stop&lt;br /&gt;
echo rouser my_username priv &amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.51  beancounters  /bin/cat /proc/user_beancounters&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.52  vzquota  /bin/cat /proc/vz/vzquota&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo  createUser my_username MD5 my_password DES &amp;gt;&amp;gt; /var/lib/snmp/snmpd.conf&lt;br /&gt;
/etc/init.d/snmpd start &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testing snmp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snmpwalk   -v 3  -u my_usrname -l authPriv   -a MD5 -A my_password -x DES -X my_password  207.46.250.119&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning: the minimum pass phrase length is 8 characters.&lt;br /&gt;
&lt;br /&gt;
== nagios configuration ==&lt;br /&gt;
=== example nagios configuration ===&lt;br /&gt;
add to configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define command {&lt;br /&gt;
command_name check_snmp_openvz_on_port&lt;br /&gt;
# command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ PORT    USER    PASSWORD&lt;br /&gt;
command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ $ARG1$  $ARG2$  $ARG3$&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define host {&lt;br /&gt;
        host_name   openvz-server&lt;br /&gt;
        alias       Serwer Openvz&lt;br /&gt;
        address     207.46.250.119&lt;br /&gt;
        use         generic-host&lt;br /&gt;
        contact_groups  admins&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define service{&lt;br /&gt;
        use                             generic-service&lt;br /&gt;
        host_name                       openvz-server&lt;br /&gt;
        service_description             Virtual Machines Limits&lt;br /&gt;
        check_command                   check_snmp_openvz_on_port!161!my_username!my_password&lt;br /&gt;
        max_check_attempts              1&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== nagios plugin ===&lt;br /&gt;
It is shell script:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# cat /usr/local/bin/check_snmp_openvz.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
HOST=$1&lt;br /&gt;
PORT=$2&lt;br /&gt;
USER=$3&lt;br /&gt;
PASS=$4&lt;br /&gt;
export FILE=/tmp/$HOST.beancounters&lt;br /&gt;
RET=0&lt;br /&gt;
&lt;br /&gt;
DATA_TMP=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.51.4`&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DATA=`echo &amp;quot;$DATA_TMP&amp;quot;| perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ -f $FILE ]; then&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
use Data::Dumper;&lt;br /&gt;
my $file=$ENV{&amp;quot;FILE&amp;quot;};&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $resource ;&lt;br /&gt;
my $held ;&lt;br /&gt;
my $maxheld ;&lt;br /&gt;
my $barrier ;&lt;br /&gt;
my $limit ;&lt;br /&gt;
my $failcnt ;&lt;br /&gt;
my %beancounters ;&lt;br /&gt;
my %beancounters_old ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
                if ( ($held  &amp;gt; $barrier) &amp;amp;&amp;amp; ($barrier != 0) ) {&lt;br /&gt;
                        print &amp;quot;WARNING: Limits on $vid: $resource  held-&amp;gt;$held , barrier-&amp;gt;$barrier ( limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# read and parse old data&lt;br /&gt;
open(MYINPUTFILE, &amp;quot;&amp;lt;$file&amp;quot;);&lt;br /&gt;
while(&amp;lt;MYINPUTFILE&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters_old{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters_old{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach my $vmachine_id (keys %beancounters) {&lt;br /&gt;
        foreach my $resource (keys %{$beancounters{$vmachine_id}} ) {&lt;br /&gt;
                if ( defined($beancounters{$vmachine_id}{$resource}[4]) &amp;amp;&amp;amp; defined($beancounters_old{$vmachine_id}{$resource}[4]) ){&lt;br /&gt;
                        my $failcnt=$beancounters{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $failcnt_old=$beancounters_old{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $held=$beancounters{$vmachine_id}{$resource}[0];&lt;br /&gt;
                        my $maxheld=$beancounters{$vmachine_id}{$resource}[1];&lt;br /&gt;
                        my $barrier=$beancounters{$vmachine_id}{$resource}[2];&lt;br /&gt;
                        my $limit=$beancounters{$vmachine_id}{$resource}[3];&lt;br /&gt;
                        if ( $failcnt_old &amp;lt; $failcnt ){&lt;br /&gt;
                                print &amp;quot;CRITICAL: Incrased failcnt  $vmachine_id: $resource from $failcnt_old to $failcnt (held-&amp;gt;$held , maxheld-&amp;gt;$maxheld , barrier-&amp;gt;$barrier , limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                                $ret=2;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# if ($ret == 0 ) { print &amp;quot;Ok. \n&amp;quot; ; }&lt;br /&gt;
# print Dumper(%beancounters_old) ;&lt;br /&gt;
# print &amp;quot;\n&amp;quot;;&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
&lt;br /&gt;
RET1=$?&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; &amp;gt; $FILE&lt;br /&gt;
#####################################################################################&lt;br /&gt;
######### quota check&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
DATA=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.52.4 \&lt;br /&gt;
|  perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vid;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; }&lt;br /&gt;
        if ( /\s*(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ){&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $usage=$2 ;&lt;br /&gt;
                $softlimit=$3 ;&lt;br /&gt;
                $hardlimit=$4 ;&lt;br /&gt;
                $time=$5 ;&lt;br /&gt;
                $expire=$6 ;&lt;br /&gt;
                if ( $usage &amp;gt;= $softlimit ){&lt;br /&gt;
                        print &amp;quot;WARNING: VZquota limit exceeded on $vid: $resource  usage-&amp;gt;$usage, softlimit-&amp;gt;$softlimit, hardlimit-&amp;gt;$hardlimit, time-&amp;gt;$time, expire-&amp;gt;$expire  &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
RET2=$?&lt;br /&gt;
&lt;br /&gt;
#####################################################################################&lt;br /&gt;
########### return&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
if [  $RET1  -gt $RET2  ]; then&lt;br /&gt;
        RET=$RET1&lt;br /&gt;
        else&lt;br /&gt;
        RET=$RET2&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [  $RET  = 0  ]; then&lt;br /&gt;
        echo Ok.&lt;br /&gt;
fi&lt;br /&gt;
exit $RET&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== nagios plugin/failcnt locally, without snmp ===&lt;br /&gt;
&lt;br /&gt;
To be added locally on the VZ HN to /etc/nagios/nrpe_local.conf&amp;lt;br&amp;gt;&lt;br /&gt;
Works as nagios-plugin with option '-f' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-t'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.1 2008-04-03&lt;br /&gt;
# Christian Benke &amp;lt;benkokakao  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
import smtplib&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        for line in veid_conf:&lt;br /&gt;
                if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                        quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                        line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                        line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        fqdn=re.split('=',line)&lt;br /&gt;
                        hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                        return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        mailfrom = 'root@' + str(host)&lt;br /&gt;
        mailto = 'to@example.com'&lt;br /&gt;
        mailsubject = 'Beancounters changed in the last 5 minutes'&lt;br /&gt;
        mailbody = 'The Beancounter-failcnt value of the following veid(s) and resource(s) has \nincreased in the last 5 minutes:\n\n'&lt;br /&gt;
        server = smtplib.SMTP('localhost')&lt;br /&gt;
        server.sendmail(mailfrom, [mailto], '''\&lt;br /&gt;
From:''' + mailfrom + '''\&lt;br /&gt;
\nTo:''' + mailto + '''\&lt;br /&gt;
\nSubject:''' + mailsubject + '''\&lt;br /&gt;
&lt;br /&gt;
\n''' + mailbody + count_change)&lt;br /&gt;
        server.quit()&lt;br /&gt;
&lt;br /&gt;
#------------read raw and compare data from user_beancounters&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                        if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                                if int(veid) != 0:&lt;br /&gt;
                                        hostname=find_veid(veid)&lt;br /&gt;
                                else:&lt;br /&gt;
                                        hostname='OpenVZ Hardware Node'&lt;br /&gt;
                                count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5]&lt;br /&gt;
 + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
&lt;br /&gt;
                if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                        if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        else:&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounters.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounters.py : Check if resource-values break barriers or limits and failcounters increase&lt;br /&gt;
&lt;br /&gt;
 check_beancounters.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5433</id>
		<title>Monitoring openvz resources using nagios and snmp</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5433"/>
		<updated>2008-04-03T23:18:30Z</updated>

		<summary type="html">&lt;p&gt;Benko: /* nagios plugin/failcnt in python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== snmpd configuration ==&lt;br /&gt;
Debian Etch example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install snmpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''/etc/default/snmpd''' : remove ''-u snmp'' and replace ''127.0.0.1'' with your ip, Full'''/etc/default/snmpd''' example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid 207.46.250.119'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Debian 4.x:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create user(my_username) and add new mib. Password need a min. of 8 charactes. Username only characters:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/init.d/snmpd stop&lt;br /&gt;
echo rouser my_username priv &amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.51  beancounters  /bin/cat /proc/user_beancounters&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.52  vzquota  /bin/cat /proc/vz/vzquota&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo  createUser my_username MD5 my_password DES &amp;gt;&amp;gt; /var/lib/snmp/snmpd.conf&lt;br /&gt;
/etc/init.d/snmpd start &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testing snmp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snmpwalk   -v 3  -u my_usrname -l authPriv   -a MD5 -A my_password -x DES -X my_password  207.46.250.119&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning: the minimum pass phrase length is 8 characters.&lt;br /&gt;
&lt;br /&gt;
== nagios configuration ==&lt;br /&gt;
=== example nagios configuration ===&lt;br /&gt;
add to configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define command {&lt;br /&gt;
command_name check_snmp_openvz_on_port&lt;br /&gt;
# command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ PORT    USER    PASSWORD&lt;br /&gt;
command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ $ARG1$  $ARG2$  $ARG3$&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define host {&lt;br /&gt;
        host_name   openvz-server&lt;br /&gt;
        alias       Serwer Openvz&lt;br /&gt;
        address     207.46.250.119&lt;br /&gt;
        use         generic-host&lt;br /&gt;
        contact_groups  admins&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define service{&lt;br /&gt;
        use                             generic-service&lt;br /&gt;
        host_name                       openvz-server&lt;br /&gt;
        service_description             Virtual Machines Limits&lt;br /&gt;
        check_command                   check_snmp_openvz_on_port!161!my_username!my_password&lt;br /&gt;
        max_check_attempts              1&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== nagios plugin ===&lt;br /&gt;
It is shell script:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# cat /usr/local/bin/check_snmp_openvz.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
HOST=$1&lt;br /&gt;
PORT=$2&lt;br /&gt;
USER=$3&lt;br /&gt;
PASS=$4&lt;br /&gt;
export FILE=/tmp/$HOST.beancounters&lt;br /&gt;
RET=0&lt;br /&gt;
&lt;br /&gt;
DATA_TMP=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.51.4`&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DATA=`echo &amp;quot;$DATA_TMP&amp;quot;| perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ -f $FILE ]; then&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
use Data::Dumper;&lt;br /&gt;
my $file=$ENV{&amp;quot;FILE&amp;quot;};&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $resource ;&lt;br /&gt;
my $held ;&lt;br /&gt;
my $maxheld ;&lt;br /&gt;
my $barrier ;&lt;br /&gt;
my $limit ;&lt;br /&gt;
my $failcnt ;&lt;br /&gt;
my %beancounters ;&lt;br /&gt;
my %beancounters_old ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
                if ( ($held  &amp;gt; $barrier) &amp;amp;&amp;amp; ($barrier != 0) ) {&lt;br /&gt;
                        print &amp;quot;WARNING: Limits on $vid: $resource  held-&amp;gt;$held , barrier-&amp;gt;$barrier ( limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# read and parse old data&lt;br /&gt;
open(MYINPUTFILE, &amp;quot;&amp;lt;$file&amp;quot;);&lt;br /&gt;
while(&amp;lt;MYINPUTFILE&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters_old{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters_old{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach my $vmachine_id (keys %beancounters) {&lt;br /&gt;
        foreach my $resource (keys %{$beancounters{$vmachine_id}} ) {&lt;br /&gt;
                if ( defined($beancounters{$vmachine_id}{$resource}[4]) &amp;amp;&amp;amp; defined($beancounters_old{$vmachine_id}{$resource}[4]) ){&lt;br /&gt;
                        my $failcnt=$beancounters{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $failcnt_old=$beancounters_old{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $held=$beancounters{$vmachine_id}{$resource}[0];&lt;br /&gt;
                        my $maxheld=$beancounters{$vmachine_id}{$resource}[1];&lt;br /&gt;
                        my $barrier=$beancounters{$vmachine_id}{$resource}[2];&lt;br /&gt;
                        my $limit=$beancounters{$vmachine_id}{$resource}[3];&lt;br /&gt;
                        if ( $failcnt_old &amp;lt; $failcnt ){&lt;br /&gt;
                                print &amp;quot;CRITICAL: Incrased failcnt  $vmachine_id: $resource from $failcnt_old to $failcnt (held-&amp;gt;$held , maxheld-&amp;gt;$maxheld , barrier-&amp;gt;$barrier , limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                                $ret=2;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# if ($ret == 0 ) { print &amp;quot;Ok. \n&amp;quot; ; }&lt;br /&gt;
# print Dumper(%beancounters_old) ;&lt;br /&gt;
# print &amp;quot;\n&amp;quot;;&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
&lt;br /&gt;
RET1=$?&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; &amp;gt; $FILE&lt;br /&gt;
#####################################################################################&lt;br /&gt;
######### quota check&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
DATA=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.52.4 \&lt;br /&gt;
|  perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vid;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; }&lt;br /&gt;
        if ( /\s*(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ){&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $usage=$2 ;&lt;br /&gt;
                $softlimit=$3 ;&lt;br /&gt;
                $hardlimit=$4 ;&lt;br /&gt;
                $time=$5 ;&lt;br /&gt;
                $expire=$6 ;&lt;br /&gt;
                if ( $usage &amp;gt;= $softlimit ){&lt;br /&gt;
                        print &amp;quot;WARNING: VZquota limit exceeded on $vid: $resource  usage-&amp;gt;$usage, softlimit-&amp;gt;$softlimit, hardlimit-&amp;gt;$hardlimit, time-&amp;gt;$time, expire-&amp;gt;$expire  &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
RET2=$?&lt;br /&gt;
&lt;br /&gt;
#####################################################################################&lt;br /&gt;
########### return&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
if [  $RET1  -gt $RET2  ]; then&lt;br /&gt;
        RET=$RET1&lt;br /&gt;
        else&lt;br /&gt;
        RET=$RET2&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [  $RET  = 0  ]; then&lt;br /&gt;
        echo Ok.&lt;br /&gt;
fi&lt;br /&gt;
exit $RET&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== nagios plugin/failcnt in python ===&lt;br /&gt;
&lt;br /&gt;
To be added locally on the VZ HN to /etc/nagios/nrpe_local.conf&amp;lt;br&amp;gt;&lt;br /&gt;
Works as nagios-plugin with option '-f' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-t'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.1 2008-04-03&lt;br /&gt;
# Christian Benke &amp;lt;benkokakao  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
import smtplib&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        for line in veid_conf:&lt;br /&gt;
                if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                        quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                        line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                        line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        fqdn=re.split('=',line)&lt;br /&gt;
                        hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                        return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        mailfrom = 'root@' + str(host)&lt;br /&gt;
        mailto = 'to@example.com'&lt;br /&gt;
        mailsubject = 'Beancounters changed in the last 5 minutes'&lt;br /&gt;
        mailbody = 'The Beancounter-failcnt value of the following veid(s) and resource(s) has \nincreased in the last 5 minutes:\n\n'&lt;br /&gt;
        server = smtplib.SMTP('localhost')&lt;br /&gt;
        server.sendmail(mailfrom, [mailto], '''\&lt;br /&gt;
From:''' + mailfrom + '''\&lt;br /&gt;
\nTo:''' + mailto + '''\&lt;br /&gt;
\nSubject:''' + mailsubject + '''\&lt;br /&gt;
&lt;br /&gt;
\n''' + mailbody + count_change)&lt;br /&gt;
        server.quit()&lt;br /&gt;
&lt;br /&gt;
#------------read raw and compare data from user_beancounters&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                        if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                                if int(veid) != 0:&lt;br /&gt;
                                        hostname=find_veid(veid)&lt;br /&gt;
                                else:&lt;br /&gt;
                                        hostname='OpenVZ Hardware Node'&lt;br /&gt;
                                count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5]&lt;br /&gt;
 + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
&lt;br /&gt;
                if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                        if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        else:&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounters.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounters.py : Check if resource-values break barriers or limits and failcounters increase&lt;br /&gt;
&lt;br /&gt;
 check_beancounters.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5432</id>
		<title>Monitoring openvz resources using nagios and snmp</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5432"/>
		<updated>2008-04-03T23:18:05Z</updated>

		<summary type="html">&lt;p&gt;Benko: comments&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== snmpd configuration ==&lt;br /&gt;
Debian Etch example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install snmpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''/etc/default/snmpd''' : remove ''-u snmp'' and replace ''127.0.0.1'' with your ip, Full'''/etc/default/snmpd''' example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid 207.46.250.119'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Debian 4.x:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create user(my_username) and add new mib. Password need a min. of 8 charactes. Username only characters:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/init.d/snmpd stop&lt;br /&gt;
echo rouser my_username priv &amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.51  beancounters  /bin/cat /proc/user_beancounters&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.52  vzquota  /bin/cat /proc/vz/vzquota&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo  createUser my_username MD5 my_password DES &amp;gt;&amp;gt; /var/lib/snmp/snmpd.conf&lt;br /&gt;
/etc/init.d/snmpd start &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testing snmp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snmpwalk   -v 3  -u my_usrname -l authPriv   -a MD5 -A my_password -x DES -X my_password  207.46.250.119&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning: the minimum pass phrase length is 8 characters.&lt;br /&gt;
&lt;br /&gt;
== nagios configuration ==&lt;br /&gt;
=== example nagios configuration ===&lt;br /&gt;
add to configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define command {&lt;br /&gt;
command_name check_snmp_openvz_on_port&lt;br /&gt;
# command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ PORT    USER    PASSWORD&lt;br /&gt;
command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ $ARG1$  $ARG2$  $ARG3$&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define host {&lt;br /&gt;
        host_name   openvz-server&lt;br /&gt;
        alias       Serwer Openvz&lt;br /&gt;
        address     207.46.250.119&lt;br /&gt;
        use         generic-host&lt;br /&gt;
        contact_groups  admins&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define service{&lt;br /&gt;
        use                             generic-service&lt;br /&gt;
        host_name                       openvz-server&lt;br /&gt;
        service_description             Virtual Machines Limits&lt;br /&gt;
        check_command                   check_snmp_openvz_on_port!161!my_username!my_password&lt;br /&gt;
        max_check_attempts              1&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== nagios plugin ===&lt;br /&gt;
It is shell script:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# cat /usr/local/bin/check_snmp_openvz.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
HOST=$1&lt;br /&gt;
PORT=$2&lt;br /&gt;
USER=$3&lt;br /&gt;
PASS=$4&lt;br /&gt;
export FILE=/tmp/$HOST.beancounters&lt;br /&gt;
RET=0&lt;br /&gt;
&lt;br /&gt;
DATA_TMP=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.51.4`&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DATA=`echo &amp;quot;$DATA_TMP&amp;quot;| perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ -f $FILE ]; then&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
use Data::Dumper;&lt;br /&gt;
my $file=$ENV{&amp;quot;FILE&amp;quot;};&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $resource ;&lt;br /&gt;
my $held ;&lt;br /&gt;
my $maxheld ;&lt;br /&gt;
my $barrier ;&lt;br /&gt;
my $limit ;&lt;br /&gt;
my $failcnt ;&lt;br /&gt;
my %beancounters ;&lt;br /&gt;
my %beancounters_old ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
                if ( ($held  &amp;gt; $barrier) &amp;amp;&amp;amp; ($barrier != 0) ) {&lt;br /&gt;
                        print &amp;quot;WARNING: Limits on $vid: $resource  held-&amp;gt;$held , barrier-&amp;gt;$barrier ( limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# read and parse old data&lt;br /&gt;
open(MYINPUTFILE, &amp;quot;&amp;lt;$file&amp;quot;);&lt;br /&gt;
while(&amp;lt;MYINPUTFILE&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters_old{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters_old{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach my $vmachine_id (keys %beancounters) {&lt;br /&gt;
        foreach my $resource (keys %{$beancounters{$vmachine_id}} ) {&lt;br /&gt;
                if ( defined($beancounters{$vmachine_id}{$resource}[4]) &amp;amp;&amp;amp; defined($beancounters_old{$vmachine_id}{$resource}[4]) ){&lt;br /&gt;
                        my $failcnt=$beancounters{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $failcnt_old=$beancounters_old{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $held=$beancounters{$vmachine_id}{$resource}[0];&lt;br /&gt;
                        my $maxheld=$beancounters{$vmachine_id}{$resource}[1];&lt;br /&gt;
                        my $barrier=$beancounters{$vmachine_id}{$resource}[2];&lt;br /&gt;
                        my $limit=$beancounters{$vmachine_id}{$resource}[3];&lt;br /&gt;
                        if ( $failcnt_old &amp;lt; $failcnt ){&lt;br /&gt;
                                print &amp;quot;CRITICAL: Incrased failcnt  $vmachine_id: $resource from $failcnt_old to $failcnt (held-&amp;gt;$held , maxheld-&amp;gt;$maxheld , barrier-&amp;gt;$barrier , limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                                $ret=2;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# if ($ret == 0 ) { print &amp;quot;Ok. \n&amp;quot; ; }&lt;br /&gt;
# print Dumper(%beancounters_old) ;&lt;br /&gt;
# print &amp;quot;\n&amp;quot;;&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
&lt;br /&gt;
RET1=$?&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; &amp;gt; $FILE&lt;br /&gt;
#####################################################################################&lt;br /&gt;
######### quota check&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
DATA=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.52.4 \&lt;br /&gt;
|  perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vid;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; }&lt;br /&gt;
        if ( /\s*(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ){&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $usage=$2 ;&lt;br /&gt;
                $softlimit=$3 ;&lt;br /&gt;
                $hardlimit=$4 ;&lt;br /&gt;
                $time=$5 ;&lt;br /&gt;
                $expire=$6 ;&lt;br /&gt;
                if ( $usage &amp;gt;= $softlimit ){&lt;br /&gt;
                        print &amp;quot;WARNING: VZquota limit exceeded on $vid: $resource  usage-&amp;gt;$usage, softlimit-&amp;gt;$softlimit, hardlimit-&amp;gt;$hardlimit, time-&amp;gt;$time, expire-&amp;gt;$expire  &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
RET2=$?&lt;br /&gt;
&lt;br /&gt;
#####################################################################################&lt;br /&gt;
########### return&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
if [  $RET1  -gt $RET2  ]; then&lt;br /&gt;
        RET=$RET1&lt;br /&gt;
        else&lt;br /&gt;
        RET=$RET2&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [  $RET  = 0  ]; then&lt;br /&gt;
        echo Ok.&lt;br /&gt;
fi&lt;br /&gt;
exit $RET&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== nagios plugin/failcnt in python ===&lt;br /&gt;
&lt;br /&gt;
To be added locally on the VZ HN to /etc/nagios/nrpe_local.conf&lt;br /&gt;
Works as nagios-plugin with option '-f' or reports an increase of a failcnt-value by mail if run e.g. as a cronjob with option '-t'. We use it with both cases to be sure that we see a peak in case it happened between the nagios-checks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.1 2008-04-03&lt;br /&gt;
# Christian Benke &amp;lt;benkokakao  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
import smtplib&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        for line in veid_conf:&lt;br /&gt;
                if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                        quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                        line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                        line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        fqdn=re.split('=',line)&lt;br /&gt;
                        hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                        return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        mailfrom = 'root@' + str(host)&lt;br /&gt;
        mailto = 'to@example.com'&lt;br /&gt;
        mailsubject = 'Beancounters changed in the last 5 minutes'&lt;br /&gt;
        mailbody = 'The Beancounter-failcnt value of the following veid(s) and resource(s) has \nincreased in the last 5 minutes:\n\n'&lt;br /&gt;
        server = smtplib.SMTP('localhost')&lt;br /&gt;
        server.sendmail(mailfrom, [mailto], '''\&lt;br /&gt;
From:''' + mailfrom + '''\&lt;br /&gt;
\nTo:''' + mailto + '''\&lt;br /&gt;
\nSubject:''' + mailsubject + '''\&lt;br /&gt;
&lt;br /&gt;
\n''' + mailbody + count_change)&lt;br /&gt;
        server.quit()&lt;br /&gt;
&lt;br /&gt;
#------------read raw and compare data from user_beancounters&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                        if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                                if int(veid) != 0:&lt;br /&gt;
                                        hostname=find_veid(veid)&lt;br /&gt;
                                else:&lt;br /&gt;
                                        hostname='OpenVZ Hardware Node'&lt;br /&gt;
                                count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5]&lt;br /&gt;
 + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
&lt;br /&gt;
                if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                        if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        else:&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounters.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounters.py : Check if resource-values break barriers or limits and failcounters increase&lt;br /&gt;
&lt;br /&gt;
 check_beancounters.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5431</id>
		<title>Monitoring openvz resources using nagios and snmp</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5431"/>
		<updated>2008-04-03T23:06:24Z</updated>

		<summary type="html">&lt;p&gt;Benko: /* nagios plugin/failcnt in python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== snmpd configuration ==&lt;br /&gt;
Debian Etch example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install snmpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''/etc/default/snmpd''' : remove ''-u snmp'' and replace ''127.0.0.1'' with your ip, Full'''/etc/default/snmpd''' example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid 207.46.250.119'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Debian 4.x:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create user(my_username) and add new mib. Password need a min. of 8 charactes. Username only characters:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/init.d/snmpd stop&lt;br /&gt;
echo rouser my_username priv &amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.51  beancounters  /bin/cat /proc/user_beancounters&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.52  vzquota  /bin/cat /proc/vz/vzquota&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo  createUser my_username MD5 my_password DES &amp;gt;&amp;gt; /var/lib/snmp/snmpd.conf&lt;br /&gt;
/etc/init.d/snmpd start &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testing snmp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snmpwalk   -v 3  -u my_usrname -l authPriv   -a MD5 -A my_password -x DES -X my_password  207.46.250.119&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning: the minimum pass phrase length is 8 characters.&lt;br /&gt;
&lt;br /&gt;
== nagios configuration ==&lt;br /&gt;
=== example nagios configuration ===&lt;br /&gt;
add to configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define command {&lt;br /&gt;
command_name check_snmp_openvz_on_port&lt;br /&gt;
# command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ PORT    USER    PASSWORD&lt;br /&gt;
command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ $ARG1$  $ARG2$  $ARG3$&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define host {&lt;br /&gt;
        host_name   openvz-server&lt;br /&gt;
        alias       Serwer Openvz&lt;br /&gt;
        address     207.46.250.119&lt;br /&gt;
        use         generic-host&lt;br /&gt;
        contact_groups  admins&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define service{&lt;br /&gt;
        use                             generic-service&lt;br /&gt;
        host_name                       openvz-server&lt;br /&gt;
        service_description             Virtual Machines Limits&lt;br /&gt;
        check_command                   check_snmp_openvz_on_port!161!my_username!my_password&lt;br /&gt;
        max_check_attempts              1&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== nagios plugin ===&lt;br /&gt;
It is shell script:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# cat /usr/local/bin/check_snmp_openvz.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
HOST=$1&lt;br /&gt;
PORT=$2&lt;br /&gt;
USER=$3&lt;br /&gt;
PASS=$4&lt;br /&gt;
export FILE=/tmp/$HOST.beancounters&lt;br /&gt;
RET=0&lt;br /&gt;
&lt;br /&gt;
DATA_TMP=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.51.4`&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DATA=`echo &amp;quot;$DATA_TMP&amp;quot;| perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ -f $FILE ]; then&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
use Data::Dumper;&lt;br /&gt;
my $file=$ENV{&amp;quot;FILE&amp;quot;};&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $resource ;&lt;br /&gt;
my $held ;&lt;br /&gt;
my $maxheld ;&lt;br /&gt;
my $barrier ;&lt;br /&gt;
my $limit ;&lt;br /&gt;
my $failcnt ;&lt;br /&gt;
my %beancounters ;&lt;br /&gt;
my %beancounters_old ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
                if ( ($held  &amp;gt; $barrier) &amp;amp;&amp;amp; ($barrier != 0) ) {&lt;br /&gt;
                        print &amp;quot;WARNING: Limits on $vid: $resource  held-&amp;gt;$held , barrier-&amp;gt;$barrier ( limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# read and parse old data&lt;br /&gt;
open(MYINPUTFILE, &amp;quot;&amp;lt;$file&amp;quot;);&lt;br /&gt;
while(&amp;lt;MYINPUTFILE&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters_old{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters_old{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach my $vmachine_id (keys %beancounters) {&lt;br /&gt;
        foreach my $resource (keys %{$beancounters{$vmachine_id}} ) {&lt;br /&gt;
                if ( defined($beancounters{$vmachine_id}{$resource}[4]) &amp;amp;&amp;amp; defined($beancounters_old{$vmachine_id}{$resource}[4]) ){&lt;br /&gt;
                        my $failcnt=$beancounters{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $failcnt_old=$beancounters_old{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $held=$beancounters{$vmachine_id}{$resource}[0];&lt;br /&gt;
                        my $maxheld=$beancounters{$vmachine_id}{$resource}[1];&lt;br /&gt;
                        my $barrier=$beancounters{$vmachine_id}{$resource}[2];&lt;br /&gt;
                        my $limit=$beancounters{$vmachine_id}{$resource}[3];&lt;br /&gt;
                        if ( $failcnt_old &amp;lt; $failcnt ){&lt;br /&gt;
                                print &amp;quot;CRITICAL: Incrased failcnt  $vmachine_id: $resource from $failcnt_old to $failcnt (held-&amp;gt;$held , maxheld-&amp;gt;$maxheld , barrier-&amp;gt;$barrier , limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                                $ret=2;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# if ($ret == 0 ) { print &amp;quot;Ok. \n&amp;quot; ; }&lt;br /&gt;
# print Dumper(%beancounters_old) ;&lt;br /&gt;
# print &amp;quot;\n&amp;quot;;&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
&lt;br /&gt;
RET1=$?&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; &amp;gt; $FILE&lt;br /&gt;
#####################################################################################&lt;br /&gt;
######### quota check&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
DATA=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.52.4 \&lt;br /&gt;
|  perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vid;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; }&lt;br /&gt;
        if ( /\s*(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ){&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $usage=$2 ;&lt;br /&gt;
                $softlimit=$3 ;&lt;br /&gt;
                $hardlimit=$4 ;&lt;br /&gt;
                $time=$5 ;&lt;br /&gt;
                $expire=$6 ;&lt;br /&gt;
                if ( $usage &amp;gt;= $softlimit ){&lt;br /&gt;
                        print &amp;quot;WARNING: VZquota limit exceeded on $vid: $resource  usage-&amp;gt;$usage, softlimit-&amp;gt;$softlimit, hardlimit-&amp;gt;$hardlimit, time-&amp;gt;$time, expire-&amp;gt;$expire  &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
RET2=$?&lt;br /&gt;
&lt;br /&gt;
#####################################################################################&lt;br /&gt;
########### return&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
if [  $RET1  -gt $RET2  ]; then&lt;br /&gt;
        RET=$RET1&lt;br /&gt;
        else&lt;br /&gt;
        RET=$RET2&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [  $RET  = 0  ]; then&lt;br /&gt;
        echo Ok.&lt;br /&gt;
fi&lt;br /&gt;
exit $RET&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== nagios plugin/failcnt in python ===&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.1 2008-04-03&lt;br /&gt;
# Christian Benke &amp;lt;benkokakao  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
import smtplib&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        for line in veid_conf:&lt;br /&gt;
                if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                        quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                        line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                        line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        fqdn=re.split('=',line)&lt;br /&gt;
                        hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                        return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        mailfrom = 'root@' + str(host)&lt;br /&gt;
        mailto = 'to@example.com'&lt;br /&gt;
        mailsubject = 'Beancounters changed in the last 5 minutes'&lt;br /&gt;
        mailbody = 'The Beancounter-failcnt value of the following veid(s) and resource(s) has \nincreased in the last 5 minutes:\n\n'&lt;br /&gt;
        server = smtplib.SMTP('localhost')&lt;br /&gt;
        server.sendmail(mailfrom, [mailto], '''\&lt;br /&gt;
From:''' + mailfrom + '''\&lt;br /&gt;
\nTo:''' + mailto + '''\&lt;br /&gt;
\nSubject:''' + mailsubject + '''\&lt;br /&gt;
&lt;br /&gt;
\n''' + mailbody + count_change)&lt;br /&gt;
        server.quit()&lt;br /&gt;
&lt;br /&gt;
#------------read raw and compare data from user_beancounters&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                        if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                                if int(veid) != 0:&lt;br /&gt;
                                        hostname=find_veid(veid)&lt;br /&gt;
                                else:&lt;br /&gt;
                                        hostname='OpenVZ Hardware Node'&lt;br /&gt;
                                count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5]&lt;br /&gt;
 + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
&lt;br /&gt;
                if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                        if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        else:&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounters.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounters.py : Check if resource-values break barriers or limits and failcounters increase&lt;br /&gt;
&lt;br /&gt;
 check_beancounters.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5430</id>
		<title>Monitoring openvz resources using nagios and snmp</title>
		<link rel="alternate" type="text/html" href="https://wiki.openvz.org/index.php?title=Monitoring_openvz_resources_using_nagios_and_snmp&amp;diff=5430"/>
		<updated>2008-04-03T17:16:00Z</updated>

		<summary type="html">&lt;p&gt;Benko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== snmpd configuration ==&lt;br /&gt;
Debian Etch example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install snmpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
edit '''/etc/default/snmpd''' : remove ''-u snmp'' and replace ''127.0.0.1'' with your ip, Full'''/etc/default/snmpd''' example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid 207.46.250.119'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For Debian 4.x:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export MIBDIRS=/usr/share/snmp/mibs&lt;br /&gt;
SNMPDRUN=yes&lt;br /&gt;
SNMPDOPTS='-Lsd -Lf /dev/null  -I -smux -p /var/run/snmpd.pid'&lt;br /&gt;
TRAPDRUN=no&lt;br /&gt;
TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create user(my_username) and add new mib. Password need a min. of 8 charactes. Username only characters:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/init.d/snmpd stop&lt;br /&gt;
echo rouser my_username priv &amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.51  beancounters  /bin/cat /proc/user_beancounters&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo &amp;quot;extend  .1.3.6.1.4.1.2021.52  vzquota  /bin/cat /proc/vz/vzquota&amp;quot; &amp;gt;&amp;gt; /etc/snmp/snmpd.conf&lt;br /&gt;
echo  createUser my_username MD5 my_password DES &amp;gt;&amp;gt; /var/lib/snmp/snmpd.conf&lt;br /&gt;
/etc/init.d/snmpd start &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testing snmp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snmpwalk   -v 3  -u my_usrname -l authPriv   -a MD5 -A my_password -x DES -X my_password  207.46.250.119&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning: the minimum pass phrase length is 8 characters.&lt;br /&gt;
&lt;br /&gt;
== nagios configuration ==&lt;br /&gt;
=== example nagios configuration ===&lt;br /&gt;
add to configuration:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define command {&lt;br /&gt;
command_name check_snmp_openvz_on_port&lt;br /&gt;
# command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ PORT    USER    PASSWORD&lt;br /&gt;
command_line /usr/local/bin/check_snmp_openvz.sh  $HOSTADDRESS$ $ARG1$  $ARG2$  $ARG3$&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define host {&lt;br /&gt;
        host_name   openvz-server&lt;br /&gt;
        alias       Serwer Openvz&lt;br /&gt;
        address     207.46.250.119&lt;br /&gt;
        use         generic-host&lt;br /&gt;
        contact_groups  admins&lt;br /&gt;
        }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define service{&lt;br /&gt;
        use                             generic-service&lt;br /&gt;
        host_name                       openvz-server&lt;br /&gt;
        service_description             Virtual Machines Limits&lt;br /&gt;
        check_command                   check_snmp_openvz_on_port!161!my_username!my_password&lt;br /&gt;
        max_check_attempts              1&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== nagios plugin ===&lt;br /&gt;
It is shell script:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# cat /usr/local/bin/check_snmp_openvz.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
HOST=$1&lt;br /&gt;
PORT=$2&lt;br /&gt;
USER=$3&lt;br /&gt;
PASS=$4&lt;br /&gt;
export FILE=/tmp/$HOST.beancounters&lt;br /&gt;
RET=0&lt;br /&gt;
&lt;br /&gt;
DATA_TMP=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.51.4`&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DATA=`echo &amp;quot;$DATA_TMP&amp;quot;| perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ -f $FILE ]; then&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
use Data::Dumper;&lt;br /&gt;
my $file=$ENV{&amp;quot;FILE&amp;quot;};&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $resource ;&lt;br /&gt;
my $held ;&lt;br /&gt;
my $maxheld ;&lt;br /&gt;
my $barrier ;&lt;br /&gt;
my $limit ;&lt;br /&gt;
my $failcnt ;&lt;br /&gt;
my %beancounters ;&lt;br /&gt;
my %beancounters_old ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
                if ( ($held  &amp;gt; $barrier) &amp;amp;&amp;amp; ($barrier != 0) ) {&lt;br /&gt;
                        print &amp;quot;WARNING: Limits on $vid: $resource  held-&amp;gt;$held , barrier-&amp;gt;$barrier ( limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# read and parse old data&lt;br /&gt;
open(MYINPUTFILE, &amp;quot;&amp;lt;$file&amp;quot;);&lt;br /&gt;
while(&amp;lt;MYINPUTFILE&amp;gt;){&lt;br /&gt;
        my %vmachine;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters_old{$vid}=\%vmachine ; }&lt;br /&gt;
        if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) {&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $held=$2 ;&lt;br /&gt;
                $maxheld=$3 ;&lt;br /&gt;
                $barrier=$4 ;&lt;br /&gt;
                $limit=$5 ;&lt;br /&gt;
                $failcnt=$6 ;&lt;br /&gt;
                ${beancounters_old{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ];&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
foreach my $vmachine_id (keys %beancounters) {&lt;br /&gt;
        foreach my $resource (keys %{$beancounters{$vmachine_id}} ) {&lt;br /&gt;
                if ( defined($beancounters{$vmachine_id}{$resource}[4]) &amp;amp;&amp;amp; defined($beancounters_old{$vmachine_id}{$resource}[4]) ){&lt;br /&gt;
                        my $failcnt=$beancounters{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $failcnt_old=$beancounters_old{$vmachine_id}{$resource}[4];&lt;br /&gt;
                        my $held=$beancounters{$vmachine_id}{$resource}[0];&lt;br /&gt;
                        my $maxheld=$beancounters{$vmachine_id}{$resource}[1];&lt;br /&gt;
                        my $barrier=$beancounters{$vmachine_id}{$resource}[2];&lt;br /&gt;
                        my $limit=$beancounters{$vmachine_id}{$resource}[3];&lt;br /&gt;
                        if ( $failcnt_old &amp;lt; $failcnt ){&lt;br /&gt;
                                print &amp;quot;CRITICAL: Incrased failcnt  $vmachine_id: $resource from $failcnt_old to $failcnt (held-&amp;gt;$held , maxheld-&amp;gt;$maxheld , barrier-&amp;gt;$barrier , limit-&amp;gt;$limit ) &amp;quot; ;&lt;br /&gt;
                                $ret=2;&lt;br /&gt;
                        }&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# if ($ret == 0 ) { print &amp;quot;Ok. \n&amp;quot; ; }&lt;br /&gt;
# print Dumper(%beancounters_old) ;&lt;br /&gt;
# print &amp;quot;\n&amp;quot;;&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
&lt;br /&gt;
RET1=$?&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; &amp;gt; $FILE&lt;br /&gt;
#####################################################################################&lt;br /&gt;
######### quota check&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
DATA=`snmpwalk   -v 3  -u $USER -l authPriv   -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.52.4 \&lt;br /&gt;
|  perl -ne '/&amp;quot;(.*)&amp;quot;/ ; print &amp;quot;$1\n&amp;quot; ;'`&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$?&amp;quot; != &amp;quot;0&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Unknown snmp error&amp;quot;&lt;br /&gt;
        exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;$DATA&amp;quot; | perl  -n -e'&lt;br /&gt;
my $vid ;&lt;br /&gt;
my $ret=0 ;&lt;br /&gt;
while(&amp;lt;STDIN&amp;gt;){&lt;br /&gt;
        my %vid;&lt;br /&gt;
        if ( /\D*(\d+):.*/ ){ $vid=$1; }&lt;br /&gt;
        if ( /\s*(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ){&lt;br /&gt;
                $resource=$1 ;&lt;br /&gt;
                $usage=$2 ;&lt;br /&gt;
                $softlimit=$3 ;&lt;br /&gt;
                $hardlimit=$4 ;&lt;br /&gt;
                $time=$5 ;&lt;br /&gt;
                $expire=$6 ;&lt;br /&gt;
                if ( $usage &amp;gt;= $softlimit ){&lt;br /&gt;
                        print &amp;quot;WARNING: VZquota limit exceeded on $vid: $resource  usage-&amp;gt;$usage, softlimit-&amp;gt;$softlimit, hardlimit-&amp;gt;$hardlimit, time-&amp;gt;$time, expire-&amp;gt;$expire  &amp;quot; ;&lt;br /&gt;
                        $ret=1;&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
exit($ret);&lt;br /&gt;
'&lt;br /&gt;
RET2=$?&lt;br /&gt;
&lt;br /&gt;
#####################################################################################&lt;br /&gt;
########### return&lt;br /&gt;
#####################################################################################&lt;br /&gt;
&lt;br /&gt;
if [  $RET1  -gt $RET2  ]; then&lt;br /&gt;
        RET=$RET1&lt;br /&gt;
        else&lt;br /&gt;
        RET=$RET2&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [  $RET  = 0  ]; then&lt;br /&gt;
        echo Ok.&lt;br /&gt;
fi&lt;br /&gt;
exit $RET&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== nagios plugin/failcnt in python ===&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# Copyright (C) 2008 Christian Benke&lt;br /&gt;
# Distributed under the terms of the GNU General Public License v2&lt;br /&gt;
# v0.1 2008-04-03&lt;br /&gt;
# Christian Benke &amp;lt;benkokakao  gmail  com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import string&lt;br /&gt;
import pickle&lt;br /&gt;
import sys&lt;br /&gt;
import getopt&lt;br /&gt;
import re&lt;br /&gt;
import smtplib&lt;br /&gt;
import socket&lt;br /&gt;
&lt;br /&gt;
veid=''&lt;br /&gt;
current_data=dict()&lt;br /&gt;
opts=None&lt;br /&gt;
beancounter_data=open('/proc/user_beancounters','r')&lt;br /&gt;
picklefilepath='/tmp/beancounters_pickledump'&lt;br /&gt;
&lt;br /&gt;
#-------- find the hostname for each veid ---:&lt;br /&gt;
&lt;br /&gt;
def find_veid(veid):&lt;br /&gt;
        veid_conf=open('/etc/vz/conf/' + str(veid) + '.conf','r')&lt;br /&gt;
        for line in veid_conf:&lt;br /&gt;
                if &amp;quot;HOSTNAME&amp;quot; in line:&lt;br /&gt;
                        quotes=re.compile(&amp;quot;\&amp;quot;&amp;quot;)&lt;br /&gt;
                        line=quotes.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        linefeed=re.compile(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                        line=linefeed.sub(&amp;quot;&amp;quot;,line)&lt;br /&gt;
                        fqdn=re.split('=',line)&lt;br /&gt;
                        hostname=re.split('\.',fqdn[1])[0]&lt;br /&gt;
                        return hostname&lt;br /&gt;
&lt;br /&gt;
# ---------- send mail in case of a counter-change&lt;br /&gt;
def send_mail(count_change):&lt;br /&gt;
        mailfrom = 'root@' + str(host)&lt;br /&gt;
        mailto = 'tech@inqnet.at'&lt;br /&gt;
        mailsubject = 'Beancounters changed in the last 5 minutes'&lt;br /&gt;
        mailbody = 'The Beancounter-failcnt value of the following veid(s) and resource(s) has \nincreased in the last 5 minutes:\n\n'&lt;br /&gt;
        server = smtplib.SMTP('localhost')&lt;br /&gt;
        server.sendmail(mailfrom, [mailto], '''\&lt;br /&gt;
From:''' + mailfrom + '''\&lt;br /&gt;
\nTo:''' + mailto + '''\&lt;br /&gt;
\nSubject:''' + mailsubject + '''\&lt;br /&gt;
&lt;br /&gt;
\n''' + mailbody + count_change)&lt;br /&gt;
        server.quit()&lt;br /&gt;
&lt;br /&gt;
#------------read raw and compare data from user_beancounters&lt;br /&gt;
&lt;br /&gt;
def compare_data(beancounter_data,data_read,count):&lt;br /&gt;
        barrier_break=str()&lt;br /&gt;
        count_change=str()&lt;br /&gt;
        for line in beancounter_data:&lt;br /&gt;
                if 'Version' in line or 'uid' in line or 'dummy' in line:&lt;br /&gt;
                        continue&lt;br /&gt;
                else:&lt;br /&gt;
                        fields=line.split( )&lt;br /&gt;
                        if len(fields) == 7:&lt;br /&gt;
                                i=0&lt;br /&gt;
                                veid=int(fields[0][:-1])&lt;br /&gt;
                                fields.pop(0) #remove the first element&lt;br /&gt;
                                current_data[veid]=dict()&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                        else:&lt;br /&gt;
                                i=i+1&lt;br /&gt;
                                current_data[veid][fields[0]]=fields&lt;br /&gt;
                if data_read and count == True and data_read is not '0': #comparing counters of new data with previous run&lt;br /&gt;
                        if data_read[veid][fields[0]][5] &amp;lt; current_data[veid][fields[0]][5]:&lt;br /&gt;
                                if int(veid) != 0:&lt;br /&gt;
                                        hostname=find_veid(veid)&lt;br /&gt;
                                else:&lt;br /&gt;
                                        hostname='OpenVZ Hardware Node'&lt;br /&gt;
                                count_change=str(count_change) + str(hostname) + ': ' + str(fields[0]) + ' failcnt has changed from ' + data_read[veid][fields[0]][5]&lt;br /&gt;
 + ' to ' + str(current_data[veid][fields[0]][5]) + '\n'&lt;br /&gt;
&lt;br /&gt;
                if count == False:      #comparing current level with barrier/limit&lt;br /&gt;
                        if current_data[veid][fields[0]][0] == 'oomguarpages': #for oomguarpages and physpages only the limit-value is relevant&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        elif current_data[veid][fields[0]][0] == 'physpages':&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][4])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
                        else:&lt;br /&gt;
                                if int(current_data[veid][fields[0]][1]) &amp;gt; int(current_data[veid][fields[0]][3])*0.9:&lt;br /&gt;
                                        barrier_break = str(barrier_break) + str(veid) + ': ' + str(current_data[veid][fields[0]][0]) + ' '&lt;br /&gt;
        if barrier_break and count == False:&lt;br /&gt;
                print barrier_break&lt;br /&gt;
                sys.exit(2)&lt;br /&gt;
        elif count == False:&lt;br /&gt;
                print 'All Beancounters OK'&lt;br /&gt;
                sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        if count_change and count == True:&lt;br /&gt;
                send_mail(count_change)&lt;br /&gt;
                return current_data&lt;br /&gt;
        elif count == True:&lt;br /&gt;
                return current_data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ----- pickle data - read or write&lt;br /&gt;
&lt;br /&gt;
def pickle_data(current_data,action,count,picklefilepath):&lt;br /&gt;
        try:&lt;br /&gt;
                picklefile = None&lt;br /&gt;
                if action == 'write':&lt;br /&gt;
                        if current_data:&lt;br /&gt;
                                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                                pickle.dump(current_data, picklefile)&lt;br /&gt;
                                picklefile.close()&lt;br /&gt;
                                return&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'current_data is empty: ' + str(current_data)&lt;br /&gt;
                elif action == 'read':&lt;br /&gt;
                        picklefile=open(picklefilepath,'r')&lt;br /&gt;
                        data_read=pickle.load(picklefile)&lt;br /&gt;
                        picklefile.close()&lt;br /&gt;
                        if data_read:&lt;br /&gt;
                                return data_read&lt;br /&gt;
                        else:&lt;br /&gt;
                                print 'DATA_READ IS NONE:' + str(data_read)&lt;br /&gt;
                                return data_read&lt;br /&gt;
        except IOError:&lt;br /&gt;
                current_data = compare_data(beancounter_data,'0',count)&lt;br /&gt;
                picklefile=open(picklefilepath,'w')&lt;br /&gt;
                pickle.dump(current_data,picklefile)&lt;br /&gt;
                picklefile.close()&lt;br /&gt;
&lt;br /&gt;
# ------- print script usage&lt;br /&gt;
&lt;br /&gt;
def usage(prog=&amp;quot;check_beancounters.py&amp;quot;):&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
check_beancounters.py : Check if resource-values break barriers or limits and failcounters increase&lt;br /&gt;
&lt;br /&gt;
 check_beancounters.py [-tfh]&lt;br /&gt;
&lt;br /&gt;
 -h                  print this message&lt;br /&gt;
&lt;br /&gt;
 -t                  Check if failcnt-values have increased since the last run&lt;br /&gt;
 -f                  Check if current value of a resource is higher than barrier/limit&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
opts=getopt.getopt(sys.argv[1:], 'thf')&lt;br /&gt;
if opts:&lt;br /&gt;
        if opts[0]==[]:&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-h':&lt;br /&gt;
                usage(); sys.exit(0)&lt;br /&gt;
        elif opts[0][0][0]=='-t':&lt;br /&gt;
                count=True&lt;br /&gt;
        elif opts[0][0][0]=='-f':&lt;br /&gt;
                count=False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
data_read=pickle_data(current_data,'read',count,picklefilepath)&lt;br /&gt;
current_data = compare_data(beancounter_data,data_read,count)&lt;br /&gt;
pickle_data(current_data,'write',count,picklefilepath)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: HOWTO]]&lt;/div&gt;</summary>
		<author><name>Benko</name></author>
		
	</entry>
</feed>