3.7.5
Every native install since the CLI was compiled came up with no scheduled jobs. The server looked healthy in every other respect, which is why it took this long to find. If you run one of ours, the one thing to take from this release is that hitechcloudcli update puts them back.
Upgrading is hitechcloudcli update.
Eighteen jobs that never ran
INSTALL.sh installs the whole native stack in step 7 by running hitechcloudcli native-install, and installed the compiled CLI in step 9. Which implementation answers a command is decided by what is on the machine when it runs, and nothing in the command says so — so every install was served by the shell twin of that command, which is a release behind and has no step that writes /etc/cron.d/hitechcloud at all.
What was not running: the health monitor, send-limit enforcement, the status-page probes, audit ingest, backups, statistics. The file was simply absent, and the System Crons page reported no jobs, correctly, on a server that had none.
The artifact timestamps are what settled it. On a fresh 3.7.4 server, logrotate was written at 00:48:36 and the AutoSSL timer enabled at 00:52:28 — the two steps either side of the scheduled-jobs step — with nothing in between.
- The compiled CLI is now installed in step 5, beside the dispatcher it replaces.
- When it cannot be installed at all, step 7 says so, and says that the server will have nothing scheduled. Silence was the whole defect.
- The check at the end of the installer repairs what it finds before reporting it. It had warned on every install since 3.7.2, and the jobs stayed missing.
- This release's update script repairs existing servers, because on every one installed before today this is wrong and nothing about the machine looks unusual.
An ordering cannot be seen in a diff, so a check in CI asserts it: the line that installs the compiled CLI must come before the line that uses it.
The CLI could hand a command to itself
/usr/local/bin/hitechcloud-rustcli is a symlink to /usr/local/bin/hitechcloudcli, so that both names run identical bytes. Put the shell dispatcher at that path — which the installer did in step 5, and the update did on its shell path — and the dispatcher asks hitechcloud-rustcli which commands it handles, which is the dispatcher asking itself, one process deeper, with nothing at the bottom. Measured with a depth-counting stand-in: exactly one level per invocation, unbounded, each level forking before it can answer.
It now requires an ELF header on whatever that name resolves to: the compiled CLI has one, a shell script cannot, and four bytes answer the question without running anything. The update path no longer writes the dispatcher over a compiled CLI, which is what opened the window — five commands ran inside it.
And a command that falls back to its shell implementation now says so. Nineteen commands still have both, they are not the same age, and the difference above is what that costs.
Fixed
- An install that adopts an existing checkout can reach the mirror. It fetched from the private repository and, when that failed, stopped with an error recommending the mirror. The recommendation was right and nothing acted on it, so every adopt run on a machine without a credential ended there. Both are tried now, and the error only appears when both have been.
- Opening a draft no longer rewrites it. The editor reported itself dirty the moment a draft was loaded, because the baseline it compared against was the stored HTML and not what the editor had made of it, so autosave wrote a new version of a message nobody had touched.
- Modals opened from the mobile drawer are positioned against the screen. The drawer is moved with a CSS
transform, which makes it the containing block for anythingposition: fixedinside it — so three dialogs, a confirmation and two context menus were laid out against a 320-pixel panel instead of the viewport. - A duplicate upstream report is now impossible rather than unlikely. The watcher consults the titles it has already opened, in dry runs too, and its retries no longer count a transient server error as a change.