Three pieces of v1.6.0 work that happened together and are easier to
review as one save point.
Rename: Address Book → Connections
- static/addressbook.html renamed to static/connections.html
- Nav links, page titles, empty states, onboarding, and prose updated
across all 8 static pages (connections, admin, docs, index,
recordings, reports, sessions, tokens).
- README, CLAUDE.md, and every file under docs/ updated.
- src/main.rs: connections.html added to the branded-page map and
route list; /addressbook.html returns a 308 permanent redirect so
existing bookmarks keep working.
- Backend API paths, Rust types, and Vault storage paths are
deliberately unchanged — internal only.
Folder allowed_groups picker
- New SQLite table `seen_groups` tracks OIDC groups observed in any
user login; OIDC callback upserts after extracting groups.
- `GET /api/auth/known-groups` (admin-only) returns the union of
group_role_mappings and seen_groups.
- `GET /api/addressbook/folders/{scope}/{folder}/config` adds the
missing endpoint the frontend was already calling — existing
allowed_groups now prefill the edit-folder modal.
- Folder modal swaps the free-text comma-separated input for a chip
picker with a themed combobox dropdown: autocomplete over known
groups, keyboard nav, "+ add custom" row for unlisted groups.
Active session visibility (GitHub #102)
- `GET /api/sessions` scopes to the caller's own sessions by default;
`?all=true` lets admins opt in (used by the Sessions page).
- `GET /api/sessions/{id}` and the thumbnail GET/PUT endpoints are
now owner-or-admin, returning 404 for other callers so session
existence isn't leaked.
- Connections' Active Sessions strip is now always owner-scoped —
admins still manage everyone via the Sessions page.
3.9 KiB
Migrating from Apache Guacamole
rustguac can import connections from an Apache Guacamole MySQL/MariaDB database into its Vault-backed connections.
Prerequisites
- A running Vault/OpenBao instance with
[vault]configured inconfig.toml VAULT_SECRET_IDenvironment variable set- A MySQL/MariaDB dump of your Guacamole database
Step 1: Export the Guacamole database
On the Guacamole database server, create a SQL dump:
mysqldump -u guacamole_user -p guacamole_db \
guacamole_connection \
guacamole_connection_parameter \
guacamole_connection_group \
> guacamole-dump.sql
Only these three tables are needed. The dump must contain INSERT INTO statements (the default for mysqldump).
Step 2: Preview the import
Use --dry-run to see what would be imported without writing anything:
rustguac --config /opt/rustguac/config.toml \
import-guacamole \
--file guacamole-dump.sql \
--dry-run
Example output:
Found 42 connections (3 skipped, 39 to import)
[DRY RUN] Would import to folder "imported" (scope: shared):
Web-Server (ssh) → 10.0.0.1:22
Database-Primary (ssh) → 10.0.0.5:22
Windows-DC (rdp) → 10.0.1.10:3389
Production-DMZ-Firewall (ssh) → 10.0.2.1:22
...
Re-run without --dry-run to import.
Connections with unsupported protocols (e.g. telnet, kubernetes) are automatically skipped.
Step 3: Import
VAULT_SECRET_ID=your-secret-id \
rustguac --config /opt/rustguac/config.toml \
import-guacamole \
--file guacamole-dump.sql \
--folder my-servers \
--scope shared
Options
| Flag | Default | Description |
|---|---|---|
--file |
(required) | Path to the mysqldump SQL file |
--folder |
imported |
Target folder in the connections |
--scope |
shared |
shared (visible to all instances) or instance (this instance only) |
--dry-run |
off | Preview without writing to Vault |
What gets imported
The importer maps Guacamole connection parameters to rustguac connections fields:
| Guacamole parameter | Connections field |
|---|---|
hostname |
hostname |
port |
port |
username |
username |
password |
password |
private-key |
private_key |
domain |
domain |
security |
security |
ignore-cert |
ignore_cert |
color-depth |
color_depth |
enable-drive |
enable_drive |
remote-app |
remote_app |
remote-app-dir |
remote_app_dir |
remote-app-args |
remote_app_args |
Supported protocols
- SSH connections
- RDP connections (including RemoteApp)
- VNC connections
Unsupported protocols (telnet, kubernetes, etc.) are skipped with a warning.
Connection groups
Guacamole's connection group hierarchy is flattened into entry name prefixes. For example, a connection named "Firewall" in group "Production > DMZ" becomes Production-DMZ-Firewall.
Name handling
- Spaces are replaced with hyphens
- Special characters are stripped
- Duplicate names get a
-2,-3suffix - Names are truncated to 64 characters
- The original connection name is preserved in the
display_namefield
After import
Once imported, connections appear in the connections UI. You can:
- Edit entries to add features not available in Guacamole (login scripts, autofill, domain allowlists)
- Move entries between folders
- Set folder-level access controls via
allowed_groups - Enable per-entry clipboard restrictions (
disable_copy/disable_paste)
Notes
- The import is additive: existing entries in the target folder are not deleted or overwritten. If you re-run the import, entries with the same name will be updated.
- Guacamole user/group permissions are not imported. Use rustguac's OIDC group mappings and folder
allowed_groupsinstead. - Credentials (passwords, private keys) are imported into Vault where they are stored encrypted at rest and never touch disk.