def _(*args): sig = (name, ) + args if config.get_bool('info_cache') and sig in info.cache: v = info.cache[sig] log.debug('Memoize cache hit {}'.format(sig)) else: v = f(*args) log.debug('Memoize cache miss {}'.format(sig)) info.cache[sig] = v return v
def reboot(): if config.get_bool('systemd'): try: proc.run([config['cmd_systemctl'], 'reboot']) except RemoteFailureError: # FIXME: should be more discerning; also verify reboot is taking # place pass # ignored, as the command will not finish - due to rebooting elif config['remote_os'] in ('unix', 'posix'): proc.run([config['cmd_shutdown'], '-r', 'now']) return Changed(msg='Server rebooting')
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))