#!/usr/bin/python
# Copyright 2015, 2016, 2017, Cumulus Networks, Inc.  All rights reserved.
#
# update-sysctl --
#
# Based on the switching silicon, generate suitable defaults for
# various sysctl settings.
#

import os
import sys
import argparse
import subprocess

import cumulus.platforms
import cumulus.sysctlconfig

class ArgParseError(RuntimeError):
    pass

##################################################################
#
# MAIN
#
# Parses arguments, determines sysctl values, emits sysctl entries
#
##################################################################
if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description='Generates Cumulus sysctl configuration based on hardware platform')
    parser.add_argument('-v', '--verbose',
                        required=False,
                        action='store_true',
                        help='Verbose output')
    parser.add_argument('-o', '--output-directory',
                        required=True,
                        action='store',
                        help='Output directory for generated files [required]')

    try:
        args = parser.parse_args()
    except ArgParseError, e:
        parser.error(str(e))

    if os.path.isdir(args.output_directory) is False:
        sys.stdout.write('ERROR: Output directory does not exist: %s\n' % (args.output_directory))
        sys.exit(-1)

    try:
        platform = cumulus.platforms.probe()
    except cumulus.platforms.NoSuchPlatform, e:
        sys.stderr.write('WARNING: unknown platform: %s\n' % str(e))
        sys.exit(0)

    sc = cumulus.sysctlconfig.Config(platform, verbose=args.verbose)

    if args.verbose:
        sys.stdout.write('configuring sysctl for %s, chip %s\n' %
                         (platform, sc.platform.chip.__class__.__name__))

    autogen = ''
    autogen += '# Cumulus Linux default values, do not edit.\n'
    autogen += '# Automatically generated by %s.\n#\n' % (sys.argv[0])

    for sysctl in ['neigh', 'igmp', 'mld', 'route_nh']:
        file_path = os.path.join(args.output_directory, '%s.conf' % (sysctl))
        if args.verbose:
            sys.stdout.write('Generating %s\n' % (file_path))
        sysctl_file = open(file_path, 'w')
        sysctl_file.write(autogen)
        sysctl_file.write(sc.output(sysctl) + '\n')
        sysctl_file.close()
