def touch(remote_path, mtime=None, atime=None): """Update mtime and atime of a path. Similar to running ``touch remote_path``. :param remote_path: Remote path whose times will get updated. :param mtime: New mtime. If ``None``, uses the current time. :param atime: New atime. Only used if ``mtime`` is not None. Defaults to ``mtime``. :return: Since it always updates the current time, calling this function will always result in a modification. """ # ensure the file exists if not remote.lstat(remote_path): with remote.file(remote_path, 'w') as out: out.write('') if mtime is None: remote.utime(remote_path, None) return Changed(msg=u'Touched {} to current time'.format(remote_path)) else: atime = atime if atime is not None else mtime remote.utime(remote_path, (atime, mtime)) return Changed(msg=u'Touched {} to mtime={}, atime={}'.format( remote_path, mtime, atime))
def upload_file(local_path, remote_path=None, follow_symlink=True, create_parent=False): """Uploads a local file to a remote and if does not exist or differs from the local version, uploads it. To avoid having to transfer the file one or more times if unchanged, different methods for verification are available. These can be configured using the ``fs_remote_file_verify`` configuration variable. :param local_path: Local file to upload. If it is a symbolic link, it will be resolved first. :param remote_path: Remote name for the file. If ``None``, same as ``local_path``. If it points to a directory, the file will be uploaded to the directory. Symbolic links not pointing to a directory are an error. :param return: ``False`` if no upload was necessary, ``True`` otherwise. """ st, remote_path = _expand_remote_dest(local_path, remote_path) lst = os.stat(local_path) if follow_symlink else os.lstat(local_path) verifier = Verifier._by_short_name(config['fs_remote_file_verify'])() uploader = Uploader._by_short_name(config['fs_remote_file_upload'])() if lst is None: raise ConfigurationError( 'Local file {!r} does not exist'.format(local_path)) if S_ISLNK(lst.st_mode): # local file is a link rst = remote.lstat(remote_path) if rst: if not S_ISLNK(rst.st_mode): # remote file is not a link, unlink it remote.unlink(remote_path) elif remote.readlink(remote_path) != os.readlink(local_path): # non matching links remote.unlink(remote_path) else: # links pointing to the same target return Unchanged( msg='Symbolink link up-to-date: {}'.format(remote_path)) remote.symlink(os.readlink(local_path), remote_path) return Changed(msg='Created remote link: {}'.format(remote_path)) if not st or not verifier.verify_file(st, local_path, remote_path): if create_parent: create_dir(remote.path.dirname(remote_path)) uploader.upload_file(local_path, remote_path) if config.get_bool('fs_update_mtime'): times = (lst.st_mtime, lst.st_mtime) remote.utime(remote_path, times) log.debug('Updated atime/mtime: {}'.format(times)) return Changed(msg='Upload {} -> {}'.format(local_path, remote_path)) return Unchanged(msg='File up-to-date: {}'.format(remote_path))
def upload_file(local_path, remote_path=None, follow_symlink=True, create_parent=False): """Uploads a local file to a remote and if does not exist or differs from the local version, uploads it. To avoid having to transfer the file one or more times if unchanged, different methods for verification are available. These can be configured using the ``fs_remote_file_verify`` configuration variable. :param local_path: Local file to upload. If it is a symbolic link, it will be resolved first. :param remote_path: Remote name for the file. If ``None``, same as ``local_path``. If it points to a directory, the file will be uploaded to the directory. Symbolic links not pointing to a directory are an error. :param return: ``False`` if no upload was necessary, ``True`` otherwise. """ st, remote_path = _expand_remote_dest(local_path, remote_path) lst = os.stat(local_path) if follow_symlink else os.lstat(local_path) verifier = Verifier._by_short_name(config['fs_remote_file_verify'])() uploader = Uploader._by_short_name(config['fs_remote_file_upload'])() if lst is None: raise ConfigurationError('Local file {!r} does not exist'.format( local_path)) if S_ISLNK(lst.st_mode): # local file is a link rst = remote.lstat(remote_path) if rst: if not S_ISLNK(rst.st_mode): # remote file is not a link, unlink it remote.unlink(remote_path) elif remote.readlink(remote_path) != os.readlink(local_path): # non matching links remote.unlink(remote_path) else: # links pointing to the same target return Unchanged( msg='Symbolink link up-to-date: {}'.format(remote_path)) remote.symlink(os.readlink(local_path), remote_path) return Changed(msg='Created remote link: {}'.format(remote_path)) if not st or not verifier.verify_file(st, local_path, remote_path): if create_parent: create_dir(remote.path.dirname(remote_path)) uploader.upload_file(local_path, remote_path) if config.get_bool('fs_update_mtime'): times = (lst.st_mtime, lst.st_mtime) remote.utime(remote_path, times) log.debug('Updated atime/mtime: {}'.format(times)) return Changed(msg='Upload {} -> {}'.format(local_path, remote_path)) return Unchanged(msg='File up-to-date: {}'.format(remote_path))