Пример #1
0
    def test_time_rotation_index_decoding(self, socket_mock):
        handler = {'name':'name', 'log_dir':'/tmp', 'rotate_log':True}
        sl = bsc.SocketStreamCapturer(handler, ['', 9000], 'udp')

        # We expect an error when we input a bad time index value
        nose.tools.assert_raises(
            ValueError,
            sl._decode_time_rotation_index,
            'this is not a valid value'
        )

        assert 2 == sl._decode_time_rotation_index('tm_mday')
Пример #2
0
    def test_packet_log(self, socket_mock, pcap_open_mock, pcap_stream_mock):
        socket_mock.return_value = mock.MagicMock()
        pcap_open_mock.return_value = pcap.PCapStream()

        # Verify UDP packet log
        handler = {'name':'name', 'log_dir':'/tmp'}
        sl = bsc.SocketStreamCapturer([handler], ['', 9000], 'udp')
        logger = sl.capture_handlers[0]['logger']
        sl.socket.recv.return_value = 'udp_data'
        sl.capture_packet()

        sl.socket.recv.assert_called_with(sl._buffer_size)
        logger.write.assert_called_with('udp_data')

        # Verify Ethernet log
        sl = bsc.SocketStreamCapturer([handler], ['etho0', 0], 'ethernet')
        logger = sl.capture_handlers[0]['logger']
        logger.write.reset_mock()
        sl.socket.recv.return_value = 'eth_data'
        sl.capture_packet()
        logger.write.assert_called_with('eth_data')
Пример #3
0
    def test_packet_log(self, socket_mock, pcap_open_mock, pcap_stream_mock):
        socket_mock.return_value = mock.MagicMock()
        pcap_open_mock.return_value = pcap.PCapStream()

        # Verify UDP packet log
        handler = {"name": "name", "log_dir": "/tmp"}
        sl = bsc.SocketStreamCapturer([handler], ["", 9000], "udp")
        logger = sl.capture_handlers[0]["logger"]
        sl.socket.recv.return_value = "udp_data"
        sl.capture_packet()

        sl.socket.recv.assert_called_with(sl._buffer_size)
        logger.write.assert_called_with("udp_data")

        # Verify Ethernet log
        sl = bsc.SocketStreamCapturer([handler], ["etho0", 0], "ethernet")
        logger = sl.capture_handlers[0]["logger"]
        logger.write.reset_mock()
        sl.socket.recv.return_value = "eth_data"
        sl.capture_packet()
        logger.write.assert_called_with("eth_data")
Пример #4
0
    def test_get_log_file(self, socket_mock, pcap_open_mock):
        h = {
            'name':'name',
            'log_dir': '/tmp',
            'path':'foobarbaz/%j/',
            'file_name_pattern': 'extrafolder/%j/%Y-%m-%d-%H-%M-randomUDPtestData-{name}.pcap'
        }
        sl = bsc.SocketStreamCapturer(h, ['', 9000], 'udp')
        handler = sl.capture_handlers[0]

        # Check log path generation with user specified handler-specific path
        # and file_name_pattern. This includes strftime substitution and handler
        # metadata substitution.
        log_path = sl._get_log_file(handler)
        expected_path = os.path.join(h['log_dir'], h['path'], h['file_name_pattern'])
        expected_path = time.strftime(expected_path, time.gmtime())
        expected_path = expected_path.format(**handler)
        assert log_path == expected_path

        h = {'name':'name', 'log_dir': '/tmp'}
        sl = bsc.SocketStreamCapturer(h, ['', 9000], 'udp')
        handler = sl.capture_handlers[0]
Пример #5
0
    def test_packet_log_mutliple_handlers(self, socket_mock, pcap_open_mock, pcap_stream_mock):
        h1 = {'name':'h1', 'log_dir':'/tmp'}
        h2 = {'name':'h2', 'log_dir':'/tmp'}
        sl = bsc.SocketStreamCapturer([h1, h2], ['', 9000], 'udp')

        sl.capture_handlers[0]['logger'] = mock.MagicMock()
        sl.capture_handlers[1]['logger'] = mock.MagicMock()
        logger1 = sl.capture_handlers[0]['logger']
        logger2 = sl.capture_handlers[1]['logger']
        sl.socket.recv.return_value = 'udp_data'
        sl.capture_packet()

        assert logger1.write.call_count == 1
        assert logger2.write.call_count == 1
Пример #6
0
    def test_capture_with_data_manip(self, socket_mock, pcap_open_mock, pcap_stream_mock):
        transform_mock = mock.Mock(side_effect=['transformed data'])
        handler = {
            'name': 'name',
            'log_dir': '/tmp',
            'pre_write_transforms': [transform_mock]
        }
        sl = bsc.SocketStreamCapturer([handler], ['', 9000], 'udp')
        logger = sl.capture_handlers[0]['logger']
        sl.socket.recv.return_value = 'udp_data'
        sl.capture_packet()

        assert transform_mock.called
        logger.write.assert_called_with('transformed data')
Пример #7
0
    def test_packet_log_mutliple_handlers(self, socket_mock, pcap_open_mock,
                                          pcap_stream_mock):
        h1 = {"name": "h1", "log_dir": "/tmp"}
        h2 = {"name": "h2", "log_dir": "/tmp"}
        sl = bsc.SocketStreamCapturer([h1, h2], ["", 9000], "udp")

        sl.capture_handlers[0]["logger"] = mock.MagicMock()
        sl.capture_handlers[1]["logger"] = mock.MagicMock()
        logger1 = sl.capture_handlers[0]["logger"]
        logger2 = sl.capture_handlers[1]["logger"]
        sl.socket.recv.return_value = "udp_data"
        sl.capture_packet()

        assert logger1.write.call_count == 1
        assert logger2.write.call_count == 1
Пример #8
0
    def test_capture_with_data_manip(self, socket_mock, pcap_open_mock,
                                     pcap_stream_mock):
        transform_mock = mock.Mock(side_effect=["transformed data"])
        handler = {
            "name": "name",
            "log_dir": "/tmp",
            "pre_write_transforms": [transform_mock],
        }
        sl = bsc.SocketStreamCapturer([handler], ["", 9000], "udp")
        logger = sl.capture_handlers[0]["logger"]
        sl.socket.recv.return_value = "udp_data"
        sl.capture_packet()

        assert transform_mock.called
        logger.write.assert_called_with("transformed data")
Пример #9
0
    def test_logger_conf_dump(self, socket_mock):
        handler = {'name': 'name', 'log_dir': '/tmp', 'rotate_log': True}
        addr = ['', 9000]
        conn_type = 'udp'

        sl = bsc.SocketStreamCapturer(handler, addr, conn_type)
        conf_dump = sl.dump_handler_config_data()

        handler = sl.capture_handlers[0]
        expected_log_file_path = sl._get_log_file(handler)

        assert len(conf_dump) == 1
        assert conf_dump[0]['handler']['name'] == 'name'
        assert conf_dump[0]['handler']['log_dir'] == '/tmp'
        assert conf_dump[0]['handler']['rotate_log'] == True
        assert conf_dump[0]['log_file_path'] == expected_log_file_path
        assert conf_dump[0]['conn_type'] == conn_type
        assert conf_dump[0]['address'] == addr
Пример #10
0
    def test_logger_conf_dump(self, socket_mock):
        handler = {"name": "name", "log_dir": "/tmp", "rotate_log": True}
        addr = ["", 9000]
        conn_type = "udp"

        sl = bsc.SocketStreamCapturer(handler, addr, conn_type)
        conf_dump = sl.dump_handler_config_data()

        handler = sl.capture_handlers[0]
        expected_log_file_path = sl._get_log_file(handler)

        assert len(conf_dump) == 1
        assert conf_dump[0]["handler"]["name"] == "name"
        assert conf_dump[0]["handler"]["log_dir"] == "/tmp"
        assert conf_dump[0]["handler"]["rotate_log"] == True
        assert conf_dump[0]["log_file_path"] == expected_log_file_path
        assert conf_dump[0]["conn_type"] == conn_type
        assert conf_dump[0]["address"] == addr
Пример #11
0
 def test_mocked_eth_socket(self, socket_mock):
     socket_family = getattr(gevent.socket, 'AF_PACKET',
                             gevent.socket.AF_INET)
     proto = bsc.ETH_PROTOCOL
     handler = {'name': 'name', 'log_dir': '/tmp'}
     bsc.RAW_SOCKET_FD = 'foobar'
     sl = bsc.SocketStreamCapturer([handler], ['eho0', 0], 'ethernet')
     # We need to test a different load if the rawsocket package is used
     if not bsc.RAW_SOCKET_FD:
         socket_mock.socket.assert_called_with(socket_family,
                                               gevent.socket.SOCK_RAW,
                                               socket.htons(proto))
     else:
         socket_mock.fromfd.assert_called_with(bsc.RAW_SOCKET_FD,
                                               socket_family,
                                               gevent.socket.SOCK_RAW,
                                               socket.htons(proto))
     assert sl.conn_type == 'ethernet'
     bsc.RAW_SOCKET_FD = None
Пример #12
0
    def test_log_rotation(self, socket_mock, pcap_open_mock, pcap_stream_mock):
        pcap_open_mock.return_value = pcap.PCapStream()

        handler = {'name':'name', 'log_dir':'/tmp', 'rotate_log':True}
        sl = bsc.SocketStreamCapturer(handler, ['', 9000], 'udp')
        handler = sl.capture_handlers[0]

        log_path = sl._get_log_file(handler)
        pcap_open_mock.assert_called_with(
            log_path,
            mode='a'
        )

        # New name so our open call changes from above. This means we can
        # ensure that the log rotation opens a new logger as expected.
        sl_new_name = 'newname'
        handler['name'] = sl_new_name
        # We expect the rotation to set the last log rotation time. To test
        # we'll set it to None and expect it to be set after
        handler['log_rot_time'] = None

        sl._rotate_log(handler)

        # We expect the log rotation to close the existing logger
        assert pcap_stream_mock.return_value.close.call_count == 1

        # Since we change the name and rotated the log we expect this
        # updated value to be present in the new file name and the call
        # to open the new stream.
        log_path = sl._get_log_file(handler)
        assert sl_new_name in log_path
        pcap_open_mock.assert_called_with(
            log_path,
            mode='a'
        )

        assert pcap_open_mock.call_count == 2

        # We expect the rotation to fix our None assignment on the log_rot_time
        # and we expect it to be replaced by a time struct object.
        assert handler['log_rot_time'] != None
        assert type(handler['log_rot_time']) == type(time.gmtime())
Пример #13
0
    def test_mocked_eth_socket_with_rawsocket(self, socket_mock):
        socket_family = getattr(gevent.socket, 'AF_PACKET',
                                gevent.socket.AF_INET)

        rawsocket_is_installed = True if bsc.RAW_SOCKET_FD else False
        if not rawsocket_is_installed:
            rawsocket_fd = 'fake_rawsocket_fd'
            bsc.RAW_SOCKET_FD = rawsocket_fd
        else:
            rawsocket_fd = bsc.RAW_SOCKET_FD

        handler = {'name': 'name', 'log_dir': '/tmp'}
        sl = bsc.SocketStreamCapturer([handler], ['eho0', 0], 'ethernet')
        # We need to test a different load if the rawsocket package is used
        socket_mock.fromfd.assert_called_with(rawsocket_fd, socket_family,
                                              gevent.socket.SOCK_RAW,
                                              socket.htons(bsc.ETH_PROTOCOL))
        assert sl.conn_type == 'ethernet'

        if not rawsocket_is_installed:
            bsc.RAW_SOCKET_FD = None
Пример #14
0
 def test_mocked_eth_socket(self, socket_mock):
     socket_family = getattr(gevent.socket, "AF_PACKET",
                             gevent.socket.AF_INET)
     proto = bsc.ETH_PROTOCOL
     handler = {"name": "name", "log_dir": "/tmp"}
     bsc.RAW_SOCKET_FD = "foobar"
     sl = bsc.SocketStreamCapturer([handler], ["eho0", 0], "ethernet")
     # We need to test a different load if the rawsocket package is used
     if not bsc.RAW_SOCKET_FD:
         socket_mock.socket.assert_called_with(socket_family,
                                               gevent.socket.SOCK_RAW,
                                               socket.htons(proto))
     else:
         socket_mock.fromfd.assert_called_with(
             bsc.RAW_SOCKET_FD,
             socket_family,
             gevent.socket.SOCK_RAW,
             socket.htons(proto),
         )
     assert sl.conn_type == "ethernet"
     bsc.RAW_SOCKET_FD = None
Пример #15
0
    def test_custon_log_rotation(self, socket_mock):
        handler = {
            'name': 'name',
            'log_dir': '/tmp',
            'rotate_log': True,
            'rotate_log_index': 'months',
            'rotate_log_delta': 2
        }

        sl = bsc.SocketStreamCapturer(handler, ['', 9000], 'udp')
        h = sl.capture_handlers[0]

        assert sl._should_rotate_log(h) == False

        # Check the default 1 day log rotation case to make sure our config
        # is being used
        new_date = datetime.datetime.now() - datetime.timedelta(days=1)
        h['log_rot_time'] = new_date.timetuple()
        assert sl._should_rotate_log(h) == False

        # Check a working case for our "rotate every 2 months" use case.
        new_date = datetime.datetime.now() - datetime.timedelta(days=62)
        h['log_rot_time'] = new_date.timetuple()
        assert sl._should_rotate_log(h) == True
Пример #16
0
    def test_custon_log_rotation(self, socket_mock):
        handler = {
            "name": "name",
            "log_dir": "/tmp",
            "rotate_log": True,
            "rotate_log_index": "months",
            "rotate_log_delta": 2,
        }

        sl = bsc.SocketStreamCapturer(handler, ["", 9000], "udp")
        h = sl.capture_handlers[0]

        assert sl._should_rotate_log(h) == False

        # Check the default 1 day log rotation case to make sure our config
        # is being used
        new_date = datetime.datetime.now() - datetime.timedelta(days=1)
        h["log_rot_time"] = new_date.timetuple()
        assert sl._should_rotate_log(h) == False

        # Check a working case for our "rotate every 2 months" use case.
        new_date = datetime.datetime.now() - datetime.timedelta(days=62)
        h["log_rot_time"] = new_date.timetuple()
        assert sl._should_rotate_log(h) == True
Пример #17
0
    def test_mocked_eth_socket_with_rawsocket(self, socket_mock):
        socket_family = getattr(gevent.socket, "AF_PACKET",
                                gevent.socket.AF_INET)

        rawsocket_is_installed = True if bsc.RAW_SOCKET_FD else False
        if not rawsocket_is_installed:
            rawsocket_fd = "fake_rawsocket_fd"
            bsc.RAW_SOCKET_FD = rawsocket_fd
        else:
            rawsocket_fd = bsc.RAW_SOCKET_FD

        handler = {"name": "name", "log_dir": "/tmp"}
        sl = bsc.SocketStreamCapturer([handler], ["eho0", 0], "ethernet")
        # We need to test a different load if the rawsocket package is used
        socket_mock.fromfd.assert_called_with(
            rawsocket_fd,
            socket_family,
            gevent.socket.SOCK_RAW,
            socket.htons(bsc.ETH_PROTOCOL),
        )
        assert sl.conn_type == "ethernet"

        if not rawsocket_is_installed:
            bsc.RAW_SOCKET_FD = None
Пример #18
0
 def test_mocked_udp_socket(self, socket_mock):
     handler = {'name': 'name', 'log_dir': '/tmp'}
     sl = bsc.SocketStreamCapturer([handler], ['', 9000], 'udp')
     socket_mock.assert_called_with(gevent.socket.AF_INET,
                                    gevent.socket.SOCK_DGRAM)
     assert sl.conn_type == 'udp'
Пример #19
0
 def test_mocked_udp_socket(self, socket_mock):
     handler = {"name": "name", "log_dir": "/tmp"}
     sl = bsc.SocketStreamCapturer([handler], ["", 9000], "udp")
     socket_mock.assert_called_with(gevent.socket.AF_INET,
                                    gevent.socket.SOCK_DGRAM)
     assert sl.conn_type == "udp"