mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
145 lines
4.0 KiB
Python
145 lines
4.0 KiB
Python
#!/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 $?
|