Commit Graph

3610 Commits (b91407a7792e1e827082cbfda0076e5ef45c99f9)
 

Author SHA1 Message Date
David Wilson f039c81bb0 [stream-refactor] rename Process attrs, fix up more create_child_test 5 years ago
David Wilson cfe337b3c0 [stream-refactor] import incomplete create_child_test 5 years ago
David Wilson 9c38093aa7 issue #482: tests: check for zombie process after test. 5 years ago
David Wilson 3a1125a7bd issue #363: add test. 5 years ago
David Wilson baafc746fe tests: clean up old-style SSH exception catch 5 years ago
David Wilson 4524f03a48 issue #271: add mitogen__permdenied user to Docker image. 5 years ago
David Wilson acade4ce88 ssh: fix issue #271 regression due to refactor, add test. 5 years ago
David Wilson 8d1b01d8ef Refactor Stream, introduce quasi-asynchronous connect, much more
Split Stream into many, many classes

  * mitogen.parent.Connection: Handles connection setup logic only.
    * Maintain references to stdout and stderr streams.
    * Manages TimerList timer to cancel connection attempt after
      deadline
    * Blocking setup code replaced by async equivalents running on the
      broker

  * mitogen.parent.Options: Tracks connection-specific options. This
    keeps the connection class small, but more importantly, it is
    generic to the future desire to build and execute command lines
    without starting a full connection.

  * mitogen.core.Protocol: Handles program behaviour relating to events
    on a stream. Protocol performs no IO of its own, instead deferring
    it to Stream and Side. This makes testing much easier, and means
    libssh can reimplement Stream and Side to reuse MitogenProtocol

  * mitogen.core.MitogenProtocol: Guts of the old Mitogen stream
    implementtion

  * mitogen.core.BufferedWriter: Guts of the old Mitogen buffered
    transmit implementation, made generic

  * mitogen.core.DelineatedProtocol: Guts of the old IoLogger, knows how
    to split up input and pass it on to a
    on_line_received()/on_partial_line_received() callback.

  * mitogen.parent.BootstrapProtocol: Asynchronous equivalent of the old
    blocking connect code. Waits for various prompts (MITO001 etc) and
    writes the bootstrap using a BufferedWriter. On success, switches
    the stream to MitogenProtocol.

  * mitogen.core.Message: move encoding parts of MitogenProtocol out to
    Message (where it belongs) and write a bunch of new tests for
    pickling.

  * The bizarre Stream.construct() is gone now, Option.__init__ is its
    own constructor. Should fix many LGTM errors.

* Update all connection methods:  Every connection method is updated to
  use async logic, defining protocols as required to handle interactive
  prompts like in SSH or su. Add new real integration tests for at least
  doas and su.

* Eliminate manual fd management: File descriptors are trapped in file
  objects at their point of origin, and Side is updated to use file
  objects rather than raw descriptors. This eliminates a whole class of
  bugs where unrelated FDs could be closed by the wrong component. Now
  an FD's open/closed status is fused to it everywhere in the library.

* Halve file descriptor usage: now FD open/close state is tracked by
  its file object, we don't need to duplicate FDs everywhere so that
  receive/transmit side can be closed independently. Instead both sides
  back on to the same file object. Closes #26, Closes #470.

* Remove most uses of dup/dup2: Closes #256. File descriptors are
  trapped in a common file object and shared among classes. The
  remaining few uses for dup/dup2 are as close to minimal as possible.

* Introduce mitogen.parent.Process: uniform interface for subprocesses
  created either via mitogen.fork or the subprocess module. Remove all
  the crap where we steal a pid from subprocess guts. Now we use
  subprocess to manage its processes as it should be. Closes #169 by
  using the new Timers facility to poll for a slow-to-exit subprocess.

* Fix su password race: Closes #363. DelineatedProtocol naturally
  retries partially received lines, preventing the cause of the original
  race.

* Delete old blocking IO utility functions
  iter_read()/write_all()/discard_until().

Closes #26
Closes #147
Closes #169
Closes #256
Closes #363
Closes #419
Closes #470
5 years ago
David Wilson 37beb3a5c5 core: teach iter_split() to break on callback returning False. 5 years ago
David Wilson 33ecc8a5d2 issue #507: log fatal errors to syslog.
Next round should log entire exception text, but this is useful enough
already.
5 years ago
David Wilson bf77d4ab1d testlib: have LogCapturer.raw() return unicode on 2.x. 5 years ago
David Wilson 46ebd56c7a core/master: docstring, repr, and debug log message cleanups
Debug output is vastly more readable now.
5 years ago
David Wilson 0f7bbcece9 parent: remove unused Timer parameter. 5 years ago
David Wilson fb23ecae01 tests: jail_test fixes. 5 years ago
David Wilson f66611dc83 parent: docstring improvements, cfmakeraw() regression. 5 years ago
David Wilson c7ebb39ad4 core: introduce Protocol, DelimitedProtocol and BufferedWriter.
They aren't wired in yet as of this commit, and continue duplicating
other code.
5 years ago
David Wilson d368971749 core: introduce mitogen.core.pipe()
It's used in later commit. This is an os.pipe() wrapper that traps the
file descriptors in a file object, to ensure leaked objects will
eventually be collected, and a central place exists to track open/closed
status.
5 years ago
David Wilson 12569ad70a tests/bench: import ssh-roundtrip.py. 5 years ago
David Wilson bb0c98f451 tests: note location of related tests. 5 years ago
David Wilson eff8179591 tests: add real test for doas. 5 years ago
David Wilson d8dc5420ce tests: install OpenBSD doas port in Debian image.
To allow fancy new improved doas_test.
5 years ago
David Wilson de9a8b2a80 tests: add setns_test that works if password localhost sudo works. 5 years ago
David Wilson bbf0b22493 Import minimal jail_test. 5 years ago
David Wilson d1f5e0663d core: move message encoding to Message.pack(), add+refactor tests.
The old inline pack is still present in the old location but will be
removed in a followup commit.
5 years ago
David Wilson 3f1ef6e243 master: expect forwarded logs to be in UTF-8.
latin1 was causing corruption of internationalized messages.
5 years ago
David Wilson 3ab7998861 tests: add some UTF-8 to ssh_login_banner to encourage breakage. 5 years ago
David Wilson aba396d4c5 core: bootstrap FD management improvements
- open fd 0/1/2 with correct file mode
- trap reserve_tty_fd in a file object, since all other FD manual FD
  management is going away.
5 years ago
David Wilson 4f0a946f30 core: pending timers should keep broker alive. 5 years ago
David Wilson 237a3babaf core: more succinct iter_split(). 5 years ago
David Wilson dfefc4c05c core: replace UTF8_CODEC with encodings.utf_8.encode() function. 5 years ago
David Wilson 1305420aa5 docs: remove bytearray from supported types list. 5 years ago
David Wilson 3f90030c1e core: docstring style cleanups, dead code. 5 years ago
David Wilson f6d26c5acb testlib: disable lsof warnings due to Docker crap 5 years ago
David Wilson 70ff4b674c parent: discard cancelled events in TimerList.get_timeout().
Otherwise get_timeout() keeps broker alive via keep_alive() for a
cancelled timer during shutdown.
5 years ago
David Wilson 5aca9d6c3f core: split out iter_split() for use in parent.py. 5 years ago
David Wilson f43f886c37 parent: various style cleanups, remove unused function. 5 years ago
David Wilson 3aded0ca95 issue #170: add TimerList docstrings. 5 years ago
David Wilson a5536c3514 core: eliminate some quadratric behaviour from IoLogger
This is the same problem as used to afflict Stream: large input buffers
containing many small messages cause intense string copying. This
eliminates the worst of it.
5 years ago
David Wilson 77564fdfe2 issue #170: update Changelog; closes #170. 5 years ago
David Wilson 870e0b6e2d issue #170: add timers to internals.rst. 5 years ago
David Wilson 2fbc77a155 issue #170: implement timers. 5 years ago
dw 4fedf88d38
Merge pull request #595 from jordemort/buildah
Add buildah transport
5 years ago
Jordan Webb d71bdd1694
Add buildah test and stub 5 years ago
Jordan Webb 1a02a86331
Add buildah transport 5 years ago
David Wilson de12097bc4 Merge remote-tracking branch 'origin/ci280'
* origin/ci280:
  ci: Another round of fixes for random Ansible UI breakage in 2.7/2.8
  ci: work around various broken aspects of Travis VM image
  Use virtualenv Python for stub connections to workaround problem
  ci: Ansible 2.8 requires Python 2.7.
  tests: add 2.8 format async error timeout message
  ansible: prevent tempfile.mkstemp() leaks.
  update gitignore again
  ci: try bumping more Travis jobs to Ansible 2.8.
  add .*.pid to gitignore
  tests: allow running without hdrhistograms library.
  issue #578: update Changelog.
  travis: exclude docs-master from CI
  issue #589: ensure real FileService/PushFileService are in the docs
  issue #589: ensure real FileService/PushFileService are in the docs
  docs: add new contributor entry
  issue #589: remove outdated/incomplete examples
  issue #589: split services example out and make it run.
5 years ago
David Wilson ee7dae7514 ci: Another round of fixes for random Ansible UI breakage in 2.7/2.8 5 years ago
David Wilson d981a382c9 ci: work around various broken aspects of Travis VM image
- Symlink broken Ubuntu Python package pieces back together. See many
  Google hits about this issue.
- Remove apt sources that can no longer be updated.
5 years ago
David Wilson ad5a80f200 Use virtualenv Python for stub connections to workaround problem
../data/stubs/stub-kubectl.py exec -it localhost -- /usr/bin/python -c "...":

    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    LookupError: unknown encoding: base64

It's not clear why this is happening. "stub-kubectl.py" is executed with
the 2.7 virtualenv, while the exec() that happens inside stub-kubectl
was for "/usr/bin/python".

That second Python can't find chunks of its stdlib:

    stat("/usr/lib/python2.7/encodings/base64", 0x7ffde8744c60) = -1 ENOENT (No such file or directory)
    open("/usr/lib/python2.7/encodings/base64.so", O_RDONLY) = -1 ENOENT (No such file or directory)
    open("/usr/lib/python2.7/encodings/base64module.so", O_RDONLY) = -1 ENOENT (No such file or directory)
    open("/usr/lib/python2.7/encodings/base64.py", O_RDONLY) = -1 ENOENT (No such file or directory)
    open("/usr/lib/python2.7/encodings/base64.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)
    write(2, "Traceback (most recent call last):\n", 35) = 35
    write(2, "  File \"<string>\", line 1, in <module>\n", 39) = 39
5 years ago
David Wilson ab9a80cfd4 ci: Ansible 2.8 requires Python 2.7. 5 years ago
David Wilson 08e7fe4f80 tests: add 2.8 format async error timeout message 5 years ago