blob: 60b7a886e550b9ea2fbe5d8d5465ce73ab8f9fed [file] [log] [blame]
#!/usr/bin/env python2
#
# 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 optparse
import copy
import os
import re
import sys
import errno
from params import stack_root
# The global prefix and current directory
root = stack_root
current = root + "/current"
vconfroot = 'etc'
lib_root = "usr/lib"
vconf_name = "conf.dist"
packages = ("hadoop", "hbase", "hive", "hive-hcatalog",
"kafka", "spark", "tez",
"zookeeper", "zeppelin", "flink", "solr", "ranger-admin", "ranger-usersync", "ranger-tagsync")
''' conf link
/usr/bigtop/3.2.0/usr/lib/${pname}/conf -> /etc/${pname}/conf -> /etc/alternatives/${pname}-conf -> /usr/bigtop/3.2.0/etc/${pname}/conf.dist.0
'''
def printHelp():
print("""
usage: conf-select [-h] [<command>] --package --stack-version --conf-version
arguments:
<command> One of create-conf-dir, set-conf-dir
<--package> package name to set
<--stack-version> stack version number
<--conf-version> conf version to set
optional arguments:
-h, --help show this help message and exit
Commands:
set-conf-dir : set the conf to a specified version
create-conf-dir : create the specified conf directory
dry-run-set : dry run for set conf
dry-run-create : dry run for create conf
""")
def chkPkg(sver, pname):
'''
checks package name against the package tuple, check if the package directory exists and returns True
e.g. /usr/bigtop/3.2.0/usr/lib/zookeeper
'''
pkgdir = os.path.join(root, sver, lib_root, pname)
if not os.path.isdir(pkgdir) or pname not in packages:
print(pname + " not installed or incorrect package name")
sys.exit(1)
return True
def chksVer(sver):
'''
returns True if the stack version number exists
e.g. /usr/bigtop/3.2.0/usr/lib
'''
if not os.path.isdir(os.path.join(root, sver, lib_root)):
print(sver + " Incorrect stack version")
sys.exit(1)
return True
def chkPath(pname, sver, cver, method):
'''
e.g. /usr/bigtop/3.2.0/etc/zookeeper/conf.dist.0
'''
confpath = os.path.join(root, sver, vconfroot, pname, vconf_name)
if cver:
confpath = os.path.join(root, sver, vconfroot, pname, vconf_name + '.' + cver)
if method == "create" and os.path.exists(confpath):
print(confpath+" exist already")
sys.exit(1)
if method == "set" and not os.path.exists(confpath):
print(confpath+" does not exist")
sys.exit(1)
return True
def check(sver, pname, cver, method):
'''
Aggregates chksVer, chkPkg and checks if path exits.
Returns True if all the conditions are met
'''
chksVer(sver)
chkPkg(sver, pname)
chkPath(pname, sver, cver, method)
def drcrtConfDir(pname, sver, cver):
'''
# Not really executing
# e.g. /usr/bigtop/3.2.0/etc/zookeeper/conf.dist.0
'''
chksVer(sver)
chkPkg(sver, pname)
for confmapkey, confmapval in confmap.items():
path = os.path.join(root, sver, vconfroot, confmapkey, vconf_name)
if cver:
path = os.path.join(root, sver, vconfroot, confmapkey, vconf_name+'.'+cver)
print(path)
def crtConfDir(pname, sver, cver):
'''
e.g. /usr/bigtop/3.2.0/etc/zookeeper/conf.dist.0
'''
path = os.path.join(root, sver, vconfroot, pname, vconf_name)
check(sver, pname, cver, "create")
for confmapkey, confmapval in confmap.items():
path = os.path.join(root, sver, vconfroot, confmapkey, vconf_name)
if cver:
path = os.path.join(root, sver, vconfroot, confmapkey, vconf_name+'.'+cver)
try:
os.makedirs(path)
print(path)
except OSError as exc:
if exc.errno == errno.EACCES:
print("Permission denied")
def drsetConfDir(pname, sver):
'''
Not really executing
'''
chksVer(sver)
chkPkg(sver, pname)
for confmapkey, confmapval in confmap.items():
# e.g. /usr/bigtop/3.2.0/usr/lib/hive/conf
confdir = os.path.join(root, sver, lib_root, pname, confmapval)
if os.path.exists(confdir) and os.path.islink(confdir):
print(confdir)
else:
print(confdir+" does not exist")
sys.exit(1)
def setConfDir(pname, sver, cver):
'''
e.g. /usr/bigtop/3.2.0/usr/lib/zookeeper/conf -> /etc/zookeeper/conf -> /usr/bigtop/3.2.0/etc/zookeeper/conf.dist.0
'''
check(sver, pname, cver, "set")
for confmapkey, confmapval in confmap.items():
# e.g. /usr/bigtop/3.2.0/etc/zookeeper/conf.dist.0
path = os.path.join(root, sver, vconfroot, confmapkey, vconf_name)
if cver:
path = os.path.join(root, sver, vconfroot, confmapkey, vconf_name+'.'+cver)
# e.g. /usr/bigtop/3.2.0/usr/lib/zookeeper/conf
confdir = os.path.join(root, sver, lib_root, pname, confmapval)
if os.path.exists(confdir) and not os.path.islink(confdir):
raise Exception("Expected confdir %s to be a symlink." % confdir)
if os.path.islink(confdir) and not os.path.exists(confdir):
os.remove(confdir)
if os.path.exists(confdir):
if path == os.readlink(confdir):
return
else:
os.remove(confdir)
os.symlink('/etc/{0}/conf'.format(pname), confdir)
print(confdir + " -> " + '/etc/{0}/conf'.format(pname))
print('alternatives --install /etc/{0}/conf {0}-conf {1} 30'.format(pname, path))
os.system('alternatives --install /etc/{0}/conf {0}-conf {1} 30'.format(pname, path))
os.system('alternatives --set {0}-conf {1}'.format(pname, path))
print('/etc/{0}/conf'.format(pname) + " -> " + path)
# Start of main
parser = optparse.OptionParser(add_help_option=False)
parser.add_option("-h", "--help", action="store_true", dest="help",
help="print help")
parser.add_option("-p", "--package", action="store", dest="pname",
help="package name")
parser.add_option("-s", "--stack-version", action="store", dest="sver",
help="stack verison number")
parser.add_option("-c", "--conf-version", action="store", dest="cver",
help="conf verison number", default=None)
(options, args) = parser.parse_args()
'''default conf mapping'''
confmap = {options.pname: "conf"}
'''conf mapping if the pkg name is hive-hcatalog'''
if options.pname == "hive-hcatalog":
confmap = {"hive-hcatalog": "etc/hcatalog",
"hive-webhcat": "etc/webhcat"}
if options.help or len(args) == 0:
printHelp()
elif not options.pname or not options.sver:
parser.error("Invalid option")
printHelp()
elif args[0] == 'create-conf-dir':
crtConfDir(options.pname, options.sver, options.cver)
elif args[0] == 'set-conf-dir':
setConfDir(options.pname, options.sver, options.cver)
elif args[0] == 'dry-run-set':
drsetConfDir(options.pname, options.sver)
elif args[0] == 'dry-run-create':
drcrtConfDir(options.pname, options.sver, options.cver)
else:
printHelp()