From edf54ee400545d8f1e8941c8c49849f495bde404 Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Wed, 7 Sep 2005 19:16:34 +0000 Subject: Include generator stuff (Logical change 1.301) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@1226 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Server/Plugins/Vhost.py | 71 +++++++++++++++++++++++++++++++++++------ 1 file changed, 62 insertions(+), 9 deletions(-) (limited to 'src/lib/Server/Plugins/Vhost.py') diff --git a/src/lib/Server/Plugins/Vhost.py b/src/lib/Server/Plugins/Vhost.py index b0a8d3e0b..44a0bc16d 100644 --- a/src/lib/Server/Plugins/Vhost.py +++ b/src/lib/Server/Plugins/Vhost.py @@ -14,38 +14,90 @@ ''' __revision__ = '$Revision$' +import base64 from copy import deepcopy from elementtree.ElementTree import XML, Element, SubElement +from socket import gethostbyname from Bcfg2.Server.Generator import SingleXMLFileBacked -from Bcfg2.Server.Plugin import Plugin - -# Global Variables for paths of apache -sitesen = "/etc/apache2/sites-enabled/" -sitesav = "/etc/apache2/sites-available/" +from Bcfg2.Server.Plugin import Plugin, PluginExecutionError class VhostFile(SingleXMLFileBacked): '''The Vhost file contains webserver vhost configuration elements''' + sitesen = "/etc/apache2/sites-enabled/" + sitesav = "/etc/apache2/sites-available/" + + def __init__(self, name, fam): + self.dispatch = {'ConfigFile':{'/etc/default/apache2':self.generateApacheDefault}, + 'Service':{'apache2':self.generateApacheSvc}} + SingleXMLFileBacked.__init__(self, name, fam) + self.http = open('/disks/bcfg2/Vhost/default.httpd', 'r').readlines() + self.servers = [] + self.vhosts = {} def Index(self): self.meta = XML(self.data) + self.servers = [serv.get('name') for serv in self.meta.findall('server')] + self.vhosts = {} + for server in self.meta.findall("server"): + for vhost in server.findall("vhost"): + name = vhost.get('name') + self.dispatch[self.sitesav + name] = self.generateSiteFile + self.vhosts[name] = vhost def BuildStructures(self, metadata): '''Build apache+vhost bundle''' + if metadata.hostname not in self.servers: + return [] output = Element("Bundle", name='apache-vhost', version='2.0') - self.serverlist = [] for server in self.meta.findall("server"): - self.serverlist.append(server.attrib['name']) if server.attrib['name'] in metadata.hostname: for vhost in server.findall("vhost"): name = vhost.get('name') - SubElement(output, "SymLink", name=sitesen+name, to=sitesav+name) + SubElement(output, "SymLink", name=self.sitesen+name, to=self.sitesav+name) SubElement(output, "ConfigFile", name="/etc/apache2/sites-available/" + name) SubElement(output, "ConfigFile", name='/etc/default/apache2') - if [software for software in self.meta.findall('Software') if metadata.hostname in self.serverlist]: + for software in self.meta.findall("Software"): for child in software.getchildren(): output.append(deepcopy(child)) return [output] + def generateApacheDefault(self, entry, metadata): + '''Build /etc/default/apache2''' + if metadata.hostname in self.servers: + entry.text = 'NO_START=0\n' + else: + entry.text = 'NO_START=1\n' + entry.attrib.update({'owner':'root', 'group':'root', 'perms':'0644'}) + + def generateApacheSvc(self, entry, metadata): + '''Enable apache service on webservices, disable on others''' + if metadata.hostname in self.servers: + entry.set('status', 'on') + else: + entry.set('status', 'off') + + def generateSiteFile(self, entry, metadata): + '''Build site-specific config file for vhost''' + if metadata.hostname not in self.servers: + raise PluginExecutionError + vhostname = entry.get('name')[len(self.sitesav):] + if not self.vhosts.has_key(vhostname): + raise PluginExecutionError + + if self.vhosts[vhostname].get('root') == "Hostname": + choice = vhostname + else: + choice = gethostbyname(vhostname) + + config = "" + for line in self.http: + line = line.replace("XXemailXX", self.vhosts[vhostname].get('email')) + line = line.replace("XXdomainXX", vhostname) + line = line.replace("XXchoiceXX", choice) + config += line + entry.text = base64.encodestring(config) + entry.attrib.update({'owner':'root', 'group':'root', 'perms':'0644', 'encoding':'base64'}) + class Vhost(Plugin): '''This Structure is good for the pile of independent configs needed for most actual systems''' __name__ = 'Vhost' @@ -57,3 +109,4 @@ class Vhost(Plugin): Plugin.__init__(self, core, datastore) self.Vhost = VhostFile("%s/Vhost/Vhost.xml"%(datastore), self.core.fam) self.BuildStructures = self.Vhost.BuildStructures + self.Entries = self.Vhost.dispatch -- cgit v1.2.3-1-g7c22