Skip to content

Commit

Permalink
cephadm: refactor update_firewalld
Browse files Browse the repository at this point in the history
* split into three different methods
* untangle service and port lists

This helps in making our firewall handling more dynamic.

Signed-off-by: Sebastian Wagner <sebastian.wagner@suse.com>
Co-authored-by: Juan Miguel Olmo Martínez <jolmomar@redhat.com>
  • Loading branch information
sebastian-philipp and jmolmo committed Jul 14, 2020
1 parent c3af7f4 commit 4f34181
Showing 1 changed file with 81 additions and 41 deletions.
122 changes: 81 additions & 41 deletions src/cephadm/cephadm
Expand Up @@ -2046,57 +2046,97 @@ def deploy_daemon_units(fsid, uid, gid, daemon_type, daemon_id, c,
call_throws(['systemctl', 'start', unit_name])


def update_firewalld(daemon_type):
# type: (str) -> None
if args.skip_firewalld:
return
cmd = find_executable('firewall-cmd')
if not cmd:
logger.debug('firewalld does not appear to be present')
return
(enabled, state, _) = check_unit('firewalld.service')
if not enabled:
logger.debug('firewalld.service is not enabled')
return

fw_services = []
fw_ports = []
if daemon_type == 'mon':
fw_services.append('ceph-mon')
elif daemon_type in ['mgr', 'mds', 'osd']:
fw_services.append('ceph')
if daemon_type == 'mgr':
fw_ports.append(8080) # dashboard
fw_ports.append(8443) # dashboard
fw_ports.append(9283) # mgr/prometheus exporter
elif daemon_type in Monitoring.port_map.keys():
fw_ports.extend(Monitoring.port_map[daemon_type]) # prometheus etc
elif daemon_type == NFSGanesha.daemon_type:
fw_services.append('nfs')

for svc in fw_services:
out, err, ret = call([cmd, '--permanent', '--query-service', svc])
class Firewalld(object):
def __init__(self):
# type: () -> None
self.available = self.check()

def check(self):
# type: () -> bool
self.cmd = find_executable('firewall-cmd')
if not self.cmd:
logger.debug('firewalld does not appear to be present')
return False
(enabled, state, _) = check_unit('firewalld.service')
if not enabled:
logger.debug('firewalld.service is not enabled')
return False
if state != "running":
logger.debug('firewalld.service is not running')
return False

logger.info("firewalld ready")
return True

def enable_service_for(self, daemon_type):
# type: (str) -> None
if not self.available:
logger.debug('Not possible to enable service <%s>. firewalld.service is not available' % daemon_type)
return

if daemon_type == 'mon':
svc = 'ceph-mon'
elif daemon_type in ['mgr', 'mds', 'osd']:
svc = 'ceph'
elif daemon_type == NFSGanesha.daemon_type:
svc = 'nfs'
else:
return

out, err, ret = call([self.cmd, '--permanent', '--query-service', svc], verbose_on_failure=False)
if ret:
logger.info('Enabling firewalld service %s in current zone...' % svc)
out, err, ret = call([cmd, '--permanent', '--add-service', svc])
out, err, ret = call([self.cmd, '--permanent', '--add-service', svc])
if ret:
raise RuntimeError(
'unable to add service %s to current zone: %s' % (svc, err))
else:
logger.debug('firewalld service %s is enabled in current zone' % svc)
for port in fw_ports:
tcp_port = str(port) + '/tcp'
out, err, ret = call([cmd, '--permanent', '--query-port', tcp_port])
if ret:
logger.info('Enabling firewalld port %s in current zone...' % tcp_port)
out, err, ret = call([cmd, '--permanent', '--add-port', tcp_port])

def open_ports(self, fw_ports):
# type: (List[int]) -> None
if not self.available:
logger.debug('Not possible to open ports <%s>. firewalld.service is not available' % fw_ports)
return

for port in fw_ports:
tcp_port = str(port) + '/tcp'
out, err, ret = call([self.cmd, '--permanent', '--query-port', tcp_port], verbose_on_failure=False)
if ret:
raise RuntimeError('unable to add port %s to current zone: %s' %
(tcp_port, err))
else:
logger.debug('firewalld port %s is enabled in current zone' % tcp_port)
call_throws([cmd, '--reload'])
logger.info('Enabling firewalld port %s in current zone...' % tcp_port)
out, err, ret = call([self.cmd, '--permanent', '--add-port', tcp_port])
if ret:
raise RuntimeError('unable to add port %s to current zone: %s' %
(tcp_port, err))
else:
logger.debug('firewalld port %s is enabled in current zone' % tcp_port)

def apply_rules(self):
# type: () -> None
if not self.available:
return

call_throws([self.cmd, '--reload'])


def update_firewalld(daemon_type):
# type: (str) -> None
firewall = Firewalld()

firewall.enable_service_for(daemon_type)

fw_ports = []

if daemon_type == 'mgr':
fw_ports.append(8080) # dashboard
fw_ports.append(8443) # dashboard
fw_ports.append(9283) # mgr/prometheus exporter
elif daemon_type in Monitoring.port_map.keys():
fw_ports.extend(Monitoring.port_map[daemon_type]) # prometheus etc

firewall.open_ports(fw_ports)
firewall.apply_rules()

def install_base_units(fsid):
# type: (str) -> None
Expand Down

0 comments on commit 4f34181

Please sign in to comment.