AmbariConfig.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. #!/usr/bin/env python
  2. '''
  3. Licensed to the Apache Software Foundation (ASF) under one
  4. or more contributor license agreements. See the NOTICE file
  5. distributed with this work for additional information
  6. regarding copyright ownership. The ASF licenses this file
  7. to you under the Apache License, Version 2.0 (the
  8. "License"); you may not use this file except in compliance
  9. with the License. You may obtain a copy of the License at
  10. http://www.apache.org/licenses/LICENSE-2.0
  11. Unless required by applicable law or agreed to in writing, software
  12. distributed under the License is distributed on an "AS IS" BASIS,
  13. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. See the License for the specific language governing permissions and
  15. limitations under the License.
  16. '''
  17. import ConfigParser
  18. import StringIO
  19. import hostname
  20. import ambari_simplejson as json
  21. from NetUtil import NetUtil
  22. import os
  23. from ambari_commons import OSConst
  24. from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl
  25. content = """
  26. [server]
  27. hostname=localhost
  28. url_port=8440
  29. secured_url_port=8441
  30. [agent]
  31. prefix={ps}tmp{ps}ambari-agent
  32. tmp_dir={ps}tmp{ps}ambari-agent{ps}tmp
  33. data_cleanup_interval=86400
  34. data_cleanup_max_age=2592000
  35. data_cleanup_max_size_MB = 100
  36. ping_port=8670
  37. cache_dir={ps}var{ps}lib{ps}ambari-agent{ps}cache
  38. parallel_execution=0
  39. [services]
  40. [python]
  41. custom_actions_dir = {ps}var{ps}lib{ps}ambari-agent{ps}resources{ps}custom_actions
  42. [security]
  43. keysdir={ps}tmp{ps}ambari-agent
  44. server_crt=ca.crt
  45. passphrase_env_var_name=AMBARI_PASSPHRASE
  46. [heartbeat]
  47. state_interval = 6
  48. dirs={ps}etc{ps}hadoop,{ps}etc{ps}hadoop{ps}conf,{ps}var{ps}run{ps}hadoop,{ps}var{ps}log{ps}hadoop
  49. log_lines_count=300
  50. """.format(ps=os.sep)
  51. servicesToPidNames = {
  52. 'GLUSTERFS' : 'glusterd.pid$',
  53. 'NAMENODE': 'hadoop-{USER}-namenode.pid$',
  54. 'SECONDARY_NAMENODE': 'hadoop-{USER}-secondarynamenode.pid$',
  55. 'DATANODE': 'hadoop-{USER}-datanode.pid$',
  56. 'JOBTRACKER': 'hadoop-{USER}-jobtracker.pid$',
  57. 'TASKTRACKER': 'hadoop-{USER}-tasktracker.pid$',
  58. 'RESOURCEMANAGER': 'yarn-{USER}-resourcemanager.pid$',
  59. 'NODEMANAGER': 'yarn-{USER}-nodemanager.pid$',
  60. 'HISTORYSERVER': 'mapred-{USER}-historyserver.pid$',
  61. 'JOURNALNODE': 'hadoop-{USER}-journalnode.pid$',
  62. 'ZKFC': 'hadoop-{USER}-zkfc.pid$',
  63. 'OOZIE_SERVER': 'oozie.pid',
  64. 'ZOOKEEPER_SERVER': 'zookeeper_server.pid',
  65. 'FLUME_SERVER': 'flume-node.pid',
  66. 'TEMPLETON_SERVER': 'templeton.pid',
  67. 'GANGLIA_SERVER': 'gmetad.pid',
  68. 'GANGLIA_MONITOR': 'gmond.pid',
  69. 'HBASE_MASTER': 'hbase-{USER}-master.pid',
  70. 'HBASE_REGIONSERVER': 'hbase-{USER}-regionserver.pid',
  71. 'HCATALOG_SERVER': 'webhcat.pid',
  72. 'KERBEROS_SERVER': 'kadmind.pid',
  73. 'HIVE_SERVER': 'hive-server.pid',
  74. 'HIVE_METASTORE': 'hive.pid',
  75. 'MYSQL_SERVER': 'mysqld.pid',
  76. 'HUE_SERVER': '/var/run/hue/supervisor.pid',
  77. 'WEBHCAT_SERVER': 'webhcat.pid',
  78. }
  79. #Each service, which's pid depends on user should provide user mapping
  80. servicesToLinuxUser = {
  81. 'NAMENODE': 'hdfs_user',
  82. 'SECONDARY_NAMENODE': 'hdfs_user',
  83. 'DATANODE': 'hdfs_user',
  84. 'JOURNALNODE': 'hdfs_user',
  85. 'ZKFC': 'hdfs_user',
  86. 'JOBTRACKER': 'mapred_user',
  87. 'TASKTRACKER': 'mapred_user',
  88. 'RESOURCEMANAGER': 'yarn_user',
  89. 'NODEMANAGER': 'yarn_user',
  90. 'HISTORYSERVER': 'mapred_user',
  91. 'HBASE_MASTER': 'hbase_user',
  92. 'HBASE_REGIONSERVER': 'hbase_user',
  93. }
  94. pidPathVars = [
  95. {'var' : 'glusterfs_pid_dir_prefix',
  96. 'defaultValue' : '/var/run'},
  97. {'var' : 'hadoop_pid_dir_prefix',
  98. 'defaultValue' : '/var/run/hadoop'},
  99. {'var' : 'hadoop_pid_dir_prefix',
  100. 'defaultValue' : '/var/run/hadoop'},
  101. {'var' : 'ganglia_runtime_dir',
  102. 'defaultValue' : '/var/run/ganglia/hdp'},
  103. {'var' : 'hbase_pid_dir',
  104. 'defaultValue' : '/var/run/hbase'},
  105. {'var' : 'zk_pid_dir',
  106. 'defaultValue' : '/var/run/zookeeper'},
  107. {'var' : 'oozie_pid_dir',
  108. 'defaultValue' : '/var/run/oozie'},
  109. {'var' : 'hcat_pid_dir',
  110. 'defaultValue' : '/var/run/webhcat'},
  111. {'var' : 'hive_pid_dir',
  112. 'defaultValue' : '/var/run/hive'},
  113. {'var' : 'mysqld_pid_dir',
  114. 'defaultValue' : '/var/run/mysqld'},
  115. {'var' : 'hcat_pid_dir',
  116. 'defaultValue' : '/var/run/webhcat'},
  117. {'var' : 'yarn_pid_dir_prefix',
  118. 'defaultValue' : '/var/run/hadoop-yarn'},
  119. {'var' : 'mapred_pid_dir_prefix',
  120. 'defaultValue' : '/var/run/hadoop-mapreduce'},
  121. ]
  122. class AmbariConfig:
  123. TWO_WAY_SSL_PROPERTY = "security.server.two_way_ssl"
  124. AMBARI_PROPERTIES_CATEGORY = 'agentConfig'
  125. SERVER_CONNECTION_INFO = "{0}/connection_info"
  126. CONNECTION_PROTOCOL = "https"
  127. config = None
  128. net = None
  129. def __init__(self):
  130. global content
  131. self.config = ConfigParser.RawConfigParser()
  132. self.net = NetUtil()
  133. self.config.readfp(StringIO.StringIO(content))
  134. def get(self, section, value, default=None):
  135. try:
  136. return self.config.get(section, value)
  137. except ConfigParser.Error, err:
  138. if default != None:
  139. return default
  140. raise err
  141. def set(self, section, option, value):
  142. self.config.set(section, option, value)
  143. def add_section(self, section):
  144. self.config.add_section(section)
  145. def has_section(self, section):
  146. return self.config.has_section(section)
  147. def setConfig(self, customConfig):
  148. self.config = customConfig
  149. def getConfig(self):
  150. return self.config
  151. @staticmethod
  152. @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY)
  153. def getConfigFile():
  154. if 'AMBARI_AGENT_CONF_DIR' in os.environ:
  155. return os.path.join(os.environ['AMBARI_AGENT_CONF_DIR'], "ambari-agent.ini")
  156. else:
  157. return "ambari-agent.ini"
  158. @staticmethod
  159. @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT)
  160. def getConfigFile():
  161. if 'AMBARI_AGENT_CONF_DIR' in os.environ:
  162. return os.path.join(os.environ['AMBARI_AGENT_CONF_DIR'], "ambari-agent.ini")
  163. else:
  164. return os.path.join(os.sep, "etc", "ambari-agent", "conf", "ambari-agent.ini")
  165. @staticmethod
  166. def getLogFile():
  167. if 'AMBARI_AGENT_LOG_DIR' in os.environ:
  168. return os.path.join(os.environ['AMBARI_AGENT_LOG_DIR'], "ambari-agent.log")
  169. else:
  170. return os.path.join(os.sep, "var", "log", "ambari-agent", "ambari-agent.log")
  171. @staticmethod
  172. def getOutFile():
  173. if 'AMBARI_AGENT_OUT_DIR' in os.environ:
  174. return os.path.join(os.environ['AMBARI_AGENT_OUT_DIR'], "ambari-agent.out")
  175. else:
  176. return os.path.join(os.sep, "var", "log", "ambari-agent", "ambari-agent.out")
  177. def has_option(self, section, option):
  178. return self.config.has_option(section, option)
  179. def remove_option(self, section, option):
  180. return self.config.remove_option(section, option)
  181. def load(self, data):
  182. self.config = ConfigParser.RawConfigParser(data)
  183. def read(self, filename):
  184. self.config.read(filename)
  185. def getServerOption(self, url, name, default=None):
  186. status, response = self.net.checkURL(url)
  187. if status is True:
  188. try:
  189. data = json.loads(response)
  190. if name in data:
  191. return data[name]
  192. except:
  193. pass
  194. return default
  195. def get_api_url(self):
  196. return "%s://%s:%s" % (self.CONNECTION_PROTOCOL,
  197. hostname.server_hostname(self),
  198. self.get('server', 'url_port'))
  199. def isTwoWaySSLConnection(self):
  200. req_url = self.get_api_url()
  201. response = self.getServerOption(self.SERVER_CONNECTION_INFO.format(req_url), self.TWO_WAY_SSL_PROPERTY, 'false')
  202. if response is None:
  203. return False
  204. elif response.lower() == "true":
  205. return True
  206. else:
  207. return False
  208. def get_parallel_exec_option(self):
  209. return int(self.get('agent', 'parallel_execution', 0))
  210. def update_configuration_from_registration(self, reg_resp):
  211. if reg_resp and AmbariConfig.AMBARI_PROPERTIES_CATEGORY in reg_resp:
  212. if not self.has_section(AmbariConfig.AMBARI_PROPERTIES_CATEGORY):
  213. self.add_section(AmbariConfig.AMBARI_PROPERTIES_CATEGORY)
  214. for k,v in reg_resp[AmbariConfig.AMBARI_PROPERTIES_CATEGORY].items():
  215. self.set(AmbariConfig.AMBARI_PROPERTIES_CATEGORY, k, v)
  216. pass
  217. def updateConfigServerHostname(configFile, new_host):
  218. # update agent config file
  219. agent_config = ConfigParser.ConfigParser()
  220. agent_config.read(configFile)
  221. server_host = agent_config.get('server', 'hostname')
  222. if new_host is not None and server_host != new_host:
  223. print "Updating server host from " + server_host + " to " + new_host
  224. agent_config.set('server', 'hostname', new_host)
  225. with (open(configFile, "wb")) as new_agent_config:
  226. agent_config.write(new_agent_config)
  227. def main():
  228. print AmbariConfig().config
  229. if __name__ == "__main__":
  230. main()