From 14dd8791ec6984a608e83877f227d93dcd6031c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoine=20GR=C3=89A?= Date: Fri, 11 Jan 2019 21:54:47 +0100 Subject: [PATCH] Adding IPv6 to fail2ban sensor (#19457) * Fixing fail2ban regex for ipv6 * Adding IPv6 tests for fail2ban * Formating code for hound * Formating again * Formating again 2 --- homeassistant/components/sensor/fail2ban.py | 2 +- tests/components/sensor/test_fail2ban.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/fail2ban.py b/homeassistant/components/sensor/fail2ban.py index 6080ce9fd10..78b11b1942b 100644 --- a/homeassistant/components/sensor/fail2ban.py +++ b/homeassistant/components/sensor/fail2ban.py @@ -64,7 +64,7 @@ class BanSensor(Entity): self.last_ban = None self.log_parser = log_parser self.log_parser.ip_regex[self.jail] = re.compile( - r"\[{}\].(Ban|Unban) ([\w+\.]{{3,}})".format(re.escape(self.jail)) + r"\[{}\]\s*(Ban|Unban) (.*)".format(re.escape(self.jail)) ) _LOGGER.debug("Setting up jail %s", self.jail) diff --git a/tests/components/sensor/test_fail2ban.py b/tests/components/sensor/test_fail2ban.py index a48b7027725..e7874765950 100644 --- a/tests/components/sensor/test_fail2ban.py +++ b/tests/components/sensor/test_fail2ban.py @@ -19,6 +19,10 @@ def fake_log(log_key): '2017-01-01 12:23:35 fail2ban.actions [111]: ' 'NOTICE [jail_one] Ban 111.111.111.111' ), + 'ipv6_ban': ( + '2017-01-01 12:23:35 fail2ban.actions [111]: ' + 'NOTICE [jail_one] Ban 2607:f0d0:1002:51::4' + ), 'multi_ban': ( '2017-01-01 12:23:35 fail2ban.actions [111]: ' 'NOTICE [jail_one] Ban 111.111.111.111\n' @@ -112,6 +116,23 @@ class TestBanSensor(unittest.TestCase): assert \ sensor.state_attributes[STATE_ALL_BANS] == ['111.111.111.111'] + def test_ipv6_ban(self): + """Test that log is parsed correctly for IPV6 bans.""" + log_parser = BanLogParser(timedelta(seconds=-1), '/tmp') + sensor = BanSensor('fail2ban', 'jail_one', log_parser) + assert sensor.name == 'fail2ban jail_one' + mock_fh = MockOpen(read_data=fake_log('ipv6_ban')) + with patch('homeassistant.components.sensor.fail2ban.open', mock_fh, + create=True): + sensor.update() + + assert sensor.state == '2607:f0d0:1002:51::4' + assert \ + sensor.state_attributes[STATE_CURRENT_BANS] == \ + ['2607:f0d0:1002:51::4'] + assert \ + sensor.state_attributes[STATE_ALL_BANS] == ['2607:f0d0:1002:51::4'] + def test_multiple_ban(self): """Test that log is parsed correctly for multiple ban.""" log_parser = BanLogParser('/tmp')