cloudstack/scripts/vm/systemvm/injectkeys.py
2014-04-16 11:07:55 +05:30

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 $?