1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
#
# This file is part of snmpsim software.
#
# Copyright (c) 2010-2019, Ilya Etingof <etingof@gmail.com>
# License: http://snmplabs.com/snmpsim/license.html
#
from snmpsim.grammar.snmprec import SnmprecGrammar
from snmpsim.record.snmprec import SnmprecRecord
from snmpsim import log
from snmpsim.mltsplit import split
from pysnmp.smi import error
errorTypes = {
'generror': error.GenError,
'noaccess': error.NoAccessError,
'wrongtype': error.WrongTypeError,
'wrongvalue': error.WrongValueError,
'nocreation': error.NoCreationError,
'inconsistentvalue': error.InconsistentValueError,
'resourceunavailable': error.ResourceUnavailableError,
'commitfailed': error.CommitFailedError,
'undofailed': error.UndoFailedError,
'authorizationerror': error.AuthorizationError,
'notwritable': error.NotWritableError,
'inconsistentname': error.InconsistentNameError,
'nosuchobject': error.NoSuchObjectError,
'nosuchinstance': error.NoSuchInstanceError,
'endofmib': error.EndOfMibViewError
}
def init(**context):
pass
def variate(oid, tag, value, **context):
if not context['nextFlag'] and not context['exactMatch']:
return context['origOid'], tag, context['errorStatus']
if 'settings' not in recordContext:
recordContext['settings'] = dict([split(x, '=') for x in split(value, ',')])
if 'hexvalue' in recordContext['settings']:
recordContext['settings']['value'] = [int(recordContext['settings']['hexvalue'][x:x + 2], 16) for x in
range(0, len(recordContext['settings']['hexvalue']), 2)]
if 'status' in recordContext['settings']:
recordContext['settings']['status'] = recordContext['settings']['status'].lower()
if 'op' not in recordContext['settings']:
recordContext['settings']['op'] = 'any'
if 'vlist' in recordContext['settings']:
vlist = {}
recordContext['settings']['vlist'] = split(recordContext['settings']['vlist'], ':')
while recordContext['settings']['vlist']:
o, v, e = recordContext['settings']['vlist'][:3]
recordContext['settings']['vlist'] = recordContext['settings']['vlist'][3:]
typeTag, _ = SnmprecRecord.unpackTag(tag)
v = SnmprecGrammar.tagMap[typeTag](v)
if o not in vlist:
vlist[o] = {}
if o == 'eq':
vlist[o][v] = e
elif o in ('lt', 'gt'):
vlist[o] = v, e
else:
log.msg('error: bad vlist syntax: %s' % recordContext['settings']['vlist'])
recordContext['settings']['vlist'] = vlist
e = None
if context['setFlag']:
if 'vlist' in recordContext['settings']:
if ('eq' in recordContext['settings']['vlist'] and
context['origValue'] in recordContext['settings']['vlist']['eq']):
e = recordContext['settings']['vlist']['eq'][context['origValue']]
elif ('lt' in recordContext['settings']['vlist'] and
context['origValue'] < recordContext['settings']['vlist']['lt'][0]):
e = recordContext['settings']['vlist']['lt'][1]
elif ('gt' in recordContext['settings']['vlist'] and
context['origValue'] > recordContext['settings']['vlist']['gt'][0]):
e = recordContext['settings']['vlist']['gt'][1]
elif recordContext['settings']['op'] in ('set', 'any'):
if 'status' in recordContext['settings']:
e = recordContext['settings']['status']
else:
if recordContext['settings']['op'] in ('get', 'any'):
if 'status' in recordContext['settings']:
e = recordContext['settings']['status']
if e and e in errorTypes:
log.msg('error: reporting %s for %s' % (e, oid))
raise errorTypes[e](
name=oid, idx=max(0, context['varsTotal'] - context['varsRemaining'] - 1)
)
if context['setFlag']:
recordContext['settings']['value'] = context['origValue']
return oid, tag, recordContext['settings'].get('value', context['errorStatus'])
def shutdown(**context):
pass
|