You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by an...@apache.org on 2014/03/05 08:52:48 UTC

[03/20] git commit: updated refs/heads/4.3 to 3297fcc

CLOUDSTACK-6155
Baremetal agent RPM missing in spec file
(cherry picked from commit c1806bd873fe661756aeee94b25339c25f9724a5)

Signed-off-by: Animesh Chaturvedi <an...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a652737f
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a652737f
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a652737f

Branch: refs/heads/4.3
Commit: a652737f8daa07ec913169c97202f812db8bbb75
Parents: 360b7e3
Author: Frank.Zhang <fr...@citrix.com>
Authored: Fri Feb 21 13:22:55 2014 -0800
Committer: Animesh Chaturvedi <an...@apache.org>
Committed: Tue Mar 4 23:38:06 2014 -0800

----------------------------------------------------------------------
 setup/bindir/cloud-setup-baremetal.in | 232 +++++++++++++++++++++++++++++
 1 file changed, 232 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a652737f/setup/bindir/cloud-setup-baremetal.in
----------------------------------------------------------------------
diff --git a/setup/bindir/cloud-setup-baremetal.in b/setup/bindir/cloud-setup-baremetal.in
new file mode 100644
index 0000000..367e389
--- /dev/null
+++ b/setup/bindir/cloud-setup-baremetal.in
@@ -0,0 +1,232 @@
+#!/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, os
+from subprocess import PIPE, Popen
+import logging
+import traceback
+from os.path import exists, join
+from signal import alarm, signal, SIGALRM, SIGKILL
+
+class CloudRuntimeException(Exception):
+    def __init__(self, errMsg):
+        self.errMsg = errMsg
+    def __str__(self):
+        return self.errMsg
+def formatExceptionInfo(maxTBlevel=5):
+    cla, exc, trbk = sys.exc_info()
+    excTb = traceback.format_tb(trbk, maxTBlevel)
+    msg = str(exc) + "\n"
+    for tb in excTb:
+        msg += tb
+    return msg
+
+class bash:
+    def __init__(self, args, timeout=600):
+        self.args = args
+        logging.debug("execute:%s"%args)
+        self.timeout = timeout
+        self.process = None
+        self.success = False
+        self.run()
+
+    def run(self):
+        class Alarm(Exception):
+            pass
+        def alarm_handler(signum, frame):
+            raise Alarm
+
+        try:
+            self.process = Popen(self.args, shell=True, stdout=PIPE, stderr=PIPE)
+            if self.timeout != -1:
+                signal(SIGALRM, alarm_handler)
+                alarm(self.timeout)
+
+            try:
+                self.stdout, self.stderr = self.process.communicate()
+                if self.timeout != -1:
+                    alarm(0)
+            except Alarm:
+                os.kill(self.process.pid, SIGKILL)
+                raise  CloudRuntimeException("Timeout during command execution")
+
+            self.success = self.process.returncode == 0
+        except:
+            raise  CloudRuntimeException(formatExceptionInfo())
+
+#        if not self.success: 
+#            raise  CloudRuntimeException(self.getStderr())
+
+    def isSuccess(self):
+        return self.success
+    
+    def getStdout(self):
+        return self.stdout.strip("\n")
+    
+    def getLines(self):
+        return self.stdout.split("\n")
+
+    def getStderr(self):
+        return self.stderr.strip("\n")
+
+
+def initLoging(logFile=None):
+    try:
+        if logFile is None:
+            logging.basicConfig(level=logging.DEBUG) 
+        else: 
+            logging.basicConfig(filename=logFile, level=logging.DEBUG) 
+    except:
+        logging.basicConfig(level=logging.DEBUG) 
+
+def writeProgressBar(msg, result=None):    
+    if msg is not None:
+        output = "%-80s"%msg
+    elif result is True:
+        output = "[ \033[92m%-2s\033[0m ]\n"%"OK"
+    elif result is False:
+        output = "[ \033[91m%-6s\033[0m ]\n"%"FAILED"
+    sys.stdout.write(output)
+    sys.stdout.flush()
+    
+def printError(msg):
+    sys.stderr.write(msg)
+    sys.stderr.write("\n")
+    sys.stderr.flush()
+
+def printMsg(msg):
+    sys.stdout.write(msg+"\n")
+    sys.stdout.flush()
+
+def checkRpm(pkgName):
+    chkPkg = bash("rpm -q %s"%pkgName)
+    writeProgressBar("Checking %s"%pkgName, None)
+    if not chkPkg.isSuccess():
+        writeProgressBar(None, False)
+        printError("%s is not found, please make sure it is installed. You may try 'yum install %s'\n"%(pkgName, pkgName))
+        return False
+    else:
+        writeProgressBar(None, True)
+        return True
+      
+def checkEnv():
+   writeProgressBar("Checking is root")
+   ret = bash("whoami")
+   if ret.getStdout() != "root":
+       writeProgressBar(None, False)
+       printError("This script must run as root")
+       return False
+   else:
+       writeProgressBar(None, True)
+       
+   pkgList = ['tftp-server', 'syslinux', 'xinetd', 'chkconfig', 'dhcp']
+   for pkg in pkgList:
+       if not checkRpm(pkg):
+           return False
+   return True
+
+def exitIfFail(ret):
+    if not ret: sys.exit(1) 
+    
+def bashWithResult(cmd):
+    writeProgressBar("Executing '%s'"%cmd)
+    ret = bash(cmd)
+    if not ret.isSuccess():
+        writeProgressBar(None, False)
+        writeProgressBar(ret.getStderr() + '\n')
+        return False
+    else:
+        writeProgressBar(None, True)
+        return True
+    
+def configurePxeStuff(): 
+    stuff = ['tftp', 'xinetd', 'dhcpd']
+    cmds = ['chkconfig --level 345 %s on' % i for i in stuff]
+    cmds.append('/etc/init.d/xinetd restart')
+    
+    for cmd in cmds:
+        if not bashWithResult(cmd): return False
+        
+    chkIptable = bash('chkconfig --list iptables')
+    if 'on' in chkIptable.getStdout():
+        printMsg("Detected iptables is running, need to open tftp port 69")
+        if not bashWithResult('iptables -I INPUT 1 -p udp --dport 69 -j ACCEPT'): return False
+        if not bashWithResult('/etc/init.d/iptables save'): return False
+        
+    return True  
+    
+def getTftpRootDir(tftpRootDirList):
+    tftpRoot = bash("cat /etc/xinetd.d/tftp | grep server_args")
+    if not tftpRoot.isSuccess():
+        printError("Cannot get tftp root directory from /etc/xinetd.d/tftp, here may be something wrong with your tftp-server, try reinstall it\n")
+        return False
+    tftpRootDir = tftpRoot.getStdout()
+    index = tftpRootDir.find("/")
+    if index == -1:
+        printError("Wrong server_arg in /etc/xinetd.d/tftp (%s)"%tftpRootDir)
+        return False
+    tftpRootDir = tftpRootDir[index:]
+    tftpRootDirList.append(tftpRootDir)
+    return True
+
+def preparePING(tftpRootDir):
+    pingFiles = ['boot.msg', 'initrd.gz', 'kernel', 'pxelinux.0']
+    pingDir = "/usr/share/PING"
+    
+    for f in pingFiles:
+        path = join(pingDir, f)
+        if not exists(path):
+            printError("Cannot find %s, please make sure PING-3.01 is installed"%path)
+            return False
+        if not bashWithResult("cp -f %s %s"%(path, tftpRootDir)): return False
+     
+    if not bashWithResult("mkdir -p %s/pxelinux.cfg"%tftpRootDir): return False
+    
+    return True
+
+def prepareSyslinux(tftpRootDir):
+    pkg = bash('rpm -ql syslinux | grep "/pxelinux.0$"')
+    if not pkg.isSuccess():
+        printError('cannot find pxelinux.0 on system. is syslinux installed?')
+        return False
+
+    pkg = pkg.getStdout()
+    cp = "cp -f %s %s" % (pkg, tftpRootDir)
+    if not bashWithResult(cp):
+        return False
+
+    return True
+
+            
+        
+if __name__ == "__main__":
+    initLoging("/tmp/cloud-setup-baremetal.log")
+    tftpRootDirList = []
+    
+    exitIfFail(checkEnv())
+    exitIfFail(configurePxeStuff())
+    exitIfFail(getTftpRootDir(tftpRootDirList))
+    
+    tftpRootDir = tftpRootDirList[0].strip()
+    #exitIfFail(preparePING(tftpRootDir))
+    exitIfFail(prepareSyslinux(tftpRootDir))
+    printMsg("")
+    printMsg("Setup BareMetal PXE server successfully")
+    printMsg("TFTP root directory is: %s\n"%tftpRootDir)
+    sys.exit(0)
+