You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by rl...@apache.org on 2017/11/27 20:24:24 UTC

[14/49] ambari git commit: AMBARI-22453. ambari-server setup should surface GPL software agreement (aonishuk)

AMBARI-22453. ambari-server setup should surface GPL software agreement (aonishuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/f331f86d
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/f331f86d
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/f331f86d

Branch: refs/heads/branch-feature-AMBARI-20859
Commit: f331f86d1b3d4414d3ccfe4102c1fde31b517830
Parents: 3f836c0
Author: Andrew Onishuk <ao...@hortonworks.com>
Authored: Wed Nov 22 13:11:10 2017 +0200
Committer: Andrew Onishuk <ao...@hortonworks.com>
Committed: Wed Nov 22 13:11:10 2017 +0200

----------------------------------------------------------------------
 .../ambari/server/agent/ExecutionCommand.java   |    1 +
 .../server/configuration/Configuration.java     |   12 +
 .../AmbariCustomCommandExecutionHelper.java     |    2 +
 .../internal/ClientConfigResourceProvider.java  |    2 +
 ambari-server/src/main/python/ambari-server.py  |    2 +
 .../python/ambari_server/serverConfiguration.py | 1515 ------------------
 .../main/python/ambari_server/serverSetup.py    |   21 +-
 .../AmbariManagementControllerImplTest.java     |    3 +-
 .../ClientConfigResourceProviderTest.java       |    2 +
 .../src/test/python/TestAmbariServer.py         |    5 +-
 10 files changed, 45 insertions(+), 1520 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/f331f86d/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
index e475c05..5ee4bf6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
@@ -456,6 +456,7 @@ public class ExecutionCommand extends AgentCommand {
     String PACKAGE_LIST = "package_list";
     String JDK_LOCATION = "jdk_location";
     String JAVA_HOME = "java_home";
+    String GPL_LICENSE_ACCEPTED = "gpl_license_accepted";
     String AMBARI_JAVA_HOME = "ambari_java_home";
     String AMBARI_JDK_NAME = "ambari_jdk_name";
     String AMBARI_JCE_NAME = "ambari_jce_name";

http://git-wip-us.apache.org/repos/asf/ambari/blob/f331f86d/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
index 3b2baad..a53aebd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
@@ -730,6 +730,14 @@ public class Configuration {
       "server.version.file", null);
 
   /**
+   * Whether user accepted GPL license
+   */
+  @Markdown(
+      description = "Whether user accepted GPL license.")
+  public static final ConfigurationProperty<Boolean> GPL_LICENSE_ACCEPTED = new ConfigurationProperty<>(
+      "gpl.license.accepted", false);
+
+  /**
    * The location of the JDK on the Ambari Agent hosts.
    */
   @Markdown(
@@ -5437,6 +5445,10 @@ public class Configuration {
     return NumberUtils.toInt(getProperty(VERSION_DEFINITION_READ_TIMEOUT));
   }
 
+  public Boolean getGplLicenseAccepted(){
+    return Boolean.valueOf(getProperty(GPL_LICENSE_ACCEPTED));
+  }
+
   public String getAgentStackRetryOnInstallCount(){
     return getProperty(AGENT_STACK_RETRY_COUNT);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f331f86d/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
index 9f95f7a..7c52877 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
@@ -28,6 +28,7 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_DRIVER
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.DB_NAME;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GROUP_LIST;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.HOST_SYS_PREPPED;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GPL_LICENSE_ACCEPTED;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JDK_LOCATION;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.MYSQL_JDBC_URL;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.NOT_MANAGED_HDFS_PATH_LIST;
@@ -1303,6 +1304,7 @@ public class AmbariCustomCommandExecutionHelper {
     hostLevelParams.put(HOST_SYS_PREPPED, configs.areHostsSysPrepped());
     hostLevelParams.put(AGENT_STACK_RETRY_ON_UNAVAILABILITY, configs.isAgentStackRetryOnInstallEnabled());
     hostLevelParams.put(AGENT_STACK_RETRY_COUNT, configs.getAgentStackRetryOnInstallCount());
+    hostLevelParams.put(GPL_LICENSE_ACCEPTED, configs.getGplLicenseAccepted().toString());
 
     Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
     Map<PropertyInfo, String> notManagedHdfsPathMap = configHelper.getPropertiesWithPropertyType(stackId, PropertyType.NOT_MANAGED_HDFS_PATH, cluster, desiredConfigs);

http://git-wip-us.apache.org/repos/asf/ambari/blob/f331f86d/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
index a2a49d7..993da1b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
@@ -33,6 +33,7 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_NAM
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_VERSION;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_GROUPS;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.USER_LIST;
+import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.GPL_LICENSE_ACCEPTED;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
@@ -369,6 +370,7 @@ public class ClientConfigResourceProvider extends AbstractControllerResourceProv
         hostLevelParams.putAll(managementController.getRcaParameters());
         hostLevelParams.put(AGENT_STACK_RETRY_ON_UNAVAILABILITY, configs.isAgentStackRetryOnInstallEnabled());
         hostLevelParams.put(AGENT_STACK_RETRY_COUNT, configs.getAgentStackRetryOnInstallCount());
+        hostLevelParams.put(GPL_LICENSE_ACCEPTED, configs.getGplLicenseAccepted().toString());
 
         // Write down os specific info for the service
         ServiceOsSpecific anyOs = null;

http://git-wip-us.apache.org/repos/asf/ambari/blob/f331f86d/ambari-server/src/main/python/ambari-server.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/ambari-server.py b/ambari-server/src/main/python/ambari-server.py
index 8fcde77..188910e 100755
--- a/ambari-server/src/main/python/ambari-server.py
+++ b/ambari-server/src/main/python/ambari-server.py
@@ -412,6 +412,7 @@ def init_action_parser(action, parser):
   parser.add_option('--skip-database-check', action="store_true", default=False, help="Skip database consistency check", dest="skip_database_check")
   parser.add_option('--skip-view-extraction', action="store_true", default=False, help="Skip extraction of system views", dest="skip_view_extraction")
   parser.add_option('--auto-fix-database', action="store_true", default=False, help="Automatically fix database consistency issues", dest="fix_database_consistency")
+  parser.add_option('--enable-lzo-under-gpl-license', action="store_true", default=False, help="Automatically accepts GPL license", dest="accept_gpl")
   add_parser_options('--mpack',
       default=None,
       help="Specify the path for management pack to be installed/upgraded",
@@ -490,6 +491,7 @@ def init_setup_parser_options(parser):
   other_group.add_option('--sqla-server-name', default=None, help="SQL Anywhere server name", dest="sqla_server_name")
   other_group.add_option('--sidorsname', default="sname", help="Oracle database identifier type, Service ID/Service "
                                                                "Name sid|sname", dest="sid_or_sname")
+  other_group.add_option('--enable-lzo-under-gpl-license', action="store_true", default=False, help="Automatically accepts GPL license", dest="accept_gpl")
 
   parser.add_option_group(other_group)
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/f331f86d/ambari-server/src/main/python/ambari_server/serverConfiguration.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/ambari_server/serverConfiguration.py b/ambari-server/src/main/python/ambari_server/serverConfiguration.py
deleted file mode 100644
index df89f79..0000000
--- a/ambari-server/src/main/python/ambari_server/serverConfiguration.py
+++ /dev/null
@@ -1,1515 +0,0 @@
-#!/usr/bin/env 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 datetime
-import glob
-import os
-import re
-import shutil
-import stat
-import string
-import sys
-import tempfile
-import getpass
-import ambari_server.serverClassPath
-
-from ambari_commons.exceptions import FatalException
-from ambari_commons.os_check import OSCheck, OSConst
-from ambari_commons.os_family_impl import OsFamilyImpl
-from ambari_commons.os_utils import run_os_command, search_file, set_file_permissions, parse_log4j_file
-from ambari_commons.logging_utils import get_debug_mode, print_info_msg, print_warning_msg, print_error_msg, \
-  set_debug_mode
-from ambari_server.properties import Properties
-from ambari_server.userInput import get_validated_string_input
-from ambari_server.utils import compare_versions, locate_file, on_powerpc
-from ambari_server.ambariPath import AmbariPath
-
-
-OS_VERSION = OSCheck().get_os_major_version()
-OS_TYPE = OSCheck.get_os_type()
-OS_FAMILY = OSCheck.get_os_family()
-
-PID_NAME = "ambari-server.pid"
-
-# Non-root user setup commands
-NR_USER_PROPERTY = "ambari-server.user"
-
-BLIND_PASSWORD = "*****"
-
-# Common messages
-PRESS_ENTER_MSG = "Press <enter> to continue."
-
-OS_FAMILY_PROPERTY = "server.os_family"
-OS_TYPE_PROPERTY = "server.os_type"
-
-BOOTSTRAP_DIR_PROPERTY = "bootstrap.dir"
-RECOMMENDATIONS_DIR_PROPERTY = 'recommendations.dir'
-
-AMBARI_CONF_VAR = "AMBARI_CONF_DIR"
-AMBARI_PROPERTIES_FILE = "ambari.properties"
-AMBARI_ENV_FILE = "ambari-env.sh"
-AMBARI_KRB_JAAS_LOGIN_FILE = "krb5JAASLogin.conf"
-GET_FQDN_SERVICE_URL = "server.fqdn.service.url"
-
-SERVER_OUT_FILE_KEY = "ambari.output.file.path"
-VERBOSE_OUTPUT_KEY = "ambari.output.verbose"
-
-DEBUG_MODE_KEY = "ambari.server.debug"
-SUSPEND_START_MODE_KEY = "ambari.server.debug.suspend.start"
-
-# Environment variables
-AMBARI_SERVER_LIB = "AMBARI_SERVER_LIB"
-JAVA_HOME = "JAVA_HOME"
-
-AMBARI_VERSION_VAR = "AMBARI_VERSION_VAR"
-
-# JDK
-JAVA_HOME_PROPERTY = "java.home"
-JDK_NAME_PROPERTY = "jdk.name"
-JCE_NAME_PROPERTY = "jce.name"
-JDK_DOWNLOAD_SUPPORTED_PROPERTY = "jdk.download.supported"
-JCE_DOWNLOAD_SUPPORTED_PROPERTY = "jce.download.supported"
-
-# Stack JDK
-STACK_JAVA_HOME_PROPERTY = "stack.java.home"
-STACK_JDK_NAME_PROPERTY = "stack.jdk.name"
-STACK_JCE_NAME_PROPERTY = "stack.jce.name"
-STACK_JAVA_VERSION = "stack.java.version"
-
-
-#TODO property used incorrectly in local case, it was meant to be dbms name, not postgres database name,
-# has workaround for now, as we don't need dbms name if persistence_type=local
-JDBC_DATABASE_PROPERTY = "server.jdbc.database"                 # E.g., embedded|oracle|mysql|mssql|postgres
-JDBC_DATABASE_NAME_PROPERTY = "server.jdbc.database_name"       # E.g., ambari. Not used on Windows.
-JDBC_HOSTNAME_PROPERTY = "server.jdbc.hostname"
-JDBC_PORT_PROPERTY = "server.jdbc.port"
-JDBC_POSTGRES_SCHEMA_PROPERTY = "server.jdbc.postgres.schema"   # Only for postgres, defaults to same value as DB name
-JDBC_SQLA_SERVER_NAME = "server.jdbc.sqla.server_name"
-
-JDBC_USER_NAME_PROPERTY = "server.jdbc.user.name"
-JDBC_PASSWORD_PROPERTY = "server.jdbc.user.passwd"
-JDBC_PASSWORD_FILENAME = "password.dat"
-JDBC_RCA_PASSWORD_FILENAME = "rca_password.dat"
-
-CLIENT_API_PORT_PROPERTY = "client.api.port"
-CLIENT_API_PORT = "8080"
-
-SERVER_VERSION_FILE_PATH = "server.version.file"
-
-PERSISTENCE_TYPE_PROPERTY = "server.persistence.type"
-JDBC_DRIVER_PROPERTY = "server.jdbc.driver"
-JDBC_URL_PROPERTY = "server.jdbc.url"
-
-# connection pool (age and time are in seconds)
-JDBC_CONNECTION_POOL_TYPE = "server.jdbc.connection-pool"
-JDBC_CONNECTION_POOL_ACQUISITION_SIZE = "server.jdbc.connection-pool.acquisition-size"
-JDBC_CONNECTION_POOL_MAX_AGE = "server.jdbc.connection-pool.max-age"
-JDBC_CONNECTION_POOL_MAX_IDLE_TIME = "server.jdbc.connection-pool.max-idle-time"
-JDBC_CONNECTION_POOL_MAX_IDLE_TIME_EXCESS = "server.jdbc.connection-pool.max-idle-time-excess"
-JDBC_CONNECTION_POOL_IDLE_TEST_INTERVAL = "server.jdbc.connection-pool.idle-test-interval"
-
-JDBC_RCA_DATABASE_PROPERTY = "server.jdbc.database"
-JDBC_RCA_HOSTNAME_PROPERTY = "server.jdbc.hostname"
-JDBC_RCA_PORT_PROPERTY = "server.jdbc.port"
-JDBC_RCA_SCHEMA_PROPERTY = "server.jdbc.schema"
-
-JDBC_RCA_DRIVER_PROPERTY = "server.jdbc.rca.driver"
-JDBC_RCA_URL_PROPERTY = "server.jdbc.rca.url"
-JDBC_RCA_USER_NAME_PROPERTY = "server.jdbc.rca.user.name"
-JDBC_RCA_PASSWORD_FILE_PROPERTY = "server.jdbc.rca.user.passwd"
-
-DEFAULT_DBMS_PROPERTY = "server.setup.default.dbms"
-
-JDBC_RCA_PASSWORD_ALIAS = "ambari.db.password"
-
-### # Windows-specific # ###
-
-JDBC_USE_INTEGRATED_AUTH_PROPERTY = "server.jdbc.use.integrated.auth"
-
-JDBC_RCA_USE_INTEGRATED_AUTH_PROPERTY = "server.jdbc.rca.use.integrated.auth"
-
-### # End Windows-specific # ###
-# The user which will bootstrap embedded postgres database setup by creating the default schema and ambari user.
-LOCAL_DATABASE_ADMIN_PROPERTY = "local.database.user"
-
-# resources repo configuration
-RESOURCES_DIR_PROPERTY = "resources.dir"
-
-# stack repo upgrade
-STACK_LOCATION_KEY = 'metadata.path'
-
-# LDAP security
-IS_LDAP_CONFIGURED = "ambari.ldap.isConfigured"
-LDAP_MGR_PASSWORD_ALIAS = "ambari.ldap.manager.password"
-LDAP_MGR_PASSWORD_PROPERTY = "authentication.ldap.managerPassword"
-LDAP_MGR_PASSWORD_FILENAME = "ldap-password.dat"
-LDAP_MGR_USERNAME_PROPERTY = "authentication.ldap.managerDn"
-LDAP_PRIMARY_URL_PROPERTY = "authentication.ldap.primaryUrl"
-
-# SSL truststore
-SSL_TRUSTSTORE_PASSWORD_ALIAS = "ambari.ssl.trustStore.password"
-SSL_TRUSTSTORE_PATH_PROPERTY = "ssl.trustStore.path"
-SSL_TRUSTSTORE_PASSWORD_PROPERTY = "ssl.trustStore.password"
-SSL_TRUSTSTORE_TYPE_PROPERTY = "ssl.trustStore.type"
-
-# SSL common
-SSL_API = 'api.ssl'
-SSL_API_PORT = 'client.api.ssl.port'
-DEFAULT_SSL_API_PORT = 8443
-
-# Kerberos
-CHECK_AMBARI_KRB_JAAS_CONFIGURATION_PROPERTY = "kerberos.check.jaas.configuration"
-
-# JDK
-JDK_RELEASES="java.releases"
-
-if on_powerpc():
-  JDK_RELEASES += ".ppc64le"
-
-VIEWS_DIR_PROPERTY = "views.dir"
-
-ACTIVE_INSTANCE_PROPERTY = "active.instance"
-
-# web server startup timeout
-WEB_SERVER_STARTUP_TIMEOUT = "server.startup.web.timeout"
-
-#Common setup or upgrade message
-SETUP_OR_UPGRADE_MSG = "- If this is a new setup, then run the \"ambari-server setup\" command to create the user\n" \
-                       "- If this is an upgrade of an existing setup, run the \"ambari-server upgrade\" command.\n" \
-                       "Refer to the Ambari documentation for more information on setup and upgrade."
-
-DEFAULT_DB_NAME = "ambari"
-
-SECURITY_KEYS_DIR = "security.server.keys_dir"
-EXTENSION_PATH_PROPERTY = 'extensions.path'
-COMMON_SERVICES_PATH_PROPERTY = 'common.services.path'
-MPACKS_STAGING_PATH_PROPERTY = 'mpacks.staging.path'
-WEBAPP_DIR_PROPERTY = 'webapp.dir'
-SHARED_RESOURCES_DIR = 'shared.resources.dir'
-BOOTSTRAP_SCRIPT = 'bootstrap.script'
-CUSTOM_ACTION_DEFINITIONS = 'custom.action.definitions'
-BOOTSTRAP_SETUP_AGENT_SCRIPT = 'bootstrap.setup_agent.script'
-STACKADVISOR_SCRIPT = 'stackadvisor.script'
-PID_DIR_PROPERTY = 'pid.dir'
-SERVER_TMP_DIR_PROPERTY = "server.tmp.dir"
-REQUIRED_PROPERTIES = [OS_FAMILY_PROPERTY, OS_TYPE_PROPERTY, COMMON_SERVICES_PATH_PROPERTY, SERVER_VERSION_FILE_PATH,
-                       WEBAPP_DIR_PROPERTY, STACK_LOCATION_KEY, SECURITY_KEYS_DIR, JDBC_DATABASE_NAME_PROPERTY,
-                       NR_USER_PROPERTY, JAVA_HOME_PROPERTY, JDBC_PASSWORD_PROPERTY, SHARED_RESOURCES_DIR,
-                       JDBC_USER_NAME_PROPERTY, BOOTSTRAP_SCRIPT, RESOURCES_DIR_PROPERTY, CUSTOM_ACTION_DEFINITIONS,
-                       BOOTSTRAP_SETUP_AGENT_SCRIPT, STACKADVISOR_SCRIPT, BOOTSTRAP_DIR_PROPERTY, PID_DIR_PROPERTY,
-                       MPACKS_STAGING_PATH_PROPERTY]
-
-# if these properties are available 'ambari-server setup -s' is not triggered again.
-SETUP_DONE_PROPERTIES = [OS_FAMILY_PROPERTY, OS_TYPE_PROPERTY, JDK_NAME_PROPERTY, JDBC_DATABASE_PROPERTY,
-                         NR_USER_PROPERTY, PERSISTENCE_TYPE_PROPERTY
-]
-
-def get_default_views_dir():
-  return AmbariPath.get("/var/lib/ambari-server/resources/views")
-
-def get_conf_dir():
-  try:
-    conf_dir = os.environ[AMBARI_CONF_VAR]
-    return conf_dir
-  except KeyError:
-    default_conf_dir = AmbariPath.get("/etc/ambari-server/conf")
-    print_info_msg("{0} is not set, using default {1}".format(AMBARI_CONF_VAR, default_conf_dir))
-    return default_conf_dir
-
-def find_properties_file():
-  conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir())
-  if conf_file is None:
-    err = 'File %s not found in search path $%s: %s' % (AMBARI_PROPERTIES_FILE,
-          AMBARI_CONF_VAR, get_conf_dir())
-    print_error_msg (err)
-    raise FatalException(1, err)
-  else:
-    print_info_msg('Loading properties from {0}'.format(conf_file))
-  return conf_file
-
-# Load ambari properties and return dict with values
-def get_ambari_properties():
-  conf_file = find_properties_file()
-
-  # Try to read ambari properties file. It is OK to fail.
-  # Return -1 on failure.
-  properties = None
-  try:
-    properties = Properties()
-    with open(conf_file) as hfR:
-      properties.load(hfR)
-  except (Exception), e:
-    print_error_msg ('Could not read "%s": %s' % (conf_file, str(e)))
-    return -1
-
-  # Try to replace $ROOT with the value from the OS environment.
-  # OK to fail. Just print the exception and return the properties
-  # dictionary read above
-  try:
-    root_env = 'ROOT'
-    if root_env in os.environ:
-      root = os.environ["ROOT"].rstrip("/")
-    else:
-      root = ''
-
-    for k,v in properties.iteritems():
-      properties.__dict__[k] = v.replace("$ROOT", root)
-      properties._props[k] = v.replace("$ROOT", root)
-  except (Exception), e:
-    print_error_msg ('Could not replace %s in "%s": %s' %(conf_file, root_env, str(e)))
-  return properties
-
-class ServerDatabaseType(object):
-  internal = 0
-  remote = 1
-
-
-class ServerDatabaseEntry(object):
-  def __init__(self, name, title, db_type, aliases=None):
-    """
-    :type name str
-    :type title str
-    :type db_type int
-    :type aliases list
-    """
-    self.__name = name
-    self.__title = title
-    self.__type = db_type
-    if aliases is None:
-      aliases = []
-
-    self.__aliases = aliases
-
-  @property
-  def name(self):
-    return self.__name
-
-  @property
-  def title(self):
-    return self.__title
-
-  @property
-  def dbtype(self):
-    return self.__type
-
-  def __str__(self):
-    return self.name
-
-  def __eq__(self, other):
-    if other is None:
-      return False
-
-    if isinstance(other, ServerDatabaseEntry):
-      return self.name == other.name and self.dbtype == other.dbtype
-    elif isinstance(other, str):
-      return self.name == other or other in self.__aliases
-
-    raise RuntimeError("Not compatible type")
-
-
-class ServerDatabases(object):
-  postgres = ServerDatabaseEntry("postgres", "Postgres", ServerDatabaseType.remote)
-  oracle = ServerDatabaseEntry("oracle", "Oracle", ServerDatabaseType.remote)
-  mysql = ServerDatabaseEntry("mysql", "MySQL", ServerDatabaseType.remote)
-  mssql = ServerDatabaseEntry("mssql", "MSSQL", ServerDatabaseType.remote)
-  derby = ServerDatabaseEntry("derby", "Derby", ServerDatabaseType.remote)
-  sqlanywhere = ServerDatabaseEntry("sqlanywhere", "SQL Anywhere", ServerDatabaseType.remote)
-  postgres_internal = ServerDatabaseEntry("postgres", "Embedded Postgres", ServerDatabaseType.internal, aliases=['embedded'])
-
-  @staticmethod
-  def databases():
-    props = ServerDatabases.__dict__
-    r_props = []
-    for p in props:
-      if isinstance(props[p], ServerDatabaseEntry):
-        r_props.append(props[p].name)
-
-    return set(r_props)
-
-  @staticmethod
-  def match(name):
-    """
-    :type name str
-    :rtype ServerDatabaseEntry
-    """
-    props = ServerDatabases.__dict__
-
-    for p in props:
-      if isinstance(props[p], ServerDatabaseEntry):
-        if name == props[p]:
-          return props[p]
-
-    return None
-
-class ServerConfigDefaults(object):
-  def __init__(self):
-    properties = get_ambari_properties()
-    if properties == -1:
-      print_error_msg("Error getting ambari properties")
-  
-    self.JAVA_SHARE_PATH = "/usr/share/java"
-    self.SHARE_PATH = "/usr/share"
-    self.OUT_DIR = parse_log4j_file(get_conf_dir() + "/log4j.properties")['ambari.log.dir'].replace("//", "/")
-    self.SERVER_OUT_FILE = os.path.join(self.OUT_DIR, "ambari-server.out")
-    self.SERVER_LOG_FILE = os.path.join(self.OUT_DIR, "ambari-server.log")
-    self.DB_CHECK_LOG = os.path.join(self.OUT_DIR, "ambari-server-check-database.log")
-    self.ROOT_FS_PATH = os.sep
-
-    self.JDK_INSTALL_DIR = ""
-    self.JDK_SEARCH_PATTERN = ""
-    self.JAVA_EXE_SUBPATH = ""
-    self.JDK_SECURITY_DIR = os.path.join("jre", "lib", "security")
-    self.SERVER_RESOURCES_DIR = ""
-
-    # Configuration defaults
-    self.DEFAULT_CONF_DIR = ""
-    if properties == -1:
-      self.PID_DIR = AmbariPath.get(os.sep + os.path.join("var", "run", "ambari-server"))
-      self.BOOTSTRAP_DIR = AmbariPath.get(os.sep + os.path.join("var", "run", "ambari-server", "bootstrap"))
-      self.RECOMMENDATIONS_DIR = AmbariPath.get(os.sep + os.path.join("var", "run", "ambari-server", "stack-recommendations"))
-    else:
-      self.PID_DIR = properties.get_property(PID_DIR_PROPERTY)
-      self.BOOTSTRAP_DIR = properties.get_property(BOOTSTRAP_DIR_PROPERTY)
-      self.RECOMMENDATIONS_DIR = properties.get_property(RECOMMENDATIONS_DIR_PROPERTY)
-    
-    # this directories should be pre-created by user and be writable.
-    self.check_if_directories_writable([self.OUT_DIR, self.PID_DIR])
-    
-    self.DEFAULT_LIBS_DIR = ""
-    self.DEFAULT_VLIBS_DIR = ""
-
-    self.AMBARI_PROPERTIES_BACKUP_FILE = ""
-    self.AMBARI_ENV_BACKUP_FILE = ""
-    self.AMBARI_KRB_JAAS_LOGIN_BACKUP_FILE = ""
-
-    # ownership/permissions mapping
-    # path - permissions - user - group - recursive
-    # Rules are executed in the same order as they are listed
-    # {0} in user/group will be replaced by customized ambari-server username
-    self.NR_ADJUST_OWNERSHIP_LIST = []
-    self.NR_CHANGE_OWNERSHIP_LIST = []
-    self.NR_USERADD_CMD = ""
-
-    self.MASTER_KEY_FILE_PERMISSIONS = "640"
-    self.CREDENTIALS_STORE_FILE_PERMISSIONS = "640"
-    self.TRUST_STORE_LOCATION_PERMISSIONS = "640"
-
-    self.DEFAULT_DB_NAME = "ambari"
-
-    self.STACK_LOCATION_DEFAULT = ""
-    self.EXTENSION_LOCATION_DEFAULT = ""
-    self.COMMON_SERVICES_LOCATION_DEFAULT = ""
-    self.MPACKS_STAGING_LOCATION_DEFAULT = ""
-    self.SERVER_TMP_DIR_DEFAULT = ""
-    self.DASHBOARD_DIRNAME = "dashboards"
-
-    self.DEFAULT_VIEWS_DIR = ""
-
-    #keytool commands
-    self.keytool_bin_subpath = ""
-
-    #Standard messages
-    self.MESSAGE_SERVER_RUNNING_AS_ROOT = ""
-    self.MESSAGE_WARN_SETUP_NOT_ROOT = ""
-    self.MESSAGE_ERROR_RESET_NOT_ROOT = ""
-    self.MESSAGE_ERROR_UPGRADE_NOT_ROOT = ""
-    self.MESSAGE_CHECK_FIREWALL = ""
-    
-  def check_if_directories_writable(self, directories):
-    for directory in directories:
-      if not os.path.isdir(directory):
-        try:
-          os.makedirs(directory, 0755)
-        except Exception as ex:
-          # permission denied here is expected when ambari runs as non-root
-          print_error_msg("Could not create {0}. Reason: {1}".format(directory, str(ex)))
-      
-      if not os.path.isdir(directory) or not os.access(directory, os.W_OK):
-        raise FatalException(-1, "Unable to access {0} directory. Confirm the directory is created and is writable by Ambari Server user account '{1}'".format(directory, getpass.getuser()))
-
-@OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY)
-class ServerConfigDefaultsWindows(ServerConfigDefaults):
-  def __init__(self):
-    super(ServerConfigDefaultsWindows, self).__init__()
-    self.JDK_INSTALL_DIR = "C:\\"
-    self.JDK_SEARCH_PATTERN = "j[2se|dk|re]*"
-    self.JAVA_EXE_SUBPATH = "bin\\java.exe"
-
-    # Configuration defaults
-    self.DEFAULT_CONF_DIR = "conf"
-    self.DEFAULT_LIBS_DIR = "lib"
-
-    self.AMBARI_PROPERTIES_BACKUP_FILE = "ambari.properties.backup"
-    self.AMBARI_KRB_JAAS_LOGIN_BACKUP_FILE = ""  # ToDo: should be adjusted later
-    # ownership/permissions mapping
-    # path - permissions - user - group - recursive
-    # Rules are executed in the same order as they are listed
-    # {0} in user/group will be replaced by customized ambari-server username
-    # The permissions are icacls
-    self.NR_ADJUST_OWNERSHIP_LIST = [
-      (self.OUT_DIR, "M", "{0}", True),  #0110-0100-0100 rw-r-r
-      (self.OUT_DIR, "F", "{0}", False), #0111-0101-0101 rwx-rx-rx
-      (self.PID_DIR, "M", "{0}", True),
-      (self.PID_DIR, "F", "{0}", False),
-      ("bootstrap", "F", "{0}", False),
-      ("ambari-env.cmd", "F", "{0}", False),
-      ("keystore", "M", "{0}", True),
-      ("keystore", "F", "{0}", False),
-      ("keystore\\db", "700", "{0}", False),
-      ("keystore\\db\\newcerts", "700", "{0}", False),
-      ("resources\\stacks", "755", "{0}", True),
-      ("resources\\custom_actions", "755", "{0}", True),
-      ("conf", "644", "{0}", True),
-      ("conf", "755", "{0}", False),
-      ("conf\\password.dat", "640", "{0}", False),
-      # Also, /etc/ambari-server/conf/password.dat
-      # is generated later at store_password_file
-    ]
-    self.NR_USERADD_CMD = "cmd /C net user {0} {1} /ADD"
-
-    self.SERVER_RESOURCES_DIR = "resources"
-    self.STACK_LOCATION_DEFAULT = "resources\\stacks"
-    self.EXTENSION_LOCATION_DEFAULT = "resources\\extensions"
-    self.COMMON_SERVICES_LOCATION_DEFAULT = "resources\\common-services"
-    self.MPACKS_STAGING_LOCATION_DEFAULT = "resources\\mpacks"
-    self.SERVER_TMP_DIR_DEFAULT = "data\\tmp"
-
-    self.DEFAULT_VIEWS_DIR = "resources\\views"
-
-    #keytool commands
-    self.keytool_bin_subpath = "bin\\keytool.exe"
-
-    #Standard messages
-    self.MESSAGE_SERVER_RUNNING_AS_ROOT = "Ambari Server running with 'root' privileges."
-    self.MESSAGE_WARN_SETUP_NOT_ROOT = "Ambari-server setup is run with root-level privileges, passwordless sudo access for some commands commands may be required"
-    self.MESSAGE_ERROR_RESET_NOT_ROOT = "Ambari-server reset must be run with administrator-level privileges"
-    self.MESSAGE_ERROR_UPGRADE_NOT_ROOT = "Ambari-server upgrade must be run with administrator-level privileges"
-    self.MESSAGE_CHECK_FIREWALL = "Checking firewall status..."
-
-@OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT)
-class ServerConfigDefaultsLinux(ServerConfigDefaults):
-  def __init__(self):
-    super(ServerConfigDefaultsLinux, self).__init__()
-    # JDK
-    self.JDK_INSTALL_DIR = AmbariPath.get("/usr/jdk64")
-    self.JDK_SEARCH_PATTERN = "jdk*"
-    self.JAVA_EXE_SUBPATH = "bin/java"
-
-    # Configuration defaults
-    self.DEFAULT_CONF_DIR = AmbariPath.get("/etc/ambari-server/conf")
-    self.DEFAULT_LIBS_DIR = AmbariPath.get("/usr/lib/ambari-server")
-    self.DEFAULT_VLIBS_DIR = AmbariPath.get("/var/lib/ambari-server")
-
-    self.AMBARI_PROPERTIES_BACKUP_FILE = "ambari.properties.rpmsave"
-    self.AMBARI_ENV_BACKUP_FILE = "ambari-env.sh.rpmsave"
-    self.AMBARI_KRB_JAAS_LOGIN_BACKUP_FILE = "krb5JAASLogin.conf.rpmsave"
-    # ownership/permissions mapping
-    # path - permissions - user - group - recursive
-    # Rules are executed in the same order as they are listed
-    # {0} in user/group will be replaced by customized ambari-server username
-    self.NR_ADJUST_OWNERSHIP_LIST = [
-      (self.OUT_DIR + "/*", "644", "{0}", True),
-      (self.OUT_DIR, "755", "{0}", False),
-      (self.PID_DIR + "/*", "644", "{0}", True),
-      (self.PID_DIR, "755", "{0}", False),
-      (self.BOOTSTRAP_DIR, "755", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/ambari-env.sh"), "700", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/ambari-sudo.sh"), "700", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/keys/*"), "600", "{0}", True),
-      (AmbariPath.get("/var/lib/ambari-server/keys/"), "700", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/keys/db/"), "700", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/keys/db/newcerts/"), "700", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/keys/.ssh"), "700", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/resources/common-services/"), "755", "{0}", True),
-      (AmbariPath.get("/var/lib/ambari-server/resources/stacks/"), "755", "{0}", True),
-      (AmbariPath.get("/var/lib/ambari-server/resources/extensions/"), "755", "{0}", True),
-      (AmbariPath.get("/var/lib/ambari-server/resources/dashboards/"), "755", "{0}", True),
-      (AmbariPath.get("/var/lib/ambari-server/resources/mpacks/"), "755", "{0}", True),
-      (AmbariPath.get("/var/lib/ambari-server/resources/custom_actions/"), "755", "{0}", True),
-      (AmbariPath.get("/var/lib/ambari-server/resources/host_scripts/"), "755", "{0}", True),
-      (AmbariPath.get("/var/lib/ambari-server/resources/views/*"), "644", "{0}", True),
-      (AmbariPath.get("/var/lib/ambari-server/resources/views/"), "755", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/resources/views/work/"), "755", "{0}", True),
-      (AmbariPath.get("/etc/ambari-server/conf/*"), "644", "{0}", True),
-      (AmbariPath.get("/etc/ambari-server/conf/"), "755", "{0}", False),
-      (AmbariPath.get("/etc/ambari-server/conf/password.dat"), "640", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/keys/pass.txt"), "600", "{0}", False),
-      (AmbariPath.get("/etc/ambari-server/conf/ldap-password.dat"), "640", "{0}", False),
-      (self.RECOMMENDATIONS_DIR, "744", "{0}", True),
-      (self.RECOMMENDATIONS_DIR, "755", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/resources/data/"), "644", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/resources/data/"), "755", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/data/tmp/*"), "644", "{0}", True),
-      (AmbariPath.get("/var/lib/ambari-server/data/tmp/"), "755", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/data/cache/"), "600", "{0}", True),
-      (AmbariPath.get("/var/lib/ambari-server/data/cache/"), "700", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/resources/common-services/STORM/0.9.1/package/files/wordCount.jar"), "644", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/resources/stacks/HDP/2.1.GlusterFS/services/STORM/package/files/wordCount.jar"), "644", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/resources/stack-hooks/before-START/files/fast-hdfs-resource.jar"), "644", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/resources/stacks/HDP/2.1/services/SMARTSENSE/package/files/view/smartsense-ambari-view-1.4.0.0.60.jar"), "644", "{0}", False),
-      (AmbariPath.get("/var/lib/ambari-server/resources/stacks/HDP/3.0/hooks/before-START/files/fast-hdfs-resource.jar"), "644", "{0}", False),
-      # Also, /etc/ambari-server/conf/password.dat
-      # is generated later at store_password_file
-    ]
-    self.NR_CHANGE_OWNERSHIP_LIST = [
-      (AmbariPath.get("/var/lib/ambari-server"), "{0}", True),
-      (AmbariPath.get("/usr/lib/ambari-server"), "{0}", True),
-      (self.OUT_DIR, "{0}", True),
-      (self.PID_DIR, "{0}", True),
-      (AmbariPath.get("/etc/ambari-server"), "{0}", True),
-    ]
-    self.NR_USERADD_CMD = 'useradd -M --comment "{1}" ' \
-                 '--shell %s ' % locate_file('nologin', '/sbin') + ' -d ' + AmbariPath.get('/var/lib/ambari-server/keys/') + ' {0}'
-
-    self.SERVER_RESOURCES_DIR = AmbariPath.get("/var/lib/ambari-server/resources")
-    self.STACK_LOCATION_DEFAULT = AmbariPath.get("/var/lib/ambari-server/resources/stacks")
-    self.EXTENSION_LOCATION_DEFAULT = AmbariPath.get("/var/lib/ambari-server/resources/extensions")
-    self.COMMON_SERVICES_LOCATION_DEFAULT = AmbariPath.get("/var/lib/ambari-server/resources/common-services")
-    self.MPACKS_STAGING_LOCATION_DEFAULT = AmbariPath.get("/var/lib/ambari-server/resources/mpacks")
-    self.SERVER_TMP_DIR_DEFAULT = AmbariPath.get("/var/lib/ambari-server/data/tmp")
-
-    self.DEFAULT_VIEWS_DIR = AmbariPath.get("/var/lib/ambari-server/resources/views")
-
-    #keytool commands
-    self.keytool_bin_subpath = "bin/keytool"
-
-    #Standard messages
-    self.MESSAGE_SERVER_RUNNING_AS_ROOT = "Ambari Server running with administrator privileges."
-    self.MESSAGE_WARN_SETUP_NOT_ROOT = "Ambari-server setup is run with root-level privileges, passwordless sudo access for some commands commands may be required"
-    self.MESSAGE_ERROR_RESET_NOT_ROOT = "Ambari-server reset should be run with root-level privileges"
-    self.MESSAGE_ERROR_UPGRADE_NOT_ROOT = "Ambari-server upgrade must be run with root-level privileges"
-    self.MESSAGE_CHECK_FIREWALL = "Checking firewall status..."
-
-configDefaults = ServerConfigDefaults()
-
-# Security
-SECURITY_MASTER_KEY_LOCATION = "security.master.key.location"
-SECURITY_KEY_IS_PERSISTED = "security.master.key.ispersisted"
-SECURITY_KEY_ENV_VAR_NAME = "AMBARI_SECURITY_MASTER_KEY"
-SECURITY_MASTER_KEY_FILENAME = "master"
-SECURITY_IS_ENCRYPTION_ENABLED = "security.passwords.encryption.enabled"
-SECURITY_KERBEROS_JASS_FILENAME = "krb5JAASLogin.conf"
-
-SECURITY_PROVIDER_GET_CMD = "{0} -cp {1} " + \
-                            "org.apache.ambari.server.security.encryption" + \
-                            ".CredentialProvider GET {2} {3} {4} " + \
-                            "> " + configDefaults.SERVER_OUT_FILE + " 2>&1"
-
-SECURITY_PROVIDER_PUT_CMD = "{0} -cp {1} " + \
-                            "org.apache.ambari.server.security.encryption" + \
-                            ".CredentialProvider PUT {2} {3} {4} " + \
-                            "> " + configDefaults.SERVER_OUT_FILE + " 2>&1"
-
-SECURITY_PROVIDER_KEY_CMD = "{0} -cp {1} " + \
-                            "org.apache.ambari.server.security.encryption" + \
-                            ".MasterKeyServiceImpl {2} {3} {4} " + \
-                            "> " + configDefaults.SERVER_OUT_FILE + " 2>&1"
-
-
-
-def read_ambari_user():
-  '''
-  Reads ambari user from properties file
-  '''
-  properties = get_ambari_properties()
-  if properties != -1:
-    user = properties[NR_USER_PROPERTY]
-    if user:
-      return user
-  return None
-
-def get_is_active_instance():
-  # active.instance, if missing, will be considered to be true;
-  # if present, it should be explicitly set to "true" to set this as the active instance;
-  # any other value will be taken as a "false"
-  properties = get_ambari_properties()
-  # Get the value of active.instance.
-  active_instance_value = None
-  if properties != -1:
-    if ACTIVE_INSTANCE_PROPERTY in properties.propertyNames():
-      active_instance_value = properties[ACTIVE_INSTANCE_PROPERTY]
-
-  if active_instance_value is None:  # property is missing
-    is_active_instance = True
-  elif (active_instance_value == 'true'): # property is explicitly set to true
-    is_active_instance = True
-  else:  # any other value
-    is_active_instance = False
-
-  return is_active_instance
-
-def get_value_from_properties(properties, key, default=""):
-  try:
-    value = properties.get_property(key)
-    if not value:
-      value = default
-  except:
-    return default
-  return value
-
-def get_views_dir(properties):
-  views_dir = properties.get_property(VIEWS_DIR_PROPERTY)
-  if views_dir is None or views_dir == "":
-    views_dirs = glob.glob(AmbariPath.get("/var/lib/ambari-server/resources/views/work"))
-  else:
-    views_dirs = glob.glob(views_dir + "/work")
-  return views_dirs
-
-def get_admin_views_dir(properties):
-  views_dir = properties.get_property(VIEWS_DIR_PROPERTY)
-  if views_dir is None or views_dir == "":
-    views_dirs = glob.glob(AmbariPath.get("/var/lib/ambari-server/resources/views/work/ADMIN_VIEW*"))
-  else:
-    views_dirs = glob.glob(views_dir + "/work/ADMIN_VIEW*")
-  return views_dirs
-
-def get_views_jars(properties):
-  views_dir = properties.get_property(VIEWS_DIR_PROPERTY)
-  if views_dir is None or views_dir == "":
-    views_jars = glob.glob(AmbariPath.get("/var/lib/ambari-server/resources/views/*.jar"))
-  else:
-    views_jars = glob.glob(views_dir + "/*.jar")
-  return views_jars
-
-def get_is_secure(properties):
-  isSecure = properties.get_property(SECURITY_IS_ENCRYPTION_ENABLED)
-  isSecure = True if isSecure and isSecure.lower() == 'true' else False
-  return isSecure
-
-def get_is_persisted(properties):
-  keyLocation = get_master_key_location(properties)
-  masterKeyFile = search_file(SECURITY_MASTER_KEY_FILENAME, keyLocation)
-  isPersisted = True if masterKeyFile else False
-
-  return (isPersisted, masterKeyFile)
-
-def get_credential_store_location(properties):
-  store_loc = properties[SECURITY_KEYS_DIR]
-  if store_loc is None or store_loc == "":
-    store_loc = AmbariPath.get("/var/lib/ambari-server/keys/credentials.jceks")
-  else:
-    store_loc += os.sep + "credentials.jceks"
-  return store_loc
-
-def get_master_key_location(properties):
-  keyLocation = properties[SECURITY_MASTER_KEY_LOCATION]
-  if keyLocation is None or keyLocation == "":
-    keyLocation = properties[SECURITY_KEYS_DIR]
-  return keyLocation
-
-def get_ambari_server_ui_port(properties):
-  ambari_server_ui_port = CLIENT_API_PORT
-  client_api_port = properties.get_property(CLIENT_API_PORT_PROPERTY)
-  if client_api_port:
-    ambari_server_ui_port = client_api_port
-  api_ssl = properties.get_property(SSL_API)
-  if api_ssl and str(api_ssl).lower() == "true":
-    ambari_server_ui_port = DEFAULT_SSL_API_PORT
-    ssl_api_port = properties.get_property(SSL_API_PORT)
-    if ssl_api_port:
-      ambari_server_ui_port = ssl_api_port
-  return ambari_server_ui_port
-
-# Copy file to /tmp and save with file.# (largest # is latest file)
-def backup_file_in_temp(filePath):
-  if filePath is not None:
-    tmpDir = tempfile.gettempdir()
-    back_up_file_count = len(glob.glob1(tmpDir, AMBARI_PROPERTIES_FILE + "*"))
-    try:
-      shutil.copyfile(filePath, tmpDir + os.sep +
-                      AMBARI_PROPERTIES_FILE + "." + str(back_up_file_count + 1))
-    except (Exception), e:
-      print_error_msg('Could not backup file in temp "%s": %s' % (
-        back_up_file_count, str(e)))
-  return 0
-
-def get_ambari_version(properties):
-  """
-  :param properties: Ambari properties
-  :return: Return a string of the ambari version. When comparing versions, please use "compare_versions" function.
-  """
-  version = None
-  try:
-    server_version_file_path = properties[SERVER_VERSION_FILE_PATH]
-    if server_version_file_path and os.path.exists(server_version_file_path):
-      with open(server_version_file_path, 'r') as file:
-        version = file.read().strip()
-  except:
-    print_error_msg("Error getting ambari version")
-  return version
-
-def get_db_type(properties):
-  """
-  :rtype ServerDatabaseEntry
-  """
-  db_type = None
-  persistence_type = properties[PERSISTENCE_TYPE_PROPERTY]
-
-  if properties[JDBC_DATABASE_PROPERTY]:
-    db_type = ServerDatabases.match(properties[JDBC_DATABASE_PROPERTY])
-    if db_type == ServerDatabases.postgres and persistence_type == "local":
-      db_type = ServerDatabases.postgres_internal
-
-  if properties[JDBC_URL_PROPERTY] and db_type is None:
-    jdbc_url = properties[JDBC_URL_PROPERTY].lower()
-    if str(ServerDatabases.postgres) in jdbc_url:
-      db_type = ServerDatabases.postgres
-    elif str(ServerDatabases.oracle) in jdbc_url:
-      db_type = ServerDatabases.oracle
-    elif str(ServerDatabases.mysql) in jdbc_url:
-      db_type = ServerDatabases.mysql
-    elif str(ServerDatabases.mssql) in jdbc_url:
-      db_type = ServerDatabases.mssql
-    elif str(ServerDatabases.derby) in jdbc_url:
-      db_type = ServerDatabases.derby
-    elif str(ServerDatabases.sqlanywhere) in jdbc_url:
-      db_type = ServerDatabases.sqlanywhere
-
-  if persistence_type == "local" and db_type is None:
-    db_type = ServerDatabases.postgres_internal
-
-  return db_type
-
-def check_database_name_property(upgrade=False):
-  """
-  :param upgrade: If Ambari is being upgraded.
-  :return:
-  """
-  properties = get_ambari_properties()
-  if properties == -1:
-    print_error_msg("Error getting ambari properties")
-    return -1
-
-  version = get_ambari_version(properties)
-  if upgrade and (properties[JDBC_DATABASE_PROPERTY] not in ServerDatabases.databases()
-                    or properties.has_key(JDBC_RCA_SCHEMA_PROPERTY)):
-    # This code exists for historic reasons in which property names changed from Ambari 1.6.1 to 1.7.0
-    persistence_type = properties[PERSISTENCE_TYPE_PROPERTY]
-    if persistence_type == "remote":
-      db_name = properties[JDBC_RCA_SCHEMA_PROPERTY]  # this was a property in Ambari 1.6.1, but not after 1.7.0
-      if db_name:
-        write_property(JDBC_DATABASE_NAME_PROPERTY, db_name)
-
-      # If DB type is missing, attempt to reconstruct it from the JDBC URL
-      db_type = properties[JDBC_DATABASE_PROPERTY]
-      if db_type is None or db_type.strip().lower() not in ServerDatabases.databases():
-        db_type = get_db_type(properties).name
-        if db_type:
-          write_property(JDBC_DATABASE_PROPERTY, db_type)
-
-      properties = get_ambari_properties()
-    elif persistence_type == "local":
-      # Ambari 1.6.1, had "server.jdbc.database" as the DB name, and the
-      # DB type was assumed to be "postgres" if was embedded ("local")
-      db_name = properties[JDBC_DATABASE_PROPERTY]
-      if db_name:
-        write_property(JDBC_DATABASE_NAME_PROPERTY, db_name)
-        write_property(JDBC_DATABASE_PROPERTY, "postgres")
-        properties = get_ambari_properties()
-
-  dbname = properties[JDBC_DATABASE_NAME_PROPERTY]
-  if dbname is None or dbname == "":
-    err = "DB Name property not set in config file.\n" + SETUP_OR_UPGRADE_MSG
-    raise FatalException(-1, err)
-
-def update_database_name_property(upgrade=False):
-  try:
-    check_database_name_property(upgrade)
-  except FatalException:
-    properties = get_ambari_properties()
-    if properties == -1:
-      err = "Error getting ambari properties"
-      raise FatalException(-1, err)
-    print_warning_msg("{0} property isn't set in {1} . Setting it to default value - {3}".format(JDBC_DATABASE_NAME_PROPERTY, AMBARI_PROPERTIES_FILE, configDefaults.DEFAULT_DB_NAME))
-    properties.process_pair(JDBC_DATABASE_NAME_PROPERTY, configDefaults.DEFAULT_DB_NAME)
-    conf_file = find_properties_file()
-    try:
-      with open(conf_file, "w") as hfW:
-        properties.store(hfW)
-    except Exception, e:
-      err = 'Could not write ambari config file "%s": %s' % (conf_file, e)
-      raise FatalException(-1, err)
-
-
-def encrypt_password(alias, password, options):
-  properties = get_ambari_properties()
-  if properties == -1:
-    raise FatalException(1, None)
-  return get_encrypted_password(alias, password, properties, options)
-
-def get_encrypted_password(alias, password, properties, options):
-  isSecure = get_is_secure(properties)
-  (isPersisted, masterKeyFile) = get_is_persisted(properties)
-  if isSecure:
-    masterKey = None
-    if not masterKeyFile:
-      # Encryption enabled but no master key file found
-      masterKey = get_original_master_key(properties, options)
-
-    retCode = save_passwd_for_alias(alias, password, masterKey)
-    if retCode != 0:
-      print_error_msg ('Failed to save secure password!')
-      return password
-    else:
-      return get_alias_string(alias)
-
-  return password
-
-
-def is_alias_string(passwdStr):
-  regex = re.compile("\$\{alias=[\w\.]+\}")
-  # Match implies string at beginning of word
-  r = regex.match(passwdStr)
-  if r is not None:
-    return True
-  else:
-    return False
-
-def get_alias_string(alias):
-  return "${alias=" + alias + "}"
-
-def get_alias_from_alias_string(aliasStr):
-  return aliasStr[8:-1]
-
-def read_passwd_for_alias(alias, masterKey="", options=None):
-  if alias:
-    jdk_path = find_jdk()
-    if jdk_path is None:
-      print_error_msg("No JDK found, please run the \"setup\" "
-                      "command to install a JDK automatically or install any "
-                      "JDK manually to {0}".format(configDefaults.JDK_INSTALL_DIR))
-      return 1
-
-    tempFileName = "ambari.passwd"
-    passwd = ""
-    tempDir = tempfile.gettempdir()
-    #create temporary file for writing
-    tempFilePath = tempDir + os.sep + tempFileName
-    with open(tempFilePath, 'w+'):
-      os.chmod(tempFilePath, stat.S_IREAD | stat.S_IWRITE)
-
-    if options is not None and options.master_key is not None and options.master_key:
-      masterKey = options.master_key
-    if masterKey is None or masterKey == "":
-      masterKey = "None"
-
-    serverClassPath = ambari_server.serverClassPath.ServerClassPath(get_ambari_properties(), None)
-    command = SECURITY_PROVIDER_GET_CMD.format(get_java_exe_path(),
-                                               serverClassPath.get_full_ambari_classpath_escaped_for_shell(), alias, tempFilePath, masterKey)
-    (retcode, stdout, stderr) = run_os_command(command)
-    print_info_msg("Return code from credential provider get passwd: {0}".format(str(retcode)))
-    if retcode != 0:
-      print_error_msg ('ERROR: Unable to read password from store. alias = {0}'.format(alias))
-    else:
-      with open(tempFilePath, 'r') as hfRTemp:
-        passwd = hfRTemp.read()
-      # Remove temporary file
-    os.remove(tempFilePath)
-    return passwd
-  else:
-    print_error_msg("Alias is unreadable.")
-
-def decrypt_password_for_alias(properties, alias, options=None):
-  isSecure = get_is_secure(properties)
-  if isSecure:
-    masterKey = None
-    (isPersisted, masterKeyFile) = get_is_persisted(properties)
-    if not masterKeyFile:
-      # Encryption enabled but no master key file found
-      masterKey = get_original_master_key(properties, options)
-    return read_passwd_for_alias(alias, masterKey, options)
-  else:
-    return alias
-
-def save_passwd_for_alias(alias, passwd, masterKey=""):
-  if alias and passwd:
-    jdk_path = find_jdk()
-    if jdk_path is None:
-      print_error_msg("No JDK found, please run the \"setup\" "
-                      "command to install a JDK automatically or install any "
-                      "JDK manually to {0}".format(configDefaults.JDK_INSTALL_DIR))
-      return 1
-
-    if masterKey is None or masterKey == "":
-      masterKey = "None"
-
-    serverClassPath = ambari_server.serverClassPath.ServerClassPath(get_ambari_properties(), None)
-    command = SECURITY_PROVIDER_PUT_CMD.format(get_java_exe_path(),
-                                               serverClassPath.get_full_ambari_classpath_escaped_for_shell(), alias, passwd, masterKey)
-    (retcode, stdout, stderr) = run_os_command(command)
-    print_info_msg("Return code from credential provider save passwd: {0}".format(str(retcode)))
-    return retcode
-  else:
-    print_error_msg("Alias or password is unreadable.")
-
-
-def get_pass_file_path(conf_file, filename):
-  return os.path.join(os.path.dirname(conf_file), filename)
-
-def store_password_file(password, filename):
-  conf_file = find_properties_file()
-  passFilePath = get_pass_file_path(conf_file, filename)
-
-  with open(passFilePath, 'w+') as passFile:
-    passFile.write(password)
-  print_info_msg("Adjusting filesystem permissions")
-  ambari_user = read_ambari_user()
-  if ambari_user: # at the first install ambari_user can be None. Which is fine since later on password.dat is chowned with the correct ownership.
-    set_file_permissions(passFilePath, "660", ambari_user, False)
-
-  #Windows paths need double backslashes, otherwise the Ambari server deserializer will think the single \ are escape markers
-  return passFilePath.replace('\\', '\\\\')
-
-def remove_password_file(filename):
-  conf_file = find_properties_file()
-  passFilePath = os.path.join(os.path.dirname(conf_file),
-                              filename)
-
-  if os.path.exists(passFilePath):
-    try:
-      os.remove(passFilePath)
-    except Exception, e:
-      print_warning_msg('Unable to remove password file: {0}'.format(str(e)))
-      return 1
-  pass
-  return 0
-
-
-def get_web_server_startup_timeout(properties):
-  """
-  Gets the time, in seconds, that the startup script should wait for the web server to bind to
-  the configured port. If this value is too low, then the startup script will return an
-  error code even though Ambari is actually starting up.
-  :param properties:
-  :return: The timeout value, in seconds. The default is 50.
-  """
-  # get the timeout property and strip it if it exists
-  timeout = properties[WEB_SERVER_STARTUP_TIMEOUT]
-  timeout = None if timeout is None else timeout.strip()
-
-  if timeout is None or timeout == "":
-    timeout = 50
-  else:
-    timeout = int(timeout)
-  return timeout
-
-
-def get_original_master_key(properties, options = None):
-  input = True
-  masterKey = None
-  while(input):
-    try:
-      if options is not None and options.master_key is not None and options.master_key:
-        masterKey = options.master_key
-      if masterKey is None:
-        masterKey = get_validated_string_input('Enter current Master Key: ',
-                                               "", ".*", "", True, False)
-    except KeyboardInterrupt:
-      print_warning_msg('Exiting...')
-      sys.exit(1)
-
-    # Find an alias that exists
-    alias = None
-    property = properties.get_property(JDBC_PASSWORD_PROPERTY)
-    if property and is_alias_string(property):
-      alias = JDBC_RCA_PASSWORD_ALIAS
-
-    if not alias:
-      property = properties.get_property(LDAP_MGR_PASSWORD_PROPERTY)
-      if property and is_alias_string(property):
-        alias = LDAP_MGR_PASSWORD_ALIAS
-
-    if not alias:
-      property = properties.get_property(SSL_TRUSTSTORE_PASSWORD_PROPERTY)
-      if property and is_alias_string(property):
-        alias = SSL_TRUSTSTORE_PASSWORD_ALIAS
-
-    # Decrypt alias with master to validate it, if no master return
-    if alias and masterKey:
-      password = read_passwd_for_alias(alias, masterKey, options)
-      if not password:
-        print_error_msg ("ERROR: Master key does not match.")
-        continue
-
-    input = False
-
-  return masterKey
-
-
-# Load database connection properties from conf file
-def parse_properties_file(args):
-  properties = get_ambari_properties()
-  if properties == -1:
-    print_error_msg("Error getting ambari properties")
-    return -1
-
-  args.server_version_file_path = properties[SERVER_VERSION_FILE_PATH]
-  args.persistence_type = properties[PERSISTENCE_TYPE_PROPERTY]
-  args.jdbc_url = properties[JDBC_URL_PROPERTY]
-
-  args.dbms = properties[JDBC_DATABASE_PROPERTY]
-  if not args.persistence_type:
-    args.persistence_type = "local"
-
-  if args.persistence_type == 'remote':
-    args.database_host = properties[JDBC_HOSTNAME_PROPERTY]
-    args.database_port = properties[JDBC_PORT_PROPERTY]
-
-  args.database_name = properties[JDBC_DATABASE_NAME_PROPERTY]
-  args.database_username = properties[JDBC_USER_NAME_PROPERTY]
-  args.postgres_schema = properties[JDBC_POSTGRES_SCHEMA_PROPERTY] \
-    if JDBC_POSTGRES_SCHEMA_PROPERTY in properties.propertyNames() else None
-  args.database_password_file = properties[JDBC_PASSWORD_PROPERTY]
-  if args.database_password_file:
-    if not is_alias_string(args.database_password_file):
-      with open(properties[JDBC_PASSWORD_PROPERTY]) as hfDbPwd:
-        args.database_password = hfDbPwd.read()
-    else:
-      args.database_password = args.database_password_file
-  return 0
-
-def is_jaas_keytab_exists(conf_file):
-  with open(conf_file, "r") as f:
-    lines = f.read()
-
-  match = re.search("keyTab=(.*)$", lines, re.MULTILINE)
-  return os.path.exists(match.group(1).strip("\"").strip())
-
-def update_krb_jaas_login_properties():
-  """
-  Update configuration files
-  :return: int -2 - skipped, -1 - error, 0 - successful
-  """
-  prev_conf_file = search_file(configDefaults.AMBARI_KRB_JAAS_LOGIN_BACKUP_FILE, get_conf_dir())
-  conf_file = search_file(AMBARI_KRB_JAAS_LOGIN_FILE, get_conf_dir())
-
-  # check if source and target files exists, if not - skip copy action
-  if prev_conf_file is None or conf_file is None:
-    return -2
-
-  # if rpmsave file contains invalid keytab, we can skip restoring
-  if not is_jaas_keytab_exists(prev_conf_file):
-    return -2
-
-  try:
-    # restore original file, destination arg for rename func shouldn't exists
-    os.remove(conf_file)
-    os.rename(prev_conf_file, conf_file)
-    print_warning_msg("Original file %s kept" % AMBARI_KRB_JAAS_LOGIN_FILE)
-  except OSError as e:
-    print_error_msg ("Couldn't move %s file: %s" % (prev_conf_file, str(e)))
-    return -1
-
-  return 0
-
-def update_ambari_env():
-  prev_env_file = search_file(configDefaults.AMBARI_ENV_BACKUP_FILE, configDefaults.DEFAULT_VLIBS_DIR)
-  env_file = search_file(AMBARI_ENV_FILE, configDefaults.DEFAULT_VLIBS_DIR)
-
-  # Previous env file does not exist
-  if (not prev_env_file) or (prev_env_file is None):
-    print ("INFO: Can not find %s file from previous version, skipping restore of environment settings. "
-           "%s may not include any user customization.") % (configDefaults.AMBARI_ENV_BACKUP_FILE, AMBARI_ENV_FILE)
-    return 0
-
-  try:
-    if env_file is not None:
-      os.remove(env_file)
-      os.rename(prev_env_file, env_file)
-      print ("INFO: Original file %s kept") % (AMBARI_ENV_FILE)
-  except OSError as e:
-    print_error_msg ( "Couldn't move %s file: %s" % (prev_env_file, str(e)))
-    return -1
-
-  return 0
-
-def update_ambari_properties():
-  prev_conf_file = search_file(configDefaults.AMBARI_PROPERTIES_BACKUP_FILE, get_conf_dir())
-  conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir())
-
-  # Previous config file does not exist
-  if (not prev_conf_file) or (prev_conf_file is None):
-    print_warning_msg("Can not find %s file from previous version, skipping import of settings" % configDefaults.AMBARI_PROPERTIES_BACKUP_FILE)
-    return 0
-
-  # ambari.properties file does not exists
-  if conf_file is None:
-    print_error_msg("Can't find %s file" % AMBARI_PROPERTIES_FILE)
-    return -1
-
-  with open(prev_conf_file) as hfOld:
-    try:
-      old_properties = Properties()
-      old_properties.load(hfOld)
-    except Exception, e:
-      print_error_msg ('Could not read "%s": %s' % (prev_conf_file, str(e)))
-      return -1
-
-  try:
-    new_properties = Properties()
-    with open(conf_file) as hfNew:
-      new_properties.load(hfNew)
-
-    for prop_key, prop_value in old_properties.getPropertyDict().items():
-      if "agent.fqdn.service.url" == prop_key:
-        # what is agent.fqdn property in ambari.props?
-        new_properties.process_pair(GET_FQDN_SERVICE_URL, prop_value)
-      elif "server.os_type" == prop_key:
-        new_properties.process_pair(OS_TYPE_PROPERTY, OS_FAMILY + OS_VERSION)
-      elif JDK_RELEASES == prop_key:
-        # don't replace new jdk releases with old releases, because they can be updated
-        pass
-      else:
-        new_properties.process_pair(prop_key, prop_value)
-
-    # Adding custom user name property if it is absent
-    # In previous versions without custom user support server was started as
-    # "root" anyway so it's a reasonable default
-    if NR_USER_PROPERTY not in new_properties.keys():
-      new_properties.process_pair(NR_USER_PROPERTY, "root")
-
-    # update the os. In case os detection routine changed
-    new_properties.process_pair(OS_FAMILY_PROPERTY, OS_FAMILY + OS_VERSION)
-
-    with open(conf_file, 'w') as hfW:
-      new_properties.store(hfW)
-
-  except Exception, e:
-    print_error_msg ('Could not write "%s": %s' % (conf_file, str(e)))
-    return -1
-
-  timestamp = datetime.datetime.now()
-  fmt = '%Y%m%d%H%M%S'
-  new_conf_file = prev_conf_file + '.' + timestamp.strftime(fmt)
-  try:
-    os.rename(prev_conf_file, new_conf_file)
-  except Exception, e:
-    print_error_msg ('Could not rename "%s" to "%s": %s' % (prev_conf_file, new_conf_file, str(e)))
-    #Not critical, move on
-
-  return 0
-
-# update properties in a section-less properties file
-# Cannot use ConfigParser due to bugs in version 2.6
-def update_properties(propertyMap):
-  conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir())
-  backup_file_in_temp(conf_file)
-  if propertyMap is not None and conf_file is not None:
-    properties = Properties()
-    try:
-      with open(conf_file, 'r') as file:
-        properties.load(file)
-    except (Exception), e:
-      print_error_msg('Could not read "%s": %s' % (conf_file, e))
-      return -1
-
-    for key in propertyMap.keys():
-      properties.removeOldProp(key)
-      properties.process_pair(key, str(propertyMap[key]))
-
-    for key in properties.keys():
-      if not propertyMap.has_key(key):
-        properties.removeOldProp(key)
-
-    with open(conf_file, 'w') as file:
-      properties.store_ordered(file)
-
-  return 0
-
-def update_properties_2(properties, propertyMap):
-  conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir())
-  backup_file_in_temp(conf_file)
-  if conf_file is not None:
-    if propertyMap is not None:
-      for key in propertyMap.keys():
-        properties.removeOldProp(key)
-        properties.process_pair(key, str(propertyMap[key]))
-      pass
-
-    with open(conf_file, 'w') as file:
-      properties.store_ordered(file)
-    pass
-  pass
-
-def write_property(key, value):
-  conf_file = find_properties_file()
-  properties = Properties()
-  try:
-    with open(conf_file, "r") as hfR:
-      properties.load(hfR)
-  except Exception, e:
-    print_error_msg('Could not read ambari config file "%s": %s' % (conf_file, e))
-    return -1
-  properties.process_pair(key, value)
-  try:
-    with open(conf_file, 'w') as hfW:
-      properties.store(hfW)
-  except Exception, e:
-    print_error_msg('Could not write ambari config file "%s": %s' % (conf_file, e))
-    return -1
-  return 0
-
-#
-# Checks if options determine local DB configuration
-#
-def is_local_database(args):
-  try:
-    return args.persistence_type == 'local'
-  except AttributeError:
-    return False
-
-
-def update_debug_mode():
-  debug_mode = get_debug_mode()
-  # The command-line settings supersede the ones in ambari.properties
-  if not debug_mode & 1:
-    properties = get_ambari_properties()
-    if properties == -1:
-      print_error_msg("Error getting ambari properties")
-      return -1
-
-    if get_value_from_properties(properties, DEBUG_MODE_KEY, False):
-      debug_mode = debug_mode | 1
-    if get_value_from_properties(properties, SUSPEND_START_MODE_KEY, False):
-      debug_mode = debug_mode | 2
-
-    set_debug_mode(debug_mode)
-
-#
-### JDK ###
-#
-
-#
-# Describes the JDK configuration data, necessary for download and installation
-#
-class JDKRelease:
-  name = ""
-  desc = ""
-  url = ""
-  dest_file = ""
-  jcpol_url = "http://public-repo-1.hortonworks.com/ARTIFACTS/UnlimitedJCEPolicyJDK7.zip"
-  dest_jcpol_file = ""
-  inst_dir = ""
-
-  def __init__(self, i_name, i_desc, i_url, i_dest_file, i_jcpol_url, i_dest_jcpol_file, i_inst_dir, i_reg_exp):
-    if i_name is None or i_name is "":
-      raise FatalException(-1, "Invalid JDK name: " + (i_desc or ""))
-    self.name = i_name
-    if i_desc is None or i_desc is "":
-      self.desc = self.name
-    else:
-      self.desc = i_desc
-    if i_url is None or i_url is "":
-      raise FatalException(-1, "Invalid URL for JDK " + i_name)
-    self.url = i_url
-    if i_dest_file is None or i_dest_file is "":
-      self.dest_file = i_name + ".exe"
-    else:
-      self.dest_file = i_dest_file
-    if not (i_jcpol_url is None or i_jcpol_url is ""):
-      self.jcpol_url = i_jcpol_url
-    if i_dest_jcpol_file is None or i_dest_jcpol_file is "":
-      self.dest_jcpol_file = "jcpol-" + i_name + ".zip"
-    else:
-      self.dest_jcpol_file = i_dest_jcpol_file
-    if i_inst_dir is None or i_inst_dir is "":
-      self.inst_dir = os.path.join(configDefaults.JDK_INSTALL_DIR, i_desc)
-    else:
-      self.inst_dir = i_inst_dir
-    if i_reg_exp is None or i_reg_exp is "":
-      raise FatalException(-1, "Invalid output parsing regular expression for JDK " + i_name)
-    self.reg_exp = i_reg_exp
-
-  @classmethod
-  def from_properties(cls, properties, section_name):
-    (desc, url, dest_file, jcpol_url, jcpol_file, inst_dir, reg_exp) = JDKRelease.__load_properties(properties, section_name)
-    cls = JDKRelease(section_name, desc, url, dest_file, jcpol_url, jcpol_file, inst_dir, reg_exp)
-    return cls
-
-  @staticmethod
-  def __load_properties(properties, section_name):
-    if section_name is None or section_name is "":
-      raise FatalException(-1, "Invalid properties section: " + ("(empty)" if section_name is None else ""))
-    if(properties.has_key(section_name + ".desc")):   #Not critical
-      desc = properties[section_name + ".desc"]
-    else:
-      desc = section_name
-    if not properties.has_key(section_name + ".url"):
-      raise FatalException(-1, "Invalid JDK URL in the properties section: " + section_name)
-    url = properties[section_name + ".url"]      #Required
-    if not properties.has_key(section_name + ".re"):
-      raise FatalException(-1, "Invalid JDK output parsing regular expression in the properties section: " + section_name)
-    reg_exp = properties[section_name + ".re"]      #Required
-    if(properties.has_key(section_name + ".dest-file")):   #Not critical
-      dest_file = properties[section_name + ".dest-file"]
-    else:
-      dest_file = section_name + ".exe"
-    if(properties.has_key(section_name + ".jcpol-url")):   #Not critical
-      jcpol_url = properties[section_name + ".jcpol-url"]
-    else:
-      jcpol_url = None
-    if(properties.has_key(section_name + ".jcpol-file")):   #Not critical
-      jcpol_file = properties[section_name + ".jcpol-file"]
-    else:
-      jcpol_file = None
-    if(properties.has_key(section_name + ".home")):   #Not critical
-      inst_dir = properties[section_name + ".home"]
-    else:
-      inst_dir = "C:\\" + section_name
-    return (desc, url, dest_file, jcpol_url, jcpol_file, inst_dir, reg_exp)
-  pass
-
-def get_JAVA_HOME():
-  properties = get_ambari_properties()
-  if properties == -1:
-    print_error_msg("Error getting ambari properties")
-    return None
-
-  java_home = properties[JAVA_HOME_PROPERTY]
-
-  if (not 0 == len(java_home)) and (os.path.exists(java_home)):
-    return java_home
-
-  return None
-
-#
-# Checks jdk path for correctness
-#
-def validate_jdk(jdk_path):
-  if jdk_path:
-    if os.path.exists(jdk_path):
-      java_exe_path = os.path.join(jdk_path, configDefaults.JAVA_EXE_SUBPATH)
-      if os.path.exists(java_exe_path) and os.path.isfile(java_exe_path):
-        return True
-  return False
-
-#
-# Finds the available JDKs.
-#
-def find_jdk():
-  jdkPath = get_JAVA_HOME()
-  if jdkPath:
-    if validate_jdk(jdkPath):
-      return jdkPath
-  print("INFO: Looking for available JDKs at {0}".format(configDefaults.JDK_INSTALL_DIR))
-  jdks = glob.glob(os.path.join(configDefaults.JDK_INSTALL_DIR, configDefaults.JDK_SEARCH_PATTERN))
-  #[fbarca] Use the newest JDK
-  jdks.sort(None, None, True)
-  print_info_msg("Found: {0}".format(str(jdks)))
-  if len(jdks) == 0:
-    return
-  for jdkPath in jdks:
-    print "INFO: Trying to use JDK {0}".format(jdkPath)
-    if validate_jdk(jdkPath):
-      print "INFO: Selected JDK {0}".format(jdkPath)
-      return jdkPath
-    else:
-      print_error_msg ("JDK {0} is invalid".format(jdkPath))
-  return
-
-def get_java_exe_path():
-  jdkPath = find_jdk()
-  if jdkPath:
-    java_exe = os.path.join(jdkPath, configDefaults.JAVA_EXE_SUBPATH)
-    return java_exe
-  return
-
-
-#
-# Server resource files location
-#
-def get_resources_location(properties):
-  err = 'Invalid directory'
-  try:
-    resources_dir = properties[RESOURCES_DIR_PROPERTY]
-    if not resources_dir:
-      resources_dir = configDefaults.SERVER_RESOURCES_DIR
-  except (KeyError), e:
-    err = 'Property ' + str(e) + ' is not defined at ' + properties.fileName
-    resources_dir = configDefaults.SERVER_RESOURCES_DIR
-
-  if not os.path.exists(os.path.abspath(resources_dir)):
-    msg = 'Resources dir ' + resources_dir + ' is incorrectly configured: ' + err
-    raise FatalException(1, msg)
-
-  return resources_dir
-
-#
-# Stack location
-#
-def get_stack_location(properties):
-  stack_location = properties[STACK_LOCATION_KEY]
-  if not stack_location:
-    stack_location = configDefaults.STACK_LOCATION_DEFAULT
-  return stack_location
-
-#
-# Extension location
-#
-def get_extension_location(properties):
-  extension_location = properties[EXTENSION_PATH_PROPERTY]
-  if not extension_location:
-    extension_location = configDefaults.EXTENSION_LOCATION_DEFAULT
-  return extension_location
-
-#
-# Common services location
-#
-def get_common_services_location(properties):
-  common_services_location = properties[COMMON_SERVICES_PATH_PROPERTY]
-  if not common_services_location:
-    common_services_location = configDefaults.COMMON_SERVICES_LOCATION_DEFAULT
-  return common_services_location
-
-#
-# Management packs staging location
-#
-def get_mpacks_staging_location(properties):
-  mpacks_staging_location = properties[MPACKS_STAGING_PATH_PROPERTY]
-  if not mpacks_staging_location:
-    mpacks_staging_location = configDefaults.MPACKS_STAGING_LOCATION_DEFAULT
-  return mpacks_staging_location
-
-
-#
-# Dashboard location
-#
-def get_dashboard_location(properties):
-  resources_dir = get_resources_location(properties)
-  dashboard_location = os.path.join(resources_dir, configDefaults.DASHBOARD_DIRNAME)
-  return dashboard_location
-
-#
-# Server temp location
-#
-def get_server_temp_location(properties):
-  server_tmp_dir = properties[SERVER_TMP_DIR_PROPERTY]
-  if not server_tmp_dir:
-    server_tmp_dir = configDefaults.SERVER_TMP_DIR_DEFAULT
-  return server_tmp_dir
-
-def get_missing_properties(properties, property_set=REQUIRED_PROPERTIES):
-  missing_propertiers = []
-  for property in property_set:
-    value = properties[property]
-    if not value:
-      missing_propertiers.append(property)
-
-  return missing_propertiers

http://git-wip-us.apache.org/repos/asf/ambari/blob/f331f86d/ambari-server/src/main/python/ambari_server/serverSetup.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/ambari_server/serverSetup.py b/ambari-server/src/main/python/ambari_server/serverSetup.py
index 5c016c5..7063175 100644
--- a/ambari-server/src/main/python/ambari_server/serverSetup.py
+++ b/ambari-server/src/main/python/ambari_server/serverSetup.py
@@ -38,11 +38,11 @@ from ambari_commons.str_utils import compress_backslashes
 from ambari_server.dbConfiguration import DBMSConfigFactory, TAR_GZ_ARCHIVE_TYPE, default_connectors_map, check_jdbc_drivers
 from ambari_server.serverConfiguration import configDefaults, JDKRelease, \
   get_ambari_properties, get_is_secure, get_is_persisted, get_java_exe_path, get_JAVA_HOME, get_missing_properties, \
-  get_resources_location, get_value_from_properties, read_ambari_user, update_properties, validate_jdk, write_property, \
+  get_resources_location, get_value_from_properties, read_ambari_user, update_properties, validate_jdk, write_property, prompt_gpl_agreement,\
   JAVA_HOME, JAVA_HOME_PROPERTY, JCE_NAME_PROPERTY, JDBC_RCA_URL_PROPERTY, JDBC_URL_PROPERTY, \
   JDK_NAME_PROPERTY, JDK_RELEASES, NR_USER_PROPERTY, OS_FAMILY, OS_FAMILY_PROPERTY, OS_TYPE, OS_TYPE_PROPERTY, OS_VERSION, \
   VIEWS_DIR_PROPERTY, JDBC_DATABASE_PROPERTY, JDK_DOWNLOAD_SUPPORTED_PROPERTY, JCE_DOWNLOAD_SUPPORTED_PROPERTY, SETUP_DONE_PROPERTIES, \
-  STACK_JAVA_HOME_PROPERTY, STACK_JDK_NAME_PROPERTY, STACK_JCE_NAME_PROPERTY, STACK_JAVA_VERSION
+  STACK_JAVA_HOME_PROPERTY, STACK_JDK_NAME_PROPERTY, STACK_JCE_NAME_PROPERTY, STACK_JAVA_VERSION, GPL_LICENSE_ACCEPTED_PROPERTY
 from ambari_server.serverUtils import is_server_runing
 from ambari_server.setupSecurity import adjust_directory_permissions
 from ambari_server.userInput import get_YN_input, get_validated_string_input
@@ -1135,6 +1135,20 @@ def check_setup_already_done():
 
   return not bool(get_missing_properties(properties, property_set=SETUP_DONE_PROPERTIES))
 
+def write_gpl_license_accepted(options):
+  properties = get_ambari_properties()
+  if properties == -1:
+    err = "Error getting ambari properties"
+    raise FatalException(-1, err)
+
+  if get_silent():
+    result = str(options.accept_gpl).lower()
+  else:
+    result = prompt_gpl_agreement()
+
+  properties.process_pair(GPL_LICENSE_ACCEPTED_PROPERTY, result)
+  update_properties(properties)
+
 #
 # Setup the Ambari Server.
 #
@@ -1182,6 +1196,9 @@ def setup(options):
     err = 'Downloading or installing JDK failed: {0}. Exiting.'.format(e)
     raise FatalException(e.code, err)
 
+  print 'Prompting GPL software agreement...'
+  write_gpl_license_accepted(options)
+
   print 'Completing setup...'
   retcode = configure_os_settings()
   if not retcode == 0:

http://git-wip-us.apache.org/repos/asf/ambari/blob/f331f86d/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
index 94c5ebe..b774436 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
@@ -2093,6 +2093,7 @@ public class AmbariManagementControllerImplTest {
     expect(configuration.getServerDBName()).andReturn(SERVER_DB_NAME);
     expect(configuration.getJavaVersion()).andReturn(8);
     expect(configuration.areHostsSysPrepped()).andReturn("true");
+    expect(configuration.getGplLicenseAccepted()).andReturn(false);
     expect(configuration.getDatabaseConnectorNames()).andReturn(new HashMap<>()).anyTimes();
     expect(configuration.getPreviousDatabaseConnectorNames()).andReturn(new HashMap<>()).anyTimes();
     expect(repositoryVersionEntity.getVersion()).andReturn("1234").anyTimes();
@@ -2140,7 +2141,7 @@ public class AmbariManagementControllerImplTest {
 
     Map<String, String> defaultHostParams = helper.createDefaultHostParams(cluster, repositoryVersionEntity.getStackId());
 
-    assertEquals(15, defaultHostParams.size());
+    assertEquals(16, defaultHostParams.size());
     assertEquals(MYSQL_JAR, defaultHostParams.get(DB_DRIVER_FILENAME));
     assertEquals(SOME_STACK_NAME, defaultHostParams.get(STACK_NAME));
     assertEquals(SOME_STACK_VERSION, defaultHostParams.get(STACK_VERSION));

http://git-wip-us.apache.org/repos/asf/ambari/blob/f331f86d/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java
index 833be5d..6779e26f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java
@@ -278,6 +278,7 @@ public class ClientConfigResourceProviderTest {
     expect(configuration.areHostsSysPrepped()).andReturn("false");
     expect(configuration.isAgentStackRetryOnInstallEnabled()).andReturn("false");
     expect(configuration.getAgentStackRetryOnInstallCount()).andReturn("5");
+    expect(configuration.getGplLicenseAccepted()).andReturn(Configuration.GPL_LICENSE_ACCEPTED.getDefaultValue());
     expect(configuration.getExternalScriptThreadPoolSize()).andReturn(Configuration.THREAD_POOL_SIZE_FOR_EXTERNAL_SCRIPT.getDefaultValue());
     expect(configuration.getExternalScriptTimeout()).andReturn(Configuration.EXTERNAL_SCRIPT_TIMEOUT.getDefaultValue());
     Map<String,String> props = new HashMap<>();
@@ -535,6 +536,7 @@ public class ClientConfigResourceProviderTest {
     expect(configuration.areHostsSysPrepped()).andReturn("false");
     expect(configuration.isAgentStackRetryOnInstallEnabled()).andReturn("false");
     expect(configuration.getAgentStackRetryOnInstallCount()).andReturn("5");
+    expect(configuration.getGplLicenseAccepted()).andReturn(Configuration.GPL_LICENSE_ACCEPTED.getDefaultValue());
     expect(configuration.getExternalScriptThreadPoolSize()).andReturn(Configuration.THREAD_POOL_SIZE_FOR_EXTERNAL_SCRIPT.getDefaultValue());
     expect(configuration.getExternalScriptTimeout()).andReturn(Configuration.EXTERNAL_SCRIPT_TIMEOUT.getDefaultValue());
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/f331f86d/ambari-server/src/test/python/TestAmbariServer.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestAmbariServer.py b/ambari-server/src/test/python/TestAmbariServer.py
index 66df2d8..f71e0f3 100644
--- a/ambari-server/src/test/python/TestAmbariServer.py
+++ b/ambari-server/src/test/python/TestAmbariServer.py
@@ -3718,7 +3718,8 @@ class TestAmbariServer(TestCase):
   @patch("ambari_server.serverSetup.service_setup")
   @patch("ambari_server.serverSetup.read_ambari_user")
   @patch("ambari_server.serverSetup.expand_jce_zip_file")
-  def test_setup_linux(self, expand_jce_zip_file_mock, read_ambari_user_mock,
+  @patch("ambari_server.serverSetup.write_gpl_license_accepted")
+  def test_setup_linux(self, write_gpl_license_accepted_mock, expand_jce_zip_file_mock, read_ambari_user_mock,
                  service_setup_mock, adjust_dirs_mock, extract_views_mock, proceedJDBCProperties_mock, is_root_mock,
                  disable_security_enhancements_mock, check_jdbc_drivers_mock, check_ambari_user_mock,
                  download_jdk_mock, configure_os_settings_mock, get_ambari_properties_mock,
@@ -3831,6 +3832,7 @@ class TestAmbariServer(TestCase):
     check_jdbc_drivers_mock.return_value = 0
     download_jdk_mock.return_value = 0
     configure_os_settings_mock.return_value = 0
+    write_gpl_license_accepted_mock.return_value = 0
 
     result = setup(args)
 
@@ -6834,7 +6836,6 @@ class TestAmbariServer(TestCase):
                                     read_ambari_user_method, read_master_key_method,
                                     get_is_persisted_method, get_is_secure_method, exists_mock,
                                     save_passwd_for_alias_method):
-
     is_root_method.return_value = True
 
     p = Properties()