Skip to content

pgman v0.5.0

Choose a tag to compare

@github-actions github-actions released this 02 Nov 14:57
· 69 commits to main since this release

Added

  • Encrypted dumps. encrypt = "kms:<key>" on an environment wraps a
    fresh key per dump with AWS KMS, bound to the dump's header; encrypt = "age:<public key>" encrypts to your own key, made by pgman key new.
    Masked and raw dumps are both encrypted, pg_dump's output piped straight
    into the encryptor; pgman restore opens them. The journal records
    what each copy is encrypted to, and pgman copies show says it.
    pgman key new|list makes and lists your age keys.

Changed

  • A protected environment's raw and masked dumps need encrypt.
    Until the environment says kms:, age: or none (masked copies
    only), they are refused, with the lines that settle it. Schema-only
    dumps, and protected targets that aren't environments, are unchanged
    (the latter dumped masked and unencrypted, which is said).
  • An encrypted raw dump is pgman's archive, a .pgman-dump directory,
    and its link <label>-latest.pgman-dump, not <label>-latest.dump:
    a script restoring the old link name finds the last unencrypted dump.
    Masked and raw copies of one label now share that link.

Fixed

  • Over MCP, the confirmation for dump, restore and apply_patches
    starts ticked. Claude Code kept showing the form again while its box
    was unticked, and the call failed after 300s with "no answer from the
    operator". Accept or Decline is the answer; a protected environment
    still takes its typed name.
  • Over MCP, dump and restore given a connection name only
    discovery knows (one connections lists from the project) say so,
    and to pass its URL or add it to connections.toml. They used to say
    there was no such name.
  • A restore's result says that owners and grants were left out, who
    owns what it restored, and how to grant another role (the
    application's) access: until then that role can read none of it.
  • A dump refused because its user can't read everything names the
    first 20 tables and sequences, then counts partitions under their
    parent (app.events: 106 partitions). It used to name the first 8
    and say "and 106 more", which could hide the few tables that decide
    whether --skip-unreadable is safe.
  • Masking rehashes a hash whose word isn't last
    (long_value_hash_lower_case), a bare hash on a cards or users
    table, and a card number's (ccnum_hash).
  • A key into a lookup that refines another (sub_religions into
    religions) is NULLed as one into the lookup is; a text-keyed lookup
    of categories keeps its key; a lookup's translations keyed by a
    language_id aren't refused.
  • The tap monitor's status says a sender's drop count is events
    "dropped in the app, never sent", not "JAR backpressure": OTLP
    senders never report one, and pgman's own drops are the footer's.
  • The tap's transactions and pools views drop numeric columns on a
    narrow screen instead of their text column: at 60 columns a row
    ended on a bare …, and at 80 the transactions view read con… and
    the pools view showed the pool under a POOL · APP header with no
    app. The pools header names the app only when a row has room for one.
  • A connection the server ends while a page of rows loads, a transaction
    commits or rolls back, or pgman is first connecting shows the
    connection-lost card with the server's reason, as a failed query's
    did. A failed :readonly on leaves the header as the session is.