+++ /dev/null
-# ceph-deploy ftw
-import os
-try:
- from typing import Optional
-except ImportError:
- pass
-
-PYTHONS = ['python3', 'python2', 'python']
-PATH = [
- '/usr/bin',
- '/usr/local/bin',
- '/bin',
- '/usr/sbin',
- '/usr/local/sbin',
- '/sbin',
-]
-
-
-def choose_python():
- # type: () -> Optional[str]
- for e in PYTHONS:
- for b in PATH:
- p = os.path.join(b, e)
- if os.path.exists(p):
- return p
- 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
from collections import defaultdict
from contextlib import contextmanager
from typing import TYPE_CHECKING, Optional, List, cast, Dict, Any, Union, Tuple, Iterator
-
-from cephadm import remotes
-
try:
import remoto
import execnet.gateway_bootstrap
if TYPE_CHECKING:
from cephadm.module import CephadmOrchestrator
- from remoto.backends import BaseConnection
logger = logging.getLogger(__name__)
if match:
continue
self.log.info(f'Updating {host}:{path}')
- self._write_remote_file(host, path, content, mode, uid, gid)
+ self.mgr.ssh.write_remote_file(host, path, content, mode, uid, gid)
self.mgr.cache.update_client_file(host, path, digest, mode, uid, gid)
updated_files = True
for path in old_files.keys():
self.log.info(f'Removing {host}:{path}')
- with self._remote_connection(host) as tpl:
- conn, connr = tpl
- out, err, code = remoto.process.check(
- conn,
- ['rm', '-f', path])
+ cmd = ['rm', '-f', path]
+ self.mgr.ssh.check_execute_command(host, cmd)
updated_files = True
self.mgr.cache.removed_client_file(host, path)
if updated_files:
msg = f"Unable to deploy the cephadm binary to {host}: {_err}"
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,