#!/usr/bin/python
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import sys
import os
from subprocess import  Popen,PIPE
from optparse import OptionParser

if os.getenv('JAVA_HOME') is None:
	print "ERROR: JAVA_HOME environment property was not defined, exit."
	sys.exit(1)
else:
	JAVA_BIN=os.path.join(os.getenv('JAVA_HOME'),'bin','java')
print "Using Java:" + str(JAVA_BIN)

def main():

	parser = OptionParser()

	parser.add_option("-l", "--libpath", dest="library_path", help="Path to folder where credential libs are present")
	parser.add_option("-f", "--file",  dest="jceks_file_path", help="Path to jceks file to use")
	parser.add_option("-k", "--key",  dest="key", help="Key to use")
	parser.add_option("-v", "--value",  dest="value", help="Value to use")
	parser.add_option("-c", "--create",  dest="create", help="Add a new alias")

	(options, args) = parser.parse_args()
	library_path = options.library_path
	jceks_file_path = options.jceks_file_path
	key = options.key
	value = options.value
	getorcreate = 'create' if options.create else 'get'
	call_keystore(library_path, jceks_file_path, key, value, getorcreate)


def call_keystore(libpath, filepath, aliasKey, aliasValue='', getorcreate='get'):
	finalLibPath = libpath.replace('\\','/').replace('//','/')
	finalFilePath = 'jceks://file/'+filepath.replace('\\','/').replace('//','/')
	if getorcreate == 'create':
		commandtorun = [JAVA_BIN, '-cp', finalLibPath, 'org.apache.ranger.credentialapi.buildks' ,'create', aliasKey, '-value', aliasValue, '-provider',finalFilePath]
		p = Popen(commandtorun,stdin=PIPE, stdout=PIPE, stderr=PIPE)
		output, error = p.communicate()
		statuscode = p.returncode
		if statuscode == 0:
			print "Alias " + aliasKey + " created successfully!"
		else :
			print "Error creating Alias!! Error: " + str(error)
		
	elif getorcreate == 'get':
		commandtorun = [JAVA_BIN, '-cp', finalLibPath, 'org.apache.ranger.credentialapi.buildks' ,'get', aliasKey, '-provider',finalFilePath]
		p = Popen(commandtorun,stdin=PIPE, stdout=PIPE, stderr=PIPE)
		output, error = p.communicate()
		statuscode = p.returncode
		if statuscode == 0:
			print "Alias : " + aliasKey + " Value : " + str(output)
		else :
			print "Error getting value!! Error: " + str(error)
		
	else:
		print 'Invalid Arguments!!'
	
if __name__ == '__main__':
	main()
