def __init__(self, arch, OS, version, user, software, givenname, desc, getimg, passwd, verbose, printLogStdout, baseimage, scratch, size): super(IMGenerate, self).__init__() self.arch = arch self.OS = OS self.version = version self.user = user self.passwd = passwd self.software = software self.givenname = givenname self.desc = desc self.getimg = getimg self._verbose = verbose self.printLogStdout = printLogStdout self.baseimage=baseimage self.scratch=scratch self.size=size #Load Configuration from file self._genConf = IMClientConf() self._genConf.load_generationConfig() self.serveraddr = self._genConf.getServeraddr() self.gen_port = self._genConf.getGenPort() self._ca_certs = self._genConf.getCaCertsGen() self._certfile = self._genConf.getCertFileGen() self._keyfile = self._genConf.getKeyFileGen() self._log = fgLog.fgLog(self._genConf.getLogFileGen(), self._genConf.getLogLevelGen(), "GenerateClient", printLogStdout)
class IMGenerate(object): def __init__(self, arch, OS, version, user, software, givenname, desc, getimg, passwd, verbose, printLogStdout, baseimage, scratch, size): super(IMGenerate, self).__init__() self.arch = arch self.OS = OS self.version = version self.user = user self.passwd = passwd self.software = software self.givenname = givenname self.desc = desc self.getimg = getimg self._verbose = verbose self.printLogStdout = printLogStdout self.baseimage=baseimage self.scratch=scratch self.size=size #Load Configuration from file self._genConf = IMClientConf() self._genConf.load_generationConfig() self.serveraddr = self._genConf.getServeraddr() self.gen_port = self._genConf.getGenPort() self._ca_certs = self._genConf.getCaCertsGen() self._certfile = self._genConf.getCertFileGen() self._keyfile = self._genConf.getKeyFileGen() self._log = fgLog.fgLog(self._genConf.getLogFileGen(), self._genConf.getLogLevelGen(), "GenerateClient", printLogStdout) def setArch(self, arch): self.arch = arch def setOs(self, os): self.OS = os def setVersion(self, version): self.version = version def setSoftware(self, software): self.software = software def setGivenname(self, givenname): self.givenname = givenname def setDesc(self, desc): self.desc = desc def setGetimg(self, getimg): self.getimg = getimg def setDebug(self, printLogStdout): self.printLogStdout = printLogStdout def setBaseImage(self, baseimage): self.baseimage=baseimage def setScratch(self, scratch): self.scratch=scratch def setSize(self, size): self.size=size def check_auth(self, socket_conn, checkauthstat): endloop = False passed = False while not endloop: ret = socket_conn.read(1024) if (ret == "OK"): if self._verbose: print "Authentication OK. Your image request is being processed" self._log.debug("Authentication OK") endloop = True passed = True elif (ret == "TryAuthAgain"): msg = "ERROR: Permission denied, please try again. User is " + self.user self._log.error(msg) if self._verbose: print msg m = hashlib.md5() m.update(getpass()) passwd = m.hexdigest() socket_conn.write(passwd) self.passwd = passwd elif ret == "NoActive": msg="ERROR: The status of the user "+ self.user + " is not active" checkauthstat.append(str(msg)) self._log.error(msg) #if self._verbose: # print msg endloop = True passed = False elif ret == "NoUser": msg="ERROR: User "+ self.user + " does not exist" checkauthstat.append(str(msg)) self._log.error(msg) #if self._verbose: # print msg + " WE" endloop = True passed = False else: self._log.error(str(ret)) #if self._verbose: # print ret checkauthstat.append(str(ret)) endloop = True passed = False return passed def generate(self): start_all = time.time() #generate string with options separated by | character output = None checkauthstat = [] #params[0] is user #params[1] is operating system #params[2] is version #params[3] is arch #params[4] is software #params[5] is givenname #params[6] is the description #params[7] is to retrieve the image or to upload in the repo (true or false, respectively) #params[8] is the user password #params[9] is the type of password #params[10] is to generate only a base image #params[11] is to do not use a cached based image options = str(self.user) + "|" + str(self.OS) + "|" + str(self.version) + "|" + str(self.arch) + "|" + \ str(self.software) + "|" + str(self.givenname) + "|" + str(self.desc) + "|" + str(self.getimg) + \ "|" + str(self.passwd) + "|ldappassmd5|" + str(self.baseimage) + "|"+ str(self.scratch) + "|" + str(self.size) #self._log.debug("string to send: "+options) #Notify xCAT deployment to finish the job s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: genServer = ssl.wrap_socket(s, ca_certs=self._ca_certs, certfile=self._certfile, keyfile=self._keyfile, cert_reqs=ssl.CERT_REQUIRED, ssl_version=ssl.PROTOCOL_TLSv1) self._log.debug("Connecting server: " + self.serveraddr + ":" + str(self.gen_port)) if self._verbose: print "Connecting server: " + self.serveraddr + ":" + str(self.gen_port) genServer.connect((self.serveraddr, self.gen_port)) except ssl.SSLError: self._log.error("CANNOT establish SSL connection. EXIT") if self._verbose: print "ERROR: CANNOT establish SSL connection. EXIT" genServer.write(options) #check if the server received all parameters if self._verbose: print "Your image request is in the queue to be processed after authentication" if self.check_auth(genServer, checkauthstat): if self._verbose: print "Generating the image" ret = genServer.read(2048) if (re.search('^ERROR', ret)): self._log.error('The image has not been generated properly. Exit error:' + ret) if self._verbose: print "ERROR: The image has not been generated properly. Exit error:" + ret else: self._log.debug("Returned string: " + str(ret)) if self.getimg: output = self._retrieveImg(ret, "./") genServer.write('end') else: if (re.search('^ERROR', ret)): self._log.error('The image has not been generated properly. Exit error:' + ret) if self._verbose: print "ERROR: The image has not been generated properly. Exit error:" + ret else: self._log.debug("The image ID is: " + str(ret)) output = str(ret) else: self._log.error(str(checkauthstat[0])) if self._verbose: print checkauthstat[0] return end_all = time.time() self._log.info('TIME walltime image generate client:' + str(end_all - start_all)) #server return addr of the img and metafile compressed in a tgz, imgId or None if error return output """ ############################################################ # _rExec ############################################################ def _rExec(self, cmdexec): #TODO: do we want to use the .format statement from python to make code more readable? #Set up random string random.seed() randid = str(random.getrandbits(32)) cmdssh = "ssh " + self.serveraddr tmpFile = "/tmp/" + str(time()) + str(randid) #print tmpFile cmdexec = cmdexec + " > " + tmpFile cmd = cmdssh + cmdexec self._log.debug(str(cmd)) stat = os.system(cmd) if (str(stat) != "0"): #print stat self._log.debug(str(stat)) f = open(tmpFile, "r") outputs = f.readlines() f.close() os.system("rm -f " + tmpFile) #output = "" #for line in outputs: # output += line.strip() #print outputs return outputs """ ############################################################ # _retrieveImg ############################################################ def _retrieveImg(self, dir, dest): imgURI = self.serveraddr + ":" + dir imgIds = imgURI.split("/") imgId = imgIds[len(imgIds) - 1] cmdscp = "" if self._verbose: cmdscp = "scp " + self.user + "@" + imgURI + " " + dest else:#this is the case where another application call it. So no password or passphrase is allowed cmdscp = "scp -q -oBatchMode=yes " + self.user + "@" + imgURI + " " + dest output = "" try: if self._verbose: print 'Retrieving image. You may be asked for ssh/passphrase password' self._log.debug(cmdscp) stat = os.system(cmdscp) stat = 0 if (stat == 0): output = dest + "/" + imgId else: self._log.error("Error retrieving the image. Exit status " + str(stat)) if self._verbose: print "Error retrieving the image. Exit status " + str(stat) output = None #remove the temporal file except os.error: self._log.error("Error, The image cannot be retieved" + str(sys.exc_info())) if self._verbose: print "Error, The image cannot be retieved" + str(sys.exc_info()) output = None return output