python/lib/cloudutils/syscfg.py (199 lines of code) (raw):

# 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. from .utilities import Distribution, serviceOpsRedhat,serviceOpsUbuntu,serviceOpsRedhat7Later,serviceOpsSUSE from .serviceConfig import * class sysConfigFactory: @staticmethod def getSysConfigFactory(glbEnv): if glbEnv.mode == "Agent": return sysConfigAgentFactory.getAgent(glbEnv) elif glbEnv.mode == "Server": return sysConfigServerFactory.getServer(glbEnv) elif glbEnv.mode == "HttpsServer": return sysConfigServerFactory.getServer(glbEnv) elif glbEnv.mode == "Db": return sysConfigDbFactory.getDb(glbEnv) else: raise CloudInternalException("Need to specify which mode are u running: Agent/Server/Db") class sysConfigAgentFactory: @staticmethod def getAgent(glbEnv): glbEnv.distribution = Distribution() distribution = glbEnv.distribution.getVersion() if distribution == "Ubuntu": return sysConfigAgentUbuntu(glbEnv) elif distribution == "CentOS" or distribution == "RHEL5": return sysConfigEL5(glbEnv) elif distribution == "RHEL6": return sysConfigEL6(glbEnv) elif distribution == "RHEL7": return sysConfigEL7(glbEnv) elif distribution in ["Fedora", "RHEL8", "RHEL9", "RHEL10"]: return sysConfigEL(glbEnv) elif distribution == "SUSE": return sysConfigSUSE(glbEnv) else: print("Can't find the distribution version") return sysConfig() class sysConfigServerFactory: @staticmethod def getServer(glbEnv): glbEnv.distribution = Distribution() distribution = glbEnv.distribution.getVersion() if distribution == "Ubuntu": return sysConfigServerUbuntu(glbEnv) elif distribution != "Unknown": return sysConfigServerRedhat(glbEnv) else: print("Can't find the distribution version") return sysConfig() class sysConfigDbFactory: @staticmethod def getDb(glbEnv): pass class sysConfig(object): def __init__(self, env): self.env = env self.services = [] def registerService(self, service): self.services.append(service(self)) def config(self): if not self.check(): return False for service in self.services: if not service.configuration(): raise CloudInternalException("Configuration failed for service %s" % service.serviceName) def restore(self): for service in self.services: service.backup() def check(self): return True class sysConfigAgent(sysConfig): def __init__(self, env): super(sysConfigAgent, self).__init__(env) def check(self): if self.env.debug: return True if self.env.agentMode == "myCloud": if self.env.distribution.getVersion() != "Ubuntu": raise CloudInternalException("Need to run myCloud agent on an Ubuntu machine\n") elif self.env.distribution.getArch() != "x86_64": raise CloudInternalException("Need to run myCloud agent on an 64bit machine\n") #check free disk space on the local disk if os.path.exists("/var/lib/libvirt/images"): size = -1 try: size = int(bash("df -P /var/lib/libvirt/images | tail -1 |awk '{print $4}'").getStdout()) except: pass if size != -1 and size < (30 * 1024 * 1024): raise CloudRuntimeException("Need at least 30G free disk space under /var/lib/libvirt/images") #check memory mem = -1 try: mem = int(bash("free -g|grep Mem|awk '{print $2}'").getStdout()) except: pass if mem != -1 and mem < 1: raise CloudRuntimeException("Need at least 1G memory") if os.geteuid() != 0: raise CloudInternalException("Need to execute with root permission\n") hostname = bash("hostname -f") if not hostname.isSuccess(): raise CloudInternalException("Checking hostname ... [Failed]\nPlease edit /etc/hosts, add a Fully Qualified Domain Name as your hostname\n") kvmEnabled = self.svo.isKVMEnabled() if not kvmEnabled: raise CloudInternalException("Checking KVM...[Failed]\nPlease enable KVM on this machine\n") return True class sysConfigAgentRedhatBase(sysConfigAgent): def __init__(self, env): self.svo = serviceOpsRedhat() super(sysConfigAgentRedhatBase, self).__init__(env) class sysConfigAgentRedhat7Base(sysConfigAgent): def __init__(self, env): self.svo = serviceOpsRedhat7Later() super(sysConfigAgentRedhat7Base, self).__init__(env) class sysConfigAgentELBase(sysConfigAgent): def __init__(self, env): self.svo = serviceOpsRedhat7Later() super(sysConfigAgentELBase, self).__init__(env) class sysConfigAgentSUSE(sysConfigAgent): def __init__(self, env): self.svo = serviceOpsSUSE() super(sysConfigAgentSUSE, self).__init__(env) class sysConfigAgentUbuntu(sysConfigAgent): def __init__(self, glbEnv): super(sysConfigAgentUbuntu, self).__init__(glbEnv) self.svo = serviceOpsUbuntu() self.services = [hostConfig(self), securityPolicyConfigUbuntu(self), networkConfigUbuntu(self), libvirtConfigUbuntu(self), firewallConfigUbuntu(self), nfsConfig(self), cloudAgentConfig(self)] #It covers RHEL5/CentOS5, the mainly difference is that there is no cgroup class sysConfigEL5(sysConfigAgentRedhatBase): def __init__(self, glbEnv): super(sysConfigEL5, self).__init__(glbEnv) self.services = [hostConfig(self), securityPolicyConfigRedhat(self), networkConfigRedhat(self), libvirtConfigRedhat(self), firewallConfigAgent(self), nfsConfig(self), cloudAgentConfig(self)] #it covers RHEL6 class sysConfigEL6(sysConfigAgentRedhatBase): def __init__(self, glbEnv): super(sysConfigEL6, self).__init__(glbEnv) self.services = [hostConfig(self), cgroupConfig(self), securityPolicyConfigRedhat(self), networkConfigRedhat(self), libvirtConfigRedhat(self), firewallConfigAgent(self), nfsConfig(self), cloudAgentConfig(self)] #it covers RHEL7 class sysConfigEL7(sysConfigAgentRedhat7Base): def __init__(self, glbEnv): super(sysConfigEL7, self).__init__(glbEnv) self.services = [hostConfig(self), securityPolicyConfigRedhat(self), networkConfigRedhat(self), libvirtConfigRedhat(self), firewallConfigAgent(self), nfsConfig(self), cloudAgentConfig(self)] #it covers RHEL8 and later class sysConfigEL(sysConfigAgentELBase): def __init__(self, glbEnv): super(sysConfigEL, self).__init__(glbEnv) self.services = [hostConfig(self), securityPolicyConfigRedhat(self), networkConfigRedhat(self), libvirtConfigRedhat(self), firewallConfigAgent(self), nfsConfig(self), cloudAgentConfig(self)] class sysConfigSUSE(sysConfigAgentSUSE): def __init__(self, glbEnv): super(sysConfigSUSE, self).__init__(glbEnv) self.services = [hostConfig(self), securityPolicyConfigSUSE(self), networkConfigSUSE(self), libvirtConfigSUSE(self), firewallConfigAgent(self), nfsConfig(self), cloudAgentConfig(self)] class sysConfigServer(sysConfig): def check(self): if os.geteuid() != 0: raise CloudInternalException("Need to execute with root permission") hostname = bash("hostname -f") if not hostname.isSuccess(): raise CloudInternalException("Checking hostname ... [Failed]\nPlease edit /etc/hosts, add a Fully Qualified Domain Name as your hostname\n") return True class sysConfigServerRedhat(sysConfigServer): def __init__(self, glbEnv): super(sysConfigServerRedhat, self).__init__(glbEnv) self.svo = serviceOpsRedhat() self.services = [] class sysConfigServerUbuntu(sysConfigServer): def __init__(self, glbEnv): super(sysConfigServerUbuntu, self).__init__(glbEnv) self.svo = serviceOpsUbuntu() self.services = []