#coding: UTF-8 import subprocess import sys import os import re def logInfo(msg): print("\033[1;32mINFO\033[0m " + str(msg)) def logErr(msg,logFile=None): print("\033[1;31mERROR\033[0m " + str(msg)) if(logFile): logFile.write(str(msg)) logFile.flush() class ExecRecepie: def __init__(self, desc, command): self.desc = desc self.cmd = command def execute(self, logFile=None, dry=False): try: logFile.write('excuting: ' + str(self.cmd)) logFile.flush() if not dry: ret = subprocess.call(['echo'] + cmd, stdout=logFile, stderr=logFile) if ret != 0: print() logErr( "\"" + cmd[0] + "\" returned error code: " + str(ret), logFile) except OSError as e: print() logErr("failed to execute command \"" + cmd[0] + "\". Logged to " + logFile.name + ". Error was: " + str(e)) sys.exit(1) class ConfigRecepie: def __init__(self, desc, directory, contentmap): self.desc = desc self.directory = directory self.contentmap = contentmap def execute(self, logFile=None, dry=False): if( dry and not self.directory[:4] is "/tmp"): self.directory = '/tmp/' + self.directory try: os.makedirs(self.directory) except OSError as e: logInfo(self.directory + " already there") for (filename, content) in self.contentmap.items(): try: fd = open(self.directory + '/' + filename,'w') fd.write(content) fd.close() except IOError: logErr('Unable to write file: ' + self.directory + filename) sys.exit(2) class FstabRecepie: def __init__(self, desc, fstab, rootDisk): self.desc = desc self.fstab = fstab self.rootDisk = rootDisk def execute(self, logFile=None, dry=False): if( dry): self.fstab = '/tmp/' + self.fstab with open(self.fstab, 'a') as fstab: fstab.write(self.rootDisk + ' / ext4 defaults,relatime 0 1\n') fstab.close() class Executor: def __init__(self, steps, comment=sys.argv[0]): logFile = open("/tmp/" + comment + ".log","a") logFile.write("# ### Starting new run \"" + comment + "\" ### #\r\n") logFile.flush() self.logFile = logFile self.steps=steps self.dry=True def do(self): totalSteps = len(self.steps) progress=1 for step in self.steps: print("[" + str(progress) + "/" + str(totalSteps) + "] excuting: " + step.desc, end="") step.execute(self.logFile, self.dry) print("\r[" + str(progress) + "/" + str(totalSteps) + "] excuted: " + step.desc + " ") progress = progress + 1 def parseIp(rawString): match = re.match('^130\.133\.110\.([0-9]{1,3})$',rawString) if not match: logErr('the ip ' + rawString + ' is no valid ip or not a adress from our subnet') sys.exit(2) return rawString, int(match.group(1)) def parseVmName(rawString): # valdiate vm-name if not re.match('^vm-[a-z]+[0-9]?(-[a-z])?$',rawString): logErr('the name ' + rawString + ' is no valid vm-name') sys.exit(2) return rawString def parseDiskSize(rawString): # valdiate disk size diskSizeUnit = 'G' diskSize = 0 match = re.match('^([0-9]+)([GgMm])?$',rawString) if not match: logErr('the name ' + raw + ' is no a valid disk size (G|M)?'); sys.exit(2) try: diskSizeUnit = match.group(2) diskSize = int(match.group(1)) except ValueError: logErr('the size ' + options.size + ' is not a valid disk size'); sys.exit(2) if not diskSizeUnit: diskSizeUnit = 'G' logInfo("interpreteing disk size in gigbyte magnitude") if diskSizeUnit == 'm' or diskSizeUnit == 'M': if not(1024 < diskSize and diskSize < 500000): logErr(' Syrsly? ' + str(diskSize) + ' megabytes?') sys.exit(2) else: if not(1 < diskSize and diskSize < 500): logErr(' Syrsly? ' + str(diskSize) + ' gigabytes?') sys.exit(2) return (diskSize, diskSizeUnit)