Repository: cloudstack Updated Branches: refs/heads/master fe5ab4aa9 -> 93c46c9be
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93c46c9b/scripts/installer/windows/start.bat ---------------------------------------------------------------------- diff --git a/scripts/installer/windows/start.bat b/scripts/installer/windows/start.bat new file mode 100644 index 0000000..e819fa2 --- /dev/null +++ b/scripts/installer/windows/start.bat @@ -0,0 +1,12 @@ +:: 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. +echo Starting Apache CloudStack > C:\Work\tmp.out +START %CATALINA_HOME%\bin\startup.bat +echo Started Aoache CloudStack >> C:\Work\tmp.out \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93c46c9b/scripts/vm/systemvm/injectkeys.py ---------------------------------------------------------------------- diff --git a/scripts/vm/systemvm/injectkeys.py b/scripts/vm/systemvm/injectkeys.py new file mode 100644 index 0000000..bd840f9 --- /dev/null +++ b/scripts/vm/systemvm/injectkeys.py @@ -0,0 +1,142 @@ +#!/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 + +pathSep=os.sep +TMP=os.path.expanduser("~") + os.sep + "tmp" #Get Home Directory +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" % isofile) + 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 $? http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93c46c9b/server/src/com/cloud/server/ConfigurationServerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java index 4781010..13135b0 100755 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@ -737,7 +737,10 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio s_logger.info("Systemvm keypairs not found in database. Need to store them in the database"); } // FIXME: take a global database lock here for safety. - Script.runSimpleBashScript("if [ -f " + privkeyfile + " ]; then rm -f " + privkeyfile + "; fi; ssh-keygen -t rsa -N '' -f " + privkeyfile + " -q"); + boolean onWindows = isOnWindows(); + if(!onWindows) { + Script.runSimpleBashScript("if [ -f " + privkeyfile + " ]; then rm -f " + privkeyfile + "; fi; ssh-keygen -t rsa -N '' -f " + privkeyfile + " -q"); + } byte[] arr1 = new byte[4094]; // configuration table column value size try { @@ -872,7 +875,8 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio } protected void injectSshKeysIntoSystemVmIsoPatch(String publicKeyPath, String privKeyPath) { - String injectScript = "scripts/vm/systemvm/injectkeys.sh"; + s_logger.info("Trying to inject public and private keys into systemvm iso"); + String injectScript = getInjectScript(); String scriptPath = Script.findScript("", injectScript); String systemVmIsoPath = Script.findScript("", "vms/systemvm.iso"); if (scriptPath == null) { @@ -881,19 +885,42 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio if (systemVmIsoPath == null) { throw new CloudRuntimeException("Unable to find systemvm iso vms/systemvm.iso"); } - final Script command = new Script("/bin/bash", s_logger); + Script command = null; + if(isOnWindows()) { + command = new Script("python", s_logger); + } else { + command = new Script("/bin/bash", s_logger); + } command.add(scriptPath); command.add(publicKeyPath); command.add(privKeyPath); command.add(systemVmIsoPath); final String result = command.execute(); + s_logger.info("Injected public and private keys into systemvm iso with result : " + result); if (result != null) { s_logger.warn("Failed to inject generated public key into systemvm iso " + result); throw new CloudRuntimeException("Failed to inject generated public key into systemvm iso " + result); } } + protected String getInjectScript() { + String injectScript = null; + boolean onWindows = isOnWindows(); + if(onWindows) { + injectScript = "scripts/vm/systemvm/injectkeys.py"; + } else { + injectScript = "scripts/vm/systemvm/injectkeys.sh"; + } + return injectScript; + } + + protected boolean isOnWindows() { + String os = System.getProperty("os.name", "generic").toLowerCase(); + boolean onWindows = (os != null && os.startsWith("windows")); + return onWindows; + } + @DB protected void generateSecStorageVmCopyPassword() { String already = _configDao.getValue("secstorage.copy.password"); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/93c46c9b/server/test/com/cloud/server/ConfigurationServerImplTest.java ---------------------------------------------------------------------- diff --git a/server/test/com/cloud/server/ConfigurationServerImplTest.java b/server/test/com/cloud/server/ConfigurationServerImplTest.java index 08a2097..38dc1bc 100644 --- a/server/test/com/cloud/server/ConfigurationServerImplTest.java +++ b/server/test/com/cloud/server/ConfigurationServerImplTest.java @@ -21,9 +21,26 @@ import java.io.IOException; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; +import org.junit.Assert; import org.junit.Test; +import org.mockito.Spy; public class ConfigurationServerImplTest { + + @Spy + ConfigurationServerImpl windowsImpl = new ConfigurationServerImpl() { + protected boolean isOnWindows() { + return true; + } + }; + + @Spy + ConfigurationServerImpl linuxImpl = new ConfigurationServerImpl() { + protected boolean isOnWindows() { + return false; + } + }; + final static String TEST = "the quick brown fox jumped over the lazy dog"; @Test(expected = IOException.class) @@ -58,4 +75,13 @@ public class ConfigurationServerImplTest { temp.delete(); } } + + @Test + public void testWindowsScript() { + Assert.assertTrue(windowsImpl.isOnWindows()); + Assert.assertEquals("scripts/vm/systemvm/injectkeys.py", windowsImpl.getInjectScript()); + + Assert.assertFalse(linuxImpl.isOnWindows()); + Assert.assertEquals("scripts/vm/systemvm/injectkeys.sh", linuxImpl.getInjectScript()); + } }