From ec789513dce9b072a512deb6628375e88b84026b Mon Sep 17 00:00:00 2001 From: David Wilson Date: Sun, 27 Jan 2019 22:46:06 +0000 Subject: [PATCH] ssh: tidy up logs and stream names. --- mitogen/core.py | 2 +- mitogen/doas.py | 5 ++--- mitogen/docker.py | 5 ++--- mitogen/jail.py | 5 ++--- mitogen/kubectl.py | 5 ++--- mitogen/lxc.py | 5 ++--- mitogen/lxd.py | 5 ++--- mitogen/parent.py | 20 ++++++++++++++------ mitogen/setns.py | 5 ++++- mitogen/ssh.py | 16 ++++++++-------- mitogen/su.py | 5 ++--- mitogen/sudo.py | 5 ++--- 12 files changed, 43 insertions(+), 40 deletions(-) diff --git a/mitogen/core.py b/mitogen/core.py index 6979c878..fc473ae7 100644 --- a/mitogen/core.py +++ b/mitogen/core.py @@ -1703,7 +1703,7 @@ class Stream(BasicStream): def __repr__(self): cls = type(self) - return '%s.%s(%r)' % (cls.__module__, cls.__name__, self.name) + return "%s.%s('%s')" % (cls.__module__, cls.__name__, self.name) class Context(object): diff --git a/mitogen/doas.py b/mitogen/doas.py index 0f6a106c..fe814d7b 100644 --- a/mitogen/doas.py +++ b/mitogen/doas.py @@ -66,9 +66,8 @@ class Stream(mitogen.parent.Stream): if incorrect_prompts is not None: self.incorrect_prompts = map(str.lower, incorrect_prompts) - def connect(self): - super(Stream, self).connect() - self.name = u'doas.' + mitogen.core.to_text(self.username) + def _get_name(self): + return u'doas.' + mitogen.core.to_text(self.username) def get_boot_command(self): bits = [self.doas_path, '-u', self.username, '--'] diff --git a/mitogen/docker.py b/mitogen/docker.py index 36b0635b..3962f13c 100644 --- a/mitogen/docker.py +++ b/mitogen/docker.py @@ -62,9 +62,8 @@ class Stream(mitogen.parent.Stream): if username: self.username = username - def connect(self): - super(Stream, self).connect() - self.name = u'docker.' + (self.container or self.image) + def _get_name(self): + return u'docker.' + (self.container or self.image) def get_boot_command(self): args = ['--interactive'] diff --git a/mitogen/jail.py b/mitogen/jail.py index 726b60e0..85a4a6ca 100644 --- a/mitogen/jail.py +++ b/mitogen/jail.py @@ -52,9 +52,8 @@ class Stream(mitogen.parent.Stream): if jexec_path: self.jexec_path = jexec_path - def connect(self): - super(Stream, self).connect() - self.name = u'jail.' + self.container + def _get_name(self): + return u'jail.' + self.container def get_boot_command(self): bits = [self.jexec_path] diff --git a/mitogen/kubectl.py b/mitogen/kubectl.py index e6758ec4..7079bcab 100644 --- a/mitogen/kubectl.py +++ b/mitogen/kubectl.py @@ -55,9 +55,8 @@ class Stream(mitogen.parent.Stream): self.kubectl_path = kubectl_path self.kubectl_args = kubectl_args or [] - def connect(self): - super(Stream, self).connect() - self.name = u'kubectl.%s%s' % (self.pod, self.kubectl_args) + def _get_name(self): + return u'kubectl.%s%s' % (self.pod, self.kubectl_args) def get_boot_command(self): bits = [self.kubectl_path] + self.kubectl_args + ['exec', '-it', self.pod] diff --git a/mitogen/lxc.py b/mitogen/lxc.py index cd85be4f..78c32528 100644 --- a/mitogen/lxc.py +++ b/mitogen/lxc.py @@ -60,9 +60,8 @@ class Stream(mitogen.parent.Stream): if lxc_attach_path: self.lxc_attach_path = lxc_attach_path - def connect(self): - super(Stream, self).connect() - self.name = u'lxc.' + self.container + def _get_name(self): + return u'lxc.' + self.container def get_boot_command(self): bits = [ diff --git a/mitogen/lxd.py b/mitogen/lxd.py index a28e1aaa..eef53c73 100644 --- a/mitogen/lxd.py +++ b/mitogen/lxd.py @@ -61,9 +61,8 @@ class Stream(mitogen.parent.Stream): if lxc_path: self.lxc_path = lxc_path - def connect(self): - super(Stream, self).connect() - self.name = u'lxd.' + self.container + def _get_name(self): + return u'lxd.' + self.container def get_boot_command(self): bits = [ diff --git a/mitogen/parent.py b/mitogen/parent.py index 50862418..76437ebb 100644 --- a/mitogen/parent.py +++ b/mitogen/parent.py @@ -1001,7 +1001,7 @@ class DiagLogStream(mitogen.core.BasicStream): self.buf = '' def __repr__(self): - return 'mitogen.parent.DiagLogStream(fd=%r, %r)' % ( + return "mitogen.parent.DiagLogStream(fd=%r, '%s')" % ( self.receive_side.fd, self.stream.name, ) @@ -1017,11 +1017,11 @@ class DiagLogStream(mitogen.core.BasicStream): return self.on_disconnect(broker) self.buf += buf.decode('utf-8', 'replace') - while '\n' in self.buf: + while u'\n' in self.buf: lines = self.buf.split('\n') self.buf = lines[-1] for line in lines[:-1]: - LOG.debug('%r: %r', self, line.rstrip()) + LOG.debug('%s: %s', self.stream.name, line.rstrip()) class Stream(mitogen.core.Stream): @@ -1288,10 +1288,18 @@ class Stream(mitogen.core.Stream): if self.eof_error_hint: e.args = ('%s\n\n%s' % (e.args[0], self.eof_error_hint),) + def _get_name(self): + """ + Called by :meth:`connect` after :attr:`pid` is known. Subclasses can + override it to specify a default stream name, or set + :attr:`name_prefix` to generate a default format. + """ + return u'%s.%s' % (self.name_prefix, self.pid) + def connect(self): LOG.debug('%r.connect()', self) self.pid, fd, diag_fd = self.start_child() - self.name = u'%s.%s' % (self.name_prefix, self.pid) + self.name = self._get_name() self.receive_side = mitogen.core.Side(self, fd) self.transmit_side = mitogen.core.Side(self, os.dup(fd)) if diag_fd is not None: @@ -1299,8 +1307,8 @@ class Stream(mitogen.core.Stream): else: self.diag_stream = None - LOG.debug('%r.connect(): stdin=%r, stdout=%r, diag=%r', - self, self.receive_side.fd, self.transmit_side.fd, + LOG.debug('%r.connect(): pid:%r stdin:%r, stdout:%r, diag:%r', + self, self.pid, self.receive_side.fd, self.transmit_side.fd, self.diag_stream and self.diag_stream.receive_side.fd) try: diff --git a/mitogen/setns.py b/mitogen/setns.py index 0c94cd0b..ced44add 100644 --- a/mitogen/setns.py +++ b/mitogen/setns.py @@ -223,11 +223,14 @@ class Stream(mitogen.parent.Stream): def create_child(self, args): return mitogen.parent.create_child(args, preexec_fn=self.preexec_fn) + def _get_name(self): + return u'setns.' + self.container + def connect(self): + self.name = self._get_name() attr, func = self.GET_LEADER_BY_KIND[self.kind] tool_path = getattr(self, attr) self.leader_pid = func(tool_path, self.container) LOG.debug('Leader PID for %s container %r: %d', self.kind, self.container, self.leader_pid) super(Stream, self).connect() - self.name = u'setns.' + self.container diff --git a/mitogen/ssh.py b/mitogen/ssh.py index f8fe20aa..607d7f44 100644 --- a/mitogen/ssh.py +++ b/mitogen/ssh.py @@ -105,7 +105,7 @@ def filter_debug(stream, it): if b('\n') not in buf: break line, _, buf = bytes_partition(buf, b('\n')) - LOG.debug('%r: %s', stream, + LOG.debug('%s: %s', stream.name, mitogen.core.to_text(line.rstrip())) state = 'start_of_line' elif state == 'in_plain': @@ -239,11 +239,11 @@ class Stream(mitogen.parent.Stream): base = super(Stream, self).get_boot_command() return bits + [shlex_quote(s).strip() for s in base] - def connect(self): - super(Stream, self).connect() - self.name = u'ssh.' + mitogen.core.to_text(self.hostname) + def _get_name(self): + s = u'ssh.' + mitogen.core.to_text(self.hostname) if self.port: - self.name += u':%s' % (self.port,) + s += u':%s' % (self.port,) + return s auth_incorrect_msg = 'SSH authentication is incorrect' password_incorrect_msg = 'SSH password is incorrect' @@ -261,7 +261,7 @@ class Stream(mitogen.parent.Stream): def _host_key_prompt(self): if self.check_host_keys == 'accept': - LOG.debug('%r: accepting host key', self) + LOG.debug('%s: accepting host key', self.name) self.diag_stream.transmit_side.write(b('yes\n')) return @@ -273,7 +273,7 @@ class Stream(mitogen.parent.Stream): def _connect_input_loop(self, it): password_sent = False for buf, partial in filter_debug(self, it): - LOG.debug('%r: received %r', self, buf) + LOG.debug('%s: stdout: %s', self.name, buf.rstrip()) if buf.endswith(self.EC0_MARKER): self._ec0_received() return @@ -295,7 +295,7 @@ class Stream(mitogen.parent.Stream): elif partial and PASSWORD_PROMPT in buf.lower(): if self.password is None: raise PasswordError(self.password_required_msg) - LOG.debug('%r: sending password', self) + LOG.debug('%s: sending password', self.name) self.diag_stream.transmit_side.write( (self.password + '\n').encode() ) diff --git a/mitogen/su.py b/mitogen/su.py index b0bac28b..9401aee9 100644 --- a/mitogen/su.py +++ b/mitogen/su.py @@ -80,9 +80,8 @@ class Stream(mitogen.parent.Stream): if incorrect_prompts is not None: self.incorrect_prompts = map(str.lower, incorrect_prompts) - def connect(self): - super(Stream, self).connect() - self.name = u'su.' + mitogen.core.to_text(self.username) + def _get_name(self): + return u'su.' + mitogen.core.to_text(self.username) def get_boot_command(self): argv = mitogen.parent.Argv(super(Stream, self).get_boot_command()) diff --git a/mitogen/sudo.py b/mitogen/sudo.py index b97118c9..221b8391 100644 --- a/mitogen/sudo.py +++ b/mitogen/sudo.py @@ -140,9 +140,8 @@ class Stream(mitogen.parent.Stream): self.selinux_role = option(self.selinux_role, selinux_role, opts.role) self.selinux_type = option(self.selinux_type, selinux_type, opts.type) - def connect(self): - super(Stream, self).connect() - self.name = u'sudo.' + mitogen.core.to_text(self.username) + def _get_name(self): + return u'sudo.' + mitogen.core.to_text(self.username) def get_boot_command(self): # Note: sudo did not introduce long-format option processing until July