return None
+def write_file(path: str, content: bytes, mode: int, uid: int, gid: int,
+ mkdir_p: bool = True) -> Optional[str]:
+ try:
+ if mkdir_p:
+ dirname = os.path.dirname(path)
+ if not os.path.exists(dirname):
+ os.makedirs(dirname)
+ tmp_path = path + '.new'
+ with open(tmp_path, 'wb') as f:
+ os.fchown(f.fileno(), uid, gid)
+ os.fchmod(f.fileno(), mode)
+ f.write(content)
+ os.fsync(f.fileno())
+ os.rename(tmp_path, path)
+ except Exception as e:
+ return str(e)
+ return None
+
+
if __name__ == '__channelexec__':
for item in channel: # type: ignore # noqa: F821
channel.send(eval(item)) # type: ignore # noqa: F821
self.log.warning(msg)
raise OrchestratorError(msg)
+ def _write_remote_file(self,
+ host: str,
+ path: str,
+ content: bytes,
+ mode: int,
+ uid: int,
+ gid: int) -> None:
+ with self._remote_connection(host) as tpl:
+ conn, connr = tpl
+ try:
+ errmsg = connr.write_file(path, content, mode, uid, gid)
+ if errmsg is not None:
+ raise OrchestratorError(errmsg)
+ except Exception as e:
+ msg = f"Unable to write {host}:{path}: {e}"
+ self.log.warning(msg)
+ raise OrchestratorError(msg)
+
@contextmanager
def _remote_connection(self,
host: str,