def setUp(self): # clean up before we start... conpot_core.get_sessionManager().purge_sessions() # get the conpot directory self.dir_name = os.path.dirname(conpot.__file__) self.kamstrup_management_server = KamstrupServer( self.dir_name + "/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml", None, None, ) self.server_greenlet = gevent.spawn( self.kamstrup_management_server.start, "127.0.0.1", 0 ) # initialize the databus self.databus = conpot_core.get_databus() self.databus.initialize(self.dir_name + "/templates/kamstrup_382/template.xml") gevent.sleep(1) self.request_parser = request_parser.KamstrupRequestParser() self.command_responder = CommandResponder( self.dir_name + "/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml" )
def __init__(self, template, template_directory, args, timeout=0): self.timeout = timeout self.command_responder = CommandResponder(template) self.server_active = True self.server = None conpot_core.get_databus().observe_value("reboot_signal", self.reboot) logger.info("Kamstrup protocol server initialized.")
def setUp(self): # clean up before we start... conpot_core.get_sessionManager().purge_sessions() self.databus = conpot_core.get_databus() self.databus.initialize('conpot/templates/kamstrup_382.xml') self.request_parser = request_parser.KamstrupRequestParser() self.command_responder = CommandResponder('conpot/templates/kamstrup_382.xml')
def setUp(self): # get the conpot directory self.dir_name = os.path.dirname(conpot.__file__) self.request_parser = request_parser.KamstrupRequestParser() self.command_responder = CommandResponder( self.dir_name + "/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml") self.kamstrup_management_server, self.server_greenlet = spawn_test_server( KamstrupServer, "kamstrup_382", "kamstrup_meter")
class TestKamstrup(unittest.TestCase): def setUp(self): # clean up before we start... conpot_core.get_sessionManager().purge_sessions() self.databus = conpot_core.get_databus() self.databus.initialize('conpot/templates/kamstrup_382/template.xml') self.request_parser = request_parser.KamstrupRequestParser() self.command_responder = CommandResponder( 'conpot/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml') def test_request_get_register(self): # requesting register 1033 request_bytes = (0x80, 0x3f, 0x10, 0x01, 0x04, 0x09, 0x18, 0x6d, 0x0d) for i in range(0, len(request_bytes)): self.request_parser.add_byte(chr(request_bytes[i])) if i < len(request_bytes) - 1: # parser returns None until it can put together an entire message self.assertEqual(self.request_parser.get_request(), None) parsed_request = self.request_parser.get_request() response = self.command_responder.respond(parsed_request) self.assertEqual(len(response.registers), 1) self.assertEqual(response.registers[0].name, 1033) # we should have no left overs self.assertEqual(len(self.request_parser.bytes), 0)
def __init__(self, template, template_directory, args, timeout=0): self.timeout = timeout self.command_responder = CommandResponder(template) self.server_active = True self.server = None conpot_core.get_databus().observe_value('reboot_signal', self.reboot) logger.info('Kamstrup protocol server initialized.')
class TestKamstrup(unittest.TestCase): def setUp(self): # clean up before we start... conpot_core.get_sessionManager().purge_sessions() self.databus = conpot_core.get_databus() self.databus.initialize('conpot/templates/kamstrup_382/template.xml') self.request_parser = request_parser.KamstrupRequestParser() self.command_responder = CommandResponder('conpot/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml') def tearDown(self): self.databus.reset() def test_request_get_register(self): # requesting register 1033 request_bytes = (0x80, 0x3f, 0x10, 0x01, 0x04, 0x09, 0x18, 0x6d, 0x0d) for i in range(0, len(request_bytes)): self.request_parser.add_byte(chr(request_bytes[i])) if i < len(request_bytes) - 1: # parser returns None until it can put together an entire message self.assertEqual(self.request_parser.get_request(), None) parsed_request = self.request_parser.get_request() response = self.command_responder.respond(parsed_request) self.assertEqual(len(response.registers), 1) self.assertEqual(response.registers[0].name, 1033) # we should have no left overs self.assertEqual(len(self.request_parser.bytes), 0)
class TestKamstrup(unittest.TestCase): def setUp(self): # clean up before we start... conpot_core.get_sessionManager().purge_sessions() # get the conpot directory self.dir_name = os.path.dirname(conpot.__file__) self.kamstrup_management_server = KamstrupServer( self.dir_name + '/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml', None, None) self.server_greenlet = gevent.spawn( self.kamstrup_management_server.start, '127.0.0.1', 0) # initialize the databus self.databus = conpot_core.get_databus() self.databus.initialize(self.dir_name + '/templates/kamstrup_382/template.xml') gevent.sleep(1) self.request_parser = request_parser.KamstrupRequestParser() self.command_responder = CommandResponder( self.dir_name + '/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml') def tearDown(self): self.databus.reset() def test_request_get_register(self): # requesting register 1033 request_bytes = (0x80, 0x3f, 0x10, 0x01, 0x04, 0x09, 0x18, 0x6d, 0x0d) for i in range(0, len(request_bytes)): self.request_parser.add_byte(chr(request_bytes[i])) if i < len(request_bytes) - 1: # parser returns None until it can put together an entire message self.assertEqual(self.request_parser.get_request(), None) parsed_request = self.request_parser.get_request() response = self.command_responder.respond(parsed_request) self.assertEqual(len(response.registers), 1) self.assertEqual(response.registers[0].name, 1033) # we should have no left overs self.assertEqual(len(self.request_parser.bytes), 0) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect( ('127.0.0.1', self.kamstrup_management_server.server.server_port)) s.sendall( chr_py3(0x80) + chr_py3(0x3f) + chr_py3(0x10) + chr_py3(0x01) + chr_py3(0x04) + chr_py3(0x09) + chr_py3(0x18) + chr_py3(0x6d) + chr_py3(0x0d)) data = s.recv(1024) s.close() # FIXME: verify bytes received from server - ask jkv? pkt = [hex(data[i]) for i in range(len(data))] self.assertTrue(('0x40' in pkt) and ('0x3f' in pkt) and ('0xd' in pkt))
def setUp(self): # clean up before we start... conpot_core.get_sessionManager().purge_sessions() self.databus = conpot_core.get_databus() self.databus.initialize('conpot/templates/kamstrup_382/template.xml') self.request_parser = request_parser.KamstrupRequestParser() self.command_responder = CommandResponder('conpot/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml')
class TestKamstrup(unittest.TestCase): def setUp(self): # get the conpot directory self.dir_name = os.path.dirname(conpot.__file__) self.request_parser = request_parser.KamstrupRequestParser() self.command_responder = CommandResponder( self.dir_name + "/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml" ) self.kamstrup_management_server, self.server_greenlet = spawn_test_server( KamstrupServer, "kamstrup_382", "kamstrup_meter" ) def tearDown(self): teardown_test_server(self.kamstrup_management_server, self.server_greenlet) def test_request_get_register(self): # requesting register 1033 request_bytes = (0x80, 0x3F, 0x10, 0x01, 0x04, 0x09, 0x18, 0x6D, 0x0D) for i in range(0, len(request_bytes)): self.request_parser.add_byte(chr(request_bytes[i])) if i < len(request_bytes) - 1: # parser returns None until it can put together an entire message self.assertEqual(self.request_parser.get_request(), None) parsed_request = self.request_parser.get_request() response = self.command_responder.respond(parsed_request) self.assertEqual(len(response.registers), 1) self.assertEqual(response.registers[0].name, 1033) # we should have no left overs self.assertEqual(len(self.request_parser.bytes), 0) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("127.0.0.1", self.kamstrup_management_server.server.server_port)) s.sendall( chr_py3(0x80) + chr_py3(0x3F) + chr_py3(0x10) + chr_py3(0x01) + chr_py3(0x04) + chr_py3(0x09) + chr_py3(0x18) + chr_py3(0x6D) + chr_py3(0x0D) ) data = s.recv(1024) s.close() # FIXME: verify bytes received from server - ask jkv? pkt = [hex(data[i]) for i in range(len(data))] self.assertTrue(("0x40" in pkt) and ("0x3f" in pkt) and ("0xd" in pkt))
class TestKamstrup(unittest.TestCase): def setUp(self): # clean up before we start... conpot_core.get_sessionManager().purge_sessions() # get the conpot directory self.dir_name = os.path.dirname(conpot.__file__) self.kamstrup_management_server = KamstrupServer( self.dir_name + '/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml', None, None ) self.server_greenlet = gevent.spawn(self.kamstrup_management_server.start, '127.0.0.1', 0) # initialize the databus self.databus = conpot_core.get_databus() self.databus.initialize(self.dir_name + '/templates/kamstrup_382/template.xml') gevent.sleep(1) self.request_parser = request_parser.KamstrupRequestParser() self.command_responder = CommandResponder(self.dir_name + '/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml') def tearDown(self): self.databus.reset() def test_request_get_register(self): # requesting register 1033 request_bytes = (0x80, 0x3f, 0x10, 0x01, 0x04, 0x09, 0x18, 0x6d, 0x0d) for i in range(0, len(request_bytes)): self.request_parser.add_byte(chr(request_bytes[i])) if i < len(request_bytes) - 1: # parser returns None until it can put together an entire message self.assertEqual(self.request_parser.get_request(), None) parsed_request = self.request_parser.get_request() response = self.command_responder.respond(parsed_request) self.assertEqual(len(response.registers), 1) self.assertEqual(response.registers[0].name, 1033) # we should have no left overs self.assertEqual(len(self.request_parser.bytes), 0) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', self.kamstrup_management_server.server.server_port)) s.sendall(chr_py3(0x80) + chr_py3(0x3f) + chr_py3(0x10) + chr_py3(0x01) + chr_py3(0x04) + chr_py3(0x09) + chr_py3(0x18) + chr_py3(0x6d) + chr_py3(0x0d)) data = s.recv(1024) s.close() # FIXME: verify bytes received from server - ask jkv? pkt = [hex(data[i]) for i in range(len(data))] self.assertTrue(('0x40' in pkt) and ('0x3f' in pkt) and ('0xd' in pkt))
def setUp(self): # clean up before we start... conpot_core.get_sessionManager().purge_sessions() # get the conpot directory self.dir_name = os.path.dirname(conpot.__file__) self.kamstrup_management_server = KamstrupServer( self.dir_name + '/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml', None, None ) self.server_greenlet = gevent.spawn(self.kamstrup_management_server.start, '127.0.0.1', 0) # initialize the databus self.databus = conpot_core.get_databus() self.databus.initialize(self.dir_name + '/templates/kamstrup_382/template.xml') gevent.sleep(1) self.request_parser = request_parser.KamstrupRequestParser() self.command_responder = CommandResponder(self.dir_name + '/templates/kamstrup_382/kamstrup_meter/kamstrup_meter.xml')
class KamstrupServer(object): def __init__(self, template, template_directory, args, timeout=0): self.timeout = timeout self.command_responder = CommandResponder(template) self.server_active = True self.server = None conpot_core.get_databus().observe_value("reboot_signal", self.reboot) logger.info("Kamstrup protocol server initialized.") # pretending reboot... really just closing connecting while "rebooting" def reboot(self, key): assert key == "reboot_signal" self.server_active = False logger.info("Pretending server reboot") gevent.spawn_later(2, self.set_reboot_done) def set_reboot_done(self): logger.info("Stopped pretending reboot") self.server_active = True def handle(self, sock, address): session = conpot_core.get_session( "kamstrup_protocol", address[0], address[1], sock.getsockname()[0], sock.getsockname()[1], ) logger.info( "New Kamstrup connection from %s:%s. (%s)", address[0], address[1], session.id, ) session.add_event({"type": "NEW_CONNECTION"}) self.server_active = True parser = request_parser.KamstrupRequestParser() try: while self.server_active: raw_request = sock.recv(1024) if not raw_request: logger.info("Kamstrup client disconnected. (%s)", session.id) session.add_event({"type": "CONNECTION_LOST"}) break for x in raw_request: parser.add_byte(chr_py3(x)) while True: request = parser.get_request() if not request: session.add_event({"type": "CONNECTION_LOST"}) break else: logdata = { "request": binascii.hexlify(bytearray(request.message_bytes)) } response = self.command_responder.respond(request) # real Kamstrup meters has delay in this interval gevent.sleep(random.uniform(0.24, 0.34)) if response: serialized_response = response.serialize() logdata["response"] = binascii.hexlify( serialized_response) logger.info( "Kamstrup traffic from %s: %s (%s)", address[0], logdata, session.id, ) sock.send(serialized_response) session.add_event(logdata) else: session.add_event(logdata) break except socket.timeout: logger.debug("Socket timeout, remote: %s. (%s)", address[0], session.id) session.add_event({"type": "CONNECTION_LOST"}) sock.close() def start(self, host, port): self.host = host self.port = port connection = (host, port) self.server = StreamServer(connection, self.handle) logger.info("Kamstrup protocol server started on: %s", connection) self.server.serve_forever() def stop(self): self.server.stop()
class KamstrupServer(object): def __init__(self, template, template_directory, args, timeout=0): self.timeout = timeout self.command_responder = CommandResponder(template) self.server_active = True self.server = None conpot_core.get_databus().observe_value('reboot_signal', self.reboot) logger.info('Kamstrup protocol server initialized.') # pretending reboot... really just closing connecting while "rebooting" def reboot(self, key): assert (key == 'reboot_signal') self.server_active = False logger.info('Pretending server reboot') gevent.spawn_later(2, self.set_reboot_done) def set_reboot_done(self): logger.info('Stopped pretending reboot') self.server_active = True def handle(self, sock, address): session = conpot_core.get_session('kamstrup_protocol', address[0], address[1], sock.getsockname()[0], sock.getsockname()[1]) logger.info('New Kamstrup connection from %s:%s. (%s)', address[0], address[1], session.id) session.add_event({'type': 'NEW_CONNECTION'}) self.server_active = True parser = request_parser.KamstrupRequestParser() try: while self.server_active: raw_request = sock.recv(1024) if not raw_request: logger.info('Kamstrup client disconnected. (%s)', session.id) session.add_event({'type': 'CONNECTION_LOST'}) break for x in raw_request: parser.add_byte(chr_py3(x)) while True: request = parser.get_request() if not request: session.add_event({'type': 'CONNECTION_LOST'}) break else: logdata = {'request': binascii.hexlify(bytearray(request.message_bytes))} response = self.command_responder.respond(request) # real Kamstrup meters has delay in this interval gevent.sleep(random.uniform(0.24, 0.34)) if response: serialized_response = response.serialize() logdata['response'] = binascii.hexlify(serialized_response) logger.info('Kamstrup traffic from %s: %s (%s)', address[0], logdata, session.id) sock.send(serialized_response) session.add_event(logdata) else: session.add_event(logdata) break except socket.timeout: logger.debug('Socket timeout, remote: %s. (%s)', address[0], session.id) session.add_event({'type': 'CONNECTION_LOST'}) sock.close() def start(self, host, port): self.host = host self.port = port connection = (host, port) self.server = StreamServer(connection, self.handle) logger.info('Kamstrup protocol server started on: %s', connection) self.server.serve_forever() def stop(self): self.server.stop()