#!/usr/bin/python
# 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")
    (options, args) = parser.parse_args()
    if options.https:
        glbEnv.svrMode = "HttpsServer"

    glbEnv.mode = "Server"
    
    print "Starting to configure CloudStack Management Server:"
    try:
        syscfg = sysConfigFactory.getSysConfigFactory(glbEnv)
    except UnknownSystemException:
        print >>sys.stderr, ("Error: CloudStack failed to detect your "
                "operating system. Exiting.")
        sys.exit(1)
    try:
    	syscfg.registerService(cloudManagementConfig)
        syscfg.config()
        print "CloudStack Management Server setup is Done!"
    except (CloudRuntimeException, CloudInternalException), e:
        print e
        print "Try to restore your system:"
        try:
            syscfg.restore()
        except:
            pass
