Skip to content

Releases

diaggulp 2026.11.8

Choose a tag to compare

@lukejenkins lukejenkins released this 09 Nov 00:03

diaggulp 2026.11.8, the first release on PyPI: pip install diaggulp (extras: serial, decode). The PyPI version is the same code as this tag.

Packaging

  • The base install depends on diagmunge>=2026.11.8, and the decode extra on diaggrok>=2026.11.8, from PyPI instead of pinned git URLs. Mixed installs no longer fail with ResolutionImpossible.
  • The PyPI page carries the README, license and project links.

Changes

  • Telit arming in seconds. On Telit modems each SET_MASK acknowledgment was often read during the write that sent the next command, and was missed, so every group waited out a 4 s timeout. Replies read during the write now count. Start logging on an LM960 arms in about 2 s instead of about 33 s.
  • A stop while arming still disarms. From the first latching arm until the read loop starts, SIGTERM / SIGINT / SIGHUP are held and acted on once setup finishes, so the stop always reaches the disarming teardown instead of leaving the modem's masks armed.
  • The SPC step sends DIAG_SPC_F (0x41), matching diagmunge; it used to send 0x46.

diaggulp 2026.10.31

Choose a tag to compare

@lukejenkins lukejenkins released this 01 Nov 16:08

diaggulp 2026.10.31. Pins diagmunge v2026.10.31; the decode extra pins diaggrok v2026.10.31.

New

  • --pcap replay works again on an install with the decode extra. In v2026.10.13 it refused, because its replay core was not available to a public install; the core is now diagmunge.diag_source.
  • --disarm-logs-on-exit: on exit, clear the binary log mask (LOG_CONFIG op 0) and event reporting, then verify on the stream that LOG and event frames stopped. Both are sticky on the modem, so a left-armed port otherwise keeps streaming to nobody and floods the next reader. Use it with --disarm-qsh-on-exit and --restore-f3-mask-on-exit for a one-shot capture.
  • Rotating captures anchor every segment. With --rotate-size / --rotate-interval, each segment now gets its own timestamp anchor, so every file maps DIAG time to host / UTC time on its own.
  • --wait-ready keeps reopening the port until DIAG answers, for a modem that re-enumerates on USB.

Fixes

  • --pcap-out no longer breaks a live, non-rotating capture. It reused the capture writer's variable, so the capture loop wrote to the pcap writer, raised, and left a 0-byte capture.
  • Teardown with any --disarm-*-on-exit / --restore-f3-mask-on-exit flag completes even when the process is signalled again, receives SIGHUP, or loses its stderr pipe. Only SIGKILL can cut it short.
  • -o /dev/null is a valid sink (no output lock on a non-regular file), so two concurrent quiesce runs no longer refuse each other.
  • The all-logs mask handshake fails clearly on a "success" reply with all-zero log ranges, instead of arming nothing silently.

Install

diaggulp is not on PyPI. Install it from GitHub at the tag:

pip install "diaggulp @ git+https://github.com/lukejenkins/diaggulp@v2026.10.31"
pip install "diaggulp[serial] @ git+https://github.com/lukejenkins/diaggulp@v2026.10.31"   # + live USB-serial capture
pip install "diaggulp[decode] @ git+https://github.com/lukejenkins/diaggulp@v2026.10.31"   # + --decode, --pcap-out, --pcap replay

The base install needs diagmunge and zstandard; it pulls diagmunge at the tag it pins.