def __init__(self, mibObjects): """ mibObjects - a list of MibObject tuples that this agent will serve """ #each SNMP-based application has an engine self._snmpEngine = engine.SnmpEngine() #open a UDP socket on port 161 to listen for snmp requests config.addSocketTransport(self._snmpEngine, udp.domainName, udp.UdpTransport().openServerMode(('', 161))) #Here we configure two distinct Community Strings to control read and write #operations. public --> Read only, private --> Read/Write config.addV1System(self._snmpEngine, "agent", "public") config.addV1System(self._snmpEngine, 'my-write-area', 'private') #let anyone accessing 'public' read anything in the subtree below, #which is the enterprises subtree that we defined our MIB to be in config.addVacmUser(self._snmpEngine, 2, "agent", "noAuthNoPriv", readSubTree=(1,3,6,1,4,1)) #let anyone accessing 'private' read and write anything in the subtree below, #which is the enterprises subtree that we defined our MIB to be in config.addVacmUser(self._snmpEngine, 2, 'my-write-area', 'noAuthNoPriv', readSubTree=(1, 3, 6, 1, 4, 1), writeSubTree=(1, 3, 6, 1, 4, 1)) #Create Agent context self._snmpContext = context.SnmpContext(self._snmpEngine) #the builder is used to load mibs. tell it to look in the #current directory for our new MIB. We'll also use it to #export our symbols later mibBuilder = self._snmpContext.getMibInstrum().getMibBuilder() mibSources = mibBuilder.getMibSources() + (builder.DirMibSource('.'),) mibBuilder.setMibSources(*mibSources) MibScalarInstance, = mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalarInstance') #export our custom mib for mibObject in mibObjects: nextVar, = mibBuilder.importSymbols(mibObject.mibName, mibObject.objectType) instance = createVariable(MibScalarInstance, mibObject.valueFunc, mibObject.valueSetFunc, nextVar.name, (0,), nextVar.syntax) #need to export as <var name>Instance instanceDict = {str(nextVar.name)+"Instance":instance} mibBuilder.exportSymbols(mibObject.mibName, **instanceDict) # tell pysnmp to respond to get, set, getnext, and getbulk cmdrsp.GetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.SetCommandResponder(self._snmpEngine,self._snmpContext) cmdrsp.NextCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.BulkCommandResponder(self._snmpEngine, self._snmpContext)
def __init__(self, host, port, log_queue): self.log_queue = log_queue # Create SNMP engine self.snmpEngine = engine.SnmpEngine() # Transport setup udp_sock = gevent.socket.socket(gevent.socket.AF_INET, gevent.socket.SOCK_DGRAM) udp_sock.setsockopt(gevent.socket.SOL_SOCKET, gevent.socket.SO_BROADCAST, 1) udp_sock.bind((host, port)) # UDP over IPv4 self.addSocketTransport( self.snmpEngine, udp.domainName, udp_sock ) #SNMPv1 config.addV1System(self.snmpEngine, 'public-read', 'public') # SNMPv3/USM setup # user: usr-md5-des, auth: MD5, priv DES config.addV3User( self.snmpEngine, 'usr-md5-des', config.usmHMACMD5AuthProtocol, 'authkey1', config.usmDESPrivProtocol, 'privkey1' ) # user: usr-sha-none, auth: SHA, priv NONE config.addV3User( self.snmpEngine, 'usr-sha-none', config.usmHMACSHAAuthProtocol, 'authkey1' ) # user: usr-sha-aes128, auth: SHA, priv AES/128 config.addV3User( self.snmpEngine, 'usr-sha-aes128', config.usmHMACSHAAuthProtocol, 'authkey1', config.usmAesCfb128Protocol, 'privkey1' ) # Allow full MIB access for each user at VACM config.addVacmUser(self.snmpEngine, 1, 'public-read', 'noAuthNoPriv', (1, 3, 6, 1, 2, 1)) config.addVacmUser(self.snmpEngine, 3, 'usr-md5-des', 'authPriv', (1, 3, 6, 1, 2, 1), (1, 3, 6, 1, 2, 1)) config.addVacmUser(self.snmpEngine, 3, 'usr-sha-none', 'authNoPriv', (1, 3, 6, 1, 2, 1), (1, 3, 6, 1, 2, 1)) config.addVacmUser(self.snmpEngine, 3, 'usr-sha-aes128', 'authPriv', (1, 3, 6, 1, 2, 1), (1, 3, 6, 1, 2, 1)) # Get default SNMP context this SNMP engine serves snmpContext = context.SnmpContext(self.snmpEngine) # Register SNMP Applications at the SNMP engine for particular SNMP context cmdrsp.GetCommandResponder(self.snmpEngine, snmpContext) cmdrsp.SetCommandResponder(self.snmpEngine, snmpContext) cmdrsp.NextCommandResponder(self.snmpEngine, snmpContext) cmdrsp.BulkCommandResponder(self.snmpEngine, snmpContext)
def __init__(self, host, port, rcommunity): self.snmpEngine = engine.SnmpEngine() config.addSocketTransport(self.snmpEngine, udp.domainName, udp.UdpTransport().openServerMode((host, port))) config.addV1System(self.snmpEngine, 'my-area', rcommunity) config.addVacmUser(self.snmpEngine, 2, 'my-area', 'noAuthNoPriv', (1, 3, 6)) self.snmpContext = context.SnmpContext(self.snmpEngine) self.mibBuilder = self.snmpContext.getMibInstrum().getMibBuilder() self.MibScalar, self.MibScalarInstance = self.mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalar', 'MibScalarInstance') cmdrsp.GetCommandResponder(self.snmpEngine, self.snmpContext) cmdrsp.NextCommandResponder(self.snmpEngine, self.snmpContext) cmdrsp.BulkCommandResponder(self.snmpEngine, self.snmpContext)
def __init__(self, mibObjects): """ mibObjects - a list of MibObject tuples that this agent will serve """ #each SNMP-based application has an engine self._snmpEngine = engine.SnmpEngine() #open a UDP socket to listen for snmp requests config.addSocketTransport(self._snmpEngine, udp.domainName, udp.UdpTransport().openServerMode(('', 161))) #add a v2 user with the community string public config.addV1System(self._snmpEngine, "agent", "public") #let anyone accessing 'public' read anything in the subtree below, #which is the enterprises subtree that we defined our MIB to be in config.addVacmUser(self._snmpEngine, 2, "agent", "noAuthNoPriv", readSubTree=(1, 3, 6, 1, 4, 1)) #each app has one or more contexts self._snmpContext = context.SnmpContext(self._snmpEngine) #the builder is used to load mibs. tell it to look in the #current directory for our new MIB. We'll also use it to #export our symbols later mibBuilder = self._snmpContext.getMibInstrum().getMibBuilder() mibSources = mibBuilder.getMibSources() + (builder.DirMibSource('.'), ) mibBuilder.setMibSources(*mibSources) mibBuilder.loadModules('HOST-RESOURCES-MIB') #our variables will subclass this since we only have scalar types #can't load this type directly, need to import it MibScalarInstance, = mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalarInstance') #export our custom mib for mibObject in mibObjects: nextVar, = mibBuilder.importSymbols(mibObject.mibName, mibObject.objectType) instance = createVariable(MibScalarInstance, mibObject.valueFunc, nextVar.name, (0, ), nextVar.syntax) #need to export as <var name>Instance instanceDict = {str(nextVar.name) + "Instance": instance} mibBuilder.exportSymbols(mibObject.mibName, **instanceDict) # tell pysnmp to respotd to get, getnext, and getbulk cmdrsp.GetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.NextCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.BulkCommandResponder(self._snmpEngine, self._snmpContext)
def serve_forever(self): print "SNMP agent started!" # tell pysnmp to respotd to get, getnext, and getbulk cmdrsp.GetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.SetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.NextCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.BulkCommandResponder(self._snmpEngine, self._snmpContext) self._snmpEngine.transportDispatcher.jobStarted(1) try: self._snmpEngine.transportDispatcher.runDispatcher() except: self._snmpEngine.transportDispatcher.closeDispatcher() raise
def __init__(self, host, port, mibObjects): self._snmpEngine = engine.SnmpEngine() config.addSocketTransport( self._snmpEngine, udp.domainName, udp.UdpTransport().openServerMode((host, port))) config.addV1System(self._snmpEngine, "agent", "publick") # password config.addV1System(self._snmpEngine, 'my-write-area', 'private') config.addVacmUser(self._snmpEngine, 2, "agent", "noAuthNoPriv", readSubTree=(1, 3, 6, 1, 4, 1)) config.addVacmUser(self._snmpEngine, 2, 'my-write-area', 'noAuthNoPriv', readSubTree=(1, 3, 6, 1, 4, 1), writeSubTree=(1, 3, 6, 1, 4, 1)) self._snmpContext = context.SnmpContext(self._snmpEngine) mibBuilder = self._snmpContext.getMibInstrum().getMibBuilder() mibSources = mibBuilder.getMibSources() + (builder.DirMibSource('.'), ) mibBuilder.setMibSources(*mibSources) MibScalarInstance, = mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalarInstance') for mibObject in mibObjects: nextVar, = mibBuilder.importSymbols(mibObject.mibName, mibObject.objectType) instance = createVariable(MibScalarInstance, mibObject.valueFunc, mibObject.valueSetFunc, nextVar.name, (0, ), nextVar.syntax) instanceDict = {str(nextVar.name) + "Instance": instance} mibBuilder.exportSymbols(mibObject.mibName, **instanceDict) cmdrsp.GetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.SetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.NextCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.BulkCommandResponder(self._snmpEngine, self._snmpContext)
def start(self): """ Start SNMP Server main loop """ # Register SNMP Applications at the SNMP engine for particular SNMP context #read only cmdrsp.GetCommandResponder(self.snmpEngine, self.snmpContext) cmdrsp.NextCommandResponder(self.snmpEngine, self.snmpContext) cmdrsp.BulkCommandResponder(self.snmpEngine, self.snmpContext) self.snmpEngine.transportDispatcher.jobStarted(1) # Run I/O dispatcher which would receive queries and send responses while self.run: try: self.snmpEngine.transportDispatcher.runDispatcher() except KeyboardInterrupt: self.snmpEngine.transportDispatcher.closeDispatcher() raise except Exception as ex: print(ex)
def __init__(self, mibObjects): # Each SNMP-based application has an engine self._snmpEngine = engine.SnmpEngine() # Open a UDP socket to listen for snmp requests (requset sudo command) config.addSocketTransport(self._snmpEngine, udp.domainName, udp.UdpTransport().openServerMode(('', 161))) config.addV1System(self._snmpEngine, 'agent', 'public') # add a v2 user with the community string public config.addVacmUser(self._snmpEngine, 2, 'agent', 'noAuthNoPriv', readSubTree=(1, 3, 6, 1, 4, 1), writeSubTree=(1, 3, 6, 1, 4, 1)) # each app has one or more contexts self._snmpContext = context.SnmpContext(self._snmpEngine) # the builder is used to load mibs. tell it to look in the # current directory for our new MIB. We'll also use it to # export our symbols later mibBuilder = self._snmpContext.getMibInstrum().getMibBuilder() mibSources = mibBuilder.getMibSources() + (builder.DirMibSource('.'), ) mibBuilder.setMibSources(*mibSources) # our variables will subclass this since we only have scalar types # can't load this type directly, need to import it (MibTable, MibTableRow, MibTableColumn, MibScalarInstance) = mibBuilder.importSymbols('SNMPv2-SMI', 'MibTable', 'MibTableRow', 'MibTableColumn', 'MibScalarInstance') # import and maintain Table maintaintable = maintainTableThread(0, mibObjects, mibBuilder, MibScalarInstance) maintaintable.start() # tell pysnmp to respotd to get, getnext, and getbulk cmdrsp.GetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.SetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.NextCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.BulkCommandResponder(self._snmpEngine, self._snmpContext)
def __init__(self, objects): self._snmpEngine = engine.SnmpEngine() config.addSocketTransport( self._snmpEngine, udp.domainName, udp.UdpTransport().openServerMode((_addr, _port))) config.addV3User(self._snmpEngine, _account, config.usmHMACMD5AuthProtocol, _auth_key, config.usmDESPrivProtocol, _priv_key) config.addVacmUser(self._snmpEngine, 3, _account, "authPriv", (1, 3, 6, 1, 4, 1), (1, 3, 6, 1, 4, 1)) self._snmpContext = context.SnmpContext(self._snmpEngine) #builder create mibBuilder = self._snmpContext.getMibInstrum().getMibBuilder() mibSources = mibBuilder.getMibSources() + ( builder.DirMibSource('.'), ) + (builder.DirMibSource(filepath), ) mibBuilder.setMibSources(*mibSources) MibScalarInstance, = mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalarInstance') for mibObject in objects: nextVar, = mibBuilder.importSymbols(mibObject.mibName, mibObject.objectType) instance = createVariable(MibScalarInstance, mibObject.valueGetFunc, nextVar.name, (0, ), nextVar.syntax) #need to export as <var name>Instance instanceDict = {str(nextVar.name) + "Instance": instance} mibBuilder.exportSymbols(mibObject.mibName, **instanceDict) cmdrsp.GetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.SetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.NextCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.BulkCommandResponder(self._snmpEngine, self._snmpContext)
def register_cmd_responders(self): """Registers command responders.""" cmdrsp.GetCommandResponder(self.engine, self.context) cmdrsp.SetCommandResponder(self.engine, self.context) cmdrsp.NextCommandResponder(self.engine, self.context) cmdrsp.BulkCommandResponder(self.engine, self.context)
def __init__(self): #each SNMP-based application has an engine self._snmpEngine = engine.SnmpEngine() # Reading configuration self._read_conf() self._serialtcp = SerialHTTPProcess( self._CONF['LOG_DIR'] if 'LOG_DIR' in self._CONF else '') #open a UDP socket to listen for snmp requests port = int(self._CONF['PORT'] ) if 'PORT' in self._CONF and self._CONF['PORT'] else 161 config.addSocketTransport( self._snmpEngine, udp.domainName, udp.UdpTransport().openServerMode(('0.0.0.0', port))) #add a v2 user with the community string public config.addV1System( self._snmpEngine, "read-area", self._CONF['PUBLIC'] if 'PUBLIC' in self._CONF and self._CONF['PUBLIC'] else "public") config.addV1System( self._snmpEngine, 'write-area', self._CONF['PRIVATE'] if 'PRIVATE' in self._CONF and self._CONF['PRIVATE'] else 'private') #let anyone accessing 'public' read anything in the subtree below, #which is the enterprises subtree that we defined our MIB to be in config.addVacmUser(self._snmpEngine, 1, "read-area", "noAuthNoPriv", readSubTree=(1, 3, 6, 1, 2)) #config.addVacmUser(self._snmpEngine, 1, "read-area", "noAuthNoPriv", # readSubTree=(1, 3, 6, 1, 2, 1, 19, 2, 1)) config.addVacmUser(self._snmpEngine, 1, "read-area", "noAuthNoPriv", readSubTree=(1, 3, 6, 1, 4, 1, 332, 11)) config.addVacmUser(self._snmpEngine, 2, "read-area", "noAuthNoPriv", readSubTree=(1, 3, 6, 1, 2, 1, 10, 33)) config.addVacmUser(self._snmpEngine, 2, "read-area", "noAuthNoPriv", readSubTree=(1, 3, 6, 1, 2, 1, 19, 2, 1)) config.addVacmUser(self._snmpEngine, 2, "read-area", "noAuthNoPriv", readSubTree=(1, 3, 6, 1, 4, 1, 332, 11)) # Write Subtree log('before enable write-area') if self._CONF and 'ALLOW' in self._CONF and self._CONF['ALLOW'].lower( ) in 'true': log('Adding Write community with write-area') config.addVacmUser(self._snmpEngine, 1, 'write-area', 'noAuthNoPriv', readSubTree=(1, 3, 6, 1, 2, 1, 10, 33), writeSubTree=(1, 3, 6, 1, 2, 1, 10, 33)) config.addVacmUser(self._snmpEngine, 2, 'write-area', 'noAuthNoPriv', readSubTree=(1, 3, 6, 1, 2, 1, 10, 33), writeSubTree=(1, 3, 6, 1, 2, 1, 10, 33)) config.addVacmUser(self._snmpEngine, 1, 'write-area', 'noAuthNoPriv', readSubTree=(1, 3, 6, 1, 2, 1, 19, 2, 1), writeSubTree=(1, 3, 6, 1, 2, 1, 19, 2, 1)) config.addVacmUser(self._snmpEngine, 2, 'write-area', 'noAuthNoPriv', readSubTree=(1, 3, 6, 1, 2, 1, 19, 2, 1), writeSubTree=(1, 3, 6, 1, 2, 1, 19, 2, 1)) #each app has one or more contexts self._snmpContext = context.SnmpContext(self._snmpEngine) #the builder is used to load mibs. tell it to look in the #MIBS directory for our new MIB. We'll also use it to #export our symbols later mibBuilder = self._snmpContext.getMibInstrum().getMibBuilder() pub = path.join(getcwd(), 'PYSNMP_MIBS') priv = path.join(getcwd(), 'MIBSPY') mibSources = mibBuilder.getMibSources() + ( builder.DirMibSource(pub), ) + (builder.DirMibSource(priv), ) mibBuilder.setMibSources(*mibSources) #export our custom mib self._exportprivMIBS(mibBuilder) self._exportpubMIBS(mibBuilder) # tell pysnmp to respotd to get, getnext, set and getbulk cmdrsp.GetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.NextCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.SetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.BulkCommandResponder(self._snmpEngine, self._snmpContext)
def __init__(self, args, mibController): self.mibController = mibController configDict = loadConfig(args.config) self.moduleLogger = set_logging(configDict, __class__.__name__) self.moduleLogger.debug(f'configDict:{configDict}') self.snmpEngine = snmp_config.getSnmpEngine( engineId=configDict['snmp'].get('engineId')) engineBoots = snmp_config.setSnmpEngineBoots( self.snmpEngine, configDict.get('stateDir', '.')) self.listeningAddress = configDict['responder']['listeningIP'] self.listeningPort = configDict['responder']['listeningPort'] self.birthday = time.time() self.moduleLogger.info( f'Running SNMP engine ID {self.snmpEngine.snmpEngineID.prettyPrint()}, ' f'boots {engineBoots}') # UDP over IPv4 try: snmp_config.setSnmpTransport( self.snmpEngine, (self.listeningAddress, self.listeningPort)) except Exception as exc: self.moduleLogger.error(f'SNMP transport error: {exc}') raise self.moduleLogger.info( f'SnmpEngine UDPv4 listening on {self.listeningAddress} ' f'{self.listeningPort}') for snmpVersion, snmpConfigEntries in configDict['snmp'].get( 'versions', {}).items(): snmpVersion = str(snmpVersion) if snmpVersion in ('1', '2c'): for security, snmpConfig in snmpConfigEntries.items(): community = snmpConfig['community'] snmp_config.setCommunity( self.snmpEngine, security, community, version=snmpVersion) self.moduleLogger.info( f'Configuring SNMPv{snmpVersion} security name ' f'{security}, community name {community}') elif snmpVersion == '3': for security, usmCreds in snmpConfigEntries.get('usmUsers', {}).items(): snmp_config.setUsmUser( self.snmpEngine, security, usmCreds.get('user'), usmCreds.get('authKey'), usmCreds.get('authProtocol'), usmCreds.get('privKey'), usmCreds.get('privProtocol')) self.moduleLogger.info( f'Configuring SNMPv3 USM security {security}, user ' f'{usmCreds.get("user")}, ' f'auth {usmCreds.get("authKey")}/{usmCreds.get("authProtocol")}, ' f'priv {usmCreds.get("privKey")}/{usmCreds.get("privProtocol")}') else: raise error.BdsError('Unknown SNMP version {snmpVersion}') snmpContext = snmp_config.setMibController( self.snmpEngine, mibController) self.moduleLogger.info( f'Configuring SNMP context name "{snmpContext}"') cmdrsp.GetCommandResponder(self.snmpEngine, snmpContext) cmdrsp.NextCommandResponder(self.snmpEngine, snmpContext) cmdrsp.BulkCommandResponder(self.snmpEngine, snmpContext) self.snmpEngine.transportDispatcher.jobStarted(1)
def __init__(self, mibObjects): """ mibObjects - a list of MibObject tuples that this agent will serve """ #each SNMP-based application has an engine self._snmpEngine = engine.SnmpEngine() #open a UDP socket to listen for snmp requests config.addSocketTransport(self._snmpEngine, udp.domainName, udp.UdpTransport().openServerMode(('', 161))) #add a v2 user with the community string public config.addV1System(self._snmpEngine, "agent", "public") config.addV1System(self._snmpEngine, 'write-area', 'private') #let anyone accessing 'public' read anything in the subtree below, #which is the enterprises subtree that we defined our MIB to be in config.addVacmUser(self._snmpEngine, 2, "agent", "noAuthNoPriv", readSubTree=(1,3,6,1,4,1)) config.addVacmUser(self._snmpEngine, 2, 'write-area', 'noAuthNoPriv', readSubTree=(1,3,6,1,4,1), writeSubTree=(1,3,6,1,4,1)) #each app has one or more contexts self._snmpContext = context.SnmpContext(self._snmpEngine) #the builder is used to load mibs. tell it to look in the #current directory for our new MIB. We'll also use it to #export our symbols later mibBuilder = self._snmpContext.getMibInstrum().getMibBuilder() mibSources = mibBuilder.getMibSources() + (builder.DirMibSource('.'),) mibBuilder.setMibSources(*mibSources) Integer, ObjectIdentifier, OctetString = mibBuilder.importSymbols("ASN1", "Integer", "ObjectIdentifier", "OctetString") MibScalar, MibScalarInstance = mibBuilder.importSymbols( 'SNMPv2-SMI', 'MibScalar', 'MibScalarInstance' ) NamedValues, = mibBuilder.importSymbols("ASN1-ENUMERATION", "NamedValues") ConstraintsUnion, SingleValueConstraint, ConstraintsIntersection, ValueSizeConstraint, ValueRangeConstraint = mibBuilder.importSymbols("ASN1-REFINEMENT", "ConstraintsUnion", "SingleValueConstraint", "ConstraintsIntersection", "ValueSizeConstraint", "ValueRangeConstraint") NotificationGroup, ModuleCompliance, ObjectGroup = mibBuilder.importSymbols("SNMPv2-CONF", "NotificationGroup", "ModuleCompliance", "ObjectGroup") Integer32, MibScalar, MibTable, MibTableRow, MibTableColumn, NotificationType, MibIdentifier, IpAddress, TimeTicks, Counter64, Unsigned32, enterprises, iso, Gauge32, ModuleIdentity, ObjectIdentity, Bits, Counter32 = mibBuilder.importSymbols("SNMPv2-SMI", "Integer32", "MibScalar", "MibTable", "MibTableRow", "MibTableColumn", "NotificationType", "MibIdentifier", "IpAddress", "TimeTicks", "Counter64", "Unsigned32", "enterprises", "iso", "Gauge32", "ModuleIdentity", "ObjectIdentity", "Bits", "Counter32") DisplayString, TextualConvention = mibBuilder.importSymbols("SNMPv2-TC", "DisplayString", "TextualConvention") dockerRoot = ObjectIdentity((1, 3, 6, 1, 4, 1, 12345)) if mibBuilder.loadTexts: dockerRoot.setStatus('current') dockerDaemon = MibIdentifier((1, 3, 6, 1, 4, 1, 12345, 1)) dockerDaemonUptime = MibScalar((1, 3, 6, 1, 4, 1, 12345, 1, 1), TimeTicks()).setMaxAccess("readonly") dockerDaemonRestart = MibScalar((1, 3, 6, 1, 4, 1, 12345, 1, 2), Integer32().subtype(subtypeSpec=SingleValueConstraint(0, 1)).clone(namedValues=NamedValues(("notRestarting", 0), ("restaring", 1)))).setMaxAccess("readwrite") if mibBuilder.loadTexts: dockerDaemonRestart.setStatus('current') dockerDaemonMandatoryImplementations = ObjectGroup((1, 3, 6, 1, 4, 1, 12345, 1, 3)).setObjects(("ANDRE-GLOBAL-REG", "dockerDaemonUptime"), ("ANDRE-GLOBAL-REG", "dockerDaemonRestart")) if getattr(mibBuilder, 'version', (0, 0, 0)) > (4, 4, 0): dockerDaemonMandatoryImplementations = dockerDaemonMandatoryImplementations.setStatus('current') dockerContainers = MibIdentifier((1, 3, 6, 1, 4, 1, 12345, 2)) containeListTable = MibTable((1, 3, 6, 1, 4, 1, 12345, 2, 1), ) if mibBuilder.loadTexts: containeListTable.setStatus('current') containeListEntry = MibTableRow((1, 3, 6, 1, 4, 1, 12345, 2, 1, 1), ).setIndexNames((0, "ANDRE-GLOBAL-REG", "containeListHashIdentifier"), (0, "ANDRE-GLOBAL-REG", "containeListUptime"), (0, "ANDRE-GLOBAL-REG", "containeListName"), (0, "ANDRE-GLOBAL-REG", "containeListStatus")) if mibBuilder.loadTexts: containeListEntry.setStatus('current') containeListHashIdentifier = MibTableColumn((1, 3, 6, 1, 4, 1, 12345, 2, 1, 1, 1), OctetString()).setMaxAccess("readonly") if mibBuilder.loadTexts: containeListHashIdentifier.setStatus('current') containeListImageID = MibTableColumn((1, 3, 6, 1, 4, 1, 12345, 2, 1, 1, 2), OctetString()).setMaxAccess("readonly") if mibBuilder.loadTexts: containeListUptime.setStatus('current') containeListName = MibTableColumn((1, 3, 6, 1, 4, 1, 12345, 2, 1, 1, 3), OctetString()).setMaxAccess("readonly") if mibBuilder.loadTexts: containeListName.setStatus('current') containeListStatus = MibTableColumn((1, 3, 6, 1, 4, 1, 12345, 2, 1, 1, 4), OctetString()).setMaxAccess("readonly") if mibBuilder.loadTexts: containeListStatus.setStatus('current') mibBuilder.exportSymbols("ANDRE-GLOBAL-REG", dockerContainers=dockerContainers, containeListName=containeListName, dockerRoot=dockerRoot, containeListEntry=containeListEntry, containeListImageID=containeListImageID, dockerDaemonUptime=dockerDaemonUptime, dockerDaemonRestart=dockerDaemonRestart, containeListStatus=containeListStatus, dockerDaemon=dockerDaemon, dockerDaemonMandatoryImplementations=dockerDaemonMandatoryImplementations, containeListHashIdentifier=containeListHashIdentifier, containeListTable=containeListTable) container_info = getDockerProcesses() docker_informations = loads(check_output(['curl','--unix-socket','/var/run/docker.sock', 'http://localhost/containers/json'])) print docker_informations[0] class DockerDaemonUpTimeMibScalarInstance(MibScalarInstance): def getValue(self, name, idx): out = check_output(['ps', 'aux']) res = [line for line in out.split('\n') if 'MacOS/Docker' in line][0].split()[1] print res if res == [] or res == '': result = 0 return self.getSyntax().clone(result) out = check_output(['ps', '-o', 'etime=','-p',res]) print out try: try: t=datetime.datetime.strptime(out,'%H:%M:%S\n') except: t=datetime.datetime.strptime(out,'%M:%S\n') except: result = 0 return self.getSyntax().clone(result) result = (((t.hour * 60) + t.minute) * 60 + t.second) * 100 return self.getSyntax().clone(result) dockerDaemonRestart class DockerDaemonRestartMibScalarInstance(MibScalarInstance): MaxAccess = "readwrite" def getValue(self, name, idx): return self.getSyntax().clone(0) def setValue(self, value, name, idx): if value == 1: for i in range(len(container_info) - 1): print i Popen(["curl", "-d", "''", "--unix-socket", "/var/run/docker.sock", "http://localhost/containers/" + docker_informations[i]["Id"] + "/restart"]) if hasattr(self.syntax, 'setValue'): return self.syntax.setValue(value) else: return self.syntax.clone(value) class ContaineListHashIdentifierStateInstance(MibScalarInstance): def readGet(self, name, val, *args): try: docker_informations = loads(check_output(['curl','--unix-socket','/var/run/docker.sock', 'http://localhost/containers/json'])) return self.name, self.syntax.clone(docker_informations[name[-1] - 1]["Id"]) except: MibScalarInstance.readGet(self, name, val, *args) class ContaineListNameStateInstance(MibScalarInstance): def readGet(self, name, val, *args): docker_informations = loads(check_output(['curl','--unix-socket','/var/run/docker.sock', 'http://localhost/containers/json'])) return self.name, self.syntax.clone(docker_informations[name[-1] - 1]["Image"]) class ContaineListStatusStateInstance(MibScalarInstance): def readGet(self, name, val, *args): docker_informations = loads(check_output(['curl','--unix-socket','/var/run/docker.sock', 'http://localhost/containers/json'])) return self.name, self.syntax.clone(docker_informations[name[-1] - 1]["Status"]) class ContaineListImageIDStateInstance(MibScalarInstance): def readGet(self, name, val, *args): docker_informations = loads(check_output(['curl','--unix-socket','/var/run/docker.sock', 'http://localhost/containers/json'])) return self.name, self.syntax.clone(docker_informations[name[-1] - 1]["ImageID"]) mibBuilder.exportSymbols("ANDRE-GLOBAL-REG",dockerDaemonUptime, DockerDaemonUpTimeMibScalarInstance((1, 3, 6, 1, 4, 1, 12345, 1, 1),(0,),TimeTicks())) mibBuilder.exportSymbols("ANDRE-GLOBAL-REG",dockerDaemonRestart, DockerDaemonRestartMibScalarInstance(dockerDaemonRestart.getName(),(0,),dockerDaemonRestart.getSyntax()).setMaxAccess("readwrite")) for i in range(len(docker_informations)): mibBuilder.exportSymbols("ANDRE-GLOBAL-REG", ContaineListNameStateInstance(containeListName.getName(), (i+1,), containeListName.getSyntax()), ContaineListHashIdentifierStateInstance(containeListHashIdentifier.getName(), (i+1,), containeListHashIdentifier.getSyntax()), ContaineListStatusStateInstance(containeListStatus.getName(), (i+1,), containeListStatus.getSyntax()), ContaineListImageIDStateInstance(containeListImageID.getName(), (i+1,), containeListImageID.getSyntax()), ) #Export Test Table #our variables will subclass this since we only have scalar types #can't load this type directly, need to import it MibScalarInstance, = mibBuilder.importSymbols('SNMPv2-SMI', 'MibScalarInstance') # tell pysnmp to respotd to get, getnext, and getbulk cmdrsp.GetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.SetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.NextCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.BulkCommandResponder(self._snmpEngine, self._snmpContext)
def engine(self): """ Setup SNMP engine and context """ log = 'SNMP agent engine initialization sequence begun. ' +\ 'This may take a minute or two.' logger.info(log) print(log) MPQ_ACT.put_nowait([datetime.now().isoformat(' '), 'INFO', log]) # Create SNMP engine with auto generated engineID and pre-bound # to socket transport dispatcher self.eng_snmp = engine.SnmpEngine() # Transport setup # UDP over IPv4 at 0.0.0.0:8900 config.addTransport( self.eng_snmp, udp.domainName, udp.UdpTransport().openServerMode(iface=('', 8900))) # UDP over IPv6 at [::]:8900 config.addTransport( self.eng_snmp, udp6.domainName, udp6.Udp6Transport().openServerMode(iface=('::', 8900))) # SNMPv2c setup # SecurityName <-> CommunityName mapping. config.addV1System(snmpEngine=self.eng_snmp, communityIndex='agent', communityName='janusess') # Allow full MIB access for this user / securityModels at VACM # MIB 1.3.6.1.4.1.9934 refers to Janus Research Group # MIB 1.3.6.1.4.1.9934.0 refers to JanusESS Project config.addVacmUser(snmpEngine=self.eng_snmp, securityModel=2, securityName='agent', securityLevel='noAuthNoPriv', readSubTree=(1, 3, 6, 1, 4, 1, 9934, 0)) # Get default SNMP context this SNMP engine serves self.ctx_snmp = context.SnmpContext(snmpEngine=self.eng_snmp) # Create custom Managed Object Instance self.mib_builder = self.ctx_snmp.getMibInstrum().getMibBuilder() mib_sources = self.mib_builder.getMibSources() + \ ( builder.DirMibSource('/opt/Janus/ESS/python3/server/snmp/mibs'), ) self.mib_builder.setMibSources(*mib_sources) # JANUS-MIB defines and locates all Janus Research Group projects # JANUSESS-MIB defines all JanusESS project entries self.mib_builder.loadModules('JANUS-MIB', 'JANUSESS-MIB') self.config_base() self.config_lane() self.config_module() self.config_sensor() # Register SNMP Applications at the SNMP engine for particular SNMP context cmdrsp.GetCommandResponder(self.eng_snmp, self.ctx_snmp) cmdrsp.NextCommandResponder(self.eng_snmp, self.ctx_snmp) cmdrsp.BulkCommandResponder(self.eng_snmp, self.ctx_snmp) dispatcher = threading.Thread(target=self.dispatcher, args=()) dispatcher.start() MPQ_STAT.put_nowait(['snmp_agent', dispatcher.ident]) log = 'SNMP agent engine sequence concluded.' logger.info(log) MPQ_ACT.put_nowait([datetime.now().isoformat(' '), 'INFO', log]) MPQ_STAT.put_nowait(['base', ['snmp_agent', STAT_LVL['op']]]) log = 'SNMP agent listener started.' logger.info(log) print(log) MPQ_ACT.put_nowait([datetime.now().isoformat(' '), 'INFO', log]) # Poll SNMP agent queues for values to update variables while True: if not MPQ_SNMPA_STOP.empty(): MPQ_SNMPA_STOP.get() self.eng_snmp.transportDispatcher.closeDispatcher() break if not MPQ_SNMPA2.empty(): mpq_record = MPQ_SNMPA2.get() self.base(mpq_record=mpq_record) if not MPQ_SNMPA3.empty(): mpq_record = MPQ_SNMPA3.get() self.lane(mpq_record=mpq_record) if not MPQ_SNMPA4.empty(): mpq_record = MPQ_SNMPA4.get() self.module(mpq_record=mpq_record) if not MPQ_SNMPA5.empty(): mpq_record = MPQ_SNMPA5.get() self.sensor(mpq_record=mpq_record) time.sleep(0.1) MPQ_STAT.put_nowait(['snmp_agent', False]) log = 'SNMP agent dispatcher stopped.' logger.info(log) MPQ_ACT.put_nowait([datetime.now().isoformat(' '), 'INFO', log]) log = 'SNMP agent listener stopped.' logger.info(log) print(log) MPQ_ACT.put_nowait([datetime.now().isoformat(' '), 'INFO', log]) MPQ_STAT.put_nowait(['base', ['snmp_agent', STAT_LVL['not_cfg']]])
def connect_to_server(): global snmpEngine snmpEngine = engine.SnmpEngine() # GUI變數 ip_addr = ip_entry.get() port_num = port_entry.get() global model_name model_name = model_combo.get() + "-MIB" # Setup UDP over IPv4 transport endpoint config.addTransport( snmpEngine, udp.domainName, udp.UdpTransport().openServerMode((ip_addr, int(port_num)))) # SNMPv2c setup # "my-area" -> user name / "public" -> community name config.addV1System(snmpEngine, "my-area", "public") config.addContext(snmpEngine, "") # Allow full MIB access for this user / securityModels at VACM config.addVacmUser(snmpEngine, 2, "my-area", "noAuthNoPriv", (1, 3, 6, 1, 4, 1, 8691)) # Create an SNMP context snmpContext = context.SnmpContext(snmpEngine) # Create MIB builder global mibBuilder mibBuilder = snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder # Optionally set an alternative path to compiled MIBs print("Setting MIB sources...") MIBDIR = r"./pwd/mibfiles/" mibBuilder.addMibSources(builder.DirMibSource(MIBDIR)) print("done") # Load modules print("Loading MIB modules...") mibBuilder.loadModules(model_name) """ print("Indexing MIB objects..."), mibView = view.MibViewController(mibBuilder) print(mibView.getNodeName((1, 3, 6, 1, 4, 1, 8691, 2, 19, 1, 6, 4, 1, 1, 0))) print("done") """ # Build mib tree print("Building MIB tree...") global mibInstrum mibInstrum = snmpContext.getMibInstrum() print("done") print("Building table entry index from human-friendly representation...") global portEntry portEntry, = mibBuilder.importSymbols(model_name, "portEntry") """ networkConnEntry, = mibBuilder.importSymbols( model_name, "modbusProtocolEntry" ) """ global MibScalarInstance MibScalarInstance, = mibBuilder.importSymbols("SNMPv2-SMI", "MibScalarInstance") global power1InputStatus, power2InputStatus power1InputStatus, = mibBuilder.importSymbols(model_name, "power1InputStatus") power2InputStatus, = mibBuilder.importSymbols(model_name, "power2InputStatus") print("done") """ # Modify mibscalar value class Mypower1InputStatus(MibScalarInstance): # noinspection PyUnusedLocal def readGet(self, name, *args): # Just return a custom value return name, self.syntax.clone(power1InputStatus_Value.get()) class Mypower2InputStatus(MibScalarInstance): # noinspection PyUnusedLocal def readGet(self, name, *args): # Just return a custom value return name, self.syntax.clone(power2InputStatus_Value.get()) _power1InputStatus = Mypower1InputStatus( power1InputStatus.name, (0,), power1InputStatus.syntax ) _power2InputStatus = Mypower2InputStatus( power2InputStatus.name, (0,), power2InputStatus.syntax ) failedLoginLockedTime = MibScalarInstance( failedLoginLockedTime.name, (1, 3, 6, 1, 4, 1, 8691, 2, 19, 1, 6, 4, 1, 12, 0), failedLoginLockedTime.syntax.clone(50) ) print(failedLoginLockedTime) # Register Managed Object with a MIB tree mibBuilder.exportSymbols( # "__" prefixed MIB modules take precedence on indexing model_name, _power1InputStatus=_power1InputStatus, _power2InputStatus=_power2InputStatus ) """ print("Getting instance ID") global instanceId instanceId = portEntry.getInstIdFromIndices(10) print("done") write_var() """ # Modify mibtable value print("Create/update MOXA-NPS9450-MIB::consoleSetting table row: ") varBinds = mibInstrum.writeVars( ((portEntry.name + (2,) + instanceId, port_status),) ) #mibInstrum.writeVars(((networkConnEntry.name + (2,) + instanceId_networkConnEntry, "0"),)) #mibInstrum.writeVars(((realComEntry.name + (1,) + instanceId,"4"),)) for oid, val in varBinds: print("%s = %s" % (".".join([str(x) for x in oid]), not val.isValue and "N/A" or val.prettyPrint())) print("done") print("Read whole MIB (table walk)") oid, val = (), None while True: oid, val = mibInstrum.readNextVars(((oid, val),))[0] if exval.endOfMib.isSameTypeWith(val): break print("%s = %s\n" % (".".join([str(x) for x in oid]), not val.isValue and "N/A" or val.prettyPrint())) print("done") """ # Register SNMP Applications at the SNMP engine for particular SNMP context cmdrsp.GetCommandResponder(snmpEngine, snmpContext) cmdrsp.SetCommandResponder(snmpEngine, snmpContext) cmdrsp.NextCommandResponder(snmpEngine, snmpContext) cmdrsp.BulkCommandResponder(snmpEngine, snmpContext) # Register an imaginary never-ending job to keep I/O dispatcher running forever snmpEngine.transportDispatcher.jobStarted(1) # this job would never finish global connect_first # Run I/O dispatcher which would receive queries and send responses try: print("here") connect_first = 1 snmpEngine.transportDispatcher.runDispatcher() except: print("there") snmpEngine.transportDispatcher.closeDispatcher() raise
def __init__(self, mibObjects): self._snmpEngine = engine.SnmpEngine() # open a UDP socket to listen for snmp requests config.addSocketTransport( self._snmpEngine, udp.domainName, udp.UdpTransport().openServerMode(('', 7757))) # add a v2 user with the community string public config.addV1System(self._snmpEngine, "agent", "public") # let anyone accessing 'public' read anything in the subtree below, # which is the enterprises subtree that we defined our MIB to be in config.addVacmUser(self._snmpEngine, 2, "agent", "noAuthNoPriv", readSubTree=(1, 3, 6, 1, 4, 1)) # each app has one or more contexts self._snmpContext = context.SnmpContext(self._snmpEngine) # the builder is used to load mibs. tell it to look in the # current directory for our new MIB. We'll also use it to # export our symbols later mibBuilder = self._snmpContext.getMibInstrum().getMibBuilder() mibSources = mibBuilder.getMibSources() + (builder.DirMibSource('.'), ) mibBuilder.setMibSources(*mibSources) # our variables will subclass this since we only have scalar types # can't load this type directly, need to import it MibScalarInstance, = mibBuilder.importSymbols('SNMPv2-SMI', 'MibTable') mib = Mib() (nodeEntry, profileEntry, nodeIdxColumn, profileIdxColumn, dcdColumn, profileNameColumn) = mibBuilder.importSymbols('AKSION-CONTROL-MIB', 'nodeEntry', 'profileEntry', 'nodeIdx', 'profileIdx', 'dcd', 'profileName') rowInstanceId = nodeEntry.getInstIdFromIndices(1) mibInstrumentation = self._snmpContext.getMibInstrum() mibInstrumentation.writeVars( ((dcdColumn.name + rowInstanceId, 'xx1'), )) rowProfileInstanceId = profileEntry.getInstIdFromIndices(1) mibInstrumentation = self._snmpContext.getMibInstrum() mibInstrumentation.writeVars( ((profileNameColumn.name + rowInstanceId + rowProfileInstanceId, 'ProfileNode1'), )) # rowInstanceId = nodeEntry.getInstIdFromIndices(2) mibInstrumentation = self._snmpContext.getMibInstrum() mibInstrumentation.writeVars( ((dcdColumn.name + rowInstanceId, 'xx 2'), )) rowProfileInstanceId = profileEntry.getInstIdFromIndices(2) mibInstrumentation = self._snmpContext.getMibInstrum() mibInstrumentation.writeVars( ((profileNameColumn.name + rowInstanceId + rowProfileInstanceId, 'ProfileNode2'), )) # tell pysnmp to respotd to get, getnext, and getbulk cmdrsp.GetCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.NextCommandResponder(self._snmpEngine, self._snmpContext) cmdrsp.BulkCommandResponder(self._snmpEngine, self._snmpContext)
def __init__(self, udpIp, udpPort): # Create SNMP engine with autogenernated engineID and pre-bound # to socket transport dispatcher self.snmpEngine = engine.SnmpEngine() self.mibBuilder = self.snmpEngine.msgAndPduDsp.mibInstrumController.mibBuilder mibPath = self.mibBuilder.getMibPath() + ('.', ) self.mibBuilder.setMibPath(*mibPath) # Setup UDP over IPv4 transport endpoint config.addSocketTransport( self.snmpEngine, udp.domainName, udp.UdpSocketTransport().openServerMode((udpIp, udpPort))) print 'Publishing readings via SNMP' print 'Agent address {}:{}'.format(udpIp, udpPort) print 'Community name public' # v1/2 setup config.addV1System(self.snmpEngine, 'test-agent', 'public') # v3 setup config.addV3User(self.snmpEngine, 'test-user') # VACM setup config.addContext(self.snmpEngine, '') config.addRwUser(self.snmpEngine, 1, 'test-agent', 'noAuthNoPriv', (1, 3, 6)) # v1 config.addRwUser(self.snmpEngine, 2, 'test-agent', 'noAuthNoPriv', (1, 3, 6)) # v2c config.addRwUser(self.snmpEngine, 3, 'test-user', 'noAuthNoPriv', (1, 3, 6)) # v3 # SNMP context snmpContext = context.SnmpContext(self.snmpEngine) # Apps registration cmdrsp.GetCommandResponder(self.snmpEngine, snmpContext) cmdrsp.SetCommandResponder(self.snmpEngine, snmpContext) cmdrsp.NextCommandResponder(self.snmpEngine, snmpContext) cmdrsp.BulkCommandResponder(self.snmpEngine, snmpContext) MibScalarInstance, = self.mibBuilder.importSymbols( 'SNMPv2-SMI', 'MibScalarInstance') class ScalarFromCallback(MibScalarInstance): def __init__(self, sensorId, valueGetter, typeName, instId, syntax): MibScalarInstance.__init__(self, typeName, instId, syntax) self.valueGetter = valueGetter def readTest(self, name, val, idx, (acFun, acCtx)): if not self.valueGetter(): raise error.NoAccessError(idx=idx, name=name) def readGet(self, name, val, idx, (acFun, acCtx)): value = self.valueGetter() if not value: raise error.NoAccessError(idx=idx, name=name) else: return name, self.syntax.clone(value)
def _setup(self, q): """Setup a new agent in a separate process. The port the agent is listening too will be returned using the provided queue. """ port = random.randrange(22000, 22989) snmpEngine = engine.SnmpEngine() if self.ipv6: config.addSocketTransport( snmpEngine, udp6.domainName, udp6.Udp6Transport().openServerMode(('::1', port))) else: config.addSocketTransport( snmpEngine, udp.domainName, udp.UdpTransport().openServerMode(('127.0.0.1', port))) # Community is public and MIB is writable config.addV1System(snmpEngine, 'read-write', 'public') config.addVacmUser(snmpEngine, 1, 'read-write', 'noAuthNoPriv', (1, 3, 6), (1, 3, 6)) config.addVacmUser(snmpEngine, 2, 'read-write', 'noAuthNoPriv', (1, 3, 6), (1, 3, 6)) config.addV3User(snmpEngine, 'read-write', config.usmHMACMD5AuthProtocol, 'authpass', config.usmAesCfb128Protocol, 'privpass') config.addVacmUser(snmpEngine, 3, 'read-write', 'authPriv', (1, 3, 6), (1, 3, 6)) # Build MIB def stringToOid(string): return [ord(x) for x in string] def flatten(*args): result = [] for el in args: if isinstance(el, (list, tuple)): for sub in el: result.append(sub) else: result.append(el) return tuple(result) snmpContext = context.SnmpContext(snmpEngine) mibBuilder = snmpContext.getMibInstrum().getMibBuilder() (MibTable, MibTableRow, MibTableColumn, MibScalar, MibScalarInstance) = mibBuilder.importSymbols( 'SNMPv2-SMI', 'MibTable', 'MibTableRow', 'MibTableColumn', 'MibScalar', 'MibScalarInstance') mibBuilder.exportSymbols( '__MY_SNMPv2_MIB', # SNMPv2-MIB::sysDescr MibScalar((1, 3, 6, 1, 2, 1, 1, 1), v2c.OctetString()), MibScalarInstance((1, 3, 6, 1, 2, 1, 1, 1), (0, ), v2c.OctetString("Snimpy Test Agent"))) mibBuilder.exportSymbols( '__MY_IF_MIB', # IF-MIB::ifNumber MibScalar((1, 3, 6, 1, 2, 1, 2, 1), v2c.Integer()), MibScalarInstance((1, 3, 6, 1, 2, 1, 2, 1), (0, ), v2c.Integer(3)), # IF-MIB::ifTable MibTable((1, 3, 6, 1, 2, 1, 2, 2)), MibTableRow((1, 3, 6, 1, 2, 1, 2, 2, 1)).setIndexNames( (0, '__MY_IF_MIB', 'ifIndex')), # IF-MIB::ifIndex MibScalarInstance((1, 3, 6, 1, 2, 1, 2, 2, 1, 1), (1, ), v2c.Integer(1)), MibScalarInstance((1, 3, 6, 1, 2, 1, 2, 2, 1, 1), (2, ), v2c.Integer(2)), MibScalarInstance((1, 3, 6, 1, 2, 1, 2, 2, 1, 1), (3, ), v2c.Integer(3)), # IF-MIB::ifDescr MibTableColumn((1, 3, 6, 1, 2, 1, 2, 2, 1, 2), v2c.OctetString()), MibScalarInstance((1, 3, 6, 1, 2, 1, 2, 2, 1, 2), (1, ), v2c.OctetString("lo")), MibScalarInstance((1, 3, 6, 1, 2, 1, 2, 2, 1, 2), (2, ), v2c.OctetString("eth0")), MibScalarInstance((1, 3, 6, 1, 2, 1, 2, 2, 1, 2), (3, ), v2c.OctetString("eth1")), # IF-MIB::ifType MibTableColumn((1, 3, 6, 1, 2, 1, 2, 2, 1, 3), v2c.Integer()), MibScalarInstance((1, 3, 6, 1, 2, 1, 2, 2, 1, 3), (1, ), v2c.Integer(24)), MibScalarInstance((1, 3, 6, 1, 2, 1, 2, 2, 1, 3), (2, ), v2c.Integer(6)), MibScalarInstance((1, 3, 6, 1, 2, 1, 2, 2, 1, 3), (3, ), v2c.Integer(6)), # IF-MIB::ifIndex ifIndex=MibTableColumn((1, 3, 6, 1, 2, 1, 2, 2, 1, 1), v2c.Integer())) mibBuilder.exportSymbols( '__MY_SNIMPY-MIB', # SNIMPY-MIB::snimpyIpAddress MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 1), v2c.OctetString()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 1), (0, ), v2c.OctetString("AAAA")), # SNIMPY-MIB::snimpyString MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 2), v2c.OctetString()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 2), (0, ), v2c.OctetString("bye")), # SNIMPY-MIB::snimpyInteger MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 3), v2c.Integer()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 3), (0, ), v2c.Integer(19)), # SNIMPY-MIB::snimpyEnum MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 4), v2c.Integer()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 4), (0, ), v2c.Integer(2)), # SNIMPY-MIB::snimpyObjectId MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 5), v2c.ObjectIdentifier()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 5), (0, ), v2c.ObjectIdentifier((1, 3, 6, 4454, 0, 0))), # SNIMPY-MIB::snimpyBoolean MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 6), v2c.Integer()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 6), (0, ), v2c.Integer(1)), # SNIMPY-MIB::snimpyCounter MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 7), v2c.Counter32()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 7), (0, ), v2c.Counter32(47)), # SNIMPY-MIB::snimpyGauge MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 8), v2c.Gauge32()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 8), (0, ), v2c.Gauge32(18)), # SNIMPY-MIB::snimpyTimeticks MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 9), v2c.TimeTicks()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 9), (0, ), v2c.TimeTicks(12111100)), # SNIMPY-MIB::snimpyCounter64 MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 10), v2c.Counter64()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 10), (0, ), v2c.Counter64(2**48 + 3)), # SNIMPY-MIB::snimpyBits MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 11), v2c.OctetString()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 11), (0, ), v2c.OctetString(b"\xa0")), # SNIMPY-MIB::snimpyMacAddress MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 15), v2c.OctetString()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 15), (0, ), v2c.OctetString(b"\x11\x12\x13\x14\x15\x16")), # SNIMPY-MIB::snimpyMacAddressInvalid MibScalar((1, 3, 6, 1, 2, 1, 45121, 1, 16), v2c.OctetString()).setMaxAccess("readwrite"), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 1, 16), (0, ), v2c.OctetString(b"\xf1\x12\x13\x14\x15\x16")), # SNIMPY-MIB::snimpyIndexTable MibTable((1, 3, 6, 1, 2, 1, 45121, 2, 3)), MibTableRow((1, 3, 6, 1, 2, 1, 45121, 2, 3, 1)).setIndexNames( (0, "__MY_SNIMPY-MIB", "snimpyIndexVarLen"), (0, "__MY_SNIMPY-MIB", "snimpyIndexOidVarLen"), (0, "__MY_SNIMPY-MIB", "snimpyIndexFixedLen"), (1, "__MY_SNIMPY-MIB", "snimpyIndexImplied")), # SNIMPY-MIB::snimpyIndexInt MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 2, 3, 1, 6), flatten(4, stringToOid('row1'), 3, 1, 2, 3, stringToOid('alpha5'), stringToOid('end of row1')), v2c.Integer(4571)), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 2, 3, 1, 6), flatten(4, stringToOid('row2'), 4, 1, 0, 2, 3, stringToOid('beta32'), stringToOid('end of row2')), v2c.Integer(78741)), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 2, 3, 1, 6), flatten(4, stringToOid('row3'), 4, 120, 1, 2, 3, stringToOid('gamma7'), stringToOid('end of row3')), v2c.Integer(4110)), # SNIMPY-MIB::snimpyInvalidTable MibTable((1, 3, 6, 1, 2, 1, 45121, 2, 5)), MibTableRow((1, 3, 6, 1, 2, 1, 45121, 2, 5, 1)).setIndexNames( (0, "__MY_SNIMPY-MIB", "snimpyInvalidIndex")), # SNIMPY-MIB::snimpyInvalidDescr MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 2, 5, 1, 2), (1, ), v2c.OctetString(b"Hello")), MibScalarInstance((1, 3, 6, 1, 2, 1, 45121, 2, 5, 1, 2), (2, ), v2c.OctetString(b"\xf1\x12\x13\x14\x15\x16")), # Indexes snimpyIndexVarLen=MibTableColumn( (1, 3, 6, 1, 2, 1, 45121, 2, 3, 1, 1), v2c.OctetString()).setMaxAccess("noaccess"), snimpyIndexIntIndex=MibTableColumn( (1, 3, 6, 1, 2, 1, 45121, 2, 3, 1, 2), v2c.Integer()).setMaxAccess("noaccess"), snimpyIndexOidVarLen=MibTableColumn( (1, 3, 6, 1, 2, 1, 45121, 2, 3, 1, 3), v2c.ObjectIdentifier()).setMaxAccess("noaccess"), snimpyIndexFixedLen=MibTableColumn( (1, 3, 6, 1, 2, 1, 45121, 2, 3, 1, 4), v2c.OctetString().setFixedLength(6)).setMaxAccess("noaccess"), snimpyIndexImplied=MibTableColumn( (1, 3, 6, 1, 2, 1, 45121, 2, 3, 1, 5), v2c.OctetString()).setMaxAccess("noaccess"), snimpyIndexInt=MibTableColumn( (1, 3, 6, 1, 2, 1, 45121, 2, 3, 1, 6), v2c.Integer()).setMaxAccess("readwrite"), snimpyInvalidIndex=MibTableColumn( (1, 3, 6, 1, 2, 1, 45121, 2, 5, 1, 1), v2c.Integer()).setMaxAccess("noaccess"), snimpyInvalidDescr=MibTableColumn( (1, 3, 6, 1, 2, 1, 45121, 2, 5, 1, 2), v2c.OctetString()).setMaxAccess("readwrite")) # Start agent cmdrsp.GetCommandResponder(snmpEngine, snmpContext) cmdrsp.SetCommandResponder(snmpEngine, snmpContext) cmdrsp.NextCommandResponder(snmpEngine, snmpContext) cmdrsp.BulkCommandResponder(snmpEngine, snmpContext) q.put(port) snmpEngine.transportDispatcher.jobStarted(1) snmpEngine.transportDispatcher.runDispatcher()
config.addVacmUser(snmpEngine, 3, 'usr-md5-none', 'authNoPriv', (1, 3, 6, 1, 2, 1), (1, 3, 6, 1, 2, 1)) # Create an SNMP context with ContextEngineId = 8000000001020304 snmpContext = context.SnmpContext( snmpEngine, contextEngineId=v2c.OctetString(hexValue='8000000001020304')) # Create an [empty] set of Managed Objects (MibBuilder), pass it to # Management Instrumentation Controller and register at SNMP Context # under ContextName 'my-context' snmpContext.registerContextName( v2c.OctetString('my-context'), # Context Name instrum.MibInstrumController(builder.MibBuilder()) # Managed Objects ) # Register SNMP Applications at the SNMP engine for particular SNMP context cmdrsp.GetCommandResponder(snmpEngine, snmpContext) cmdrsp.SetCommandResponder(snmpEngine, snmpContext) cmdrsp.NextCommandResponder(snmpEngine, snmpContext) cmdrsp.BulkCommandResponder(snmpEngine, snmpContext) # Register an imaginary never-ending job to keep I/O dispatcher running forever snmpEngine.transportDispatcher.jobStarted(1) # Run I/O dispatcher which would receive queries and send responses try: snmpEngine.transportDispatcher.runDispatcher() except: snmpEngine.transportDispatcher.closeDispatcher() raise
def start(self): if self._engine is None: # Create SNMP engine with autogenernated engineID and pre-bound # to socket transport dispatcher self._engine = engine.SnmpEngine() # Setup UDP over IPv4 transport endpoint try: iface = ('0.0.0.0', self.port) self._logger.info("[pid: %d] Starting SNMP server on %s:%d", os.getpid(), iface[0], iface[1]) config.addSocketTransport( self._engine, udp.domainName, udp.UdpSocketTransport().openServerMode(iface) ) except CarrierError: self._logger.error('Can\'t run SNMP agent on port %d: Address already in use', self.port) raise mibBuilder = self._engine.msgAndPduDsp.mibInstrumController.mibBuilder MibSources = mibBuilder.getMibPath() sources = ['/mibs','/mibs/instances'] for source in sources: MibSources += ((os.path.realpath(os.path.dirname(__file__) + source), )) apply(mibBuilder.setMibPath, MibSources) try: mibBuilder.loadModules(*self._modules) except SmiError: self._logger.warn('Can\'t load modules') raise config.addV1System(self._engine, self._security_name, self._community_name) # VACM setup config.addContext(self._engine, '') config.addRwUser(self._engine, 1, self._security_name, 'noAuthNoPriv', (1,3,6)) # v1 config.addRwUser(self._engine, 2, self._security_name, 'noAuthNoPriv', (1,3,6)) # v2c # SNMP context snmpContext = context.SnmpContext(self._engine) # Apps registration cmdrsp.GetCommandResponder(self._engine, snmpContext) cmdrsp.SetCommandResponder(self._engine, snmpContext) cmdrsp.NextCommandResponder(self._engine, snmpContext) cmdrsp.BulkCommandResponder(self._engine, snmpContext) # Start server self._logger.debug('Starting transport dispatcher') self._engine.transportDispatcher.jobStarted(1) try: self._logger.debug('Run transport dispatcher') self._engine.transportDispatcher.runDispatcher() except select.error, e: if e.args[0] == 9: # 'Bad file descriptor' # Throws when dispatcher closed from another thread pass else: raise