| #!/bin/bash | |
| # 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. | |
| # Copies keys that enable SSH communication with system vms | |
| # $1 = new public key | |
| # $2 = new private key | |
| ''' | |
| All imports go here... | |
| ''' | |
| import os | |
| import shutil | |
| import os.path | |
| import sys | |
| import subprocess | |
| import commands | |
| import traceback | |
| import filecmp | |
| import tempfile | |
| pathSep=os.sep | |
| TMP=tempfile.gettempdir() + os.sep + "tmp" #Get Home Directory | |
| print("Temp Directory is : %s" % TMP) | |
| MOUNTPATH=TMP + pathSep + "systemvm_mnt" | |
| TMPDIR=TMP + pathSep + "cloud" + pathSep + "systemvm" | |
| osType=os.name | |
| os.makedirs(TMP) | |
| os.makedirs(MOUNTPATH) | |
| os.makedirs(TMPDIR) | |
| def clean_up(): | |
| shutil.rmtree(TMP) | |
| #$SUDO umount $MOUNTPATH | |
| def inject_into_iso(pubKey,systemiso): | |
| isofile=systemvmpath | |
| newpubkey=pubKey | |
| backup=isofile + ".bak" | |
| tmpiso=TMP + pathSep + systemiso | |
| if not os.path.exists(isofile): | |
| print("Could not open %s" % isofile) | |
| clean_up() | |
| sys.exit(IOError) | |
| command = "7z x -y " + isofile + " -o" + MOUNTPATH | |
| status = os.system(command) | |
| if status != 0: | |
| print ("Failed to mount original iso %" % isofile) | |
| clean_up() | |
| sys.exit(status) | |
| pubKeyFileOld=open(MOUNTPATH + pathSep + "authorized_keys", 'r') | |
| pubKeyFileNew=open(newpubkey, 'r') | |
| for line1 in pubKeyFileOld: | |
| for line2 in pubKeyFileNew: | |
| if line1 == line2: | |
| pubKeyFileOld.close() | |
| pubKeyFileNew.close() | |
| return 0 | |
| pubKeyFileOld.close() | |
| pubKeyFileNew.close() | |
| try: | |
| shutil.copy(isofile, backup) | |
| except: | |
| print("Failed to backup original iso %" % isofile) | |
| clean_up() | |
| sys.exit(IOError) | |
| shutil.rmtree(TMPDIR) | |
| try : | |
| shutil.copytree(MOUNTPATH, TMPDIR) | |
| except : | |
| print ("Failed to copy from original iso %s to %s" % (MOUNTPATH, TMPDIR)) | |
| clean_up() | |
| sys.exit(IOError) | |
| try : | |
| shutil.copyfile(newpubkey, TMPDIR + pathSep + "authorized_keys") | |
| except : | |
| print ("Failed to copy key %s from original iso to new iso" % newpubkey) | |
| traceback.print_exc(file=sys.stdout) | |
| clean_up() | |
| sys.exit(IOError) | |
| command = "mkisofs -quiet -r -o " + tmpiso + " " + TMPDIR | |
| try : | |
| status = os.system(command) | |
| except : | |
| print("Failed to create new iso %s from %s" % (tmpiso, TMPDIR)) | |
| clean_up() | |
| sys.exit(IOError) | |
| shutil.rmtree(MOUNTPATH) | |
| try : | |
| shutil.copyfile(tmpiso, isofile) | |
| except : | |
| print ("Failed to overwrite old iso %s with %s" % (isofile,tmpiso)) | |
| traceback.print_exc(file=sys.stdout) | |
| clean_up() | |
| sys.exit(IOError) | |
| shutil.rmtree(TMPDIR) | |
| def copy_priv_key(newKey): | |
| currDir = os.path.dirname(os.path.abspath(__file__)) | |
| if filecmp.cmp(currDir + pathSep + "id_rsa.cloud", newKey): | |
| return 0 | |
| print ("Copying new private key file as it is not matching with old file") | |
| shutil.copyfile(newKey, currDir + pathSep + "id_rsa.cloud") | |
| os.chmod(currDir + pathSep + "id_rsa.cloud", 0644) | |
| return 0 | |
| if len(sys.argv) != 4: | |
| print("Usage: injectkeys.py <new public key file> <new private key file> <systemvm iso path>") | |
| clean_up() | |
| sys.exit(None) | |
| newpubkey=sys.argv[1] | |
| newprivkey=sys.argv[2] | |
| systemvmpath=sys.argv[3] | |
| if not os.path.exists(newpubkey): | |
| print("Could not open %s" % newpubkey) | |
| clean_up() | |
| sys.exit(IOError) | |
| if not os.path.exists(newprivkey): | |
| print("Could not open %s" % newprivkey) | |
| clean_up() | |
| sys.exit(IOError) | |
| #Verify all needed commands exists before calling | |
| inject_into_iso(newpubkey,"systemvm.iso") | |
| copy_priv_key(newprivkey) | |
| clean_up() | |
| #exit $? |