Blame cloudinit/config/cc_fan.py

Packit Service a04d08
# Copyright (C) 2015 Canonical Ltd.
Packit Service a04d08
#
Packit Service a04d08
# Author: Scott Moser <scott.moser@canonical.com>
Packit Service a04d08
#
Packit Service a04d08
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service a04d08
Packit Service a04d08
"""
Packit Service a04d08
Fan
Packit Service a04d08
---
Packit Service a04d08
**Summary:** configure ubuntu fan networking
Packit Service a04d08
Packit Service a04d08
This module installs, configures and starts the ubuntu fan network system. For
Packit Service a04d08
more information about Ubuntu Fan, see:
Packit Service a04d08
``https://wiki.ubuntu.com/FanNetworking``.
Packit Service a04d08
Packit Service a04d08
If cloud-init sees a ``fan`` entry in cloud-config it will:
Packit Service a04d08
Packit Service a04d08
    - write ``config_path`` with the contents of the ``config`` key
Packit Service a04d08
    - install the package ``ubuntu-fan`` if it is not installed
Packit Service a04d08
    - ensure the service is started (or restarted if was previously running)
Packit Service a04d08
Packit Service a04d08
**Internal name:** ``cc_fan``
Packit Service a04d08
Packit Service a04d08
**Module frequency:** per instance
Packit Service a04d08
Packit Service a04d08
**Supported distros:** ubuntu
Packit Service a04d08
Packit Service a04d08
**Config keys**::
Packit Service a04d08
Packit Service a04d08
    fan:
Packit Service a04d08
        config: |
Packit Service a04d08
            # fan 240
Packit Service a04d08
            10.0.0.0/8 eth0/16 dhcp
Packit Service a04d08
            10.0.0.0/8 eth1/16 dhcp off
Packit Service a04d08
            # fan 241
Packit Service a04d08
            241.0.0.0/8 eth0/16 dhcp
Packit Service a04d08
        config_path: /etc/network/fan
Packit Service a04d08
"""
Packit Service a04d08
Packit Service a04d08
from cloudinit import log as logging
Packit Service a04d08
from cloudinit.settings import PER_INSTANCE
Packit Service 9bfd13
from cloudinit import subp
Packit Service a04d08
from cloudinit import util
Packit Service a04d08
Packit Service a04d08
LOG = logging.getLogger(__name__)
Packit Service a04d08
Packit Service a04d08
frequency = PER_INSTANCE
Packit Service a04d08
Packit Service a04d08
BUILTIN_CFG = {
Packit Service a04d08
    'config': None,
Packit Service a04d08
    'config_path': '/etc/network/fan',
Packit Service a04d08
}
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def stop_update_start(service, config_file, content, systemd=False):
Packit Service a04d08
    if systemd:
Packit Service a04d08
        cmds = {'stop': ['systemctl', 'stop', service],
Packit Service a04d08
                'start': ['systemctl', 'start', service],
Packit Service a04d08
                'enable': ['systemctl', 'enable', service]}
Packit Service a04d08
    else:
Packit Service a04d08
        cmds = {'stop': ['service', 'stop'],
Packit Service a04d08
                'start': ['service', 'start']}
Packit Service a04d08
Packit Service a04d08
    def run(cmd, msg):
Packit Service a04d08
        try:
Packit Service 9bfd13
            return subp.subp(cmd, capture=True)
Packit Service 9bfd13
        except subp.ProcessExecutionError as e:
Packit Service a04d08
            LOG.warning("failed: %s (%s): %s", service, cmd, e)
Packit Service a04d08
            return False
Packit Service a04d08
Packit Service a04d08
    stop_failed = not run(cmds['stop'], msg='stop %s' % service)
Packit Service a04d08
    if not content.endswith('\n'):
Packit Service a04d08
        content += '\n'
Packit Service a04d08
    util.write_file(config_file, content, omode="w")
Packit Service a04d08
Packit Service a04d08
    ret = run(cmds['start'], msg='start %s' % service)
Packit Service a04d08
    if ret and stop_failed:
Packit Service a04d08
        LOG.warning("success: %s started", service)
Packit Service a04d08
Packit Service a04d08
    if 'enable' in cmds:
Packit Service a04d08
        ret = run(cmds['enable'], msg='enable %s' % service)
Packit Service a04d08
Packit Service a04d08
    return ret
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def handle(name, cfg, cloud, log, args):
Packit Service a04d08
    cfgin = cfg.get('fan')
Packit Service a04d08
    if not cfgin:
Packit Service a04d08
        cfgin = {}
Packit Service a04d08
    mycfg = util.mergemanydict([cfgin, BUILTIN_CFG])
Packit Service a04d08
Packit Service a04d08
    if not mycfg.get('config'):
Packit Service a04d08
        LOG.debug("%s: no 'fan' config entry. disabling", name)
Packit Service a04d08
        return
Packit Service a04d08
Packit Service a04d08
    util.write_file(mycfg.get('config_path'), mycfg.get('config'), omode="w")
Packit Service a04d08
    distro = cloud.distro
Packit Service 9bfd13
    if not subp.which('fanctl'):
Packit Service a04d08
        distro.install_packages(['ubuntu-fan'])
Packit Service a04d08
Packit Service a04d08
    stop_update_start(
Packit Service a04d08
        service='ubuntu-fan', config_file=mycfg.get('config_path'),
Packit Service a04d08
        content=mycfg.get('config'), systemd=distro.uses_systemd())
Packit Service a04d08
Packit Service a04d08
# vi: ts=4 expandtab