Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

provision: reload the firewall only once #1846

Open
wants to merge 6 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 4 additions & 22 deletions src/firewall.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ def firewall_allow(
ipv6_only=False,
no_upnp=False,
no_reload=False,
reload_only_if_change=False,
):
"""
Allow connections on a port
Expand Down Expand Up @@ -76,20 +75,14 @@ def firewall_allow(
"ipv6",
]

changed = False

for p in protocols:
# Iterate over IP versions to add port
for i in ipvs:
if port not in firewall[i][p]:
firewall[i][p].append(port)
changed = True
else:
ipv = "IPv%s" % i[3]
if not reload_only_if_change:
logger.warning(
m18n.n("port_already_opened", port=port, ip_version=ipv)
)
logger.warning(m18n.n("port_already_opened", port=port, ip_version=ipv))
# Add port forwarding with UPnP
if not no_upnp and port not in firewall["uPnP"][p]:
firewall["uPnP"][p].append(port)
Expand All @@ -101,9 +94,7 @@ def firewall_allow(

# Update and reload firewall
_update_firewall_file(firewall)
if (not reload_only_if_change and not no_reload) or (
reload_only_if_change and changed
):
if not no_reload:
return firewall_reload()


Expand All @@ -114,7 +105,6 @@ def firewall_disallow(
ipv6_only=False,
upnp_only=False,
no_reload=False,
reload_only_if_change=False,
):
"""
Disallow connections on a port
Expand Down Expand Up @@ -159,20 +149,14 @@ def firewall_disallow(
elif upnp_only:
ipvs = []

changed = False

for p in protocols:
# Iterate over IP versions to remove port
for i in ipvs:
if port in firewall[i][p]:
firewall[i][p].remove(port)
changed = True
else:
ipv = "IPv%s" % i[3]
if not reload_only_if_change:
logger.warning(
m18n.n("port_already_closed", port=port, ip_version=ipv)
)
logger.warning(m18n.n("port_already_closed", port=port, ip_version=ipv))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ugh actually we probably want to have an option to disable this warning, otherwise everytime a port is not to be "exposed" (= the vast majority of the apps ?), yunohost will display a warning during install/upgrade/... when provision ports

Similar stuff for port_already_open too

# Remove port forwarding with UPnP
if upnp and port in firewall["uPnP"][p]:
firewall["uPnP"][p].remove(port)
Expand All @@ -182,9 +166,7 @@ def firewall_disallow(

# Update and reload firewall
_update_firewall_file(firewall)
if (not reload_only_if_change and not no_reload) or (
reload_only_if_change and changed
):
if not no_reload:
return firewall_reload()


Expand Down
29 changes: 20 additions & 9 deletions src/utils/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -1291,7 +1291,14 @@ def _port_is_used(self, port):
return used_by_process or used_by_app or used_by_self_provisioning

def provision_or_update(self, context: Dict = {}):
from yunohost.firewall import firewall_allow, firewall_disallow
from yunohost.firewall import (
firewall_allow,
firewall_disallow,
firewall_list,
firewall_reload,
)

previous_ports = firewall_list(raw=True)

for name, infos in self.ports.items():
setting_name = f"port_{name}" if name != "main" else "port"
Expand Down Expand Up @@ -1322,23 +1329,27 @@ def provision_or_update(self, context: Dict = {}):
self.set_setting(setting_name, port_value)

if infos["exposed"]:
firewall_allow(infos["exposed"], port_value, reload_only_if_change=True)
firewall_allow(infos["exposed"], port_value, no_reload=True)
else:
firewall_disallow(
infos["exposed"], port_value, reload_only_if_change=True
)
firewall_disallow(infos["exposed"], port_value, no_reload=True)

if firewall_list(raw=True) != previous_ports:
firewall_reload()

def deprovision(self, context: Dict = {}):
from yunohost.firewall import firewall_disallow
from yunohost.firewall import firewall_disallow, firewall_list, firewall_reload

previous_ports = firewall_list(raw=True)

for name, infos in self.ports.items():
setting_name = f"port_{name}" if name != "main" else "port"
value = self.get_setting(setting_name)
self.delete_setting(setting_name)
if value and str(value).strip():
firewall_disallow(
infos["exposed"], int(value), reload_only_if_change=True
)
firewall_disallow(infos["exposed"], int(value), no_reload=True)

if firewall_list(raw=True) != previous_ports:
firewall_reload()


class DatabaseAppResource(AppResource):
Expand Down
Loading