2015-11-25 15:22:27 +01:00

122 lines
3.4 KiB
Python

#
# This file is part of Plinth.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
"""
Plinth module to configure name services
"""
from gettext import gettext as _
import logging
from plinth import cfg
from plinth.signals import domain_added, domain_removed
SERVICES = [
('http', _('HTTP'), 80),
('https', _('HTTPS'), 443),
('ssh', _('SSH'), 22),
]
depends = ['plinth.modules.system']
domain_types = {}
domains = {}
logger = logging.getLogger(__name__)
def init():
"""Initialize the names module."""
menu = cfg.main_menu.get('system:index')
menu.add_urlname(_('Name Services'), 'glyphicon-th', 'names:index', 19)
domain_added.connect(on_domain_added)
domain_removed.connect(on_domain_removed)
def on_domain_added(sender, domain_type, name='', description='',
services=None, **kwargs):
"""Add domain to global list."""
if not domain_type:
return
domain_types[domain_type] = description
if not name:
return
if not services:
services = []
if domain_type not in domains:
# new domain_type
domains[domain_type] = {}
domains[domain_type][name] = services
logger.info('Added domain %s of type %s with services %s',
name, domain_type, str(services))
def on_domain_removed(sender, domain_type, name='', **kwargs):
"""Remove domain from global list."""
if domain_type in domains:
if name == '': # remove all domains of this type
domains[domain_type] = {}
logger.info('Removed all domains of type %s', domain_type)
elif name in domains[domain_type]:
del domains[domain_type][name]
logger.info('Removed domain %s of type %s', name, domain_type)
def get_domain_types():
"""Get list of domain_types."""
return list(domain_types.keys())
def get_description(domain_type):
"""Get description of a domain_type, if available."""
if domain_type in domain_types:
return domain_types[domain_type]
else:
return domain_type
def get_domain(domain_type):
"""
Get domain of type domain_type.
This function is meant for use with single-domain domain_types. If there is
more than one domain, any one of the domains may be returned.
"""
if domain_type in domains and len(domains[domain_type]) > 0:
return list(domains[domain_type].keys())[0]
else:
return _('Not Available')
def get_services(domain_type, domain):
"""Get list of enabled services for a domain."""
try:
return domains[domain_type][domain]
except KeyError:
# domain_type or domain not registered
return []
def get_services_status(domain_type, domain):
"""Get list of whether each service is enabled for a domain."""
enabled = get_services(domain_type, domain)
return [service[0] in enabled for service in SERVICES]