~oddbloke/cloud-init/lp1506187

« back to all changes in this revision

Viewing changes to cloudinit/config/cc_fan.py

  • Committer: Scott Moser
  • Date: 2015-10-09 16:49:24 UTC
  • mfrom: (1147.1.1 trunk.fan)
  • Revision ID: smoser@ubuntu.com-20151009164924-1fbowe1yvww9k8i3
support configuring and installing the Ubuntu fan driver

  #cloud-config
  fan:
    config: |
      # fan 240
      10.0.0.0/8 eth0/16 dhcp
      10.0.0.0/8 eth1/16 dhcp off
      # fan 241
      241.0.0.0/8 eth0/16 dhcp
    config_path: /etc/network/fan

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# vi: ts=4 expandtab
 
2
#
 
3
#    Copyright (C) 2015 Canonical Ltd.
 
4
#
 
5
#    Author: Scott Moser <scott.moser@canonical.com>
 
6
#
 
7
#    This program is free software: you can redistribute it and/or modify
 
8
#    it under the terms of the GNU General Public License version 3, as
 
9
#    published by the Free Software Foundation.
 
10
#
 
11
#    This program is distributed in the hope that it will be useful,
 
12
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
#    GNU General Public License for more details.
 
15
#
 
16
#    You should have received a copy of the GNU General Public License
 
17
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
18
"""
 
19
fan module allows configuration of Ubuntu Fan
 
20
  https://wiki.ubuntu.com/FanNetworking
 
21
 
 
22
Example config:
 
23
  #cloud-config
 
24
  fan:
 
25
    config: |
 
26
      # fan 240
 
27
      10.0.0.0/8 eth0/16 dhcp
 
28
      10.0.0.0/8 eth1/16 dhcp off
 
29
      # fan 241
 
30
      241.0.0.0/8 eth0/16 dhcp
 
31
    config_path: /etc/network/fan
 
32
 
 
33
If cloud-init sees a 'fan' entry in cloud-config it will
 
34
 a.) write 'config_path' with the contents
 
35
 b.) install the package 'ubuntu-fan' if it is not installed
 
36
 c.) ensure the service is started (or restarted if was previously running)
 
37
"""
 
38
 
 
39
from cloudinit import log as logging
 
40
from cloudinit import util
 
41
from cloudinit.settings import PER_INSTANCE
 
42
 
 
43
LOG = logging.getLogger(__name__)
 
44
 
 
45
frequency = PER_INSTANCE
 
46
 
 
47
BUILTIN_CFG = {
 
48
    'config': None,
 
49
    'config_path': '/etc/network/fan',
 
50
}
 
51
 
 
52
 
 
53
def stop_update_start(service, config_file, content, systemd=False):
 
54
    if systemd:
 
55
        cmds = {'stop': ['systemctl', 'stop', service],
 
56
                'start': ['systemctl', 'start', service],
 
57
                'enable': ['systemctl', 'enable', service]}
 
58
    else:
 
59
        cmds = {'stop': ['service', 'stop'],
 
60
                'start': ['service', 'start']}
 
61
 
 
62
    def run(cmd, msg):
 
63
        try:
 
64
            return util.subp(cmd, capture=True)
 
65
        except util.ProcessExecutionError as e:
 
66
            LOG.warn("failed: %s (%s): %s", service, cmd, e)
 
67
            return False
 
68
 
 
69
    stop_failed = not run(cmds['stop'], msg='stop %s' % service)
 
70
    if not content.endswith('\n'):
 
71
        content += '\n'
 
72
    util.write_file(config_file, content, omode="w")
 
73
 
 
74
    ret = run(cmds['start'], msg='start %s' % service)
 
75
    if ret and stop_failed:
 
76
        LOG.warn("success: %s started", service)
 
77
 
 
78
    if 'enable' in cmds:
 
79
        ret = run(cmds['enable'], msg='enable %s' % service)
 
80
 
 
81
    return ret
 
82
 
 
83
 
 
84
def handle(name, cfg, cloud, log, args):
 
85
    cfgin = cfg.get('fan')
 
86
    if not cfgin:
 
87
        cfgin = {}
 
88
    mycfg = util.mergemanydict([cfgin, BUILTIN_CFG])
 
89
 
 
90
    if not mycfg.get('config'):
 
91
        LOG.debug("%s: no 'fan' config entry. disabling", name)
 
92
        return
 
93
 
 
94
    util.write_file(mycfg.get('config_path'), mycfg.get('config'), omode="w")
 
95
    distro = cloud.distro
 
96
    if not util.which('fanctl'):
 
97
        distro.install_packages(['ubuntu-fan'])
 
98
 
 
99
    stop_update_start(
 
100
        service='ubuntu-fan', config_file=mycfg.get('config_path'),
 
101
        content=mycfg.get('config'), systemd=distro.uses_systemd())