[Twisted-Python] Patch to support DNS updates

Tommi Virtanen tv at twistedmatrix.com
Mon Feb 28 03:32:46 EST 2005


Jeff Silver wrote:
> --- names/authority.py	2004-02-07 17:57:11.000000000 +0000
> +++ names/authority.py.new	2005-02-25 09:34:02.725600288 +0000
> @@ -161,6 +161,78 @@
>                  add.extend(res[1][2])
>          return ans, auth, add
>  
> +    def _trySaveToOriginalFile(self):
> +        '''Called after an update.'''
> +        soa_rec = self.soa[1]
> +        new_serial = int(time.strftime('%Y%m%d%H%M')) - 200000000000
> +        if new_serial <= soa_rec.serial:
> +            new_serial = soa_rec.serial + 1
> +        old_serial = soa_rec.serial
> +        soa_rec.serial = new_serial
> +        if hasattr(self, 'filename'):
> +            tmp_filename = self.filename + '.new'
> +            save_filename = '%s.%d' % (self.filename, old_serial)
> +            self.saveFile(tmp_filename)
> +            os.rename(self.filename, save_filename)
> +            os.rename(tmp_filename, self.filename)

While I am not going to comment on the rest of the patch (the feature
does sound nice, altough lack of authentication makes using it pretty
pointless IMHO), this is just unacceptable.

If an exception is raised, the app crashes, or the machine loses power
between those two renames, your original zone file has been renamed
and your DNS server won't start.

Do something like

 >>> f=open('foo', 'w')
 >>> f.write('foo')
 >>> f.close()
 >>> import os
 >>> os.link('foo', 'foo.old')
 >>> f=open('bar', 'w')
 >>> f.write('bar')
 >>> os.fsync(f)
 >>> f.close()
 >>> os.rename('bar', 'foo')
 >>>


Also, nice y2.043k trap there, I don't think many have been able to
write ones targeting that exact date.




More information about the Twisted-Python mailing list