Source code for Bcfg2.Server.Plugins.Cfg.CfgDiffFilter
""" Handle .diff files, which apply diffs to plaintext files """
import os
import tempfile
from Bcfg2.Server.Plugin import PluginExecutionError
from subprocess import Popen, PIPE
from Bcfg2.Server.Plugins.Cfg import CfgFilter
[docs]class CfgDiffFilter(CfgFilter):
    """ CfgDiffFilter applies diffs to plaintext
    :ref:`server-plugins-generators-Cfg` files """
    #: Handle .diff files
    __extensions__ = ['diff']
    #: .diff files are deprecated
    deprecated = True
[docs]    def modify_data(self, entry, metadata, data):
        basehandle, basename = tempfile.mkstemp()
        open(basename, 'w').write(data)
        os.close(basehandle)
        cmd = ["patch", "-u", "-f", basename]
        patch = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
        stderr = patch.communicate(input=self.data)[1]
        ret = patch.wait()
        output = open(basename, 'r').read()
        os.unlink(basename)
        if ret != 0:
            raise PluginExecutionError("Error applying diff %s: %s" %
                                       (self.name, stderr))
        return output 
    modify_data.__doc__ = CfgFilter.modify_data.__doc__