Exemplo n.º 1
0
    def setContent(self, content, ext='.new'):
        """
		Replace the file at this path with a new file that contains the given
		bytes, trying to avoid data-loss in the meanwhile.

		On UNIX-like platforms, this method does its best to ensure that by the
		time this method returns, either the old contents I{or} the new contents
		of the file will be present at this path for subsequent readers
		regardless of premature device removal, program crash, or power loss,
		making the following assumptions:

			- your filesystem is journaled (i.e. your filesystem will not
			  I{itself} lose data due to power loss)

			- your filesystem's C{rename()} is atomic

			- your filesystem will not discard new data while preserving new
			  metadata (see U{http://mjg59.livejournal.com/108257.html} for more
			  detail)

		On most versions of Windows there is no atomic C{rename()} (see
		U{http://bit.ly/win32-overwrite} for more information), so this method
		is slightly less helpful.  There is a small window where the file at
		this path may be deleted before the new file is moved to replace it:
		however, the new file will be fully written and flushed beforehand so in
		the unlikely event that there is a crash at that point, it should be
		possible for the user to manually recover the new version of their data.
		In the future, Twisted will support atomic file moves on those versions
		of Windows which I{do} support them: see U{Twisted ticket
		3004<http://twistedmatrix.com/trac/ticket/3004>}.

		This method should be safe for use by multiple concurrent processes, but
		note that it is not easy to predict which process's contents will
		ultimately end up on disk if they invoke this method at close to the
		same time.

		@param content: The desired contents of the file at this path.

		@type content: L{str}

		@param ext: An extension to append to the temporary filename used to
			store the bytes while they are being written.  This can be used to
			make sure that temporary files can be identified by their suffix,
			for cleanup in case of crashes.

		@type ext: C{str}
		"""
        sib = self.temporarySibling(ext)
        f = sib.open('w')
        try:
            f.write(content)
        finally:
            f.close()
        if platform.isWindows() and exists(self.path):
            os.unlink(self.path)
        os.rename(sib.path, self.path)
Exemplo n.º 2
0
	def setContent(self, content, ext='.new'):
		"""
		Replace the file at this path with a new file that contains the given
		bytes, trying to avoid data-loss in the meanwhile.

		On UNIX-like platforms, this method does its best to ensure that by the
		time this method returns, either the old contents I{or} the new contents
		of the file will be present at this path for subsequent readers
		regardless of premature device removal, program crash, or power loss,
		making the following assumptions:

			- your filesystem is journaled (i.e. your filesystem will not
			  I{itself} lose data due to power loss)

			- your filesystem's C{rename()} is atomic

			- your filesystem will not discard new data while preserving new
			  metadata (see U{http://mjg59.livejournal.com/108257.html} for more
			  detail)

		On most versions of Windows there is no atomic C{rename()} (see
		U{http://bit.ly/win32-overwrite} for more information), so this method
		is slightly less helpful.  There is a small window where the file at
		this path may be deleted before the new file is moved to replace it:
		however, the new file will be fully written and flushed beforehand so in
		the unlikely event that there is a crash at that point, it should be
		possible for the user to manually recover the new version of their data.
		In the future, Twisted will support atomic file moves on those versions
		of Windows which I{do} support them: see U{Twisted ticket
		3004<http://twistedmatrix.com/trac/ticket/3004>}.

		This method should be safe for use by multiple concurrent processes, but
		note that it is not easy to predict which process's contents will
		ultimately end up on disk if they invoke this method at close to the
		same time.

		@param content: The desired contents of the file at this path.

		@type content: L{str}

		@param ext: An extension to append to the temporary filename used to
			store the bytes while they are being written.  This can be used to
			make sure that temporary files can be identified by their suffix,
			for cleanup in case of crashes.

		@type ext: C{str}
		"""
		sib = self.temporarySibling(ext)
		f = sib.open('w')
		try:
			f.write(content)
		finally:
			f.close()
		if platform.isWindows() and exists(self.path):
			os.unlink(self.path)
		os.rename(sib.path, self.path)
Exemplo n.º 3
0
	def child(self, path):
		if platform.isWindows() and path.count(":"):
			# Catch paths like C:blah that don't have a slash
			raise InsecurePath("%r contains a colon." % (path,))
		norm = normpath(path)
		if slash in norm:
			raise InsecurePath("%r contains one or more directory separators" % (path,))
		newpath = abspath(joinpath(self.path, norm))
		if not newpath.startswith(self.path):
			raise InsecurePath("%r is not a child of %s" % (newpath, self.path))
		return self.clonePath(newpath)
Exemplo n.º 4
0
 def child(self, path):
     if platform.isWindows() and path.count(":"):
         # Catch paths like C:blah that don't have a slash
         raise InsecurePath("%r contains a colon." % (path, ))
     norm = normpath(path)
     if slash in norm:
         raise InsecurePath("%r contains one or more directory separators" %
                            (path, ))
     newpath = abspath(joinpath(self.path, norm))
     if not newpath.startswith(self.path):
         raise InsecurePath("%r is not a child of %s" %
                            (newpath, self.path))
     return self.clonePath(newpath)
Exemplo n.º 5
0
# See LICENSE for details.

"""
Standard input/out/err support.

This module exposes one name, StandardIO, which is a factory that takes an
IProtocol provider as an argument.  It connects that protocol to standard input
and output on the current process.

It should work on any UNIX and also on Win32 (with some caveats: due to
platform limitations, it will perform very poorly on Win32).

Future Plans::

	support for stderr, perhaps
	Rewrite to use the reactor instead of an ad-hoc mechanism for connecting
		protocols to transport.


Maintainer: James Y Knight
"""

from lib.twisted.python.runtime import platform

if platform.isWindows():
	from lib.twisted.internet._win32stdio import StandardIO
else:
	from lib.twisted.internet._posixstdio import StandardIO

__all__ = ['StandardIO']
Exemplo n.º 6
0
# Copyright (c) 2001-2010 Twisted Matrix Laboratories.
# See LICENSE for details.
"""
Standard input/out/err support.

This module exposes one name, StandardIO, which is a factory that takes an
IProtocol provider as an argument.  It connects that protocol to standard input
and output on the current process.

It should work on any UNIX and also on Win32 (with some caveats: due to
platform limitations, it will perform very poorly on Win32).

Future Plans::

	support for stderr, perhaps
	Rewrite to use the reactor instead of an ad-hoc mechanism for connecting
		protocols to transport.


Maintainer: James Y Knight
"""

from lib.twisted.python.runtime import platform

if platform.isWindows():
    from lib.twisted.internet._win32stdio import StandardIO
else:
    from lib.twisted.internet._posixstdio import StandardIO

__all__ = ['StandardIO']