cas-toolbox
Cluster Automation Scripts Toolbox — one stop shop for tool scripts used in cluster automation operations in high performance computing.
cas-toolbox is a meta-package: it ships no code of its own. It pins exact
releases of the nine tools below and installs all of their console commands in a
single step, so a fresh host gets the whole toolbox with one pip install.
Every bundled tool is a single self-contained .py file — copy one onto a
host and it runs, no packaging required. (multiSSH3's optional shell
autocomplete is the one exception: it needs mssh_complete.py next to
multiSSH3.py.)
Project metadata
| Current version | 2026.42.2 |
| Released | 2026-10-16 |
| Python | >= 3.6 |
| Platform | Linux (POSIX); macOS for multiSSH3, simple-iotest, statblk, tee-logger, TSVZ |
| License | GPL-3.0-or-later |
| Author | Yufei Pan (pan@zopyr.us) |
| Homepage | github.com/yufei-pan/cas-toolbox |
| PyPI | pypi.org/project/cas-toolbox |
| Build backend | setuptools (pyproject.toml) |
| Bundled tools | 9 |
Versioning and release cadence
Versions are YYYY.WW.hotfix — calendar year, ISO week number, and a hotfix
counter. For example 2026.40.1 is the first release cut in week 40 of 2026.
The bundle is deliberately semi-stable:
- Mondays are the normal re-cut. Last week's accumulated upstream changes are
rolled into one release: the
==pins of everything that moved are updated and the version bumps to the newYYYY.WW. - Mid-week releases are for emergency fixes only. Only the affected tool's
pin changes and the
hotfixsegment increments (2026.39.1→2026.39.2), leaving the week number alone. - Releasing an individual upstream tool is independent and can happen any day. Its pin bump normally rides along in the next Monday roll-up.
Upstream tools use their own x.y / x.y.z schemes; the pins in this package
record exactly which release is in the bundle.
Included tools
Versions listed are the ones pinned by the current release of cas-toolbox.
| Tool | Module | PyPI package | Pinned | Commands | What it does |
|---|---|---|---|---|---|
| hpcp | hpcp.py |
hpcp |
9.73 | hpcp |
Highly-parallel cp / imaging for HPC storage |
| multiCMD | multiCMD.py |
multicmd |
1.53 | mcmd, multicmd, multiCMD |
Run many subprocesses in parallel (base library) |
| multiSSH3 | multiSSH3.py |
multissh3 |
6.31 | mssh, mssh3, multissh, multissh3, multiSSH3, mssh-complete |
Parallel SSH across hosts, curses TUI |
| simple-iotest | iotest.py |
simple-iotest |
3.69.1 | iotest, simple-iotest |
Dead-simple filesystem I/O benchmark |
| statbtrfs | statbtrfs.py |
statbtrfs |
0.35 | statbtrfs |
Btrfs status / scrub orchestration |
| Tee_Logger | src/Tee_Logger.py |
tee-logger |
6.42 | (library only) | Logger that tees to dated files + stdout |
| TSVZ | TSVZ.py |
tsvz |
4.7 | tsvz, TSVZ |
Key-value store / in-memory DB backed by a TSV file |
| statblk | statblk.py |
statblk |
1.54 | statblk |
Block-device / partition info table |
| firewatcher | firewatcher.py |
firewatcher |
1.59 | firewatcher |
Journal/log incident capture with off-box context |
Internal dependency graph worth knowing when a pin moves:
multiCMDis the foundation —hpcp,statbtrfsandstatblkall depend on it.simple-iotestdepends ontee-logger.
Recent releases
| Version | Date | What changed |
|---|---|---|
2026.42.2 |
2026-10-16 | Hotfix: hpcp 9.72 → 9.73. -rm with a destination (a move) no longer deletes sources it did not copy: it is skipped after any copy error (Remove skipped, 212), and otherwise removes only the files and links the copy listed, then empty directories, so files written during the move, FIFOs, sockets, device nodes and the files of a -do copy stay; a move onto itself (hpcp -rm /data/x -d /data/) is refused, and -rm -di NEW.img creates the image first (9.72 removed the sources and made no image). The move's removal goes by directory descriptors without following symlinks, so a source or directory swapped for a symlink during the copy is not removed from, and it needs about half of 9.72's metadata operations. -rme -di no longer empties the image it just filled; -rme keeps the copy of an excluded path (absolute or not, -e 'cache/' included) and a filesystem's lost+found; a -d glob no longer yields /. One unreadable file or directory no longer stops a copy (Listing error, 209; the rest is copied), and -diff refuses a partial listing instead of writing delete rows. Link tracking is opt-in (-lt; it had been inactive since May 2025). -dd mounts source partitions read-only unless they are mounted live, and xfs clones mount with nouuid. Pool workers get the run's settings (-co, -ncd, -hs, -ctl on macOS, Windows and Python 3.14+). |
2026.42.1 |
2026-10-13 | tsvz 3.39 → 4.7 (major): .tsvz / .csvz / .nsvz / .psvz files now follow tsvz-spec-v1, so a file 3.39 wrote under one of those names reads differently — rename it to .tsv (see TSVZ's Breaking changes from 3.39); .tsv / .csv get bug fixes only. 4.7 passes the whole spec conformance suite: carriage returns and zero bytes in values are written as <CR> and <NUL> (older versions read those as text, so stop older tsvz serve handlers before upgrading; a value 4.2/4.3 wrote with a raw zero byte now reads as damage), parts names codecs, and a part in a codec this Python lacks (zstd before 3.14) is refused. Damaged compressed members and zero-filled lines are recovered, skipped or stop the read as the store's #_on_corruption_# says (recover by default); appends never read the store; a key ending in whitespace can be read and deleted by name, so `tsvz keys s |
2026.40.1 |
2026-09-28 | simple-iotest 3.67.0 → 3.68.0: IOPS (call/sync) and op counts in every mode's report, including index; fixed worker count for repeated role keys (e.g. write s), which over-reported size and call bandwidth. |
2026.39.2 |
2026-09-23 | Mid-week hotfix. Restored requires-python >= 3.6 (2026.39.1 had raised it to 3.8 for TSVZ 4.0 while still pinning tsvz 3.39, so pip on 3.6 silently stayed on 2026.38.1). hpcp 9.62 → 9.64, multissh3 6.24 → 6.25, firewatcher 1.57 → 1.58. |
Full history is in the commit log.
Requirements
- Python >= 3.6
Nothing outside the standard library is required; the optional libraries below only add features or speed.
Optional Python libraries
Heavier libraries are imported defensively — every tool runs without them, just with reduced functionality or performance.
| Library | Used by | Effect when present |
|---|---|---|
curses |
multiSSH3 |
Interactive TUI instead of the plain text output |
numpy |
iotest |
Much faster random-number generation in the I/O benchmark |
xxhash |
hpcp |
Faster hashing; falls back to hashlib.blake2b |
resource |
multiSSH3, TSVZ |
Resource-usage reporting |
argcomplete |
TSVZ, statblk, statbtrfs |
Shell tab completion (pip install '<tool>[completion]') |
xxhash is declared by hpcp but imported defensively, so hpcp still works
without it.
Installation
Use pip:
pip install cas-toolbox
Use pipx:
pipx install cas-toolbox
Use uv (as an isolated tool, with numpy for the iotest benchmark):
uv tool install --with numpy cas-toolbox
Use uv to add it as a dependency:
uv add cas-toolbox
Note on
numpy: it is only used byiotest's random-number generator and is not needed anywhere else in the toolbox.
To install one tool on its own, install its PyPI package directly instead of this meta-package.
Commands provided
| Command | Tool |
|---|---|
hpcp |
hpcp |
mcmd / multicmd / multiCMD |
multiCMD |
mssh / mssh3 / multissh / multissh3 / multiSSH3 |
multiSSH3 |
mssh-complete |
multiSSH3 (autocomplete engine behind mssh --completion) |
iotest / simple-iotest |
simple-iotest |
statbtrfs |
statbtrfs |
tsvz / TSVZ |
TSVZ |
statblk |
statblk |
firewatcher |
firewatcher |
Every command supports --help / -h and -V / --version, except
mssh-complete, the engine the shell glue runs (run it bare for its usage).
Verifying an install
hpcp -V && mcmd -V && mssh3 -V && iotest -V && statbtrfs -V \
&& TSVZ -V && statblk -V && firewatcher -V
cas-toolbox itself exposes no command — it is a dependency bundle only.
From a checkout that has the nine upstream repositories side by side,
getCASVersions.sh prints every tool's version at once:
./getCASVersions.sh
Development
This repository holds only the meta-package (pyproject.toml, uv.lock,
README.md, getCASVersions.sh). The upstream sources live in their own
repositories — see the links below.
uv sync --frozen # resolve the locked dependency set
uv build # build wheel + sdist into dist/
Pins are exact (==) on purpose: the bundle is meant to be reproducible.
Author
- Yufei Pan (pan@zopyr.us)
License
GPL-3.0-or-later
Links
Metadata
Release files for cas-toolbox 2026.42.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| cas_toolbox-2026.42.2.tar.gz | 8.2 kB | Without provenance | Details for cas_toolbox-2026.42.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| cas_toolbox-2026.42.2-py3-none-any.whl | Python 3 | none | any | Details for cas_toolbox-2026.42.2-py3-none-any.whl |
Total release size: 15.7 kB
Release files / cas_toolbox-2026.42.2.tar.gz
| Download URL | cas_toolbox-2026.42.2.tar.gz |
|---|---|
| Size | 8.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cd331e3140389e5f093add9669d9f317110fced32873522f35cdb7c4f677d32d
|
|
BLAKE2b-256 checksum How to use checksums |
a9d5379aa15b2408d966277462085fd69659c3abc7715b0d8da6bf69dd63d6a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / cas_toolbox-2026.42.2-py3-none-any.whl
| Download URL | cas_toolbox-2026.42.2-py3-none-any.whl |
|---|---|
| Size | 7.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
610d9a210ec5193ae78512942feba9443e9b1f19e20522339502a1d5c2237e1d
|
|
BLAKE2b-256 checksum How to use checksums |
aa88284eaa0165eaf399ec73c4b1473109a2d182093706ede24cc43850f9e44c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for cas-toolbox 2026.42.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.