catena-installer
catena-installer installs a Catena server from the client's machine and
opens its panel. With no arguments it serves a browser page on loopback; with
a verb it runs in the console.
uvx catena-installer # the page
uvx catena-installer install --inventory clientco # the console
uvx catena-installer install --inventory clientco --release vX.Y.Z
uvx catena-installer connect --inventory clientco # open the panel here
From a checkout of catena-ce, uv run catena-installer runs this tree's copy:
the one operators and the test bench run.
Where it runs, and what that decides
On the client's own machine, Windows, macOS or Linux, with uv the only thing to install. Whoever holds the SSH private key reaches the server, so a hosted installer would make the operator custodian of every client's server (ADR 0011).
It runs no Ansible itself. It reaches the server over SSH (paramiko), sends a starter script and the image fetcher through that session, and the server installs itself with the code of the release it fetched (../ansible/install-host.sh): the roles, the engines and the panel the server ends up with are one version. What the server prints comes back through the session, to the console or to the page.
The console owns the job; the browser is a view. Closing the browser changes nothing. Closing the console stops the install with it; reopening its inventory keeps every answer and offers the install again, as after a failed one. Running the install again on an installed server re-applies the release it runs, and repairs it.
The install, step by step
- Log in: as
opswith the inventory's key on a server installed before, else as the provider's login with the key, else once with the provider's password to add the key there. A server presenting another host key than the one this machine trusts gets nothing until the client confirms it was reinstalled. - Leg
accounts, through that login: the starter installs what the release needs to start, fetches the release image by digest and runs its install-host.sh, which createsopsand the forward-onlypanelaccount with this machine's public key. Nothing is closed yet. - Log in again, as
opswith the key. That login is what the hardening waits for: the server checks sshd's record of this very session before its first role turns off every other login. - Leg
system: bootstrap, the passwords (printed between two marker lines), the converge, the version recorded, the server's own checks. - The checks only another machine can make: a scan of every TCP port of the public IP against what the server declares, and the containers' network out of reach from here.
- The page opens the
panelaccount's forward and links the panel;connectdoes the same from the console.
--release vX.Y.Z moves the server to that release with that release's own
code and records it, the same end state as the panel's update. Without it the
server keeps the release it records, and a new server gets the newest one.
What the package carries
The installer page and the console are one program (catena_installer/). It
carries a few files of the Ansible tree, which a wheel holds under
catena_installer/tree/ and a checkout reads from ../ansible/
(catena_installer/tree.py): seed.py and the knob registry, which write and
read an inventory's .env, and the files sent to the server before the
release is there, helpers/fetch_release.py and what it imports. The starter
script (catena_installer/starter.sh) has nothing version-specific in it, so
the newest installer can install or move a server to any release.
It lives beside ../ansible/ rather than in it because catena-admin's vendor
step copies the tracked ansible/ tree into the public panel image, and the
installer does not belong there.
It holds no knob knowledge
The sections, their explanations and the questions each asks come from
../ansible/helpers/knobs.yml, the registry
the on-box store, the installer and the settings page all read. A knob that
declares a step appears in that section under its label, with its help
behind a (?) tooltip; one that does not is never asked. There is no list of
fields in this package, and a test refuses one.
Adding a question is therefore a registry edit. Adding a proof is a function
in catena_installer/steps.py, registered in its PROBES under the section it
checks. The one button verifies every section and starts the install only when
none of them blocks, with what the checks found under it.
The server's check is the one that matters: an SSH server has to answer, with
the host key this machine trusts for it, and the install has to be able to log
in. A server presenting another key gets no login and no password: its check
carries a box to tick when the server was reinstalled. Either the key already
opens the initial login -- most providers install it when the server is
ordered, and the key field suggests the pairs already in ~/.ssh, or offers to
create the one it names -- or the provider's password does, and the install
uses it once to add the key. The password is the one field the section has
beside the registry's, held in memory only.
Fields the registry marks required block until filled; everything else is
labelled optional.
English and French
Every page is in English or French. The switcher at the end of the tab bar
stores the choice in a cookie; without one, the browser's preferred language
decides, then English. A registry field carries its label and help in both
languages. The page's own words are in catena_installer/translations/, one
file per language with the same keys, which a test holds together. The
console reports in English.
An inventory is the run
Inventories live in the user's data directory (~/.local/share/catena/inventory
on Linux, ~/Library/Application Support/catena/inventory on macOS,
%APPDATA%\catena\inventory on Windows), in ../ansible/inventory/ when run
from a checkout, or under CATENA_INVENTORY_ROOT. The page has two tabs.
Inventory lists them, one per line, and creates new ones. Installation is one
page: the target and the configuration in one form, the button that verifies
and installs, the install's output, and then the server access section with
the passwords and the way into the panel. Every field starts from the
registry's default, and a knob that declares an example shows it as a
placeholder, never as a value. The button saves the whole form, whatever the
verification finds:
<inventory root>/<name>/
.env the answers, written by seed.py's own writer: the
file the console reads. NOT the credentials.
hosts.yml the server's name.
.catena-installer.json the install's state and the installer that runs it. 0600.
The provider's password and an admin password pin are held in memory for the life of the process. The pin reaches the server as a transient 0600 file for the run, deleted when it ends; the provider's password never leaves this machine. A reopened inventory asks for them again. That is the honest cost of not writing them to a client's disk.
What the install prints goes to the console and to the page from memory, never to a file: it carries the passwords the server shows once. The server prints them as JSON between two marker lines; the page shows each one in the server access section, and the console window does not.
The console, for operators and the bench
catena-installer install --inventory clientco [-i FILE] [--release vX.Y.Z | --image REF]
[--address A] [--tags T] [--reinstalled] [--no-confirm]
[--keyset-json] [--ca-file F] [--insecure-http]
-i FILE installs a new server from one input file: the .env keys of the
registry, host_name (the server's name), host_initial_password (the
provider's password, used once) and an optional admin_password pin. Without
it the inventory's .env must exist (init, then fill it in). On a terminal
the console asks for the provider's password when no key opens the server,
and whether a server presenting a new host key was reinstalled;
--no-confirm asks nothing and stops instead. --image installs from any
catena-admin image reference, and --ca-file / --insecure-http reach a
private registry: the test bench serves the image it built that way.
uninstall takes the same three, and otherwise runs the uninstall of the
release the server records.
Exit statuses: 0 installed; 1 the install failed; 3 it finished and a check failed; 4 the server refused the second leg's session.
Metadata
Release files for catena-installer 0.11.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| catena_installer-0.11.3-py3-none-any.whl | Python 3 | none | any | Details |
Release files / catena_installer-0.11.3-py3-none-any.whl
| Download URL | catena_installer-0.11.3-py3-none-any.whl |
|---|---|
| Size | 138.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
99138e59574b2d5933fd8b1526cec7aedd402cd34b05a0de4d7ba0cc7b8b6dea
|
|
BLAKE2b-256 checksum How to use checksums |
ec1f3c5a81bbb218f17061cc7128ee7e65ae081a792f63d97acf701fe52cf347
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for catena-installer 0.11.3
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.