Skip to content

v0.7.0

Choose a tag to compare

@flipbit03 flipbit03 released this 11 Oct 14:53
· 6 commits to main since this release
6336f2b

Upgrading from 0.6.x

  • Protocol 6 → 8. Upgrade the rustible CLI and your workspace's crates together. A mismatched pair refuses at the handshake and tells you to rebuild.
  • Test API behind a testing feature. Fake, System::fake, testing::ctx/testing::dry, changed_then_ok and #[integration_test] now need it. Ctx::new is no longer public; use rustible_sdk::testing::ctx(sys). Collections add one line:
    [dev-dependencies]
    rustible-sdk = { version = "0.7.0", features = ["testing"] }
  • Behaviour changes you may notice:
    • http::Download writes only on a 200. It refuses a body cut short by a reset or by TLS without close_notify, and .timeout() also bounds silence in the body.
    • ctx.fetch does nothing under --check.
    • Under --check, a step run as an account that doesn't exist yet reports would change ("waits for account").
    • brew steps never autoremove formulae.
    • Secrets are masked in every event the binary emits, and in panic messages. A secret under 4 characters is never masked.

Highlights

  • File contents, listings and command I/O stream through the escalation helper, with no size limits.
  • http::Request (Ansible's uri).
  • archive::Extracted handles zstd, and git archive / GitHub source tarballs extract at strip 0.
  • A run-wide secret masker using Ansible's rules, plus mask::apply_prefix.
  • A step failure the playbook catches counts as recovered, and -v shows its command and stderr.
  • Output escapes control and invisible formatting characters, and a command killed by a signal shows (killed by signal N).

What's Changed

  • Host verdict: a step failure the playbook catches is recovered, not failed by @flipbit03 in #54
  • Tier 4: a caught escalation failure under ssh_user names the override and counts as recovered by @flipbit03 in #65
  • Testing tiers: three, numbered by environment (in-process, docker, VM); CI job names carry the tier by @flipbit03 in #67
  • Testing tiers follow-up: correct what a container lacks, split the mac job by tier, widen T1 by @flipbit03 in #68
  • --check contacts nothing outside the target: apt::Latest stops refreshing, UserKeys stops fetching, plus a sweep by @flipbit03 in #69
  • Local::write sets setuid/setgid after its chown, so rewriting a setuid/setgid file keeps the bits by @flipbit03 in #74
  • System::backup: never write through a planted symlink, never leave a setuid copy by @flipbit03 in #76
  • archive::Extracted: a member whose stream ends early writes nothing under its name by @flipbit03 in #77
  • http::Request: general HTTP API calls (Ansible's uri) by @flipbit03 in #81
  • Diff::short is a summary's first line; http::Request shows its body at -v; -v prints a failed step's diff by @flipbit03 in #89
  • A caught step failure shows its command's stderr at -v (StepFinished.cmd, protocol 8) by @flipbit03 in #94
  • The helper refuses an answer larger than one frame instead of sending it (#84) by @flipbit03 in #97
  • brew::Absent removes every installed version and refuses a pinned formula (#71) by @flipbit03 in #98
  • brew: resolve an installed alias or old name through opt/ (#72) by @flipbit03 in #100
  • apt: a refresh writes update-success-stamp, and the lists' age is the newer of it and the lists (#70) by @flipbit03 in #101
  • archive: refuse pax sparse members, replace a symlink member through a renamed temporary link by @flipbit03 in #102
  • Set the mode without setuid, then the owner, then the full mode by @flipbit03 in #105
  • SDK: stream file contents, listings and command I/O across the escalation helper (#85) by @flipbit03 in #106
  • Stream ctx.fetch and file::Copy (#86) by @flipbit03 in #108
  • Stream http::Download; no default size caps on HTTP (#87) by @flipbit03 in #111
  • Elevated: a helper that exits reports its whole stderr (#90) by @flipbit03 in #113
  • Stream archive::Extracted, zstd included (#88) by @flipbit03 in #114
  • PROGRESS: #82 merged with #114; backlog train 2 complete by @flipbit03 in #116
  • Vision: back to a vision; the source is the authority on types by @flipbit03 in #120
  • Docs: bring the user docs up to date with the week's changes by @flipbit03 in #121
  • Vision 5.4: the binary never listens or connects back by @flipbit03 in #124
  • Probe tests: join the in-process helper inside the watched window (#110) by @flipbit03 in #127
  • Tests: make write-then-exec tests immune to the ETXTBSY fork race (#128) by @flipbit03 in #129
  • SDK: test-only API behind a testing feature; Ctx::new leaves the public surface (#125) by @flipbit03 in #130
  • ctx.fetch does nothing under --check (#117) by @flipbit03 in #131
  • --check: steps as an account that does not exist yet wait for it (#118) by @flipbit03 in #132
  • Run-wide secret masker with Ansible's rules, applied where events leave the binary (#126) by @flipbit03 in #133
  • Renderers: a signal-killed command shows (killed by signal N) (#95) by @flipbit03 in #135
  • Renderers escape control and invisible formatting characters (#91) by @flipbit03 in #136
  • http::Download: verified close, idle body timeout, 200 only, apply executes the intent (#112) by @flipbit03 in #137
  • archive::Extracted: a pax global header is metadata, so git archive tarballs extract at strip 0 (#103) by @flipbit03 in #139
  • file::Symlink stages at a random sibling name, shared with archive (#104) by @flipbit03 in #140
  • authorized_keys::Present gives mode and owner to the write (#119) by @flipbit03 in #141
  • brew::Absent removes only what it names: HOMEBREW_NO_AUTOREMOVE (#99) by @flipbit03 in #142
  • Inventory: the same-distance conflict message names fixes that work (#123) by @flipbit03 in #143
  • mask::apply_prefix: mask before http cuts or reshapes text (#134) by @flipbit03 in #144
  • ureq: minimum 3.4.1, and a scheduled check against the newest 3.x (#138) by @flipbit03 in #145
  • CI: drop the weekly newest-ureq job; keep ureq's 3.4.1 minimum by @flipbit03 in #146

Full Changelog: v0.6.1...v0.7.0