<commit_before># -*- coding: utf-8 -*-

""" License

    Copyright (C) 2013 YunoHost

    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

"""

""" yunohost_service.py

    Manage services
"""
import yaml
import glob
import subprocess
import os.path
from yunohost import YunoHostError, win_msg


def service_start(names):
    """
    Start one or more services

    Keyword argument:
        names -- Services name to start

    """
    for name in names:
        if _run_service_command('start', name):
            win_msg(_("'%s' service started") % name)
        else:
            raise YunoHostError(1, _("Service starting failed for '%s'") % name)


def service_stop(names):
    """
    Stop one or more services

    Keyword argument:
        name -- Services name to stop

    """
    for name in names:
        if _run_service_command('stop', name):
            win_msg(_("'%s' service stopped") % name)
        else:
            raise YunoHostError(1, _("Service stopping failed for '%s'") % name)


def service_enable(names):
    """
    Enable one or more services

    Keyword argument:
        names -- Services name to enable

    """
    for name in names:
        if _run_service_command('enable', name):
            win_msg(_("'%s' service enabled") % name)
        else:
            raise YunoHostError(1, _("Service enabling failed for '%s'") % name)


def service_disable(names):
    """
    Disable one or more services

    Keyword argument:
        names -- Services name to disable

    """
    for name in names:
        if _run_service_command('disable', name):
            win_msg(_("'%s' service disabled") % name)
        else:
            raise YunoHostError(1, _("Service disabling failed for '%s'") % name)


def service_status(names=None):
    """
    Show status information about one or more services (all by default)

    Keyword argument:
        names -- Services name to show

    """
    services = _get_services()
    check_names = True
    result = {}

    if names is None or len(names) == 0:
        names = services.keys()
        check_names = False

    for name in names:
        if check_names and name not in services.keys():
            raise YunoHostError(1, _("Unknown service '%s'") % name)

        status = None
        if services[name]['status'] == 'service':
            status = 'service %s status' % name
        else:
            status = str(services[name]['status'])

        runlevel = 5
        if 'runlevel' in services[name].keys():
            runlevel = int(services[name]['runlevel'])

        result[name] = { 'status': 'unknown', 'loaded': 'unknown' }

        # Retrieve service status
        try:
            ret = subprocess.check_output(status.split(), stderr=subprocess.STDOUT)
        except subprocess.CalledProcessError as e:
            # TODO: log error
            result[name]['status'] = _("inactive")
        else:
            result[name]['status'] = _("running")

        # Retrieve service loading
        rc_path = glob.glob("/etc/rc%d.d/S[0-9][0-9]%s" % (runlevel, name))
        if len(rc_path) == 1 and os.path.islink(rc_path[0]):
            result[name]['loaded'] = _("enabled")
        elif os.path.isfile("/etc/init.d/%s" % name):
            result[name]['loaded'] = _("disabled")
        else:
            result[name]['loaded'] = _("not-found")

    return result


def _run_service_command(action, service):
    """
    Run services management command (start, stop,  enable, disable)

    Keyword argument:
        service -- Service name
        action -- Action to perform

    """
    if service not in _get_services().keys():
        raise YunoHostError(1, _("Unknown service '%s'") % service)

    cmd = None
    if action in ['start', 'stop']:
        cmd = 'service %s %s' % (service, action)
    elif action in ['enable', 'disable']:
        arg = 'defaults' if action == 'enable' else 'remove'
        cmd = 'update-rc.d %s %s' % (service, arg)
    else:
        raise YunoHostError(1, _("Unknown action '%s'") % service)

    try:
        ret = subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT)
    except subprocess.CalledProcessError as e:
        # TODO: log error instead
        if os.isatty(1):
            err = e.output.rstrip()
            print(_("'%s' has returned:\n%s") % (' '.join(e.cmd), err))
            return False

    return True


def _get_services():
    """
    Get a dict of managed services with their parameters

    """
    with open('process.yml', 'r') as f:
        services = yaml.load(f)
    return services<commit_msg>Change process.yml name and location<commit_after># -*- coding: utf-8 -*-

""" License

    Copyright (C) 2013 YunoHost

    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

"""

""" yunohost_service.py

    Manage services
"""
import yaml
import glob
import subprocess
import os.path
from yunohost import YunoHostError, win_msg


def service_start(names):
    """
    Start one or more services

    Keyword argument:
        names -- Services name to start

    """
    for name in names:
        if _run_service_command('start', name):
            win_msg(_("'%s' service started") % name)
        else:
            raise YunoHostError(1, _("Service starting failed for '%s'") % name)


def service_stop(names):
    """
    Stop one or more services

    Keyword argument:
        name -- Services name to stop

    """
    for name in names:
        if _run_service_command('stop', name):
            win_msg(_("'%s' service stopped") % name)
        else:
            raise YunoHostError(1, _("Service stopping failed for '%s'") % name)


def service_enable(names):
    """
    Enable one or more services

    Keyword argument:
        names -- Services name to enable

    """
    for name in names:
        if _run_service_command('enable', name):
            win_msg(_("'%s' service enabled") % name)
        else:
            raise YunoHostError(1, _("Service enabling failed for '%s'") % name)


def service_disable(names):
    """
    Disable one or more services

    Keyword argument:
        names -- Services name to disable

    """
    for name in names:
        if _run_service_command('disable', name):
            win_msg(_("'%s' service disabled") % name)
        else:
            raise YunoHostError(1, _("Service disabling failed for '%s'") % name)


def service_status(names=None):
    """
    Show status information about one or more services (all by default)

    Keyword argument:
        names -- Services name to show

    """
    services = _get_services()
    check_names = True
    result = {}

    if names is None or len(names) == 0:
        names = services.keys()
        check_names = False

    for name in names:
        if check_names and name not in services.keys():
            raise YunoHostError(1, _("Unknown service '%s'") % name)

        status = None
        if services[name]['status'] == 'service':
            status = 'service %s status' % name
        else:
            status = str(services[name]['status'])

        runlevel = 5
        if 'runlevel' in services[name].keys():
            runlevel = int(services[name]['runlevel'])

        result[name] = { 'status': 'unknown', 'loaded': 'unknown' }

        # Retrieve service status
        try:
            ret = subprocess.check_output(status.split(), stderr=subprocess.STDOUT)
        except subprocess.CalledProcessError as e:
            # TODO: log error
            result[name]['status'] = _("inactive")
        else:
            result[name]['status'] = _("running")

        # Retrieve service loading
        rc_path = glob.glob("/etc/rc%d.d/S[0-9][0-9]%s" % (runlevel, name))
        if len(rc_path) == 1 and os.path.islink(rc_path[0]):
            result[name]['loaded'] = _("enabled")
        elif os.path.isfile("/etc/init.d/%s" % name):
            result[name]['loaded'] = _("disabled")
        else:
            result[name]['loaded'] = _("not-found")

    return result


def _run_service_command(action, service):
    """
    Run services management command (start, stop,  enable, disable)

    Keyword argument:
        service -- Service name
        action -- Action to perform

    """
    if service not in _get_services().keys():
        raise YunoHostError(1, _("Unknown service '%s'") % service)

    cmd = None
    if action in ['start', 'stop']:
        cmd = 'service %s %s' % (service, action)
    elif action in ['enable', 'disable']:
        arg = 'defaults' if action == 'enable' else 'remove'
        cmd = 'update-rc.d %s %s' % (service, arg)
    else:
        raise YunoHostError(1, _("Unknown action '%s'") % service)

    try:
        ret = subprocess.check_output(cmd.split(), stderr=subprocess.STDOUT)
    except subprocess.CalledProcessError as e:
        # TODO: log error instead
        if os.isatty(1):
            err = e.output.rstrip()
            print(_("'%s' has returned:\n%s") % (' '.join(e.cmd), err))
            return False

    return True


def _get_services():
    """
    Get a dict of managed services with their parameters

    """
    with open('/etc/yunohost/services.yml', 'r') as f:
        services = yaml.load(f)
    return services
{'fraction_non_alphanumeric': 0.11646201074443592, 'fraction_numerical': 0.00422102839600921, 'mean_word_length': 2.396871945259042, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6772947', 'n_tokens_mistral': 3027, 'n_tokens_neox': 2927, 'n_words': 999}