conf.py
author Tero Marttila <terom@fixme.fi>
Sun, 12 Jul 2009 00:43:36 +0300
changeset 6 57e8168ba8c4
parent 4 8b633782f02d
permissions -rw-r--r--
use FQDN for zone hosts
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Generic configuration file output
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     5
import os, os.path, tempfile, shutil
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
     7
class ConfObject (object) :
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
    """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
        An object that can be written to a ConfFile, as multiple lines of text.
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
3
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    12
    def __init__ (self, comments=None) :
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    13
        """
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    14
            Initialize with the given list of comments. Comments that are None should be ignore.
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    15
        """
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    16
        
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    17
        # init the comments list
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    18
        self.comments = comments or []
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    19
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    20
    def add_comment (self, comment) :
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    21
        """
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    22
            Add a comment to be rendered in the output.
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    23
        """
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    24
        
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    25
        # add it
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    26
        self.comments.append(comment)
ff98fa9b84ce implement comments properly
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    27
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    def fmt_lines (self) :
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
            Yield a series of lines to be output in the file
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
        
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
        abstract
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    35
class File (ConfObject) :
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        A single configuration file on the filesystem.
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    39
        Configuration files are themselves ConfObject's, although this must be implemented in the inheriting class.
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    def __init__ (self, name, path, backup_suffix='.bak', mode=0644) :
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
        """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
            Initialize the config file, but don't open it yet
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
            @param name the human-readable friendly name for the config file
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
            @param path the full filesystem path for the file
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
            @param backup_suffix rename the old file by adding this suffix when replacing it
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
            @param mode the permission bits for the new file
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
  
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        self.name = name
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        self.path = path
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        self.backup_suffix = backup_suffix
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        self.mode = mode
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
    
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    57
    def write_file (self, file) :
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        """
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    59
            Write out this config's stuff into the given file
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        writer = Writer(file)
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    63
        writer.write_obj(self)
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    65
    def write (self) :
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        """
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    67
            Write out a new config file with this config's stuff using the following procedure:
4
8b633782f02d write bind_conf.py
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    68
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
                * lock the real file
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
                * open a new temporary file, and write out the objects into that, closing it
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
                * move the real file out of the way
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
                * move the temporary file into the real file's place
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
                * unlock the real file
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
        # XXX: how to aquire the lock?
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        # XXX: this needs checking over
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
        # open the new temporary file
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
        # XXX: ensure fd is closed
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        tmp_fd, tmp_path = tempfile.mkstemp(prefix=self.name)
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        # ...as a file
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
        tmp_file = os.fdopen(tmp_fd, "w")
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
        # fix the permissions
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
        os.chmod(tmp_path, self.mode)
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        # write it
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    90
        self.write_file(tmp_file)
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        # close it
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        tmp_file.close()
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
        
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
        # move the old file out of the way
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    96
        if os.path.exists(self.path) :
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
    97
            os.rename(self.path, self.path + self.backup_suffix)
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
        # move the new file in
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
        shutil.move(tmp_path, self.path)
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
class Writer (object) :
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        A conf.Writer is used to write out a new conf.File (as a temporary file)
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
    def __init__ (self, file) :
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
        """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
            @param file the temporary file object
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
        """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
        self.file = file
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
    
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   114
    def write_line (self, line) :
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   115
        """
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   116
            Write a single line to the file
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   117
        """
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   118
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   119
        self.file.write("%s\n" % (line, ))
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   120
    
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   121
    def write_lines (self, lines) :
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   122
        """
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   123
            Write a series of lines into the file
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   124
        """
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   125
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   126
        for line in lines :
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   127
            self.write_line(line)
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   128
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
    def write_obj (self, obj) :
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
        """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
            Write a single object to the file
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
        """
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
        # just write out all the lines
1
2223ade4f259 continue the overengineering effort, we are now able to generate dhcpd.conf files
Tero Marttila <terom@fixme.fi>
parents: 0
diff changeset
   135
        self.write_lines(obj.fmt_lines())
0
257003279747 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136