basebuilder_pel7ppc64bebuilder0
6 years ago
16 changed files with 3573 additions and 0 deletions
@ -0,0 +1,117 @@ |
|||||||
|
From 5f41f061390876f4c43c2306911d9b3482aed396 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Lubomir Rintel <lkundrak@v3.sk> |
||||||
|
Date: Mon, 16 Jul 2018 17:42:34 +0200 |
||||||
|
Subject: [PATCH 1/3] firewall.core.fw_nm: avoid iterating NM devices, |
||||||
|
connections |
||||||
|
|
||||||
|
NetworkManager has an API to do the lookups. |
||||||
|
|
||||||
|
(cherry picked from commit 65f92930a5d049404dac780c15eebe2d788e6285) |
||||||
|
--- |
||||||
|
src/firewall/core/fw_nm.py | 70 ++++++++++++++++++---------------------------- |
||||||
|
1 file changed, 27 insertions(+), 43 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/firewall/core/fw_nm.py b/src/firewall/core/fw_nm.py |
||||||
|
index f75733fe65f6..76901cee2adf 100644 |
||||||
|
--- a/src/firewall/core/fw_nm.py |
||||||
|
+++ b/src/firewall/core/fw_nm.py |
||||||
|
@@ -73,22 +73,18 @@ def nm_get_zone_of_connection(connection): |
||||||
|
""" |
||||||
|
check_nm_imported() |
||||||
|
|
||||||
|
- active_connections = nm_get_client().get_active_connections() |
||||||
|
+ con = nm_get_client().get_connection_by_id(connection) |
||||||
|
+ if con is None: |
||||||
|
+ return False |
||||||
|
|
||||||
|
- for active_con in active_connections: |
||||||
|
- if active_con.get_id() == connection: |
||||||
|
- con = active_con.get_connection() |
||||||
|
- if con is None: |
||||||
|
- continue |
||||||
|
- setting_con = con.get_setting_connection() |
||||||
|
- if setting_con is None: |
||||||
|
- continue |
||||||
|
- zone = setting_con.get_zone() |
||||||
|
- if zone is None: |
||||||
|
- zone = "" |
||||||
|
- return zone |
||||||
|
+ setting_con = con.get_setting_connection() |
||||||
|
+ if setting_con is None: |
||||||
|
+ return False |
||||||
|
|
||||||
|
- return None |
||||||
|
+ zone = setting_con.get_zone() |
||||||
|
+ if zone is None: |
||||||
|
+ zone = "" |
||||||
|
+ return zone |
||||||
|
|
||||||
|
def nm_set_zone_of_connection(zone, connection): |
||||||
|
"""Set the zone for a connection |
||||||
|
@@ -98,24 +94,18 @@ def nm_set_zone_of_connection(zone, connection): |
||||||
|
""" |
||||||
|
check_nm_imported() |
||||||
|
|
||||||
|
- active_connections = nm_get_client().get_active_connections() |
||||||
|
- |
||||||
|
- for active_con in active_connections: |
||||||
|
- con = active_con.get_connection() |
||||||
|
- if con is None: |
||||||
|
- continue |
||||||
|
+ con = nm_get_client().get_connection_by_id(connection) |
||||||
|
+ if con is None: |
||||||
|
+ return False |
||||||
|
|
||||||
|
- if active_con.get_id() == connection: |
||||||
|
- setting_con = con.get_setting_connection() |
||||||
|
- if setting_con is None: |
||||||
|
- continue |
||||||
|
- if zone == "": |
||||||
|
- zone = None |
||||||
|
- setting_con.set_property("zone", zone) |
||||||
|
- con.commit_changes(True, None) |
||||||
|
- return True |
||||||
|
+ setting_con = con.get_setting_connection() |
||||||
|
+ if setting_con is None: |
||||||
|
+ return False |
||||||
|
|
||||||
|
- return False |
||||||
|
+ if zone == "": |
||||||
|
+ zone = None |
||||||
|
+ setting_con.set_property("zone", zone) |
||||||
|
+ return con.commit_changes(True, None) |
||||||
|
|
||||||
|
def nm_get_connections(connections, connections_uuid): |
||||||
|
"""Get active connections from NM |
||||||
|
@@ -150,21 +140,15 @@ def nm_get_connection_of_interface(interface): |
||||||
|
""" |
||||||
|
check_nm_imported() |
||||||
|
|
||||||
|
- active_connections = nm_get_client().get_active_connections() |
||||||
|
- |
||||||
|
- for active_con in active_connections: |
||||||
|
- # ignore vpn devices for now |
||||||
|
- if active_con.get_vpn(): |
||||||
|
- continue |
||||||
|
- |
||||||
|
- devices = active_con.get_devices() |
||||||
|
- |
||||||
|
- for dev in devices: |
||||||
|
- if dev.get_iface() == interface: |
||||||
|
- return active_con.get_id() |
||||||
|
+ device = nm_get_client().get_device_by_iface(interface) |
||||||
|
+ if device is None: |
||||||
|
+ return None |
||||||
|
|
||||||
|
+ active_con = device.get_active_connection() |
||||||
|
+ if active_con is None: |
||||||
|
+ return None |
||||||
|
|
||||||
|
- return None |
||||||
|
+ return active_con.get_id() |
||||||
|
|
||||||
|
def nm_get_bus_name(): |
||||||
|
if not _nm_imported: |
||||||
|
-- |
||||||
|
2.16.3 |
||||||
|
|
@ -0,0 +1,190 @@ |
|||||||
|
From 17470fa9deac4aa15ecf75b9c811c093bc44c019 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Eric Garver <e@erig.me> |
||||||
|
Date: Fri, 17 Aug 2018 12:26:53 -0400 |
||||||
|
Subject: [PATCH 1/2] fw: if startup fails on reload, reapply non-perm config |
||||||
|
that survives reload |
||||||
|
|
||||||
|
Even if startup fails we should still re-assign the non-permanent |
||||||
|
interfaces to zones and non-permanent direct rules. |
||||||
|
|
||||||
|
Fixes: rhbz 1498923 |
||||||
|
(cherry picked from commit 2796edc1691f52c3655991c0be814a617cb26910) |
||||||
|
--- |
||||||
|
src/firewall/core/fw.py | 121 +++++++++++++++------------- |
||||||
|
src/tests/regression/rhbz1498923.at | 17 ++++ |
||||||
|
2 files changed, 80 insertions(+), 58 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/firewall/core/fw.py b/src/firewall/core/fw.py |
||||||
|
index 5b706d6d3e80..9079f1bbc6a4 100644 |
||||||
|
--- a/src/firewall/core/fw.py |
||||||
|
+++ b/src/firewall/core/fw.py |
||||||
|
@@ -910,70 +910,75 @@ class Firewall(object): |
||||||
|
def reload(self, stop=False): |
||||||
|
_panic = self._panic |
||||||
|
|
||||||
|
- try: |
||||||
|
- # save zone interfaces |
||||||
|
- _zone_interfaces = { } |
||||||
|
- for zone in self.zone.get_zones(): |
||||||
|
- _zone_interfaces[zone] = self.zone.get_settings(zone)["interfaces"] |
||||||
|
- # save direct config |
||||||
|
- _direct_config = self.direct.get_runtime_config() |
||||||
|
- _old_dz = self.get_default_zone() |
||||||
|
- |
||||||
|
- # stop |
||||||
|
- self.cleanup() |
||||||
|
+ # save zone interfaces |
||||||
|
+ _zone_interfaces = { } |
||||||
|
+ for zone in self.zone.get_zones(): |
||||||
|
+ _zone_interfaces[zone] = self.zone.get_settings(zone)["interfaces"] |
||||||
|
+ # save direct config |
||||||
|
+ _direct_config = self.direct.get_runtime_config() |
||||||
|
+ _old_dz = self.get_default_zone() |
||||||
|
+ |
||||||
|
+ # stop |
||||||
|
+ self.cleanup() |
||||||
|
|
||||||
|
- self.set_policy("DROP") |
||||||
|
+ self.set_policy("DROP") |
||||||
|
|
||||||
|
+ start_exception = None |
||||||
|
+ try: |
||||||
|
self._start(reload=True, complete_reload=stop) |
||||||
|
- |
||||||
|
- # handle interfaces in the default zone and move them to the new |
||||||
|
- # default zone if it changed |
||||||
|
- _new_dz = self.get_default_zone() |
||||||
|
- if _new_dz != _old_dz: |
||||||
|
- # if_new_dz has been introduced with the reload, we need to add it |
||||||
|
- # https://github.com/firewalld/firewalld/issues/53 |
||||||
|
- if _new_dz not in _zone_interfaces: |
||||||
|
- _zone_interfaces[_new_dz] = { } |
||||||
|
- # default zone changed. Move interfaces from old default zone to |
||||||
|
- # the new one. |
||||||
|
- for iface, settings in list(_zone_interfaces[_old_dz].items()): |
||||||
|
- if settings["__default__"]: |
||||||
|
- # move only those that were added to default zone |
||||||
|
- # (not those that were added to specific zone same as |
||||||
|
- # default) |
||||||
|
- _zone_interfaces[_new_dz][iface] = \ |
||||||
|
- _zone_interfaces[_old_dz][iface] |
||||||
|
- del _zone_interfaces[_old_dz][iface] |
||||||
|
- |
||||||
|
- # add interfaces to zones again |
||||||
|
- for zone in self.zone.get_zones(): |
||||||
|
- if zone in _zone_interfaces: |
||||||
|
- self.zone.set_settings(zone, { "interfaces": |
||||||
|
- _zone_interfaces[zone] }) |
||||||
|
- del _zone_interfaces[zone] |
||||||
|
- else: |
||||||
|
- log.info1("New zone '%s'.", zone) |
||||||
|
- if len(_zone_interfaces) > 0: |
||||||
|
- for zone in list(_zone_interfaces.keys()): |
||||||
|
- log.info1("Lost zone '%s', zone interfaces dropped.", zone) |
||||||
|
- del _zone_interfaces[zone] |
||||||
|
- del _zone_interfaces |
||||||
|
- |
||||||
|
- # restore direct config |
||||||
|
- self.direct.set_config(_direct_config) |
||||||
|
- |
||||||
|
- # enable panic mode again if it has been enabled before or set policy |
||||||
|
- # to ACCEPT |
||||||
|
- if _panic: |
||||||
|
- self.enable_panic_mode() |
||||||
|
+ except Exception as e: |
||||||
|
+ # save the exception for later, but continue restoring interfaces, |
||||||
|
+ # etc. We'll re-raise it at the end. |
||||||
|
+ start_exception = e |
||||||
|
+ |
||||||
|
+ # handle interfaces in the default zone and move them to the new |
||||||
|
+ # default zone if it changed |
||||||
|
+ _new_dz = self.get_default_zone() |
||||||
|
+ if _new_dz != _old_dz: |
||||||
|
+ # if_new_dz has been introduced with the reload, we need to add it |
||||||
|
+ # https://github.com/firewalld/firewalld/issues/53 |
||||||
|
+ if _new_dz not in _zone_interfaces: |
||||||
|
+ _zone_interfaces[_new_dz] = { } |
||||||
|
+ # default zone changed. Move interfaces from old default zone to |
||||||
|
+ # the new one. |
||||||
|
+ for iface, settings in list(_zone_interfaces[_old_dz].items()): |
||||||
|
+ if settings["__default__"]: |
||||||
|
+ # move only those that were added to default zone |
||||||
|
+ # (not those that were added to specific zone same as |
||||||
|
+ # default) |
||||||
|
+ _zone_interfaces[_new_dz][iface] = \ |
||||||
|
+ _zone_interfaces[_old_dz][iface] |
||||||
|
+ del _zone_interfaces[_old_dz][iface] |
||||||
|
+ |
||||||
|
+ # add interfaces to zones again |
||||||
|
+ for zone in self.zone.get_zones(): |
||||||
|
+ if zone in _zone_interfaces: |
||||||
|
+ self.zone.set_settings(zone, { "interfaces": |
||||||
|
+ _zone_interfaces[zone] }) |
||||||
|
+ del _zone_interfaces[zone] |
||||||
|
else: |
||||||
|
- self.set_policy("ACCEPT") |
||||||
|
+ log.info1("New zone '%s'.", zone) |
||||||
|
+ if len(_zone_interfaces) > 0: |
||||||
|
+ for zone in list(_zone_interfaces.keys()): |
||||||
|
+ log.info1("Lost zone '%s', zone interfaces dropped.", zone) |
||||||
|
+ del _zone_interfaces[zone] |
||||||
|
+ del _zone_interfaces |
||||||
|
+ |
||||||
|
+ # restore direct config |
||||||
|
+ self.direct.set_config(_direct_config) |
||||||
|
+ |
||||||
|
+ # enable panic mode again if it has been enabled before or set policy |
||||||
|
+ # to ACCEPT |
||||||
|
+ if _panic: |
||||||
|
+ self.enable_panic_mode() |
||||||
|
+ else: |
||||||
|
+ self.set_policy("ACCEPT") |
||||||
|
|
||||||
|
- self._state = "RUNNING" |
||||||
|
- except Exception: |
||||||
|
+ if start_exception: |
||||||
|
self._state = "FAILED" |
||||||
|
- self.set_policy("ACCEPT") |
||||||
|
- raise |
||||||
|
+ raise start_exception |
||||||
|
+ else: |
||||||
|
+ self._state = "RUNNING" |
||||||
|
|
||||||
|
# STATE |
||||||
|
|
||||||
|
diff --git a/src/tests/regression/rhbz1498923.at b/src/tests/regression/rhbz1498923.at |
||||||
|
index bb0d841db2a7..9b68678180ef 100644 |
||||||
|
--- a/src/tests/regression/rhbz1498923.at |
||||||
|
+++ b/src/tests/regression/rhbz1498923.at |
||||||
|
@@ -1,11 +1,28 @@ |
||||||
|
FWD_START_TEST([invalid direct rule causes reload error]) |
||||||
|
FWD_CHECK([-q --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT]) |
||||||
|
FWD_CHECK([-q --permanent --direct --add-rule ipv4 filter INPUT 1 --a-bogus-flag]) |
||||||
|
+ |
||||||
|
+dnl add some non-permanent things that should persist a reload |
||||||
|
+FWD_CHECK([-q --zone=public --add-interface=foobar0]) |
||||||
|
+FWD_CHECK([-q --direct --direct --add-rule ipv4 filter FORWARD 0 -p tcp -j ACCEPT]) |
||||||
|
+ |
||||||
|
FWD_RELOAD(13, [ignore], [ignore], 251) |
||||||
|
FWD_CHECK([--state], 251, [ignore], [failed |
||||||
|
]) |
||||||
|
|
||||||
|
+dnl verify the non-permanent stuff we set above remained |
||||||
|
+FWD_CHECK([--get-zone-of-interface=foobar0], 0, [dnl |
||||||
|
+public |
||||||
|
+]) |
||||||
|
+FWD_CHECK([-q --direct --direct --query-rule ipv4 filter FORWARD 0 -p tcp -j ACCEPT]) |
||||||
|
+ |
||||||
|
dnl now remove the bad rule and reload successfully |
||||||
|
FWD_CHECK([-q --permanent --direct --remove-rule ipv4 filter INPUT 1 --a-bogus-flag]) |
||||||
|
FWD_RELOAD |
||||||
|
+ |
||||||
|
+dnl verify the non-permanent stuff we set above remained |
||||||
|
+FWD_CHECK([--get-zone-of-interface=foobar0], 0, [dnl |
||||||
|
+public |
||||||
|
+]) |
||||||
|
+FWD_CHECK([-q --direct --direct --query-rule ipv4 filter FORWARD 0 -p tcp -j ACCEPT]) |
||||||
|
FWD_END_TEST([-e '/.*a-bogus-flag.*/d']) |
||||||
|
-- |
||||||
|
2.18.0 |
||||||
|
|
@ -0,0 +1,26 @@ |
|||||||
|
From 26e35f61bb856aa482f84f50521f924d4a6c12b1 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Eric Garver <e@erig.me> |
||||||
|
Date: Thu, 24 May 2018 16:30:13 -0400 |
||||||
|
Subject: [PATCH 1/5] ipset: check type when parsing ipset definition |
||||||
|
|
||||||
|
(cherry picked from commit ebe0cb93c3f38a5d9af267407769eb187940c62f) |
||||||
|
--- |
||||||
|
src/firewall/core/io/ipset.py | 2 ++ |
||||||
|
1 file changed, 2 insertions(+) |
||||||
|
|
||||||
|
diff --git a/src/firewall/core/io/ipset.py b/src/firewall/core/io/ipset.py |
||||||
|
index f291d15e0033..0670677b4206 100644 |
||||||
|
--- a/src/firewall/core/io/ipset.py |
||||||
|
+++ b/src/firewall/core/io/ipset.py |
||||||
|
@@ -320,6 +320,8 @@ class ipset_ContentHandler(IO_Object_ContentHandler): |
||||||
|
self.item.parser_check_element_attrs(name, attrs) |
||||||
|
if name == "ipset": |
||||||
|
if "type" in attrs: |
||||||
|
+ if attrs["type"] not in IPSET_TYPES: |
||||||
|
+ raise FirewallError(errors.INVALID_TYPE, "%s" % attrs["type"]) |
||||||
|
self.item.type = attrs["type"] |
||||||
|
if "version" in attrs: |
||||||
|
self.item.version = attrs["version"] |
||||||
|
-- |
||||||
|
2.16.3 |
||||||
|
|
@ -0,0 +1,28 @@ |
|||||||
|
From 83f7000d753f6e4c688ca91badc4d73bcf37929f Mon Sep 17 00:00:00 2001 |
||||||
|
From: Eric Garver <e@erig.me> |
||||||
|
Date: Mon, 13 Aug 2018 14:39:25 -0400 |
||||||
|
Subject: [PATCH 1/4] tests/functions: check state after a reload |
||||||
|
|
||||||
|
To make sure firewalld doesn't get stuck during a reload we should check |
||||||
|
the state as well. |
||||||
|
|
||||||
|
(cherry picked from commit 8b3591c3f238156911bb63dd5622168d21a9ae78) |
||||||
|
--- |
||||||
|
src/tests/functions.at | 1 + |
||||||
|
1 file changed, 1 insertion(+) |
||||||
|
|
||||||
|
diff --git a/src/tests/functions.at b/src/tests/functions.at |
||||||
|
index d9b1ce401bb0..02464f3c22df 100644 |
||||||
|
--- a/src/tests/functions.at |
||||||
|
+++ b/src/tests/functions.at |
||||||
|
@@ -55,6 +55,7 @@ m4_define([FWD_START_FIREWALLD], [ |
||||||
|
|
||||||
|
m4_define([FWD_RELOAD], [ |
||||||
|
FWD_CHECK([-q --reload], [$1], [$2], [$3]) |
||||||
|
+ FWD_CHECK([-q --state], [$4], [$5], [$6]) |
||||||
|
]) |
||||||
|
|
||||||
|
m4_define([FWD_RESTART], [ |
||||||
|
-- |
||||||
|
2.18.0 |
||||||
|
|
@ -0,0 +1,132 @@ |
|||||||
|
From 2342548148763cca0579da98ed0a682d22beb49d Mon Sep 17 00:00:00 2001 |
||||||
|
From: Eric Garver <e@erig.me> |
||||||
|
Date: Fri, 1 Jun 2018 09:37:34 -0400 |
||||||
|
Subject: [PATCH 2/5] firewall/core/io/functions: add check_config() |
||||||
|
|
||||||
|
This is a utility function to run checks on all the configuration files. |
||||||
|
|
||||||
|
(cherry picked from commit 4164148b88f1882eabde4eeb4cc9a45506aff0fa) |
||||||
|
--- |
||||||
|
po/POTFILES.in | 1 + |
||||||
|
src/Makefile.am | 1 + |
||||||
|
src/firewall/core/io/functions.py | 84 +++++++++++++++++++++++++++++++++++++++ |
||||||
|
3 files changed, 86 insertions(+) |
||||||
|
create mode 100644 src/firewall/core/io/functions.py |
||||||
|
|
||||||
|
diff --git a/po/POTFILES.in b/po/POTFILES.in |
||||||
|
index 12cdbf2c6929..2332f8acc4eb 100644 |
||||||
|
--- a/po/POTFILES.in |
||||||
|
+++ b/po/POTFILES.in |
||||||
|
@@ -70,6 +70,7 @@ src/firewall/core/prog.py |
||||||
|
src/firewall/core/watcher.py |
||||||
|
src/firewall/core/io/__init__.py |
||||||
|
src/firewall/core/io/firewalld_conf.py |
||||||
|
+src/firewall/core/io/functions.py |
||||||
|
src/firewall/core/io/icmptype.py |
||||||
|
src/firewall/core/io/io_object.py |
||||||
|
src/firewall/core/io/service.py |
||||||
|
diff --git a/src/Makefile.am b/src/Makefile.am |
||||||
|
index b249c2e5fd46..b44ae0c1eca4 100644 |
||||||
|
--- a/src/Makefile.am |
||||||
|
+++ b/src/Makefile.am |
||||||
|
@@ -34,6 +34,7 @@ nobase_dist_python_DATA = \ |
||||||
|
firewall/core/__init__.py \ |
||||||
|
firewall/core/io/direct.py \ |
||||||
|
firewall/core/io/firewalld_conf.py \ |
||||||
|
+ firewall/core/io/functions.py \ |
||||||
|
firewall/core/io/helper.py \ |
||||||
|
firewall/core/io/icmptype.py \ |
||||||
|
firewall/core/io/ifcfg.py \ |
||||||
|
diff --git a/src/firewall/core/io/functions.py b/src/firewall/core/io/functions.py |
||||||
|
new file mode 100644 |
||||||
|
index 000000000000..7509a5390e12 |
||||||
|
--- /dev/null |
||||||
|
+++ b/src/firewall/core/io/functions.py |
||||||
|
@@ -0,0 +1,84 @@ |
||||||
|
+# -*- coding: utf-8 -*- |
||||||
|
+# |
||||||
|
+# Copyright (C) 2018 Red Hat, Inc. |
||||||
|
+# |
||||||
|
+# Authors: |
||||||
|
+# Eric Garver <egarver@redhat.com> |
||||||
|
+# |
||||||
|
+# This program is free software; you can redistribute it and/or modify |
||||||
|
+# it under the terms of the GNU General Public License as published by |
||||||
|
+# the Free Software Foundation; either version 2 of the License, or |
||||||
|
+# (at your option) any later version. |
||||||
|
+# |
||||||
|
+# This program is distributed in the hope that it will be useful, |
||||||
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
+# GNU General Public License for more details. |
||||||
|
+# |
||||||
|
+# You should have received a copy of the GNU General Public License |
||||||
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
+# |
||||||
|
+ |
||||||
|
+import os |
||||||
|
+ |
||||||
|
+from firewall import config |
||||||
|
+from firewall.errors import FirewallError |
||||||
|
+ |
||||||
|
+from firewall.core.io.zone import zone_reader |
||||||
|
+from firewall.core.io.service import service_reader |
||||||
|
+from firewall.core.io.ipset import ipset_reader |
||||||
|
+from firewall.core.io.icmptype import icmptype_reader |
||||||
|
+from firewall.core.io.helper import helper_reader |
||||||
|
+from firewall.core.io.direct import Direct |
||||||
|
+from firewall.core.io.lockdown_whitelist import LockdownWhitelist |
||||||
|
+from firewall.core.io.firewalld_conf import firewalld_conf |
||||||
|
+ |
||||||
|
+def check_config(fw=None): |
||||||
|
+ readers = { |
||||||
|
+ "ipset" : (ipset_reader, [config.FIREWALLD_IPSETS, config.ETC_FIREWALLD_IPSETS]), |
||||||
|
+ "helper" : (helper_reader, [config.FIREWALLD_HELPERS, config.ETC_FIREWALLD_HELPERS]), |
||||||
|
+ "icmptype" : (icmptype_reader, [config.FIREWALLD_ICMPTYPES, config.ETC_FIREWALLD_ICMPTYPES]), |
||||||
|
+ "service" : (service_reader, [config.FIREWALLD_SERVICES, config.ETC_FIREWALLD_SERVICES]), |
||||||
|
+ "zone" : (zone_reader, [config.FIREWALLD_ZONES, config.ETC_FIREWALLD_ZONES]), |
||||||
|
+ } |
||||||
|
+ for reader in readers.keys(): |
||||||
|
+ for dir in readers[reader][1]: |
||||||
|
+ if not os.path.isdir(dir): |
||||||
|
+ continue |
||||||
|
+ for file in sorted(os.listdir(dir)): |
||||||
|
+ if file.endswith(".xml"): |
||||||
|
+ try: |
||||||
|
+ obj = readers[reader][0](file, dir) |
||||||
|
+ if fw and reader == "zone": |
||||||
|
+ obj.fw_config = fw.config |
||||||
|
+ obj.check_config(obj.export_config()) |
||||||
|
+ except FirewallError as error: |
||||||
|
+ raise FirewallError(error.code, "'%s': %s" % (file, error.msg)) |
||||||
|
+ except Exception as msg: |
||||||
|
+ raise Exception("'%s': %s" % (file, msg)) |
||||||
|
+ if os.path.isfile(config.FIREWALLD_DIRECT): |
||||||
|
+ try: |
||||||
|
+ obj = Direct(config.FIREWALLD_DIRECT) |
||||||
|
+ obj.read() |
||||||
|
+ obj.check_config(obj.export_config()) |
||||||
|
+ except FirewallError as error: |
||||||
|
+ raise FirewallError(error.code, "'%s': %s" % (config.FIREWALLD_DIRECT, error.msg)) |
||||||
|
+ except Exception as msg: |
||||||
|
+ raise Exception("'%s': %s" % (config.FIREWALLD_DIRECT, msg)) |
||||||
|
+ if os.path.isfile(config.LOCKDOWN_WHITELIST): |
||||||
|
+ try: |
||||||
|
+ obj = LockdownWhitelist(config.LOCKDOWN_WHITELIST) |
||||||
|
+ obj.read() |
||||||
|
+ obj.check_config(obj.export_config()) |
||||||
|
+ except FirewallError as error: |
||||||
|
+ raise FirewallError(error.code, "'%s': %s" % (config.LOCKDOWN_WHITELIST, error.msg)) |
||||||
|
+ except Exception as msg: |
||||||
|
+ raise Exception("'%s': %s" % (config.LOCKDOWN_WHITELIST, msg)) |
||||||
|
+ if os.path.isfile(config.FIREWALLD_CONF): |
||||||
|
+ try: |
||||||
|
+ obj = firewalld_conf(config.FIREWALLD_CONF) |
||||||
|
+ obj.read() |
||||||
|
+ except FirewallError as error: |
||||||
|
+ raise FirewallError(error.code, "'%s': %s" % (config.FIREWALLD_CONF, error.msg)) |
||||||
|
+ except Exception as msg: |
||||||
|
+ raise Exception("'%s': %s" % (config.FIREWALLD_CONF, msg)) |
||||||
|
-- |
||||||
|
2.16.3 |
||||||
|
|
@ -0,0 +1,352 @@ |
|||||||
|
From 0ce07e30014a8ee6b2a8a4909c313f207d9c9b31 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Lubomir Rintel <lkundrak@v3.sk> |
||||||
|
Date: Mon, 16 Jul 2018 17:43:04 +0200 |
||||||
|
Subject: [PATCH 2/3] firewall.core.fw_nm: identify the connections by uuid |
||||||
|
|
||||||
|
...as opposed by id. Uuid is guarranteed to be uniquie, while the id is |
||||||
|
provided merely for convenience without any guarrantees. |
||||||
|
|
||||||
|
(cherry picked from commit 624039964bd16e5e0e8ffb73e708d3d0c40e89d3) |
||||||
|
--- |
||||||
|
src/firewall-applet | 38 ++++++++++++++++++++------------------ |
||||||
|
src/firewall-config | 45 +++++++++++++++++++++++++-------------------- |
||||||
|
src/firewall/core/fw_nm.py | 16 ++++++++-------- |
||||||
|
3 files changed, 53 insertions(+), 46 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/firewall-applet b/src/firewall-applet |
||||||
|
index 3dc149c32755..86aaccab9f88 100755 |
||||||
|
--- a/src/firewall-applet |
||||||
|
+++ b/src/firewall-applet |
||||||
|
@@ -155,11 +155,12 @@ class ZoneInterfaceEditor(QtGui.QDialog): |
||||||
|
# ZoneConnectionEditor ######################################################## |
||||||
|
|
||||||
|
class ZoneConnectionEditor(ZoneInterfaceEditor): |
||||||
|
- def __init__(self, fw, connection, zone): |
||||||
|
+ def __init__(self, fw, connection, connection_name, zone): |
||||||
|
self.fw = fw |
||||||
|
self.connection = connection |
||||||
|
+ self.connection_name = connection_name |
||||||
|
self.zone = None |
||||||
|
- self.title = _("Select zone for connection '%s'") % self.connection |
||||||
|
+ self.title = _("Select zone for connection '%s'") % self.connection_name |
||||||
|
|
||||||
|
QtGui.QDialog.__init__(self) |
||||||
|
self.create_ui(zone) |
||||||
|
@@ -168,12 +169,12 @@ class ZoneConnectionEditor(ZoneInterfaceEditor): |
||||||
|
# apply changes |
||||||
|
try: |
||||||
|
nm_set_zone_of_connection(self.get_zone(), self.connection) |
||||||
|
- except Exception as msg: |
||||||
|
- text = _("Failed to set zone {zone} for connection {connection}") |
||||||
|
+ except Exception: |
||||||
|
+ text = _("Failed to set zone {zone} for connection {connection_name}") |
||||||
|
QtGui.QMessageBox.warning(None, fromUTF8(escape(self.title)), |
||||||
|
escape(text.format( |
||||||
|
zone=self.get_zone(), |
||||||
|
- connection=self.connection))) |
||||||
|
+ connection_name=self.connection_name))) |
||||||
|
self.hide() |
||||||
|
|
||||||
|
# ZoneSourceEditor ############################################################ |
||||||
|
@@ -428,7 +429,7 @@ class TrayApplet(QtGui.QSystemTrayIcon): |
||||||
|
|
||||||
|
self.active_zones = { } |
||||||
|
self.connections = { } |
||||||
|
- self.connections_uuid = { } |
||||||
|
+ self.connections_name = { } |
||||||
|
self.default_zone = None |
||||||
|
self.zone_connection_editors = { } |
||||||
|
self.zone_interface_editors = { } |
||||||
|
@@ -666,30 +667,31 @@ class TrayApplet(QtGui.QSystemTrayIcon): |
||||||
|
# NM controlled connections |
||||||
|
for interface in self.connections: |
||||||
|
connection = self.connections[interface] |
||||||
|
- if connection not in self.connections_uuid: |
||||||
|
- uuid = None |
||||||
|
+ if connection not in self.connections_name: |
||||||
|
+ connection_name = None |
||||||
|
else: |
||||||
|
- uuid = self.connections_uuid[connection] |
||||||
|
+ connection_name = self.connections_name[connection] |
||||||
|
zone = nm_get_zone_of_connection(connection) |
||||||
|
- connections[connection] = [ zone, uuid ] |
||||||
|
+ connections[connection] = [ zone, connection_name ] |
||||||
|
|
||||||
|
binding = _("{entry} (Zone: {zone})") |
||||||
|
|
||||||
|
# add NM controlled bindings |
||||||
|
for connection in sorted(connections): |
||||||
|
zone = connections[connection][0] |
||||||
|
+ connection_name = connections[connection][1] |
||||||
|
if zone == "": |
||||||
|
_binding = _("{entry} (Default Zone: {default_zone})") |
||||||
|
action = QtGui.QAction( |
||||||
|
fromUTF8(escape( |
||||||
|
_binding.format(default_zone=self.default_zone, |
||||||
|
- entry=connection))), self) |
||||||
|
+ entry=connection_name))), self) |
||||||
|
else: |
||||||
|
action = QtGui.QAction( |
||||||
|
fromUTF8(escape(binding.format(zone=zone, |
||||||
|
- entry=connection))), self) |
||||||
|
+ entry=connection_name))), self) |
||||||
|
action.triggered.connect(functools.partial( |
||||||
|
- self.zone_connection_editor, connection, zone)) |
||||||
|
+ self.zone_connection_editor, connection, connection_name, zone)) |
||||||
|
self.left_menu.addAction(action) |
||||||
|
|
||||||
|
# add interfaces entry |
||||||
|
@@ -729,13 +731,13 @@ class TrayApplet(QtGui.QSystemTrayIcon): |
||||||
|
editor.raise_() |
||||||
|
editor.show() |
||||||
|
|
||||||
|
- def zone_connection_editor(self, connection, zone): |
||||||
|
+ def zone_connection_editor(self, connection, connection_name, zone): |
||||||
|
if connection in self.zone_connection_editors: |
||||||
|
self.zone_connection_editors[connection].set_zone(zone) |
||||||
|
self.zone_connection_editors[connection].show() |
||||||
|
return self.zone_connection_editors[connection].raise_() |
||||||
|
|
||||||
|
- editor = ZoneConnectionEditor(self.fw, connection, zone) |
||||||
|
+ editor = ZoneConnectionEditor(self.fw, connection, connection_name, zone) |
||||||
|
self.zone_connection_editors[connection] = editor |
||||||
|
editor.show() |
||||||
|
editor.raise_() |
||||||
|
@@ -755,15 +757,15 @@ class TrayApplet(QtGui.QSystemTrayIcon): |
||||||
|
|
||||||
|
def nm_signal_receiver(self, *args, **kwargs): |
||||||
|
self.connections.clear() |
||||||
|
- self.connections_uuid.clear() |
||||||
|
+ self.connections_name.clear() |
||||||
|
|
||||||
|
# do not use NMClient could result in python core dump |
||||||
|
|
||||||
|
if nm_is_imported(): |
||||||
|
text = _("Failed to get connections from NetworkManager") |
||||||
|
try: |
||||||
|
- nm_get_connections(self.connections, self.connections_uuid) |
||||||
|
- except Exception as msg: |
||||||
|
+ nm_get_connections(self.connections, self.connections_name) |
||||||
|
+ except Exception: |
||||||
|
self.notify(escape(text), urgency=Notify.Urgency.CRITICAL) |
||||||
|
if text not in self.tooltip_messages: |
||||||
|
self.tooltip_messages.append(text) |
||||||
|
diff --git a/src/firewall-config b/src/firewall-config |
||||||
|
index 02bffabf457c..223c0ff6d27d 100755 |
||||||
|
--- a/src/firewall-config |
||||||
|
+++ b/src/firewall-config |
||||||
|
@@ -1368,7 +1368,7 @@ class FirewallConfig(object): |
||||||
|
# connect |
||||||
|
|
||||||
|
self.connections = { } |
||||||
|
- self.connections_uuid = { } |
||||||
|
+ self.connections_name = { } |
||||||
|
|
||||||
|
if nm_is_imported(): |
||||||
|
self.fw.bus.add_signal_receiver( |
||||||
|
@@ -1428,11 +1428,11 @@ class FirewallConfig(object): |
||||||
|
self.fw.changeZoneOfInterface(editor.get_zone(), interface) |
||||||
|
del self.zone_interface_editors[interface] |
||||||
|
|
||||||
|
- def change_zone_connection_editor(self, item, connection, zone): |
||||||
|
+ def change_zone_connection_editor(self, item, connection, connection_name, zone): |
||||||
|
if connection in self.zone_connection_editors: |
||||||
|
return self.zone_connection_editors[connection].present() |
||||||
|
|
||||||
|
- editor = ZoneConnectionEditor(self.fw, connection, zone) |
||||||
|
+ editor = ZoneConnectionEditor(self.fw, connection, connection_name, zone) |
||||||
|
editor.set_icon(self.icon) |
||||||
|
editor.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) |
||||||
|
editor.set_transient_for(self.mainWindow) |
||||||
|
@@ -1557,14 +1557,14 @@ class FirewallConfig(object): |
||||||
|
self.update_active_zones() |
||||||
|
|
||||||
|
self.connections.clear() |
||||||
|
- self.connections_uuid.clear() |
||||||
|
+ self.connections_name.clear() |
||||||
|
|
||||||
|
# do not use NMClient could result in python core dump |
||||||
|
|
||||||
|
if nm_is_imported(): |
||||||
|
try: |
||||||
|
- nm_get_connections(self.connections, self.connections_uuid) |
||||||
|
- except Exception as msg: |
||||||
|
+ nm_get_connections(self.connections, self.connections_name) |
||||||
|
+ except Exception: |
||||||
|
text = _("Failed to get connections from NetworkManager") |
||||||
|
self._warning(text) |
||||||
|
|
||||||
|
@@ -1572,12 +1572,14 @@ class FirewallConfig(object): |
||||||
|
while iter: |
||||||
|
interface = self.interfaceStore.get_value(iter, 0) |
||||||
|
if interface in self.connections: |
||||||
|
- zone = nm_get_zone_of_connection(self.connections[interface]) |
||||||
|
+ connection = self.connections[interface] |
||||||
|
+ connection_name = self.connections_name[connection] |
||||||
|
+ zone = nm_get_zone_of_connection(connection) |
||||||
|
if zone == "": |
||||||
|
comment = self.default_zone_used_by_label % \ |
||||||
|
- self.connections[interface] |
||||||
|
+ connection_name |
||||||
|
else: |
||||||
|
- comment = self.used_by_label % self.connections[interface] |
||||||
|
+ comment = self.used_by_label % connection_name |
||||||
|
self.interfaceStore.set_value(iter, 1, comment) |
||||||
|
iter = self.interfaceStore.iter_next(iter) |
||||||
|
self.change_interface_selection_cb(self.interfaceView.get_selection()) |
||||||
|
@@ -2427,37 +2429,38 @@ class FirewallConfig(object): |
||||||
|
# add NM controlled entries |
||||||
|
for connection in sorted(connections): |
||||||
|
[ zone, _interfaces ] = connections[connection] |
||||||
|
+ connection_name = self.connections_name[connection] |
||||||
|
|
||||||
|
item = Gtk.MenuItem.new() |
||||||
|
hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6) |
||||||
|
label = Gtk.Label() |
||||||
|
if zone == "": |
||||||
|
label.set_markup("%s (%s)\n<small>%s: %s</small>" % \ |
||||||
|
- (connection, ",".join(_interfaces), |
||||||
|
+ (connection_name, ",".join(_interfaces), |
||||||
|
escape(_("Default Zone")), self.default_zone)) |
||||||
|
else: |
||||||
|
label.set_markup("%s (%s)\n<small>%s: %s</small>" % \ |
||||||
|
- (connection, ",".join(_interfaces), |
||||||
|
+ (connection_name, ",".join(_interfaces), |
||||||
|
escape(_("Zone")), zone)) |
||||||
|
label.set_alignment(0, 0.5) |
||||||
|
label.set_padding(12, 0) |
||||||
|
hbox.pack_start(label, True, True, 0) |
||||||
|
item.add(hbox) |
||||||
|
- item.connect("activate", self.change_zone_connection_editor, connection, zone) |
||||||
|
+ item.connect("activate", self.change_zone_connection_editor, connection, connection_name, zone) |
||||||
|
self.left_menu.append(item) |
||||||
|
|
||||||
|
if zone == "": |
||||||
|
self.bindingsStore.append( |
||||||
|
self.connectionsIter, |
||||||
|
[ "%s (%s)\n<small>%s</small>" % ( |
||||||
|
- connection, ",".join(_interfaces), |
||||||
|
+ connection_name, ",".join(_interfaces), |
||||||
|
_("Default Zone: %s") % self.default_zone), |
||||||
|
connection, zone ]) |
||||||
|
else: |
||||||
|
self.bindingsStore.append( |
||||||
|
self.connectionsIter, |
||||||
|
[ "%s (%s)\n<small>%s</small>" % ( |
||||||
|
- connection, ",".join(_interfaces), |
||||||
|
+ connection_name, ",".join(_interfaces), |
||||||
|
_("Zone: %s") % zone), |
||||||
|
connection, zone ]) |
||||||
|
|
||||||
|
@@ -2683,7 +2686,7 @@ class FirewallConfig(object): |
||||||
|
zone = self.bindingsStore.get_value(iter, 2) |
||||||
|
|
||||||
|
if self.bindingsStore.get_value(parent_iter, 0) == _("Connections"): |
||||||
|
- self.change_zone_connection_editor(None, item, zone) |
||||||
|
+ self.change_zone_connection_editor(None, item, self.connections_name[item], zone) |
||||||
|
elif self.bindingsStore.get_value(parent_iter, 0) == _("Interfaces"): |
||||||
|
self.change_zone_interface_editor(None, item, zone) |
||||||
|
elif self.bindingsStore.get_value(parent_iter, 0) == _("Sources"): |
||||||
|
@@ -3894,9 +3897,10 @@ class FirewallConfig(object): |
||||||
|
interface = self.interfaceStore.get_value(iter, 0) |
||||||
|
if interface in self.connections: |
||||||
|
connection = self.connections[interface] |
||||||
|
+ connection_name = self.connections_name[connection] |
||||||
|
if selected_zone == self.default_zone: |
||||||
|
selected_zone = nm_get_zone_of_connection(connection) |
||||||
|
- editor = ZoneConnectionEditor(self.fw, connection, selected_zone) |
||||||
|
+ editor = ZoneConnectionEditor(self.fw, connection, connection_name, selected_zone) |
||||||
|
editor.set_icon(self.icon) |
||||||
|
editor.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) |
||||||
|
editor.set_transient_for(self.mainWindow) |
||||||
|
@@ -3905,9 +3909,9 @@ class FirewallConfig(object): |
||||||
|
result = editor.run() |
||||||
|
except Exception: |
||||||
|
text = _("Failed to set zone {zone} " |
||||||
|
- "for connection {connection}") |
||||||
|
+ "for connection {connection_name}") |
||||||
|
self._warning(text.format(zone=editor.get_zone(), |
||||||
|
- connection=editor.connection)) |
||||||
|
+ connection_name=editor.connection_name)) |
||||||
|
editor.hide() |
||||||
|
else: |
||||||
|
self.add_edit_interface(False) |
||||||
|
@@ -8115,11 +8119,12 @@ class ZoneInterfaceEditor(Gtk.Dialog): |
||||||
|
self.fw.changeZoneOfInterface(self.get_zone(), self.interface) |
||||||
|
|
||||||
|
class ZoneConnectionEditor(ZoneInterfaceEditor): |
||||||
|
- def __init__(self, fw, connection, zone): |
||||||
|
+ def __init__(self, fw, connection, connection_name, zone): |
||||||
|
self.fw = fw |
||||||
|
self.connection = connection |
||||||
|
+ self.connection_name = connection_name |
||||||
|
self.zone = None |
||||||
|
- self.title = _("Select zone for connection '%s'") % self.connection |
||||||
|
+ self.title = _("Select zone for connection '%s'") % self.connection_name |
||||||
|
|
||||||
|
Gtk.Dialog.__init__(self, self.title) |
||||||
|
self.create_ui(zone) |
||||||
|
diff --git a/src/firewall/core/fw_nm.py b/src/firewall/core/fw_nm.py |
||||||
|
index 76901cee2adf..d21cc25feb8b 100644 |
||||||
|
--- a/src/firewall/core/fw_nm.py |
||||||
|
+++ b/src/firewall/core/fw_nm.py |
||||||
|
@@ -73,7 +73,7 @@ def nm_get_zone_of_connection(connection): |
||||||
|
""" |
||||||
|
check_nm_imported() |
||||||
|
|
||||||
|
- con = nm_get_client().get_connection_by_id(connection) |
||||||
|
+ con = nm_get_client().get_connection_by_uuid(connection) |
||||||
|
if con is None: |
||||||
|
return False |
||||||
|
|
||||||
|
@@ -94,7 +94,7 @@ def nm_set_zone_of_connection(zone, connection): |
||||||
|
""" |
||||||
|
check_nm_imported() |
||||||
|
|
||||||
|
- con = nm_get_client().get_connection_by_id(connection) |
||||||
|
+ con = nm_get_client().get_connection_by_uuid(connection) |
||||||
|
if con is None: |
||||||
|
return False |
||||||
|
|
||||||
|
@@ -107,14 +107,14 @@ def nm_set_zone_of_connection(zone, connection): |
||||||
|
setting_con.set_property("zone", zone) |
||||||
|
return con.commit_changes(True, None) |
||||||
|
|
||||||
|
-def nm_get_connections(connections, connections_uuid): |
||||||
|
+def nm_get_connections(connections, connections_name): |
||||||
|
"""Get active connections from NM |
||||||
|
@param connections return dict |
||||||
|
- @param connections_uuid return dict |
||||||
|
+ @param connections_name return dict |
||||||
|
""" |
||||||
|
|
||||||
|
connections.clear() |
||||||
|
- connections_uuid.clear() |
||||||
|
+ connections_name.clear() |
||||||
|
|
||||||
|
check_nm_imported() |
||||||
|
|
||||||
|
@@ -129,9 +129,9 @@ def nm_get_connections(connections, connections_uuid): |
||||||
|
uuid = active_con.get_uuid() |
||||||
|
devices = active_con.get_devices() |
||||||
|
|
||||||
|
- connections_uuid[name] = uuid |
||||||
|
+ connections_name[uuid] = name |
||||||
|
for dev in devices: |
||||||
|
- connections[dev.get_iface()] = name |
||||||
|
+ connections[dev.get_iface()] = uuid |
||||||
|
|
||||||
|
def nm_get_connection_of_interface(interface): |
||||||
|
"""Get connection from NM that is using the interface |
||||||
|
@@ -148,7 +148,7 @@ def nm_get_connection_of_interface(interface): |
||||||
|
if active_con is None: |
||||||
|
return None |
||||||
|
|
||||||
|
- return active_con.get_id() |
||||||
|
+ return active_con.get_uuid() |
||||||
|
|
||||||
|
def nm_get_bus_name(): |
||||||
|
if not _nm_imported: |
||||||
|
-- |
||||||
|
2.16.3 |
||||||
|
|
@ -0,0 +1,40 @@ |
|||||||
|
From efdecad74ac18d93b62a6f9ba3792904bb976b3b Mon Sep 17 00:00:00 2001 |
||||||
|
From: Eric Garver <e@erig.me> |
||||||
|
Date: Fri, 17 Aug 2018 13:26:18 -0400 |
||||||
|
Subject: [PATCH 2/2] fw: If direct rules fail to apply add a "Direct" label to |
||||||
|
error msg |
||||||
|
|
||||||
|
Since they're free form it's easy to write a bad rule. This will at |
||||||
|
least let user know where to look. |
||||||
|
|
||||||
|
(cherry picked from commit db2d72e32579d14b5f03c6f06a9e6f38b00717cd) |
||||||
|
--- |
||||||
|
src/firewall/core/fw.py | 12 +++++++++--- |
||||||
|
1 file changed, 9 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/firewall/core/fw.py b/src/firewall/core/fw.py |
||||||
|
index 9079f1bbc6a4..21f5fc680c10 100644 |
||||||
|
--- a/src/firewall/core/fw.py |
||||||
|
+++ b/src/firewall/core/fw.py |
||||||
|
@@ -440,9 +440,15 @@ class Firewall(object): |
||||||
|
log.debug1("Applying direct chains rules and passthrough rules") |
||||||
|
self.direct.apply_direct(transaction) |
||||||
|
|
||||||
|
- # Execute transaction |
||||||
|
- transaction.execute(True) |
||||||
|
- transaction.clear() |
||||||
|
+ # since direct rules are easy to make syntax errors lets highlight |
||||||
|
+ # the cause if the transaction fails. |
||||||
|
+ try: |
||||||
|
+ transaction.execute(True) |
||||||
|
+ transaction.clear() |
||||||
|
+ except FirewallError as e: |
||||||
|
+ raise FirewallError(e.code, "Direct: %s" % (e.msg if e.msg else "")) |
||||||
|
+ except Exception: |
||||||
|
+ raise |
||||||
|
|
||||||
|
del transaction |
||||||
|
|
||||||
|
-- |
||||||
|
2.18.0 |
||||||
|
|
@ -0,0 +1,45 @@ |
|||||||
|
From aac434a339ec9d261bdba70eaf649bcd8820af51 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Eric Garver <e@erig.me> |
||||||
|
Date: Mon, 13 Aug 2018 16:02:11 -0400 |
||||||
|
Subject: [PATCH 2/4] fw: on restart set policy from same function |
||||||
|
|
||||||
|
Toggle the DROP/ACCEPT policy from the same function. Doing it in |
||||||
|
various areas is error prone. |
||||||
|
|
||||||
|
(cherry picked from commit d3acaac62106b10945c7ac400140b5d0f2c4264d) |
||||||
|
--- |
||||||
|
src/firewall/core/fw.py | 7 +++---- |
||||||
|
1 file changed, 3 insertions(+), 4 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/firewall/core/fw.py b/src/firewall/core/fw.py |
||||||
|
index e99201d0363d..1ff36f18cd99 100644 |
||||||
|
--- a/src/firewall/core/fw.py |
||||||
|
+++ b/src/firewall/core/fw.py |
||||||
|
@@ -391,14 +391,11 @@ class Firewall(object): |
||||||
|
# Start transaction |
||||||
|
transaction = FirewallTransaction(self) |
||||||
|
|
||||||
|
- if reload: |
||||||
|
- self.set_policy("DROP", use_transaction=transaction) |
||||||
|
- |
||||||
|
# flush rules |
||||||
|
self.flush(use_transaction=transaction) |
||||||
|
|
||||||
|
# If modules need to be unloaded in complete reload or if there are |
||||||
|
- # ipsets to get applied, limit the transaction to set_policy and flush. |
||||||
|
+ # ipsets to get applied, limit the transaction to flush. |
||||||
|
# |
||||||
|
# Future optimization for the ipset case in reload: The transaction |
||||||
|
# only needs to be split here if there are conflicting ipset types in |
||||||
|
@@ -919,6 +916,8 @@ class Firewall(object): |
||||||
|
# stop |
||||||
|
self.cleanup() |
||||||
|
|
||||||
|
+ self.set_policy("DROP") |
||||||
|
+ |
||||||
|
# start |
||||||
|
self._start(reload=True, complete_reload=stop) |
||||||
|
|
||||||
|
-- |
||||||
|
2.18.0 |
||||||
|
|
@ -0,0 +1,68 @@ |
|||||||
|
From 9b8de9ce33e671a89ea8fd0b6e9c391c0b779726 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Eric Garver <e@erig.me> |
||||||
|
Date: Wed, 23 May 2018 14:35:10 -0400 |
||||||
|
Subject: [PATCH 3/5] firewall-offline-cmd: add --check-config option |
||||||
|
|
||||||
|
(cherry picked from commit 749e64b74cff231585667417b37ff4f60af65dc0) |
||||||
|
--- |
||||||
|
src/firewall-offline-cmd | 16 +++++++++++++++- |
||||||
|
1 file changed, 15 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/src/firewall-offline-cmd b/src/firewall-offline-cmd |
||||||
|
index 7f7c10739f77..13ecfadf4080 100755 |
||||||
|
--- a/src/firewall-offline-cmd |
||||||
|
+++ b/src/firewall-offline-cmd |
||||||
|
@@ -35,6 +35,7 @@ from firewall.errors import FirewallError |
||||||
|
from firewall import config |
||||||
|
from firewall.core.fw_test import Firewall_test |
||||||
|
from firewall.functions import joinArgs, splitArgs |
||||||
|
+from firewall.core.io.functions import check_config |
||||||
|
from firewall.core.io.zone import zone_reader |
||||||
|
from firewall.core.io.service import service_reader |
||||||
|
from firewall.core.io.ipset import ipset_reader |
||||||
|
@@ -62,6 +63,7 @@ General Options |
||||||
|
-q, --quiet Do not print status messages |
||||||
|
--system-config Path to firewalld system configuration |
||||||
|
--default-config Path to firewalld default configuration |
||||||
|
+ --check-config Check system and default configuration |
||||||
|
|
||||||
|
Lokkit Compatibility Options |
||||||
|
--migrate-system-config-firewall=<file> |
||||||
|
@@ -532,6 +534,7 @@ parser_group_lokkit.add_argument("--block-icmp", metavar="<icmptype>", action='a |
||||||
|
|
||||||
|
parser.add_argument("--system-config", metavar="path") |
||||||
|
parser.add_argument("--default-config", metavar="path") |
||||||
|
+parser.add_argument("--check-config", action="store_true") |
||||||
|
|
||||||
|
parser_group_standalone = parser.add_mutually_exclusive_group() |
||||||
|
parser_group_standalone.add_argument("-h", "--help", |
||||||
|
@@ -970,7 +973,8 @@ cmd.set_verbose(a.verbose) |
||||||
|
if not (options_standalone or options_ipset or \ |
||||||
|
options_lokkit or \ |
||||||
|
options_icmptype or options_service or options_helper or \ |
||||||
|
- options_permanent or options_direct or options_desc_xml_file): |
||||||
|
+ options_permanent or options_direct or options_desc_xml_file or \ |
||||||
|
+ a.check_config): |
||||||
|
cmd.fail(parser.format_usage() + "No option specified.") |
||||||
|
|
||||||
|
if options_lokkit and (options_standalone or \ |
||||||
|
@@ -1035,6 +1039,16 @@ if a.system_config: |
||||||
|
config.set_system_config_paths(a.system_config) |
||||||
|
if a.default_config: |
||||||
|
config.set_default_config_paths(a.default_config) |
||||||
|
+if a.check_config: |
||||||
|
+ try: |
||||||
|
+ fw = Firewall_test() |
||||||
|
+ fw.start() |
||||||
|
+ check_config(fw) |
||||||
|
+ except FirewallError as error: |
||||||
|
+ cmd.print_and_exit("Configuration error: %s" % error, error.code) |
||||||
|
+ except Exception as msg: |
||||||
|
+ cmd.fail("Configuration error: %s" % msg) |
||||||
|
+ sys.exit(0) |
||||||
|
|
||||||
|
zone = a.zone |
||||||
|
fw = Firewall_test() |
||||||
|
-- |
||||||
|
2.16.3 |
||||||
|
|
@ -0,0 +1,37 @@ |
|||||||
|
From a3e6d2c48a1535b56bc5f28094818f10f93bf352 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Lubomir Rintel <lkundrak@v3.sk> |
||||||
|
Date: Mon, 16 Jul 2018 17:43:25 +0200 |
||||||
|
Subject: [PATCH 3/3] firewall.core.fw_nm: ignore generated connections |
||||||
|
|
||||||
|
If a connection is generated by NetworkManager, changing it persists it and |
||||||
|
makes the device managed by NetworkManager. |
||||||
|
|
||||||
|
(cherry picked from commit a102dde5d9430d503767cbface3e3b610134bdb6) |
||||||
|
--- |
||||||
|
src/firewall/core/fw_nm.py | 10 ++++++++++ |
||||||
|
1 file changed, 10 insertions(+) |
||||||
|
|
||||||
|
diff --git a/src/firewall/core/fw_nm.py b/src/firewall/core/fw_nm.py |
||||||
|
index d21cc25feb8b..0ed19248a79f 100644 |
||||||
|
--- a/src/firewall/core/fw_nm.py |
||||||
|
+++ b/src/firewall/core/fw_nm.py |
||||||
|
@@ -148,6 +148,16 @@ def nm_get_connection_of_interface(interface): |
||||||
|
if active_con is None: |
||||||
|
return None |
||||||
|
|
||||||
|
+ try: |
||||||
|
+ con = active_con.get_connection() |
||||||
|
+ if con.get_flags() & NM.SettingsConnectionFlags.NM_GENERATED: |
||||||
|
+ return None |
||||||
|
+ except AttributeError: |
||||||
|
+ # Prior to NetworkManager 1.12, we can only guess |
||||||
|
+ # that a connection was generated. |
||||||
|
+ if con.get_unsaved(): |
||||||
|
+ return None |
||||||
|
+ |
||||||
|
return active_con.get_uuid() |
||||||
|
|
||||||
|
def nm_get_bus_name(): |
||||||
|
-- |
||||||
|
2.16.3 |
||||||
|
|
@ -0,0 +1,244 @@ |
|||||||
|
From 9e4bf24e1e0a5d54398d2220f0a5217eff0704a7 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Eric Garver <e@erig.me> |
||||||
|
Date: Mon, 13 Aug 2018 16:53:46 -0400 |
||||||
|
Subject: [PATCH 3/4] fw: if failure occurs during startup set state to FAILED |
||||||
|
|
||||||
|
Previously if a failure occurred at startup firewalld would get stuck in |
||||||
|
INIT state and the policy would remain as "DROP". This commit changes |
||||||
|
that behavior and introduces a new state "FAILED", which means a failure |
||||||
|
occurred and we're running in a failed state. Policy is set to "ACCEPT" |
||||||
|
so as to hopefully prevent locking out an admin. |
||||||
|
|
||||||
|
(cherry picked from commit f475bd2293b7ba01ad4b56b68bef1b61d01526f0) |
||||||
|
--- |
||||||
|
doc/xml/firewall-cmd.xml.in | 2 +- |
||||||
|
doc/xml/firewalld.dbus.xml | 2 +- |
||||||
|
src/firewall-cmd | 2 + |
||||||
|
src/firewall/core/fw.py | 131 +++++++++++++++------------- |
||||||
|
src/firewall/errors.py | 1 + |
||||||
|
src/tests/regression/rhbz1498923.at | 8 +- |
||||||
|
6 files changed, 83 insertions(+), 63 deletions(-) |
||||||
|
|
||||||
|
diff --git a/doc/xml/firewall-cmd.xml.in b/doc/xml/firewall-cmd.xml.in |
||||||
|
index 32c89591db86..c2606553e549 100644 |
||||||
|
--- a/doc/xml/firewall-cmd.xml.in |
||||||
|
+++ b/doc/xml/firewall-cmd.xml.in |
||||||
|
@@ -118,7 +118,7 @@ |
||||||
|
<term><option>--state</option></term> |
||||||
|
<listitem> |
||||||
|
<para> |
||||||
|
- Check whether the firewalld daemon is active (i.e. running). Returns an exit code 0 if it is active, <replaceable>NOT_RUNNING</replaceable> otherwise (see <xref linkend="exit_codes"/>). This will also print the state to <replaceable>STDOUT</replaceable>. |
||||||
|
+ Check whether the firewalld daemon is active (i.e. running). Returns an exit code 0 if it is active, <replaceable>RUNNING_BUT_FAILED</replaceable> if failure occurred on startup, <replaceable>NOT_RUNNING</replaceable> otherwise. See <xref linkend="exit_codes"/>. This will also print the state to <replaceable>STDOUT</replaceable>. |
||||||
|
</para> |
||||||
|
</listitem> |
||||||
|
</varlistentry> |
||||||
|
diff --git a/doc/xml/firewalld.dbus.xml b/doc/xml/firewalld.dbus.xml |
||||||
|
index acdbb5fd6e00..ec82d4cad077 100644 |
||||||
|
--- a/doc/xml/firewalld.dbus.xml |
||||||
|
+++ b/doc/xml/firewalld.dbus.xml |
||||||
|
@@ -488,7 +488,7 @@ |
||||||
|
</varlistentry> |
||||||
|
<varlistentry id="FirewallD1.Properties.state"> |
||||||
|
<term><parameter>state</parameter> - s - (ro)</term> |
||||||
|
- <listitem><para>firewalld state. This can be either <literal>INIT</literal> or <literal>RUNNING</literal>. In <literal>INIT</literal> state, firewalld is starting up and initializing.</para></listitem> |
||||||
|
+ <listitem><para>firewalld state. This can be either <literal>INIT</literal>, <literal>FAILED</literal>, or <literal>RUNNING</literal>. In <literal>INIT</literal> state, firewalld is starting up and initializing. In <literal>FAILED</literal> state, firewalld completely started but experienced a failure.</para></listitem> |
||||||
|
</varlistentry> |
||||||
|
<varlistentry id="FirewallD1.Properties.version"> |
||||||
|
<term><parameter>version</parameter> - s - (ro)</term> |
||||||
|
diff --git a/src/firewall-cmd b/src/firewall-cmd |
||||||
|
index b80115564e1b..12e18bb88a54 100755 |
||||||
|
--- a/src/firewall-cmd |
||||||
|
+++ b/src/firewall-cmd |
||||||
|
@@ -2022,6 +2022,8 @@ elif a.state: |
||||||
|
state = fw.get_property("state") |
||||||
|
if state == "RUNNING": |
||||||
|
cmd.print_and_exit ("running") |
||||||
|
+ elif state == "FAILED": |
||||||
|
+ cmd.print_and_exit("failed", errors.RUNNING_BUT_FAILED) |
||||||
|
else: |
||||||
|
cmd.print_and_exit ("not running", errors.NOT_RUNNING) |
||||||
|
elif a.get_log_denied: |
||||||
|
diff --git a/src/firewall/core/fw.py b/src/firewall/core/fw.py |
||||||
|
index 1ff36f18cd99..5b706d6d3e80 100644 |
||||||
|
--- a/src/firewall/core/fw.py |
||||||
|
+++ b/src/firewall/core/fw.py |
||||||
|
@@ -451,11 +451,16 @@ class Firewall(object): |
||||||
|
tm2 = time.time() |
||||||
|
log.debug2("Flushing and applying took %f seconds" % (tm2 - tm1)) |
||||||
|
|
||||||
|
- self._state = "RUNNING" |
||||||
|
- |
||||||
|
def start(self): |
||||||
|
- self._start() |
||||||
|
- self.set_policy("ACCEPT") |
||||||
|
+ try: |
||||||
|
+ self._start() |
||||||
|
+ except Exception: |
||||||
|
+ self._state = "FAILED" |
||||||
|
+ self.set_policy("ACCEPT") |
||||||
|
+ raise |
||||||
|
+ else: |
||||||
|
+ self._state = "RUNNING" |
||||||
|
+ self.set_policy("ACCEPT") |
||||||
|
|
||||||
|
def _loader(self, path, reader_type, combine=False): |
||||||
|
# combine: several zone files are getting combined into one obj |
||||||
|
@@ -905,64 +910,70 @@ class Firewall(object): |
||||||
|
def reload(self, stop=False): |
||||||
|
_panic = self._panic |
||||||
|
|
||||||
|
- # save zone interfaces |
||||||
|
- _zone_interfaces = { } |
||||||
|
- for zone in self.zone.get_zones(): |
||||||
|
- _zone_interfaces[zone] = self.zone.get_settings(zone)["interfaces"] |
||||||
|
- # save direct config |
||||||
|
- _direct_config = self.direct.get_runtime_config() |
||||||
|
- _old_dz = self.get_default_zone() |
||||||
|
- |
||||||
|
- # stop |
||||||
|
- self.cleanup() |
||||||
|
- |
||||||
|
- self.set_policy("DROP") |
||||||
|
- |
||||||
|
- # start |
||||||
|
- self._start(reload=True, complete_reload=stop) |
||||||
|
- |
||||||
|
- # handle interfaces in the default zone and move them to the new |
||||||
|
- # default zone if it changed |
||||||
|
- _new_dz = self.get_default_zone() |
||||||
|
- if _new_dz != _old_dz: |
||||||
|
- # if_new_dz has been introduced with the reload, we need to add it |
||||||
|
- # https://github.com/firewalld/firewalld/issues/53 |
||||||
|
- if _new_dz not in _zone_interfaces: |
||||||
|
- _zone_interfaces[_new_dz] = { } |
||||||
|
- # default zone changed. Move interfaces from old default zone to |
||||||
|
- # the new one. |
||||||
|
- for iface, settings in list(_zone_interfaces[_old_dz].items()): |
||||||
|
- if settings["__default__"]: |
||||||
|
- # move only those that were added to default zone |
||||||
|
- # (not those that were added to specific zone same as |
||||||
|
- # default) |
||||||
|
- _zone_interfaces[_new_dz][iface] = \ |
||||||
|
- _zone_interfaces[_old_dz][iface] |
||||||
|
- del _zone_interfaces[_old_dz][iface] |
||||||
|
- |
||||||
|
- # add interfaces to zones again |
||||||
|
- for zone in self.zone.get_zones(): |
||||||
|
- if zone in _zone_interfaces: |
||||||
|
- self.zone.set_settings(zone, { "interfaces": |
||||||
|
- _zone_interfaces[zone] }) |
||||||
|
- del _zone_interfaces[zone] |
||||||
|
+ try: |
||||||
|
+ # save zone interfaces |
||||||
|
+ _zone_interfaces = { } |
||||||
|
+ for zone in self.zone.get_zones(): |
||||||
|
+ _zone_interfaces[zone] = self.zone.get_settings(zone)["interfaces"] |
||||||
|
+ # save direct config |
||||||
|
+ _direct_config = self.direct.get_runtime_config() |
||||||
|
+ _old_dz = self.get_default_zone() |
||||||
|
+ |
||||||
|
+ # stop |
||||||
|
+ self.cleanup() |
||||||
|
+ |
||||||
|
+ self.set_policy("DROP") |
||||||
|
+ |
||||||
|
+ self._start(reload=True, complete_reload=stop) |
||||||
|
+ |
||||||
|
+ # handle interfaces in the default zone and move them to the new |
||||||
|
+ # default zone if it changed |
||||||
|
+ _new_dz = self.get_default_zone() |
||||||
|
+ if _new_dz != _old_dz: |
||||||
|
+ # if_new_dz has been introduced with the reload, we need to add it |
||||||
|
+ # https://github.com/firewalld/firewalld/issues/53 |
||||||
|
+ if _new_dz not in _zone_interfaces: |
||||||
|
+ _zone_interfaces[_new_dz] = { } |
||||||
|
+ # default zone changed. Move interfaces from old default zone to |
||||||
|
+ # the new one. |
||||||
|
+ for iface, settings in list(_zone_interfaces[_old_dz].items()): |
||||||
|
+ if settings["__default__"]: |
||||||
|
+ # move only those that were added to default zone |
||||||
|
+ # (not those that were added to specific zone same as |
||||||
|
+ # default) |
||||||
|
+ _zone_interfaces[_new_dz][iface] = \ |
||||||
|
+ _zone_interfaces[_old_dz][iface] |
||||||
|
+ del _zone_interfaces[_old_dz][iface] |
||||||
|
+ |
||||||
|
+ # add interfaces to zones again |
||||||
|
+ for zone in self.zone.get_zones(): |
||||||
|
+ if zone in _zone_interfaces: |
||||||
|
+ self.zone.set_settings(zone, { "interfaces": |
||||||
|
+ _zone_interfaces[zone] }) |
||||||
|
+ del _zone_interfaces[zone] |
||||||
|
+ else: |
||||||
|
+ log.info1("New zone '%s'.", zone) |
||||||
|
+ if len(_zone_interfaces) > 0: |
||||||
|
+ for zone in list(_zone_interfaces.keys()): |
||||||
|
+ log.info1("Lost zone '%s', zone interfaces dropped.", zone) |
||||||
|
+ del _zone_interfaces[zone] |
||||||
|
+ del _zone_interfaces |
||||||
|
+ |
||||||
|
+ # restore direct config |
||||||
|
+ self.direct.set_config(_direct_config) |
||||||
|
+ |
||||||
|
+ # enable panic mode again if it has been enabled before or set policy |
||||||
|
+ # to ACCEPT |
||||||
|
+ if _panic: |
||||||
|
+ self.enable_panic_mode() |
||||||
|
else: |
||||||
|
- log.info1("New zone '%s'.", zone) |
||||||
|
- if len(_zone_interfaces) > 0: |
||||||
|
- for zone in list(_zone_interfaces.keys()): |
||||||
|
- log.info1("Lost zone '%s', zone interfaces dropped.", zone) |
||||||
|
- del _zone_interfaces[zone] |
||||||
|
- del _zone_interfaces |
||||||
|
- |
||||||
|
- # restore direct config |
||||||
|
- self.direct.set_config(_direct_config) |
||||||
|
- |
||||||
|
- # enable panic mode again if it has been enabled before or set policy |
||||||
|
- # to ACCEPT |
||||||
|
- if _panic: |
||||||
|
- self.enable_panic_mode() |
||||||
|
- else: |
||||||
|
+ self.set_policy("ACCEPT") |
||||||
|
+ |
||||||
|
+ self._state = "RUNNING" |
||||||
|
+ except Exception: |
||||||
|
+ self._state = "FAILED" |
||||||
|
self.set_policy("ACCEPT") |
||||||
|
+ raise |
||||||
|
|
||||||
|
# STATE |
||||||
|
|
||||||
|
diff --git a/src/firewall/errors.py b/src/firewall/errors.py |
||||||
|
index 1cd604884c99..63d007191ffa 100644 |
||||||
|
--- a/src/firewall/errors.py |
||||||
|
+++ b/src/firewall/errors.py |
||||||
|
@@ -97,6 +97,7 @@ MISSING_NAME = 205 |
||||||
|
MISSING_SETTING = 206 |
||||||
|
MISSING_FAMILY = 207 |
||||||
|
|
||||||
|
+RUNNING_BUT_FAILED = 251 |
||||||
|
NOT_RUNNING = 252 |
||||||
|
NOT_AUTHORIZED = 253 |
||||||
|
UNKNOWN_ERROR = 254 |
||||||
|
diff --git a/src/tests/regression/rhbz1498923.at b/src/tests/regression/rhbz1498923.at |
||||||
|
index 505a523d5cc4..bb0d841db2a7 100644 |
||||||
|
--- a/src/tests/regression/rhbz1498923.at |
||||||
|
+++ b/src/tests/regression/rhbz1498923.at |
||||||
|
@@ -1,5 +1,11 @@ |
||||||
|
FWD_START_TEST([invalid direct rule causes reload error]) |
||||||
|
FWD_CHECK([-q --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT]) |
||||||
|
FWD_CHECK([-q --permanent --direct --add-rule ipv4 filter INPUT 1 --a-bogus-flag]) |
||||||
|
-FWD_RELOAD(13, [ignore], [ignore]) |
||||||
|
+FWD_RELOAD(13, [ignore], [ignore], 251) |
||||||
|
+FWD_CHECK([--state], 251, [ignore], [failed |
||||||
|
+]) |
||||||
|
+ |
||||||
|
+dnl now remove the bad rule and reload successfully |
||||||
|
+FWD_CHECK([-q --permanent --direct --remove-rule ipv4 filter INPUT 1 --a-bogus-flag]) |
||||||
|
+FWD_RELOAD |
||||||
|
FWD_END_TEST([-e '/.*a-bogus-flag.*/d']) |
||||||
|
-- |
||||||
|
2.18.0 |
||||||
|
|
@ -0,0 +1,122 @@ |
|||||||
|
From c37c84f095d820cbd137a285e263075472934502 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Eric Garver <e@erig.me> |
||||||
|
Date: Thu, 31 May 2018 14:15:57 -0400 |
||||||
|
Subject: [PATCH 4/5] firewall-cmd: add --check-config option |
||||||
|
|
||||||
|
Fixes: rhbz 1477771 |
||||||
|
(cherry picked from commit b071536beb7ef2c91adb79c7769a265fc74ab15f) |
||||||
|
--- |
||||||
|
doc/xml/firewalld.dbus.xml | 11 +++++++++++ |
||||||
|
src/firewall-cmd | 6 +++++- |
||||||
|
src/firewall/client.py | 5 +++++ |
||||||
|
src/firewall/server/firewalld.py | 11 +++++++++++ |
||||||
|
4 files changed, 32 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/doc/xml/firewalld.dbus.xml b/doc/xml/firewalld.dbus.xml |
||||||
|
index f02edb173f6e..acdbb5fd6e00 100644 |
||||||
|
--- a/doc/xml/firewalld.dbus.xml |
||||||
|
+++ b/doc/xml/firewalld.dbus.xml |
||||||
|
@@ -347,6 +347,17 @@ |
||||||
|
</para> |
||||||
|
</listitem> |
||||||
|
</varlistentry> |
||||||
|
+ <varlistentry id="FirewallD1.Methods.checkPermanentConfig"> |
||||||
|
+ <term><methodname>checkPermanentConfig</methodname>() → Nothing</term> |
||||||
|
+ <listitem> |
||||||
|
+ <para> |
||||||
|
+ Run checks on the permanent configuration. This is most useful if changes were made manually to configuration files. |
||||||
|
+ </para> |
||||||
|
+ <para> |
||||||
|
+ Possible errors: any |
||||||
|
+ </para> |
||||||
|
+ </listitem> |
||||||
|
+ </varlistentry> |
||||||
|
<varlistentry id="FirewallD1.Methods.setDefaultZone"> |
||||||
|
<term><methodname>setDefaultZone</methodname>(s: <parameter>zone</parameter>) → Nothing</term> |
||||||
|
<listitem> |
||||||
|
diff --git a/src/firewall-cmd b/src/firewall-cmd |
||||||
|
index 1a864b32e819..b80115564e1b 100755 |
||||||
|
--- a/src/firewall-cmd |
||||||
|
+++ b/src/firewall-cmd |
||||||
|
@@ -59,6 +59,7 @@ Status Options |
||||||
|
--complete-reload Reload firewall and lose state information |
||||||
|
--runtime-to-permanent |
||||||
|
Create permanent from runtime configuration |
||||||
|
+ --check-config Check permanent configuration for errors |
||||||
|
|
||||||
|
Log Denied Options |
||||||
|
--get-log-denied Print the log denied value |
||||||
|
@@ -484,6 +485,7 @@ parser_group_standalone.add_argument("--reload", action="store_true") |
||||||
|
parser_group_standalone.add_argument("--complete-reload", action="store_true") |
||||||
|
parser_group_standalone.add_argument("--runtime-to-permanent", |
||||||
|
action="store_true") |
||||||
|
+parser_group_standalone.add_argument("--check-config", action="store_true") |
||||||
|
parser_group_standalone.add_argument("--get-ipset-types", action="store_true") |
||||||
|
parser_group_standalone.add_argument("--get-log-denied", action="store_true") |
||||||
|
parser_group_standalone.add_argument("--set-log-denied", metavar="<value>") |
||||||
|
@@ -750,7 +752,7 @@ options_standalone = a.help or a.version or \ |
||||||
|
a.get_default_zone or a.set_default_zone or \ |
||||||
|
a.get_active_zones or a.get_ipset_types or \ |
||||||
|
a.get_log_denied or a.set_log_denied or \ |
||||||
|
- a.get_automatic_helpers or a.set_automatic_helpers |
||||||
|
+ a.get_automatic_helpers or a.set_automatic_helpers or a.check_config |
||||||
|
|
||||||
|
options_desc_xml_file = a.set_description or a.get_description or \ |
||||||
|
a.set_short or a.get_short |
||||||
|
@@ -2039,6 +2041,8 @@ elif a.complete_reload: |
||||||
|
fw.complete_reload() |
||||||
|
elif a.runtime_to_permanent: |
||||||
|
fw.runtimeToPermanent() |
||||||
|
+elif a.check_config: |
||||||
|
+ fw.checkPermanentConfig() |
||||||
|
elif a.direct: |
||||||
|
if a.passthrough: |
||||||
|
if len(a.passthrough) < 2: |
||||||
|
diff --git a/src/firewall/client.py b/src/firewall/client.py |
||||||
|
index f90bbd78eb73..da45ceb5b964 100644 |
||||||
|
--- a/src/firewall/client.py |
||||||
|
+++ b/src/firewall/client.py |
||||||
|
@@ -2760,6 +2760,11 @@ class FirewallClient(object): |
||||||
|
def runtimeToPermanent(self): |
||||||
|
self.fw.runtimeToPermanent() |
||||||
|
|
||||||
|
+ @slip.dbus.polkit.enable_proxy |
||||||
|
+ @handle_exceptions |
||||||
|
+ def checkPermanentConfig(self): |
||||||
|
+ self.fw.checkPermanentConfig() |
||||||
|
+ |
||||||
|
@slip.dbus.polkit.enable_proxy |
||||||
|
@handle_exceptions |
||||||
|
def get_property(self, prop): |
||||||
|
diff --git a/src/firewall/server/firewalld.py b/src/firewall/server/firewalld.py |
||||||
|
index fc7422f12261..2cecc4771cb0 100644 |
||||||
|
--- a/src/firewall/server/firewalld.py |
||||||
|
+++ b/src/firewall/server/firewalld.py |
||||||
|
@@ -42,6 +42,7 @@ from firewall.dbus_utils import dbus_to_python, \ |
||||||
|
command_of_sender, context_of_sender, uid_of_sender, user_of_uid, \ |
||||||
|
dbus_introspection_prepare_properties, \ |
||||||
|
dbus_introspection_add_properties |
||||||
|
+from firewall.core.io.functions import check_config |
||||||
|
from firewall.core.io.zone import Zone |
||||||
|
from firewall.core.io.ipset import IPSet |
||||||
|
from firewall.core.io.service import Service |
||||||
|
@@ -336,6 +337,16 @@ class FirewallD(slip.dbus.service.Object): |
||||||
|
def Reloaded(self): |
||||||
|
log.debug1("Reloaded()") |
||||||
|
|
||||||
|
+ @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) |
||||||
|
+ @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', |
||||||
|
+ out_signature='') |
||||||
|
+ @dbus_handle_exceptions |
||||||
|
+ def checkPermanentConfig(self, sender=None): # pylint: disable=W0613 |
||||||
|
+ """Check permanent configuration |
||||||
|
+ """ |
||||||
|
+ log.debug1("checkPermanentConfig()") |
||||||
|
+ check_config(self.fw) |
||||||
|
+ |
||||||
|
# runtime to permanent |
||||||
|
|
||||||
|
@slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) |
||||||
|
-- |
||||||
|
2.16.3 |
||||||
|
|
@ -0,0 +1,416 @@ |
|||||||
|
From b388398d8c4b9859fba9b45371239bd2e5d6bfd4 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Eric Garver <e@erig.me> |
||||||
|
Date: Thu, 24 May 2018 16:30:41 -0400 |
||||||
|
Subject: [PATCH 5/5] tests/firewall-cmd: exercise --check-config |
||||||
|
|
||||||
|
This exercises the --check-config option for both firewall-cmd and |
||||||
|
firewall-offline-cmd. |
||||||
|
|
||||||
|
We also remove the explicit check in config/Makefile as it's now part of |
||||||
|
the normal testsuite. |
||||||
|
|
||||||
|
(cherry picked from commit c2bd43e71018ca4e43141ca93fab352e344f4a30) |
||||||
|
--- |
||||||
|
src/tests/firewall-cmd.at | 374 ++++++++++++++++++++++++++++++++++++++++++++++ |
||||||
|
src/tests/functions.at | 3 + |
||||||
|
2 files changed, 377 insertions(+) |
||||||
|
|
||||||
|
diff --git a/src/tests/firewall-cmd.at b/src/tests/firewall-cmd.at |
||||||
|
index 7364e9770d27..92cade844b9e 100644 |
||||||
|
--- a/src/tests/firewall-cmd.at |
||||||
|
+++ b/src/tests/firewall-cmd.at |
||||||
|
@@ -840,3 +840,377 @@ FWD_END_TEST([-e '/ERROR: INVALID_RULE:/d' dnl |
||||||
|
-e '/ERROR: INVALID_LOG_LEVEL: eror/d' dnl |
||||||
|
-e '/ERROR: MISSING_FAMILY/d' dnl |
||||||
|
-e '/ERROR: INVALID_LIMIT: 1\/2m/d']) |
||||||
|
+ |
||||||
|
+FWD_START_TEST([config validation]) |
||||||
|
+ dnl default config |
||||||
|
+ FWD_CHECK([--check-config], 0, ignore) |
||||||
|
+ |
||||||
|
+ dnl The rest of these are negative test cases. |
||||||
|
+ |
||||||
|
+ dnl firewalld.conf |
||||||
|
+ AT_CHECK([cp ./firewalld.conf ./firewalld.conf.orig]) |
||||||
|
+ AT_CHECK([echo "SomeBogusField=yes" >> ./firewalld.conf]) |
||||||
|
+ FWD_CHECK([--check-config], 0, ignore, [dnl |
||||||
|
+m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [dnl |
||||||
|
+ERROR: Invalid option: 'SomeBogusField=yes' |
||||||
|
+ERROR: Invalid option: 'SomeBogusField=yes' |
||||||
|
+])]) |
||||||
|
+ AT_CHECK([cp ./firewalld.conf.orig ./firewalld.conf]) |
||||||
|
+ |
||||||
|
+ dnl direct |
||||||
|
+ AT_DATA([./direct.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<direct> |
||||||
|
+<chain table="filter" ipv="ipv7" chain="foobar"/> |
||||||
|
+</direct> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 111, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./direct.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<direct> |
||||||
|
+<rule /> |
||||||
|
+</direct> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ AT_CHECK([rm ./direct.xml]) |
||||||
|
+ |
||||||
|
+ dnl lockdown-whitelist |
||||||
|
+ AT_DATA([./lockdown-whitelist.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<whitelist> |
||||||
|
+ <user uid="666"/> |
||||||
|
+</whitelist> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./lockdown-whitelist.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<whitelist> |
||||||
|
+ <uid id="666"/> |
||||||
|
+</whitelist> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./lockdown-whitelist.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<whitelist> |
||||||
|
+ <group name="foobar" /> |
||||||
|
+</whitelist> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ AT_CHECK([rm ./lockdown-whitelist.xml]) |
||||||
|
+ |
||||||
|
+ dnl ipset |
||||||
|
+ AT_CHECK([mkdir -p ./ipsets]) |
||||||
|
+ AT_DATA([./ipsets/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<ipset type="hash:mac"> |
||||||
|
+ <entry>12:34:56:78:90</entry> |
||||||
|
+</ipset> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 0, ignore, [dnl |
||||||
|
+m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [dnl |
||||||
|
+WARNING: INVALID_ENTRY: invalid mac address '12:34:56:78:90' in '12:34:56:78:90', ignoring. |
||||||
|
+WARNING: INVALID_ENTRY: invalid mac address '12:34:56:78:90' in '12:34:56:78:90', ignoring. |
||||||
|
+])]) |
||||||
|
+ |
||||||
|
+ AT_DATA([./ipsets/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<ipset type="hash:mac"> |
||||||
|
+ <entry bogus_attr="bogus">12:34:56:78:90:ab</entry> |
||||||
|
+</ipset> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./ipsets/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<ipset type="hash:ip,bogus"> |
||||||
|
+</ipset> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 119, ignore, ignore) |
||||||
|
+ AT_CHECK([rm ./ipsets/foobar.xml]) |
||||||
|
+ |
||||||
|
+ dnl helpers |
||||||
|
+ AT_CHECK([mkdir -p ./helpers]) |
||||||
|
+ AT_DATA([./helpers/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<helper> |
||||||
|
+</helper> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./helpers/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<helper family="ipv7" module="nf_conntrack_ftp"> |
||||||
|
+</helper> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 111, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./helpers/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<helper family="ipv6" module="nf_conntrack_ftp"> |
||||||
|
+<port protocol="aoeui" port="666" /> |
||||||
|
+</helper> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 103, ignore, ignore) |
||||||
|
+ AT_CHECK([rm ./helpers/foobar.xml]) |
||||||
|
+ |
||||||
|
+ dnl icmptype |
||||||
|
+ AT_CHECK([mkdir -p ./icmptypes]) |
||||||
|
+ AT_DATA([./icmptypes/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<bad_element /> |
||||||
|
+<icmptype> |
||||||
|
+</icmptype> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./icmptypes/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<icmptype> |
||||||
|
+<destination unexpected_attr="foobar" /> |
||||||
|
+</icmptype> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ AT_CHECK([rm ./icmptypes/foobar.xml]) |
||||||
|
+ |
||||||
|
+ dnl services |
||||||
|
+ AT_CHECK([mkdir -p ./services]) |
||||||
|
+ AT_DATA([./services/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<service> |
||||||
|
+<protocol value="aoeui" /> |
||||||
|
+</service> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 103, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./services/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<service> |
||||||
|
+<protocol bad_attr="foo" /> |
||||||
|
+</service> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./services/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<service> |
||||||
|
+<bad_element /> |
||||||
|
+</service> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./services/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<service> |
||||||
|
+<module module="bad_attr" /> |
||||||
|
+</service> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./services/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<service> |
||||||
|
+<port protocol="aoeu" port="666" /> |
||||||
|
+</service> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 103, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./services/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<service> |
||||||
|
+<port protocol="tcp" port="ssssssh" /> |
||||||
|
+</service> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 102, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./services/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<service> |
||||||
|
+<port protocol="tcp" port="22" /> |
||||||
|
+<source-port protocol="tcp" port="sssssh" /> |
||||||
|
+</service> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 102, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./services/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<service> |
||||||
|
+<destination ipv4="224.0.0.1" ipv7="1234" /> |
||||||
|
+</service> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ AT_CHECK([rm ./services/foobar.xml]) |
||||||
|
+ |
||||||
|
+ dnl zones |
||||||
|
+ AT_CHECK([mkdir -p ./zones]) |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 112, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<service name="bogus_service_name" /> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 101, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<port protocol="ipv4" /> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<protocol value="thisdoesnotexist" /> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 103, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<icmp-block invalid_attr=""/> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<icmp-type /> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<masquerade value="true" /> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<forward-port port="666" /> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<forward-port protocol="sctppp" /> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<source-port port="-1" /> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<interface /> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<source /> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 0, ignore, [dnl |
||||||
|
+m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [dnl |
||||||
|
+WARNING: Invalid source: No address no ipset. |
||||||
|
+WARNING: Invalid source: No address no ipset. |
||||||
|
+])]) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<rule> |
||||||
|
+<source address="10.0.0.1/24" /> |
||||||
|
+<limit /> |
||||||
|
+</rule> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<rule family="ipv4"> |
||||||
|
+<source address="10.0.0.1/24" /> |
||||||
|
+<accept> |
||||||
|
+<limit value="none" /> |
||||||
|
+</accept> |
||||||
|
+</rule> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 0, ignore, [dnl |
||||||
|
+m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [dnl |
||||||
|
+WARNING: INVALID_LIMIT: none: rule family="ipv4" source address="10.0.0.1/24" accept limit value="none" |
||||||
|
+WARNING: INVALID_LIMIT: none: rule family="ipv4" source address="10.0.0.1/24" accept limit value="none" |
||||||
|
+])]) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<rule> |
||||||
|
+<source address="10.0.0.1/24" /> |
||||||
|
+<log level="super_critical" /> |
||||||
|
+</rule> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 0, ignore, [dnl |
||||||
|
+m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [dnl |
||||||
|
+WARNING: Invalid rule: Invalid log level |
||||||
|
+WARNING: Invalid rule: Invalid log level |
||||||
|
+])]) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<rule family="ipv4"> |
||||||
|
+<source address="10.0.0.1/24" /> |
||||||
|
+<audit prefix="foobar" /> |
||||||
|
+</rule> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 28, ignore, ignore) |
||||||
|
+ |
||||||
|
+ AT_DATA([./zones/foobar.xml], [dnl |
||||||
|
+<?xml version="1.0" encoding="utf-8"?> |
||||||
|
+<zone> |
||||||
|
+<rule family="ipv6"> |
||||||
|
+<source address="10.0.0.1/24" /> |
||||||
|
+<accept /> |
||||||
|
+</rule> |
||||||
|
+</zone> |
||||||
|
+]) |
||||||
|
+ FWD_CHECK([--check-config], 0, ignore, [dnl |
||||||
|
+m4_ifdef([TESTING_FIREWALL_OFFLINE_CMD], [dnl |
||||||
|
+WARNING: INVALID_ADDR: 10.0.0.1/24: rule family="ipv6" source address="10.0.0.1/24" accept |
||||||
|
+WARNING: INVALID_ADDR: 10.0.0.1/24: rule family="ipv6" source address="10.0.0.1/24" accept |
||||||
|
+])]) |
||||||
|
+ AT_CHECK([rm ./zones/foobar.xml]) |
||||||
|
+ |
||||||
|
+FWD_END_TEST([-e '/ERROR:/d'dnl |
||||||
|
+ -e '/WARNING:/d']) |
||||||
|
diff --git a/src/tests/functions.at b/src/tests/functions.at |
||||||
|
index 7bd66d5c74fe..d9b1ce401bb0 100644 |
||||||
|
--- a/src/tests/functions.at |
||||||
|
+++ b/src/tests/functions.at |
||||||
|
@@ -122,6 +122,9 @@ m4_define([FWD_CHECK], [ |
||||||
|
m4_if(-1, m4_index([$1], [-default-zone]), [], [ |
||||||
|
m4_define([FWD_CHECK_RUN_FIREWALL_OFFLINE_CMD]) |
||||||
|
]) |
||||||
|
+ m4_if(-1, m4_index([$1], [--check-config]), [], [ |
||||||
|
+ m4_define([FWD_CHECK_RUN_FIREWALL_OFFLINE_CMD]) |
||||||
|
+ ]) |
||||||
|
], [ |
||||||
|
m4_if(-1, m4_index([$1], [--timeout]), [ |
||||||
|
m4_define([FWD_CHECK_RUN_FIREWALL_OFFLINE_CMD]) |
||||||
|
-- |
||||||
|
2.16.3 |
||||||
|
|
@ -0,0 +1,46 @@ |
|||||||
|
diff -up firewalld-0.4.4.3/doc/man/man1/Makefile.am.exclude_firewallctl_rhbz#1374799 firewalld-0.4.4.3/doc/man/man1/Makefile.am |
||||||
|
--- firewalld-0.4.4.3/doc/man/man1/Makefile.am.exclude_firewallctl_rhbz#1374799 2016-12-16 13:35:59.000000000 +0100 |
||||||
|
+++ firewalld-0.4.4.3/doc/man/man1/Makefile.am 2017-02-08 19:20:18.109073530 +0100 |
||||||
|
@@ -1,3 +1,8 @@ |
||||||
|
EXTRA_DIST = $(man_MANS) |
||||||
|
|
||||||
|
-man_MANS = firewall*.1 |
||||||
|
+man_MANS = \ |
||||||
|
+ firewall-applet.1 \ |
||||||
|
+ firewall-cmd.1 \ |
||||||
|
+ firewall-config.1 \ |
||||||
|
+ firewalld.1 \ |
||||||
|
+ firewall-offline-cmd.1 |
||||||
|
diff -up firewalld-0.4.4.3/doc/xml/Makefile.am.exclude_firewallctl_rhbz#1374799 firewalld-0.4.4.3/doc/xml/Makefile.am |
||||||
|
--- firewalld-0.4.4.3/doc/xml/Makefile.am.exclude_firewallctl_rhbz#1374799 2016-10-31 10:19:14.000000000 +0100 |
||||||
|
+++ firewalld-0.4.4.3/doc/xml/Makefile.am 2017-02-08 19:16:45.904176658 +0100 |
||||||
|
@@ -11,7 +11,6 @@ man1_MANS = \ |
||||||
|
../man/man1/firewall-applet.1 \ |
||||||
|
../man/man1/firewall-cmd.1 \ |
||||||
|
../man/man1/firewall-config.1 \ |
||||||
|
- ../man/man1/firewallctl.1 \ |
||||||
|
../man/man1/firewalld.1 \ |
||||||
|
../man/man1/firewall-offline-cmd.1 |
||||||
|
|
||||||
|
diff -up firewalld-0.4.4.3/doc/xml/seealso.xml.exclude_firewallctl_rhbz#1374799 firewalld-0.4.4.3/doc/xml/seealso.xml |
||||||
|
--- firewalld-0.4.4.3/doc/xml/seealso.xml.exclude_firewallctl_rhbz#1374799 2016-10-31 10:19:14.000000000 +0100 |
||||||
|
+++ firewalld-0.4.4.3/doc/xml/seealso.xml 2017-02-08 19:16:45.904176658 +0100 |
||||||
|
@@ -29,7 +29,6 @@ |
||||||
|
<member><citerefentry><refentrytitle>firewalld</refentrytitle><manvolnum>1</manvolnum></citerefentry></member> |
||||||
|
<member><citerefentry><refentrytitle>firewall-cmd</refentrytitle><manvolnum>1</manvolnum></citerefentry></member> |
||||||
|
<member><citerefentry><refentrytitle>firewall-config</refentrytitle><manvolnum>1</manvolnum></citerefentry></member> |
||||||
|
- <member><citerefentry><refentrytitle>firewallctl</refentrytitle><manvolnum>1</manvolnum></citerefentry></member> |
||||||
|
<member><citerefentry><refentrytitle>firewalld.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry></member> |
||||||
|
<member><citerefentry><refentrytitle>firewalld.direct</refentrytitle><manvolnum>5</manvolnum></citerefentry></member> |
||||||
|
<member><citerefentry><refentrytitle>firewalld.dbus</refentrytitle><manvolnum>5</manvolnum></citerefentry></member> |
||||||
|
diff -up firewalld-0.4.4.3/src/Makefile.am.exclude_firewallctl_rhbz#1374799 firewalld-0.4.4.3/src/Makefile.am |
||||||
|
--- firewalld-0.4.4.3/src/Makefile.am.exclude_firewallctl_rhbz#1374799 2017-02-08 17:51:00.000000000 +0100 |
||||||
|
+++ firewalld-0.4.4.3/src/Makefile.am 2017-02-08 19:16:45.904176658 +0100 |
||||||
|
@@ -1,6 +1,6 @@ |
||||||
|
SUBDIRS = icons |
||||||
|
|
||||||
|
-dist_bin_SCRIPTS = firewall-applet firewall-cmd firewall-offline-cmd firewall-config firewallctl |
||||||
|
+dist_bin_SCRIPTS = firewall-applet firewall-cmd firewall-offline-cmd firewall-config |
||||||
|
dist_sbin_SCRIPTS = firewalld |
||||||
|
|
||||||
|
gladedir = $(pkgdatadir) |
@ -0,0 +1,449 @@ |
|||||||
|
diff -up firewalld-0.4.4.3/src/firewall-applet.qt4_applet firewalld-0.4.4.3/src/firewall-applet |
||||||
|
--- firewalld-0.4.4.3/src/firewall-applet.qt4_applet 2017-01-26 13:07:25.000000000 +0100 |
||||||
|
+++ firewalld-0.4.4.3/src/firewall-applet 2017-02-08 19:13:03.196185899 +0100 |
||||||
|
@@ -21,14 +21,14 @@ |
||||||
|
# |
||||||
|
|
||||||
|
import sys |
||||||
|
-from PyQt5 import QtGui, QtCore, QtWidgets |
||||||
|
+from PyQt4 import QtGui, QtCore |
||||||
|
|
||||||
|
import gi |
||||||
|
gi.require_version('Notify', '0.7') |
||||||
|
from gi.repository import Notify |
||||||
|
|
||||||
|
import os |
||||||
|
-from dbus.mainloop.pyqt5 import DBusQtMainLoop |
||||||
|
+from dbus.mainloop.qt import DBusQtMainLoop |
||||||
|
import functools |
||||||
|
|
||||||
|
from firewall.config import * |
||||||
|
@@ -74,20 +74,21 @@ def escape(text): |
||||||
|
return text |
||||||
|
|
||||||
|
def fromUTF8(text): |
||||||
|
- if PY2 and QtCore.QT_VERSION < 0x050000: |
||||||
|
+ if PY2: |
||||||
|
return QtCore.QString.fromUtf8(text) |
||||||
|
- return text |
||||||
|
+ else: |
||||||
|
+ return text |
||||||
|
|
||||||
|
# ZoneInterfaceEditor ######################################################### |
||||||
|
|
||||||
|
-class ZoneInterfaceEditor(QtWidgets.QDialog): |
||||||
|
+class ZoneInterfaceEditor(QtGui.QDialog): |
||||||
|
def __init__(self, fw, interface, zone): |
||||||
|
self.fw = fw |
||||||
|
self.interface = interface |
||||||
|
self.zone = None |
||||||
|
self.title = _("Select zone for interface '%s'") % self.interface |
||||||
|
|
||||||
|
- QtWidgets.QDialog.__init__(self) |
||||||
|
+ QtGui.QDialog.__init__(self) |
||||||
|
self.create_ui(zone) |
||||||
|
|
||||||
|
def create_ui(self, zone): |
||||||
|
@@ -96,19 +97,19 @@ class ZoneInterfaceEditor(QtWidgets.QDia |
||||||
|
|
||||||
|
self.resize(100, 50) |
||||||
|
|
||||||
|
- vbox = QtWidgets.QVBoxLayout() |
||||||
|
+ vbox = QtGui.QVBoxLayout() |
||||||
|
vbox.setSpacing(6) |
||||||
|
|
||||||
|
- label = QtWidgets.QLabel(fromUTF8(escape(self.title))) |
||||||
|
+ label = QtGui.QLabel(fromUTF8(escape(self.title))) |
||||||
|
vbox.addWidget(label) |
||||||
|
|
||||||
|
- self.combo = QtWidgets.QComboBox() |
||||||
|
+ self.combo = QtGui.QComboBox() |
||||||
|
self.fill_zone_combo() |
||||||
|
vbox.addWidget(self.combo) |
||||||
|
|
||||||
|
- buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok |
||||||
|
- | QtWidgets.QDialogButtonBox.Cancel) |
||||||
|
- self.ok_button = buttonBox.button(QtWidgets.QDialogButtonBox.Ok) |
||||||
|
+ buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok |
||||||
|
+ | QtGui.QDialogButtonBox.Cancel) |
||||||
|
+ self.ok_button = buttonBox.button(QtGui.QDialogButtonBox.Ok) |
||||||
|
buttonBox.accepted.connect(self.ok) |
||||||
|
buttonBox.rejected.connect(self.hide) |
||||||
|
vbox.addWidget(buttonBox) |
||||||
|
@@ -160,7 +161,7 @@ class ZoneConnectionEditor(ZoneInterface |
||||||
|
self.zone = None |
||||||
|
self.title = _("Select zone for connection '%s'") % self.connection |
||||||
|
|
||||||
|
- QtWidgets.QDialog.__init__(self) |
||||||
|
+ QtGui.QDialog.__init__(self) |
||||||
|
self.create_ui(zone) |
||||||
|
|
||||||
|
def ok(self): |
||||||
|
@@ -169,7 +170,7 @@ class ZoneConnectionEditor(ZoneInterface |
||||||
|
nm_set_zone_of_connection(self.get_zone(), self.connection) |
||||||
|
except Exception as msg: |
||||||
|
text = _("Failed to set zone {zone} for connection {connection}") |
||||||
|
- QtWidgets.QMessageBox.warning(None, fromUTF8(escape(self.title)), |
||||||
|
+ QtGui.QMessageBox.warning(None, fromUTF8(escape(self.title)), |
||||||
|
escape(text.format( |
||||||
|
zone=self.get_zone(), |
||||||
|
connection=self.connection))) |
||||||
|
@@ -184,7 +185,7 @@ class ZoneSourceEditor(ZoneInterfaceEdit |
||||||
|
self.zone = None |
||||||
|
self.title = _("Select zone for source '%s'") % self.source |
||||||
|
|
||||||
|
- QtWidgets.QDialog.__init__(self) |
||||||
|
+ QtGui.QDialog.__init__(self) |
||||||
|
self.create_ui(zone) |
||||||
|
|
||||||
|
def ok(self): |
||||||
|
@@ -193,7 +194,7 @@ class ZoneSourceEditor(ZoneInterfaceEdit |
||||||
|
|
||||||
|
# ShieldsEditor ######################################################### |
||||||
|
|
||||||
|
-class ShieldsEditor(QtWidgets.QDialog): |
||||||
|
+class ShieldsEditor(QtGui.QDialog): |
||||||
|
def __init__(self, fw, settings, shields_up, shields_down): |
||||||
|
self.fw = fw |
||||||
|
self.settings = settings |
||||||
|
@@ -201,63 +202,63 @@ class ShieldsEditor(QtWidgets.QDialog): |
||||||
|
self.shields_down = shields_down |
||||||
|
self.title = _("Configure Shields Up/Down Zones") |
||||||
|
|
||||||
|
- QtWidgets.QDialog.__init__(self) |
||||||
|
+ QtGui.QDialog.__init__(self) |
||||||
|
self.create_ui() |
||||||
|
|
||||||
|
def create_ui(self): |
||||||
|
self.setWindowTitle(fromUTF8(escape(self.title))) |
||||||
|
self.rejected.connect(self.hide) |
||||||
|
|
||||||
|
- vbox = QtWidgets.QVBoxLayout() |
||||||
|
+ vbox = QtGui.QVBoxLayout() |
||||||
|
vbox.setSpacing(6) |
||||||
|
|
||||||
|
- label = QtWidgets.QLabel(fromUTF8(escape( |
||||||
|
+ label = QtGui.QLabel(fromUTF8(escape( |
||||||
|
_("Here you can select the zones used for Shields Up and " |
||||||
|
"Shields Down.")))) |
||||||
|
label.setWordWrap(True) |
||||||
|
vbox.addWidget(label) |
||||||
|
|
||||||
|
- label = QtWidgets.QLabel(fromUTF8(escape( |
||||||
|
+ label = QtGui.QLabel(fromUTF8(escape( |
||||||
|
_("This feature is useful for people using the default zones " |
||||||
|
"mostly. For users, that are changing zones of connections, it " |
||||||
|
"might be of limited use.")))) |
||||||
|
label.setWordWrap(True) |
||||||
|
vbox.addWidget(label) |
||||||
|
|
||||||
|
- grid = QtWidgets.QGridLayout() |
||||||
|
+ grid = QtGui.QGridLayout() |
||||||
|
grid.setSpacing(6) |
||||||
|
|
||||||
|
- label = QtWidgets.QLabel(fromUTF8(escape(_("Shields Up Zone:")))) |
||||||
|
+ label = QtGui.QLabel(fromUTF8(escape(_("Shields Up Zone:")))) |
||||||
|
label.setWordWrap(True) |
||||||
|
grid.addWidget(label, 0, 0, 1, 1) |
||||||
|
|
||||||
|
- self.shields_up_combo = QtWidgets.QComboBox() |
||||||
|
+ self.shields_up_combo = QtGui.QComboBox() |
||||||
|
#self.fill_combo(self.shields_up_combo) |
||||||
|
#self.set_shields_up(self.shields_up) |
||||||
|
grid.addWidget(self.shields_up_combo, 0, 1, 1, 1) |
||||||
|
|
||||||
|
- button = QtWidgets.QPushButton(_("Reset To Default")) |
||||||
|
+ button = QtGui.QPushButton(_("Reset To Default")) |
||||||
|
button.clicked.connect(self.reset_shields_up) |
||||||
|
grid.addWidget(button, 0, 2, 1, 1) |
||||||
|
|
||||||
|
- label = QtWidgets.QLabel(fromUTF8(escape(_("Shields Down Zone:")))) |
||||||
|
+ label = QtGui.QLabel(fromUTF8(escape(_("Shields Down Zone:")))) |
||||||
|
label.setWordWrap(True) |
||||||
|
grid.addWidget(label, 1, 0, 1, 1) |
||||||
|
|
||||||
|
- self.shields_down_combo = QtWidgets.QComboBox() |
||||||
|
+ self.shields_down_combo = QtGui.QComboBox() |
||||||
|
#self.fill_combo(self.shields_down_combo) |
||||||
|
#self.set_shields_down(self.shields_down) |
||||||
|
grid.addWidget(self.shields_down_combo, 1, 1, 1, 1) |
||||||
|
|
||||||
|
- button = QtWidgets.QPushButton(_("Reset To Default")) |
||||||
|
+ button = QtGui.QPushButton(_("Reset To Default")) |
||||||
|
button.clicked.connect(self.reset_shields_down) |
||||||
|
grid.addWidget(button, 1, 2, 1, 1) |
||||||
|
|
||||||
|
vbox.addLayout(grid) |
||||||
|
|
||||||
|
- buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok |
||||||
|
- | QtWidgets.QDialogButtonBox.Cancel) |
||||||
|
- self.ok_button = buttonBox.button(QtWidgets.QDialogButtonBox.Ok) |
||||||
|
+ buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok |
||||||
|
+ | QtGui.QDialogButtonBox.Cancel) |
||||||
|
+ self.ok_button = buttonBox.button(QtGui.QDialogButtonBox.Ok) |
||||||
|
buttonBox.accepted.connect(self.ok) |
||||||
|
buttonBox.rejected.connect(self.hide) |
||||||
|
vbox.addWidget(buttonBox) |
||||||
|
@@ -328,56 +329,56 @@ class ShieldsEditor(QtWidgets.QDialog): |
||||||
|
|
||||||
|
# AboutDialog ################################################################# |
||||||
|
|
||||||
|
-class AboutDialog(QtWidgets.QDialog): |
||||||
|
+class AboutDialog(QtGui.QDialog): |
||||||
|
def __init__(self, name, icon, version, url, copyright, authors, license): |
||||||
|
- QtWidgets.QDialog.__init__(self) |
||||||
|
+ QtGui.QDialog.__init__(self) |
||||||
|
self.setWindowIcon(icon) |
||||||
|
self.setWindowTitle(fromUTF8(escape(_("About %s" % name)))) |
||||||
|
self.resize(500, 250) |
||||||
|
|
||||||
|
- vbox = QtWidgets.QVBoxLayout() |
||||||
|
+ vbox = QtGui.QVBoxLayout() |
||||||
|
vbox.setSpacing(6) |
||||||
|
|
||||||
|
- hbox = QtWidgets.QHBoxLayout() |
||||||
|
+ hbox = QtGui.QHBoxLayout() |
||||||
|
hbox.setSpacing(24) |
||||||
|
|
||||||
|
- label = QtWidgets.QLabel() |
||||||
|
+ label = QtGui.QLabel() |
||||||
|
label.setPixmap(icon.pixmap(96)) |
||||||
|
label.setMinimumSize(96, 96) |
||||||
|
label.setMaximumSize(96, 96) |
||||||
|
hbox.addWidget(label) |
||||||
|
|
||||||
|
- vbox2 = QtWidgets.QVBoxLayout() |
||||||
|
+ vbox2 = QtGui.QVBoxLayout() |
||||||
|
vbox2.setSpacing(3) |
||||||
|
|
||||||
|
- label = QtWidgets.QLabel(name) |
||||||
|
+ label = QtGui.QLabel(name) |
||||||
|
font = label.font() |
||||||
|
font.setPointSize(font.pointSize()*2) |
||||||
|
font.setBold(True) |
||||||
|
label.setFont(font) |
||||||
|
vbox2.addWidget(label) |
||||||
|
|
||||||
|
- vbox2.addWidget(QtWidgets.QLabel(version)) |
||||||
|
+ vbox2.addWidget(QtGui.QLabel(version)) |
||||||
|
|
||||||
|
- label = QtWidgets.QLabel("<a href=\"%s\">%s</a>" % (url, url)) |
||||||
|
+ label = QtGui.QLabel("<a href=\"%s\">%s</a>" % (url, url)) |
||||||
|
label.setTextFormat(QtCore.Qt.RichText) |
||||||
|
label.setTextInteractionFlags(QtCore.Qt.TextBrowserInteraction) |
||||||
|
label.setOpenExternalLinks(True) |
||||||
|
|
||||||
|
vbox2.addWidget(label) |
||||||
|
|
||||||
|
- vbox2.addWidget(QtWidgets.QLabel(copyright)) |
||||||
|
+ vbox2.addWidget(QtGui.QLabel(copyright)) |
||||||
|
|
||||||
|
hbox.addLayout(vbox2) |
||||||
|
|
||||||
|
vbox.addLayout(hbox) |
||||||
|
|
||||||
|
- tabs = QtWidgets.QTabWidget() |
||||||
|
+ tabs = QtGui.QTabWidget() |
||||||
|
tabs.setStyleSheet("QTabWidget::tab { padding: 1px 1px 1px 1px; }") |
||||||
|
|
||||||
|
- tab = QtWidgets.QWidget() |
||||||
|
- vbox3 = QtWidgets.QVBoxLayout() |
||||||
|
- textedit = QtWidgets.QPlainTextEdit() |
||||||
|
+ tab = QtGui.QWidget() |
||||||
|
+ vbox3 = QtGui.QVBoxLayout() |
||||||
|
+ textedit = QtGui.QPlainTextEdit() |
||||||
|
#textedit.setStyleSheet("QPlainTextEdit { border: 0; padding: 0; }") |
||||||
|
textedit.setReadOnly(True) |
||||||
|
textedit.setPlainText(fromUTF8("\n".join(authors))) |
||||||
|
@@ -385,9 +386,9 @@ class AboutDialog(QtWidgets.QDialog): |
||||||
|
tab.setLayout(vbox3) |
||||||
|
tabs.addTab(tab, fromUTF8(escape(_("Authors")))) |
||||||
|
|
||||||
|
- tab = QtWidgets.QWidget() |
||||||
|
- vbox3 = QtWidgets.QVBoxLayout() |
||||||
|
- textedit = QtWidgets.QPlainTextEdit() |
||||||
|
+ tab = QtGui.QWidget() |
||||||
|
+ vbox3 = QtGui.QVBoxLayout() |
||||||
|
+ textedit = QtGui.QPlainTextEdit() |
||||||
|
#textedit.setStyleSheet("QPlainTextEdit { border: 0; padding: 0; }") |
||||||
|
textedit.setReadOnly(True) |
||||||
|
textedit.setPlainText(license) |
||||||
|
@@ -397,7 +398,7 @@ class AboutDialog(QtWidgets.QDialog): |
||||||
|
|
||||||
|
vbox.addWidget(tabs) |
||||||
|
|
||||||
|
- buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Close) |
||||||
|
+ buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Close) |
||||||
|
buttonBox.rejected.connect(self.hide) |
||||||
|
vbox.addWidget(buttonBox) |
||||||
|
|
||||||
|
@@ -405,7 +406,7 @@ class AboutDialog(QtWidgets.QDialog): |
||||||
|
|
||||||
|
# TrayApplet ################################################################## |
||||||
|
|
||||||
|
-class TrayApplet(QtWidgets.QSystemTrayIcon): |
||||||
|
+class TrayApplet(QtGui.QSystemTrayIcon): |
||||||
|
def __init__(self): |
||||||
|
super(TrayApplet, self).__init__() |
||||||
|
self.name = _("Firewall Applet") |
||||||
|
@@ -452,67 +453,67 @@ class TrayApplet(QtWidgets.QSystemTrayIc |
||||||
|
|
||||||
|
# urgencies |
||||||
|
|
||||||
|
- self.urgencies = { "noicon": QtWidgets.QSystemTrayIcon.NoIcon, |
||||||
|
- "information": QtWidgets.QSystemTrayIcon.Information, |
||||||
|
- "warning": QtWidgets.QSystemTrayIcon.Warning, |
||||||
|
- "critical": QtWidgets.QSystemTrayIcon.Critical } |
||||||
|
+ self.urgencies = { "noicon": QtGui.QSystemTrayIcon.NoIcon, |
||||||
|
+ "information": QtGui.QSystemTrayIcon.Information, |
||||||
|
+ "warning": QtGui.QSystemTrayIcon.Warning, |
||||||
|
+ "critical": QtGui.QSystemTrayIcon.Critical } |
||||||
|
|
||||||
|
# actions |
||||||
|
|
||||||
|
- self.shieldsupAction = QtWidgets.QAction(fromUTF8(escape(_("Shields Up"))), |
||||||
|
+ self.shieldsupAction = QtGui.QAction(fromUTF8(escape(_("Shields Up"))), |
||||||
|
self) |
||||||
|
self.shieldsupAction.setCheckable(True) |
||||||
|
self.shieldsupAction.setChecked(False) |
||||||
|
self.shieldsupAction.triggered.connect(self.shieldsup_changed_cb) |
||||||
|
|
||||||
|
- self.notificationsAction = QtWidgets.QAction( |
||||||
|
+ self.notificationsAction = QtGui.QAction( |
||||||
|
fromUTF8(escape(_("Enable Notifications"))), self) |
||||||
|
self.notificationsAction.setCheckable(True) |
||||||
|
self.notificationsAction.setChecked(False) |
||||||
|
self.notificationsAction.triggered.connect(self.notification_changed_cb) |
||||||
|
|
||||||
|
- self.settingsAction = QtWidgets.QAction( |
||||||
|
+ self.settingsAction = QtGui.QAction( |
||||||
|
fromUTF8(escape(_("Edit Firewall Settings..."))), self) |
||||||
|
self.settingsAction.triggered.connect(self.configure_cb) |
||||||
|
|
||||||
|
- self.changeZonesAction = QtWidgets.QAction( |
||||||
|
+ self.changeZonesAction = QtGui.QAction( |
||||||
|
fromUTF8(escape(_("Change Zones of Connections..."))), self) |
||||||
|
self.changeZonesAction.triggered.connect(self.nm_connection_editor) |
||||||
|
|
||||||
|
- self.shieldsAction = QtWidgets.QAction( |
||||||
|
+ self.shieldsAction = QtGui.QAction( |
||||||
|
fromUTF8(escape(_("Configure Shields UP/Down Zones..."))), self) |
||||||
|
self.shieldsAction.triggered.connect(self.configure_shields) |
||||||
|
|
||||||
|
- self.panicAction = QtWidgets.QAction( |
||||||
|
+ self.panicAction = QtGui.QAction( |
||||||
|
fromUTF8(escape(_("Block all network traffic"))), self) |
||||||
|
self.panicAction.setCheckable(True) |
||||||
|
self.panicAction.setChecked(False) |
||||||
|
self.panicAction.triggered.connect(self.panic_mode_cb) |
||||||
|
|
||||||
|
- self.aboutAction = QtWidgets.QAction(fromUTF8(escape(_("About"))), self) |
||||||
|
+ self.aboutAction = QtGui.QAction(fromUTF8(escape(_("About"))), self) |
||||||
|
self.aboutAction.triggered.connect(self.about_dialog.exec_) |
||||||
|
|
||||||
|
- #self.quitAction = QtWidgets.QAction(fromUTF8(escape(_("Quit"))), self, |
||||||
|
+ #self.quitAction = QtGui.QAction(fromUTF8(escape(_("Quit"))), self, |
||||||
|
# triggered=self.quit) |
||||||
|
|
||||||
|
- self.connectionsAction = QtWidgets.QWidgetAction(self) |
||||||
|
- self.connectionsAction.setDefaultWidget(QtWidgets.QLabel( |
||||||
|
+ self.connectionsAction = QtGui.QWidgetAction(self) |
||||||
|
+ self.connectionsAction.setDefaultWidget(QtGui.QLabel( |
||||||
|
fromUTF8("<b>"+escape(_("Connections"))+"</b> "))) |
||||||
|
|
||||||
|
- self.interfacesAction = QtWidgets.QWidgetAction(self) |
||||||
|
- self.interfacesAction.setDefaultWidget(QtWidgets.QLabel( |
||||||
|
+ self.interfacesAction = QtGui.QWidgetAction(self) |
||||||
|
+ self.interfacesAction.setDefaultWidget(QtGui.QLabel( |
||||||
|
fromUTF8("<b>"+escape(_("Interfaces"))+"</b> "))) |
||||||
|
|
||||||
|
- self.sourcesAction = QtWidgets.QWidgetAction(self) |
||||||
|
- self.sourcesAction.setDefaultWidget(QtWidgets.QLabel( |
||||||
|
+ self.sourcesAction = QtGui.QWidgetAction(self) |
||||||
|
+ self.sourcesAction.setDefaultWidget(QtGui.QLabel( |
||||||
|
fromUTF8("<b>"+escape(_("Sources"))+"</b> "))) |
||||||
|
|
||||||
|
# init |
||||||
|
|
||||||
|
- self.left_menu = QtWidgets.QMenu() |
||||||
|
+ self.left_menu = QtGui.QMenu() |
||||||
|
self.left_menu.setStyleSheet('QMenu { margin: 5px; }') |
||||||
|
|
||||||
|
- self.right_menu = QtWidgets.QMenu() |
||||||
|
+ self.right_menu = QtGui.QMenu() |
||||||
|
self.right_menu.addAction(self.shieldsupAction) |
||||||
|
self.right_menu.addAction(self.notificationsAction) |
||||||
|
self.right_menu.addSeparator() |
||||||
|
@@ -631,7 +632,7 @@ class TrayApplet(QtWidgets.QSystemTrayIc |
||||||
|
self.setVisible(True) |
||||||
|
|
||||||
|
def activated_cb(self, reason): |
||||||
|
- if reason == QtWidgets.QSystemTrayIcon.Trigger: |
||||||
|
+ if reason == QtGui.QSystemTrayIcon.Trigger: |
||||||
|
self.left_menu.popup(QtGui.QCursor.pos()) |
||||||
|
|
||||||
|
def update_active_zones(self): |
||||||
|
@@ -679,12 +680,12 @@ class TrayApplet(QtWidgets.QSystemTrayIc |
||||||
|
zone = connections[connection][0] |
||||||
|
if zone == "": |
||||||
|
_binding = _("{entry} (Default Zone: {default_zone})") |
||||||
|
- action = QtWidgets.QAction( |
||||||
|
+ action = QtGui.QAction( |
||||||
|
fromUTF8(escape( |
||||||
|
_binding.format(default_zone=self.default_zone, |
||||||
|
entry=connection))), self) |
||||||
|
else: |
||||||
|
- action = QtWidgets.QAction( |
||||||
|
+ action = QtGui.QAction( |
||||||
|
fromUTF8(escape(binding.format(zone=zone, |
||||||
|
entry=connection))), self) |
||||||
|
action.triggered.connect(functools.partial( |
||||||
|
@@ -697,7 +698,7 @@ class TrayApplet(QtWidgets.QSystemTrayIc |
||||||
|
# add other interfaces |
||||||
|
for interface in sorted(interfaces): |
||||||
|
zone = interfaces[interface] |
||||||
|
- action = QtWidgets.QAction( |
||||||
|
+ action = QtGui.QAction( |
||||||
|
fromUTF8(escape(binding.format(zone=zone, entry=interface))), |
||||||
|
self) |
||||||
|
action.triggered.connect(functools.partial( |
||||||
|
@@ -709,7 +710,7 @@ class TrayApplet(QtWidgets.QSystemTrayIc |
||||||
|
|
||||||
|
for source in sorted(sources): |
||||||
|
zone = sources[source] |
||||||
|
- action = QtWidgets.QAction( |
||||||
|
+ action = QtGui.QAction( |
||||||
|
fromUTF8(escape(binding.format(zone=zone, entry=source))), |
||||||
|
self) |
||||||
|
action.triggered.connect(functools.partial( |
||||||
|
@@ -931,10 +932,10 @@ class TrayApplet(QtWidgets.QSystemTrayIc |
||||||
|
os.system("%s &" % NM_CONNECTION_EDITOR) |
||||||
|
|
||||||
|
def warning(self, text): |
||||||
|
- QtWidgets.QMessageBox.warning(None, fromUTF8(escape(self.name)), text) |
||||||
|
+ QtGui.QMessageBox.warning(None, fromUTF8(escape(self.name)), text) |
||||||
|
|
||||||
|
def error(self, text): |
||||||
|
- QtWidgets.QMessageBox.critical(None, fromUTF8(escape(self.name)), text) |
||||||
|
+ QtGui.QMessageBox.critical(None, fromUTF8(escape(self.name)), text) |
||||||
|
|
||||||
|
def configure_cb(self, widget): |
||||||
|
os.system("firewall-config &") |
||||||
|
@@ -970,8 +971,6 @@ class TrayApplet(QtWidgets.QSystemTrayIc |
||||||
|
def reloaded(self): |
||||||
|
if self.notificationsAction.isChecked(): |
||||||
|
self.notify(escape(_("FirewallD has been reloaded."))) |
||||||
|
- self.update_active_zones() |
||||||
|
- self.update_tooltip() |
||||||
|
|
||||||
|
def default_zone_changed(self, zone): |
||||||
|
self.default_zone = zone |
||||||
|
@@ -1118,7 +1117,7 @@ Options: |
||||||
|
# reset SIGINT signal to default |
||||||
|
signal.signal(signal.SIGINT, signal.SIG_DFL) |
||||||
|
|
||||||
|
-app = QtWidgets.QApplication(sys.argv) |
||||||
|
+app = QtGui.QApplication(sys.argv) |
||||||
|
app.setQuitOnLastWindowClosed(False) |
||||||
|
|
||||||
|
applet = TrayApplet() |
Loading…
Reference in new issue