2014-07-07 16:15:53 -04:00

106 lines
3.5 KiB
Python
Executable File

# -*- coding: utf-8 -*-
# Copyright 2014 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import argparse
import json
import logging
import os
import sys
import os_net_config
from os_net_config import impl_eni
from os_net_config import impl_ifcfg
from os_net_config import impl_iproute
from os_net_config import objects
def parse_opts(argv):
parser = argparse.ArgumentParser(
description='Configure host network interfaces using a JSON'
' config file format.')
parser.add_argument('-c', '--config-file', metavar='CONFIG_FILE',
help="""path to the configuration file.""",
default='/etc/os-net-config/config.json')
parser.add_argument('-p', '--provider', metavar='PROVIDER',
help="""The provider to use."""
"""One of: ifcfg, eni, iproute.""",
default=None)
parser.add_argument('--version', action='version',
version=os_net_config.__version__)
opts = parser.parse_args(argv[1:])
return opts
def main(argv=sys.argv):
opts = parse_opts(argv)
logger.info('Using config file at: %s' % opts.config_file)
iface_array = []
provider = None
if opts.provider:
if opts.provider == 'ifcfg':
provider = impl_ifcfg.IfcfgNetConfig()
elif opts.provider == 'eni':
provider = impl_eni.ENINetConfig()
elif opts.provider == 'iproute':
provider = impl_iproute.IprouteNetConfig()
else:
logger.error('Invalid provider specified.')
return 1
else:
if os.path.exists('/etc/sysconfig/network-scripts/'):
provider = impl_ifcfg.IfcfgNetConfig()
elif os.path.exists('/etc/network/'):
provider = impl_eni.ENINetConfig()
else:
logger.error('Unable to set provider for this operating system.')
return 1
if os.path.exists(opts.config_file):
with open(opts.config_file) as cf:
iface_array = json.loads(cf.read()).get("network_config")
logger.debug('network_config JSON: %s' % str(iface_array))
else:
logger.error('No config file exists at: %s' % opts.config_file)
return 1
if not isinstance(iface_array, list):
logger.error('No interfaces defined in config: %s' % opts.config_file)
return 1
for iface_json in iface_array:
obj = objects.object_from_json(iface_json)
provider.addObject(obj)
provider.apply()
return 0
LOG_FORMAT = '[%(asctime)s] [%(levelname)s] %(message)s'
DATE_FORMAT = '%Y/%m/%d %I:%M:%S %p'
def add_handler(logger, handler):
handler.setFormatter(logging.Formatter(LOG_FORMAT, datefmt=DATE_FORMAT))
logger.addHandler(handler)
logger = logging.getLogger('os-net-config')
logger.setLevel(logging.INFO)
add_handler(logger, logging.StreamHandler())
if os.geteuid() == 0:
add_handler(logger, logging.FileHandler('/var/log/os-net-config.log'))
if __name__ == '__main__':
sys.exit(main(sys.argv))