Blame cloudinit/dhclient_hook.py

Packit Service a04d08
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service a04d08
Packit Service a04d08
"""Run the dhclient hook to record network info."""
Packit Service a04d08
Packit Service a04d08
import argparse
Packit Service a04d08
import os
Packit Service a04d08
Packit Service a04d08
from cloudinit import atomic_helper
Packit Service a04d08
from cloudinit import log as logging
Packit Service a04d08
from cloudinit import stages
Packit Service a04d08
Packit Service a04d08
LOG = logging.getLogger(__name__)
Packit Service a04d08
Packit Service a04d08
NAME = "dhclient-hook"
Packit Service a04d08
UP = "up"
Packit Service a04d08
DOWN = "down"
Packit Service a04d08
EVENTS = (UP, DOWN)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def _get_hooks_dir():
Packit Service a04d08
    i = stages.Init()
Packit Service a04d08
    return os.path.join(i.paths.get_runpath(), 'dhclient.hooks')
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def _filter_env_vals(info):
Packit Service a04d08
    """Given info (os.environ), return a dictionary with
Packit Service a04d08
    lower case keys for each entry starting with DHCP4_ or new_."""
Packit Service a04d08
    new_info = {}
Packit Service a04d08
    for k, v in info.items():
Packit Service a04d08
        if k.startswith("DHCP4_") or k.startswith("new_"):
Packit Service a04d08
            key = (k.replace('DHCP4_', '').replace('new_', '')).lower()
Packit Service a04d08
            new_info[key] = v
Packit Service a04d08
    return new_info
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def run_hook(interface, event, data_d=None, env=None):
Packit Service a04d08
    if event not in EVENTS:
Packit Service a04d08
        raise ValueError("Unexpected event '%s'. Expected one of: %s" %
Packit Service a04d08
                         (event, EVENTS))
Packit Service a04d08
    if data_d is None:
Packit Service a04d08
        data_d = _get_hooks_dir()
Packit Service a04d08
    if env is None:
Packit Service a04d08
        env = os.environ
Packit Service a04d08
    hook_file = os.path.join(data_d, interface + ".json")
Packit Service a04d08
Packit Service a04d08
    if event == UP:
Packit Service a04d08
        if not os.path.exists(data_d):
Packit Service a04d08
            os.makedirs(data_d)
Packit Service a04d08
        atomic_helper.write_json(hook_file, _filter_env_vals(env))
Packit Service a04d08
        LOG.debug("Wrote dhclient options in %s", hook_file)
Packit Service a04d08
    elif event == DOWN:
Packit Service a04d08
        if os.path.exists(hook_file):
Packit Service a04d08
            os.remove(hook_file)
Packit Service a04d08
            LOG.debug("Removed dhclient options file %s", hook_file)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def get_parser(parser=None):
Packit Service a04d08
    if parser is None:
Packit Service a04d08
        parser = argparse.ArgumentParser(prog=NAME, description=__doc__)
Packit Service a04d08
    parser.add_argument(
Packit Service a04d08
        "event", help='event taken on the interface', choices=EVENTS)
Packit Service a04d08
    parser.add_argument(
Packit Service a04d08
        "interface", help='the network interface being acted upon')
Packit Service a04d08
    # cloud-init main uses 'action'
Packit Service a04d08
    parser.set_defaults(action=(NAME, handle_args))
Packit Service a04d08
    return parser
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def handle_args(name, args, data_d=None):
Packit Service a04d08
    """Handle the Namespace args.
Packit Service a04d08
    Takes 'name' as passed by cloud-init main. not used here."""
Packit Service a04d08
    return run_hook(interface=args.interface, event=args.event, data_d=data_d)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
if __name__ == '__main__':
Packit Service a04d08
    import sys
Packit Service a04d08
    parser = get_parser()
Packit Service a04d08
    args = parser.parse_args(args=sys.argv[1:])
Packit Service a04d08
    return_value = handle_args(
Packit Service a04d08
        NAME, args, data_d=os.environ.get('_CI_DHCP_HOOK_DATA_D'))
Packit Service a04d08
    if return_value:
Packit Service a04d08
        sys.exit(return_value)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
# vi: ts=4 expandtab