Files
rustguac/docs/migration.md
T
Dave Kempe 0d69e8fed4 Rename Address Book → Connections; allowed_groups picker; session privacy (#102)
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.
2026-04-18 21:56:20 +10:00

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 in config.toml
  • VAULT_SECRET_ID environment 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, -3 suffix
  • Names are truncated to 64 characters
  • The original connection name is preserved in the display_name field

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_groups instead.
  • Credentials (passwords, private keys) are imported into Vault where they are stored encrypted at rest and never touch disk.