コード例 #1
0
def setup_snmp():
    """Configure SNMP server listener"""

    transport_dispatcher = AsynsockDispatcher()

    transport_dispatcher.registerRecvCbFun(snmp_trap_receiver)

    # UDP/IPv4
    transport_dispatcher.registerTransport(
        udp.domainName,
        udp.UdpSocketTransport().openServerMode(('0.0.0.0', 162)))

    # UDP/IPv6
    transport_dispatcher.registerTransport(
        udp6.domainName,
        udp6.Udp6SocketTransport().openServerMode(('::1', 162)))

    transport_dispatcher.jobStarted(1)

    try:
        # Dispatcher will never finish as job#1 never reaches zero
        transport_dispatcher.runDispatcher()
    except:
        transport_dispatcher.closeDispatcher()
        raise
コード例 #2
0
ファイル: snmpApi.py プロジェクト: akshaydawar/DWDM_REPORT
def receive_trap(self):
    
    transportDispatcher = AsynsockDispatcher()

    transportDispatcher.registerRecvCbFun(cbFun)

    # UDP/IPv4
    transportDispatcher.registerTransport(
        udp.domainName, udp.UdpSocketTransport().openServerMode(('192.168.115.187', 162))
        )

    # UDP/IPv6
    transportDispatcher.registerTransport(
        udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 162))
        )

    transportDispatcher.jobStarted(1)

    try:
        # Dispatcher will never finish as job#1 never reaches zero
        print('run dispatcher')
        transportDispatcher.runDispatcher()
    except:
        transportDispatcher.closeDispatcher()
        raise
コード例 #3
0
    def add_udp_endpoint(
        self,
        snmp_engine,
        snmp_timeout=SNMP_TIMEOUT,
        snmp_retry_count=SNMP_RETRIES_COUNT,
    ):
        if self._snmp_parameters.ip:
            try:
                agent_udp_endpoint = socket.getaddrinfo(
                    self._snmp_parameters.ip,
                    self._snmp_parameters.port,
                    socket.AF_INET,
                    socket.SOCK_DGRAM,
                    socket.IPPROTO_UDP,
                )[0][4][:2]
            except socket.gaierror:
                raise InitializeSNMPException(
                    "Failed to validate {} hostname".format(
                        self._snmp_parameters.ip),
                    self._logger,
                )
        else:
            raise InitializeSNMPException(
                "Failed to validate {} hostname".format(
                    self._snmp_parameters.ip),
                self._logger,
            )

        ip = ip_address(u"{}".format(self._snmp_parameters.ip))
        if isinstance(ip, IPv6Address):
            config.addSocketTransport(
                snmp_engine,
                udp6.domainName,
                udp6.Udp6SocketTransport().openClientMode(),
            )
            config.addTargetAddr(
                snmp_engine,
                "tgt",
                udp6.domainName,
                agent_udp_endpoint,
                "pms",
                snmp_timeout,
                snmp_retry_count,
            )
        else:
            config.addSocketTransport(
                snmp_engine, udp.domainName,
                udp.UdpSocketTransport().openClientMode())
            config.addTargetAddr(
                snmp_engine,
                "tgt",
                udp.domainName,
                agent_udp_endpoint,
                "pms",
                snmp_timeout,
                snmp_retry_count,
            )
コード例 #4
0
    def run(self):
        """Run the sensor on its own thread"""

        # Check for debug mode being activated/deactivated
        self._read_my_msgQ_noWait()

        try:
            self._log_debug("Start processing")

            # Create MIB loader to lookup oids sent in traps
            self._mib_builder()

            # Create an asynchronous dispatcher and register a callback method to handle incoming traps
            transportDispatcher = AsynsockDispatcher()
            transportDispatcher.registerRecvCbFun(self._trap_catcher)

            # UDP/IPv4
            transportDispatcher.registerTransport(
                udp.domainName,
                udp.UdpSocketTransport().openServerMode(
                    (self._bind_ip, self._bind_port)))

            # UDP/IPv6
            transportDispatcher.registerTransport(
                udp6.domainName,
                udp6.Udp6SocketTransport().openServerMode(
                    ('::1', self._bind_port)))

            transportDispatcher.jobStarted(1)

            try:
                # Dispatcher will never finish as job #1 never reaches zero
                transportDispatcher.runDispatcher()
            except Exception as ae:
                self._log_debug("Exception: %r" % ae)
                transportDispatcher.closeDispatcher()

            self._log_debug("Finished processing, restarting SNMP listener")

            # Reset debug mode if persistence is not enabled
            self._disable_debug_if_persist_false()

            # Schedule the next time to run thread
            self._scheduler.enter(10, self._priority, self.run, ())

        # Could not bind to IP:port, log it and exit out module
        except Exception as ae:
            self._log_debug(
                "Unable to process SNMP traps from this node, closing module.")
            self._log_debug(
                f"SNMP Traps sensor attempted to bind to {self._bind_ip}:{self._bind_port}"
            )
コード例 #5
0
def main():
    'main program function'
    if os.path.isfile(CONFIG_FILE):
        filename = CONFIG_FILE
    elif os.path.isfile('/config/{0}'.format(CONFIG_FILE)):
        filename = '/config/{0}'.format(CONFIG_FILE)
    else:
        print 'Error: cannot find configuration file', CONFIG_FILE
        return

    processConfig(filename)

    transportDispatcher = AsynsockDispatcher()

    transportDispatcher.registerRecvCbFun(cbFun)

    # UDP/IPv4
    if gArgs.virtual_router:
        lookupVR(gArgs.virtual_router)

    # During startup, the IP address may not be ready yet. So we try a few times
    for retry in range(30):
        try:
            transportDispatcher.registerTransport(
                udp.domainName,
                udp.UdpSocketTransport().openServerMode(
                    (gArgs.ip_address, 162)))
            break
        except Exception:
            time.sleep(5)


# UDP/IPv6
    transportDispatcher.registerTransport(
        udp6.domainName,
        udp6.Udp6SocketTransport().openServerMode(('::1', 162)))

    transportDispatcher.jobStarted(1)

    try:
        # Dispatcher will never finish as job#1 never reaches zero
        transportDispatcher.runDispatcher()
    except Exception:
        transportDispatcher.closeDispatcher()
        raise
コード例 #6
0
    def start(self):
        transportDispatcher = AsynsockDispatcher()
        transportDispatcher.registerRecvCbFun(self._event_handle)

        if self.ipv4_addr:
            transportDispatcher.registerTransport(
                udp.domainName,
                udp.UdpSocketTransport().openServerMode(
                    (str(self.ipv4_addr), self.port)))
        if self.ipv6_addr:
            transportDispatcher.registerTransport(
                udp6.domainName,
                udp6.Udp6SocketTransport().openServerMode(
                    (str(self.ipv6_addr), self.port)))

        transportDispatcher.jobStarted(1)
        try:
            # Dispatcher will never finish as job#1 never reaches zero
            transportDispatcher.runDispatcher()
        except:
            transportDispatcher.closeDispatcher()
            raise
コード例 #7
0
def getSNMPEngine(address4, address6, snmpv12_agents, SNMPv3_users):
    # Create SNMP engine with autogenernated engineID and pre-bound
    # to socket transport dispatcher
    snmpEngine = engine.SnmpEngine()

    # Setup transport endpoint
    config.addSocketTransport(
        snmpEngine, udp.domainName,
        udp.UdpSocketTransport().openServerMode(address4))

    config.addSocketTransport(
        snmpEngine, udp6.domainName,
        udp6.Udp6SocketTransport().openServerMode(address6))
    log.info(
        "SNMP Trap; listening; msg=SNMP Trap daemon listening on UDP address %s and %s",
        address4, address6)

    # v1/2 setup
    for agent in snmpv12_agents:
        agent_val = snmpv12_agents.get(agent)
        community_string = agent_val.get("community_string")
        if community_string:
            config.addV1System(snmpEngine, agent, community_string)
            log.info("SNMP Trap; registering; Registered agent %s", agent)

    # v3 setup
    for user in SNMPv3_users:
        user_val = SNMPv3_users.get(user)
        user_auth_key = user_val.get("auth-key")
        user_priv_key = user_val.get("priv-key")
        if user_auth_key and user_priv_key:
            config.addV3User(snmpEngine, user, config.usmHMACMD5AuthProtocol,
                             user_auth_key, config.usmDESPrivProtocol,
                             user_priv_key)
            log.info("SNMP Trap; registering; Registered snmp v3 user %s",
                     user)

    return snmpEngine
コード例 #8
0
    def __init__(self, ip, port=161, is_ipv6=False, timeout=2000, retry_count=2, get_bulk_flag=False,
                 continue_on_errors=0, get_bulk_repetitions=25, v3_context_engine_id=None, v3_context=''):
        self.ip = ip
        self.continue_on_errors = continue_on_errors
        self.get_bulk_repetitions = get_bulk_repetitions
        self.timeout = timeout
        self.output_file = list()
        self.retry_count = retry_count
        self.get_bulk_flag = get_bulk_flag
        self.v3_context_engine_id = v3_context_engine_id
        self.v3_context = v3_context
        if self.v3_context_engine_id:
            if self.v3_context_engine_id[2:] == '0x':
                self.v3_context_engine_id = univ.OctetString(hexValue=self.v3_context_engine_id[2:])
            else:
                self.v3_context_engine_id = univ.OctetString(self.v3_context_engine_id)
        if self.v3_context:
            if self.v3_context[:2] == '0x':
                self.v3_context = univ.OctetString(hexValue=self.v3_context[2:])
            else:
                self.v3_context = univ.OctetString(self.v3_context)
        if ip:
            try:
                agent_udp_endpoint = \
                    socket.getaddrinfo(ip,
                                       port,
                                       socket.AF_INET, socket.SOCK_DGRAM,
                                       socket.IPPROTO_UDP)[0][4][:2]
            except socket.gaierror:
                sys.stderr.write('ERROR: unknown hostname {}\r\n'.format(ip))
                sys.exit(-1)
        else:
            sys.stderr.write('ERROR: unknown hostname {}\r\n'.format(ip))
            sys.exit(-1)

        self._snmp_engine = engine.SnmpEngine()

        config.addTargetParams(self._snmp_engine, 'pms', self.get_user, self.get_security,
                               self.get_snmp_version)

        if agent_udp_endpoint:
            if is_ipv6:
                config.addSocketTransport(
                    self._snmp_engine,
                    udp6.domainName,
                    udp6.Udp6SocketTransport().openClientMode()
                )
                config.addTargetAddr(
                    self._snmp_engine, 'tgt', udp6.domainName, agent_udp_endpoint, 'pms',
                    self.timeout, self.retry_count
                )
            else:
                config.addSocketTransport(
                    self._snmp_engine,
                    udp.domainName,
                    udp.UdpSocketTransport().openClientMode()
                )
                config.addTargetAddr(
                    self._snmp_engine, 'tgt', udp.domainName, agent_udp_endpoint, 'pms',
                    self.timeout, self.retry_count
                )
        else:
            sys.stderr.write('ERROR: Failed to communicate with provided IP Address {}\r\n'.format(ip))
            sys.exit(-1)
コード例 #9
0
# a target name. Since Notifications could be sent to multiple Managers
# at once, more than one target entry may be configured (and tagged).
#

# UDP/IPv4
config.addSocketTransport(snmpEngine, udp.domainName,
                          udp.UdpSocketTransport().openClientMode())
config.addTargetAddr(snmpEngine,
                     'my-nms-1',
                     udp.domainName, ('127.0.0.1', 162),
                     'my-creds-1',
                     tagList='all-my-managers')

## UDP/IPv6
config.addSocketTransport(snmpEngine, udp6.domainName,
                          udp6.Udp6SocketTransport().openClientMode())
config.addTargetAddr(snmpEngine,
                     'my-nms-2',
                     udp6.domainName, ('::1', 162),
                     'my-creds-3',
                     tagList='all-my-managers')

## Local domain socket
#config.addSocketTransport(
#    snmpEngine,
#    unix.domainName,
#    unix.UnixSocketTransport().openClientMode()
#)
#config.addTargetAddr(
#    snmpEngine, 'my-nms',
#    unix.domainName, '/tmp/snmp-manager',
コード例 #10
0
# Build message
trapMsg = pMod.Message()
pMod.apiMessage.setDefaults(trapMsg)
pMod.apiMessage.setCommunity(trapMsg, 'public')
pMod.apiMessage.setPDU(trapMsg, trapPDU)

transportDispatcher = AsynsockDispatcher()

# UDP/IPv4
transportDispatcher.registerTransport(
    udp.domainName, udp.UdpSocketTransport().openClientMode()
    )
transportDispatcher.sendMessage(
    encoder.encode(trapMsg), udp.domainName, ('localhost', 5003)
    )

# UDP/IPv6
transportDispatcher.registerTransport(
    udp6.domainName, udp6.Udp6SocketTransport().openClientMode()
)
transportDispatcher.sendMessage(
    encoder.encode(trapMsg), udp6.domainName, ('::1', 5003))

# Dispatcher will finish as all scheduled messages are sent
transportDispatcher.runDispatcher()

transportDispatcher.closeDispatcher()



コード例 #11
0
ファイル: SNMP_check.py プロジェクト: rpuligandla/csr
            for oid, val in varBinds:
                print('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))
    return wholeMsg


transportDispatcher = AsynsockDispatcher()

transportDispatcher.registerRecvCbFun(cbFun)

# UDP/IPv4
transportDispatcher.registerTransport(
    udp.domainName,
    udp.UdpSocketTransport().openServerMode(('192.168.77.22', 162)))

# UDP/IPv6
transportDispatcher.registerTransport(
    udp6.domainName,
    udp6.Udp6SocketTransport().openServerMode(('::1', 162)))

transportDispatcher.jobStarted(1)

try:
    # Dispatcher will never finish as job#1 never reaches zero
    transportDispatcher.runDispatcher()
except:
    transportDispatcher.closeDispatcher()
    raise

if __name__ == '__main__':
    #   SNMP_Get()
    cbFun()
コード例 #12
0
ファイル: sdktrapreceiver.py プロジェクト: qwertzlbert/omsdk
            else:
                varBinds = pMod.apiPDU.getVarBindList(reqPDU)
            logger.debug('Var-binds:')
            for oid, val in varBinds:
                logger.debug('%s = %s' % (oid.prettyPrint(), val.prettyPrint()))
    return wholeMsg


transportDispatcher = AsynsockDispatcher()

transportDispatcher.registerRecvCbFun(cbFun)

# UDP/IPv4
transportDispatcher.registerTransport(
    udp.domainName, udp.UdpSocketTransport().openServerMode(('localhost', 162))
)

# UDP/IPv6
transportDispatcher.registerTransport(
    udp6.domainName, udp6.Udp6SocketTransport().openServerMode(('::1', 162))
)

transportDispatcher.jobStarted(1)

try:
    # Dispatcher will never finish as job#1 never reaches zero
    transportDispatcher.runDispatcher()
except:
    transportDispatcher.closeDispatcher()
    raise
コード例 #13
0
 def openClientMode(self):
     self.transport = udp6.Udp6SocketTransport().openClientMode()
     return self.transport
コード例 #14
0
ファイル: snmp.py プロジェクト: SrijaGupta/file
    def start_trap(self, pattern_end_trap, time_end_trap,
                   timeout, port, queue):
        """
            :param pattern_end_trap
               **OPTION** the pattern you are looking for in the trap to
               stop trap. If not defined, trap will be stopped after
               timeout value
            :param time_end_trap
               **OPTION** the time for running trap. Default: 30
            :param timeout
               **OPTION** the timeout for snmp trap. Default: 300.
            :param port
               **OPTION** the port of snmp trap.
            :return:
        """
        t.log("DEBUG", "Entering 'start_trap'\n"+__file__)
        import warnings
        warnings.simplefilter("ignore", ResourceWarning)
        startedat = time.time()
        #global results
        global RESPONSE

        RESPONSE = ''

        def cbfun(transportdispatcher, transportdomain, transportaddress,
                  wholemsg):
            t.log("DEBUG", "Entering 'cbfun'\n"+__file__)
            #global results
            global RESPONSE
            while wholemsg:
                msgver = int(api.decodeMessageVersion(wholemsg))
                if msgver in api.protoModules:
                    pmod = api.protoModules[msgver]
                else:
                    RESPONSE += 'Unsupported SNMP version %s' % msgver
                    return
                reqmsg, wholemsg = decoder.decode(
                    wholemsg, asn1Spec=pmod.Message(),
                    )
                RESPONSE += 'Notification message from %s:%s: \n' % (
                    transportdomain, transportaddress
                    )
                reqpdu = pmod.apiMessage.getPDU(reqmsg)
                if msgver == api.protoVersion1:
                    varbinds = pmod.apiTrapPDU.getVarBindList(reqpdu)
                    RESPONSE += 'Var-binds: \n'
                    for oid, val in varbinds:
                        RESPONSE += '%s = %s \n' % (oid.prettyPrint(),
                                                    val.prettyPrint())
                        if pattern_end_trap and re.search(pattern_end_trap,
                                                          RESPONSE, re.I):
                            transportdispatcher.jobFinished(1)
                            RESPONSE += "Stopped trap \n"

                    RESPONSE += 'Enterprise: %s \n' % (
                        pmod.apiTrapPDU.getEnterprise(reqpdu).prettyPrint()
                        )

                    RESPONSE += 'Agent Address: %s \n' % (
                        pmod.apiTrapPDU.getAgentAddr(reqpdu).prettyPrint()
                        )
                    RESPONSE += 'Generic Trap: %s \n' % (
                        pmod.apiTrapPDU.getGenericTrap(
                            reqpdu).prettyPrint())

                    RESPONSE += 'Specific Trap: %s \n' % (
                        pmod.apiTrapPDU.getSpecificTrap(
                            reqpdu).prettyPrint()
                        )

                    RESPONSE += 'Uptime: %s \n' % (
                        pmod.apiTrapPDU.getTimeStamp(
                            reqpdu).prettyPrint()
                        )
                else:
                    varbinds = pmod.apiPDU.getVarBindList(reqpdu)

        def cbtimerfun(timenow):
            t.log("DEBUG", "Entering 'cbtimerfun'\n"+__file__)
            #global results
            global RESPONSE
            if time_end_trap is not None:
                if timenow - startedat >= time_end_trap:
                    transportdispatcher.jobFinished(1)
                    RESPONSE += "Stopped trap \n"

            if timenow - startedat >= timeout:
                t.log(level="DEBUG", message="Request timed out \n")
                raise Exception("Request timed out \n")

        transportdispatcher = AsynsockDispatcher()
        transportdispatcher.registerRecvCbFun(cbfun)
        transportdispatcher.registerTimerCbFun(cbtimerfun)
        # UDP/IPv4
        transportdispatcher.registerTransport(
            udp.domainName, udp.UdpSocketTransport().openServerMode(
                (self.trap_server_v4, port))
        )

        # UDP/IPv6
        transportdispatcher.registerTransport(
            udp6.domainName, udp6.Udp6SocketTransport().openServerMode(
                (self.trap_server_v6, port))
        )

        transportdispatcher.jobStarted(1)

        try:
            # Dispatcher will never finish as job#1 never reaches zero
            transportdispatcher.runDispatcher()
        except:
            transportdispatcher.closeDispatcher()

        queue.put(RESPONSE)
        t.log(level="DEBUG", message="Exiting 'start_trap' with return value/code :\n")
        return
コード例 #15
0
def main():

    parser = argparse.ArgumentParser(description="HEALTH CHECKER.")
    parser.add_argument("-c",
                        "--config",
                        default="/etc/healthchecker.yaml",
                        help="Path to config file.")
    parser.add_argument("-v",
                        "--verbose",
                        action="count",
                        default=0,
                        help="Increase logging verbosity.")
    parser.add_argument("-q",
                        "--quiet",
                        action="count",
                        default=0,
                        help="Decrease logging verbosity.")
    parser.add_argument("-V",
                        "--version",
                        action="version",
                        version="%%(prog)s %s" % __version__,
                        help="Display version information.")

    args = parser.parse_args()

    oid_translate.load_mibs()

    config = Config.from_file(args.config)

    db_host, db_port, db_name, db_user, db_passwd = config.get_database_config(
    )
    db_engine = PooledMySQLDatabase(
        db_name, **{
            'host': db_host,
            'port': db_port,
            'password': db_passwd,
            'user': db_user
        })
    models = [Target, FPingMessage, Device, EventMessage, Port]
    db_engine.bind(models)

    community = config["community"]
    if not community:
        community = None
    ipv6_server = config["ipv6"]
    if not ipv6_server:
        ipv6_server = None

    trap_cb = TrapperCallback(db_engine, config, community)

    logging.basicConfig(
        filename=LOGFILE,
        level=10,  #get_loglevel(args),
        format=LOGFORMAT)

    transport_dispatcher = AsynsockDispatcher()
    transport_dispatcher.registerRecvCbFun(trap_cb)
    if ipv6_server:
        transport_dispatcher.registerTransport(
            udp6.domainName,
            udp6.Udp6SocketTransport().openServerMode(
                ("::1", int(config["trap_port"]))))
    transport_dispatcher.registerTransport(
        udp.domainName,
        udp.UdpSocketTransport().openServerMode(
            ("0.0.0.0", int(config["trap_port"]))))
    transport_dispatcher.jobStarted(1)

    process_count = config['process_count']
    if not process_count:
        process_count = (
            multiprocessing.cpu_count() * 2 +
            1) if (multiprocessing.cpu_count() * 2 + 1) < 11 else 10
    logging.info("multiprocess count is : %s" % process_count)

    fping_count = int(config['fping_count'])
    if not fping_count:
        fping_count = 5
    logging.info("fping count is : %d" % fping_count)

    interval_time = int(config['interval_time'])
    if not interval_time:
        interval_time = 1

    fping_cb = FPingCallback(db_engine)
    scheduler = BackgroundScheduler()
    trigger = IntervalTrigger(minutes=interval_time)  # FIX PYINSTALL BUG
    scheduler.add_job(fping_cb,
                      trigger,
                      args=(process_count, fping_count),
                      max_instances=10)
    #scheduler.add_job(fping_cb, trigger='interval', args=(process_count, fping_count),
    #                  max_instances=10, minutes=interval_time)

    ## syslog service
    host = '127.0.0.1'
    port = 8889
    syslog_service = SyslogService(db_engine, host, port)

    TRAP = False
    try:
        scheduler.start()
        if TRAP:  #TODO new thread
            transport_dispatcher.runDispatcher()
        else:
            #redo_start_time = datetime.datetime.now() + datetime.timedelta(seconds=-20)
            redo_start_time = config.get("redo_start_time")
            if redo_start_time is None:
                redo_start_time = False
            syslog_service.start(redo_start_time)
    except KeyboardInterrupt:
        pass
    finally:
        logging.info("Shutdown Scheduler...")
        scheduler.shutdown()

        if TRAP:
            logging.info("Stopping Transport Dispatcher...")
            transport_dispatcher.closeDispatcher()
        else:
            syslog_service.stop()
        logging.info("Bye")