#!/usr/bin/python3
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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 sys
from cloudutils.syscfg import sysConfigFactory
from cloudutils.utilities import initLoging, UnknownSystemException
from cloudutils.cloudException import CloudRuntimeException, CloudInternalException
from cloudutils.globalEnv import globalEnv
from cloudutils.serviceConfigServer import cloudManagementConfig
from optparse import OptionParser
if __name__ == '__main__':
    initLoging("@MSLOGDIR@/setupManagement.log")
    glbEnv = globalEnv()

    parser = OptionParser()
    parser.add_option("--https", action="store_true", dest="https", help="Enable HTTPs connection of management server")
    parser.add_option("--tomcat7", action="store_true", dest="tomcat7", help="Depreciated option, don't use it")
    parser.add_option("--no-start", action="store_true", dest="nostart", help="Do not start management server after successful configuration")
    (options, args) = parser.parse_args()
    if options.https:
        glbEnv.svrMode = "HttpsServer"
    if options.tomcat7:
        print("The --tomcat7 option is deprecated, CloudStack now uses embedded Jetty server.")
    if options.nostart:
        glbEnv.noStart = True

    glbEnv.mode = "Server"

    print("Starting to configure CloudStack Management Server:")
    try:
        syscfg = sysConfigFactory.getSysConfigFactory(glbEnv)
    except UnknownSystemException:
        print("Error: CloudStack failed to detect your "
                "operating system. Exiting.", file=sys.stderr)
        sys.exit(1)
    try:
        syscfg.registerService(cloudManagementConfig)
        syscfg.config()
        print("CloudStack Management Server setup is Done!")
        print("Please ensure the following ports are open for the management server to function properly : 8080 8250 8443 9090")
    except (CloudRuntimeException, CloudInternalException) as e:
        print(e)
        print("Try to restore your system:")
        try:
            syscfg.restore()
        except:
            pass
