@ -18,27 +18,35 @@
# USA.
#
# Version: $Id$
""" This module defines the code for handling domains. """
import datetime
import os
from gnuviechadmin . exceptions import *
from settings import *
from BackendTo import Record , Domain
from BackendEntity import BackendEntity
from BackendEntityHandler import BackendEntityHandler
from gnuviechadmin . exceptions import ValidationFailedError
from gnuviechadmin . backend . settings import config , get_template , \
get_template_dir , get_template_string
from gnuviechadmin . backend . BackendTo import Record , Domain
from gnuviechadmin . backend . BackendEntity import BackendEntity
from gnuviechadmin . backend . BackendEntityHandler import BackendEntityHandler
class DomainEntity ( BackendEntity ) :
""" Entity class for DNS domains. """
# the valid domain types
_valid_domain_types = ( " MASTER " , " SLAVE " )
def __init__ ( self , delegate , verbose = False , * * kwargs ) :
""" Initializes the DomainEntity instance.
` delegate ` is the corresponding database object .
If ` verbose ` is ` True ` verbose logging is turned on .
"""
BackendEntity . __init__ ( self , delegate , verbose )
self . ns1 = None
self . ns2 = None
self . mx = None
self . mx rr = None
self . ipaddr = None
for ( key , value ) in kwargs . items ( ) :
self . __setattr__ ( key , value )
@ -48,17 +56,20 @@ class DomainEntity(BackendEntity):
self . ns1 = config . get ( ' domain ' , ' defaultns1 ' )
if not self . ns2 :
self . ns2 = config . get ( ' domain ' , ' defaultns2 ' )
if not self . mx :
self . mx = config . get ( ' domain ' , ' defaultmx ' )
if not self . mx rr :
self . mx rr = config . get ( ' domain ' , ' defaultmx ' )
if not self . ipaddr :
self . ipaddr = config . get ( ' domain ' , ' defaultip ' )
self . delegateto . type = self . delegateto . type . upper ( )
self . validate ( )
def getdefaultdomaintype ( self ) :
""" Returns the default domain type. """
return self . _valid_domain_types [ 0 ]
def validate ( self ) :
""" Validates the consistency if the entity instance and
dependent entities . """
BackendEntity . validate ( self )
if not self . delegateto . type in self . _valid_domain_types :
raise ValidationFailedError (
@ -70,11 +81,12 @@ class DomainEntity(BackendEntity):
if not self . ns1 or not self . ns2 :
raise ValidationFailedError (
self , " two nameservers must be specified. " )
if not self . mx :
if not self . mx rr :
raise ValidationFailedError (
self , " a primary mx host must be specified. " )
def _getnewserial ( self , oldserial = None ) :
""" Gets a new zone serial number for the DNS domain entity. """
current = datetime . datetime . now ( )
datepart = " %04d %02d %02d " % \
( current . year , current . month , current . day )
@ -87,6 +99,7 @@ class DomainEntity(BackendEntity):
return retval
def _getnewsoa ( self ) :
""" Gets a new SOA record for the DNS domain entity. """
return ' %s %s %d %d %d %d %d ' % \
( self . ns1 ,
config . get ( ' domain ' , ' defaulthostmaster ' ) ,
@ -97,6 +110,7 @@ class DomainEntity(BackendEntity):
config . getint ( ' domain ' , ' defaultminimumttl ' ) )
def update_serial ( self , session ) :
""" Updates the serial of the domain. """
query = session . query ( Record )
soarecord = query . get_by ( Record . c . type == ' SOA ' ,
Record . c . domainid == self . delegateto . domainid )
@ -107,19 +121,24 @@ class DomainEntity(BackendEntity):
session . flush ( )
def _get_vhost_dir ( self ) :
""" Gets the directory name for the Apache VirtualHost of the
domain . """
return os . path . join ( self . delegateto . sysuser . home ,
self . delegateto . name ,
config . get ( ' domain ' , ' htdir ' ) )
def _get_log_dir ( self ) :
""" Gets the Apache log file directory for the domain. """
return os . path . join ( config . get ( ' domain ' , ' logpath ' ) ,
self . delegateto . name )
def _get_stats_dir ( self ) :
""" Gets the statistics dir for the domain. """
return os . path . join ( config . get ( ' domain ' , ' statspath ' ) ,
self . delegateto . name )
def _create_vhost_dir ( self ) :
""" Creates the Apache VirtualHost directory for the domain. """
vhostdir = self . _get_vhost_dir ( )
self . logger . debug ( " creating virtual host dir %s " % ( vhostdir ) )
cmd = ' mkdir -p " %s " ' % ( vhostdir )
@ -140,10 +159,13 @@ class DomainEntity(BackendEntity):
self . sucommand ( cmd )
def _create_log_dir ( self ) :
""" Creates the Apache log file directory for the domain. """
cmd = ' mkdir -p " %s " ' % ( self . _get_log_dir ( ) )
self . sucommand ( cmd )
def _get_auth_userfile ( self ) :
""" Gets the file name of the password file for statistic
logins for the domain . """
authdir = config . get ( ' domain ' , ' authdir ' )
if not os . path . isdir ( authdir ) :
cmd = ' mkdir -p " %s " ' % ( authdir )
@ -171,6 +193,8 @@ class DomainEntity(BackendEntity):
' .htaccess ' ) , template )
def _create_stats_conf ( self ) :
""" Creates the modlogan statistics configuration for the
domain . """
modlogandir = os . path . join ( config . get ( ' domain ' ,
' modlogandir ' ) ,
self . delegateto . sysuser . username )
@ -188,6 +212,7 @@ class DomainEntity(BackendEntity):
template )
def _create_apache_conf ( self ) :
""" Creates the Apache configuration file for the domain. """
template = get_template ( config . get ( ' domain ' , ' conftemplates ' ) ,
config . get ( ' domain ' , ' apachetemplate ' ) )
template = template . substitute ( {
@ -200,6 +225,7 @@ class DomainEntity(BackendEntity):
self . delegateto . name ) , template )
def _mail_domain ( self ) :
""" Mail a summary of the domain data. """
template = get_template ( config . get ( ' common ' , ' mailtemplates ' ) ,
config . get ( ' domain ' , ' create.mail ' ) )
text = template . substitute ( {
@ -213,6 +239,11 @@ class DomainEntity(BackendEntity):
self . send_mail ( subject , text )
def create_hook ( self , session ) :
""" Hook for the creation of the domain.
This method is called by
` gnuviechadmin . backend . BackendEntityHandler . create ( ) ` .
"""
self . delegateto . records . append ( Record (
name = self . delegateto . name , type = ' SOA ' ,
content = self . _getnewsoa ( ) ,
@ -224,7 +255,7 @@ class DomainEntity(BackendEntity):
name = self . delegateto . name , type = ' NS ' , content = self . ns2 ,
ttl = config . getint ( ' domain ' , ' defaultttl ' ) ) )
self . delegateto . records . append ( Record (
name = self . delegateto . name , type = ' MX ' , content = self . mx ,
name = self . delegateto . name , type = ' MX ' , content = self . mx rr ,
ttl = config . getint ( ' domain ' , ' defaultttl ' ) ,
prio = config . getint ( ' domain ' , ' defaultmxprio ' ) ) )
self . delegateto . records . append ( Record (
@ -244,6 +275,7 @@ class DomainEntity(BackendEntity):
self . _mail_domain ( )
def _delete_apache_conf ( self ) :
""" Deletes the Apache configuration file for the domain. """
cmd = ' a2dissite %s ' % ( self . delegateto . name )
self . sucommand ( cmd )
cmd = ' rm " %s " ' % ( os . path . join ( config . get ( ' domain ' , ' sitesdir ' ) ,
@ -251,12 +283,15 @@ class DomainEntity(BackendEntity):
self . sucommand ( cmd )
def _delete_stats_conf ( self ) :
""" Deletes the modlogan stastics configuration for the
domain . """
cmd = ' rm " %s " ' % ( os . path . join ( config . get ( ' domain ' , ' modlogandir ' ) ,
self . delegateto . sysuser . username ,
self . delegateto . name + ' .conf ' ) )
self . sucommand ( cmd )
def _archive_stats_dir ( self ) :
""" Archives the statistics directory for the domain. """
archive = os . path . join ( self . delegateto . sysuser . home ,
' %(domain)s -stats.tar.gz ' % {
' domain ' : self . delegateto . name } )
@ -276,6 +311,7 @@ class DomainEntity(BackendEntity):
self . sucommand ( cmd )
def _archive_log_dir ( self ) :
""" Archives the Apache log file directory for the domain. """
archive = os . path . join ( self . delegateto . sysuser . home ,
' %(domain)s -logs.tar.gz ' % {
' domain ' : self . delegateto . name } )
@ -295,6 +331,7 @@ class DomainEntity(BackendEntity):
self . sucommand ( cmd )
def _archive_vhost_dir ( self ) :
""" Archives the Apache VirtualHost directory for the domain. """
archive = os . path . join ( self . delegateto . sysuser . home ,
' %(domain)s -vhost.tar.gz ' % {
' domain ' : self . delegateto . name } )
@ -315,6 +352,10 @@ class DomainEntity(BackendEntity):
self . sucommand ( cmd )
def delete_hook ( self , session ) :
""" Deletes domain related files and directories.
This method is called by ` BackendEntityHandler . delete ( ) ` .
"""
self . _delete_apache_conf ( )
self . _delete_stats_conf ( )
self . _archive_stats_dir ( )
@ -326,4 +367,5 @@ class DomainHandler(BackendEntityHandler):
""" BackendEntityHandler for Domain entities. """
def __init__ ( self , verbose = False ) :
""" Initialize the DomainHandler. """
BackendEntityHandler . __init__ ( self , DomainEntity , Domain , verbose )