def write_file(filename, content, mode=None, compress=None, create_directory=False, logger=LOGGER): """Atomically write content into the specified filename. The content is written into a temp file in the same directory as filename, and then swapped into place with rename. This assumes that both the file and the directory can be written to by the broker. The same directory was used instead of a temporary directory because atomic swaps are generally only available when the source and the target are on the same filesystem. If mode is set, change permissions on the file (newly created or pre-existing) to the new mode. If unset and the file exists, the current permissions will be kept. If unset and the file is new, the default is 0644. This method may raise OSError if any of the OS-related methods (creating the temp file, writing to it, correcting permissions, swapping into place) fail. The method will attempt to remove the temp file if it had been created. If the compress keyword is passed, the content is compressed in memory before writing. The only compression currently supported is gzip. """ if compress == "gzip": config = Config() buffer = StringIO() compress = config.getint("broker", "gzip_level") zipper = gzip.GzipFile(filename, "wb", compress, buffer) zipper.write(content) zipper.close() content = buffer.getvalue() if mode is None: try: old_mode = os.stat(filename).st_mode except OSError: old_mode = 0644 dirname, basename = os.path.split(filename) if not os.path.exists(dirname) and create_directory: os.makedirs(dirname) fd, fpath = mkstemp(prefix=basename, dir=dirname) try: with os.fdopen(fd, "w") as f: f.write(content) if mode is None: os.chmod(fpath, old_mode) else: os.chmod(fpath, mode) os.rename(fpath, filename) finally: if os.path.exists(fpath): os.remove(fpath)
def write_file(filename, content, mode=None, logger=LOGGER, compress=None): """Atomically write content into the specified filename. The content is written into a temp file in the same directory as filename, and then swapped into place with rename. This assumes that both the file and the directory can be written to by the broker. The same directory was used instead of a temporary directory because atomic swaps are generally only available when the source and the target are on the same filesystem. If mode is set, change permissions on the file (newly created or pre-existing) to the new mode. If unset and the file exists, the current permissions will be kept. If unset and the file is new, the default is 0644. This method may raise OSError if any of the OS-related methods (creating the temp file, writing to it, correcting permissions, swapping into place) fail. The method will attempt to remove the temp file if it had been created. If the compress keyword is passed, the content is compressed in memory before writing. The only compression currently supported is gzip. """ if compress == 'gzip': config = Config() buffer = StringIO() compress = config.getint('broker', 'gzip_level') zipper = gzip.GzipFile(filename, 'wb', compress, buffer) zipper.write(content) zipper.close() content = buffer.getvalue() if mode is None: try: old_mode = os.stat(filename).st_mode except OSError, e: old_mode = 0644