kellyjonbrazil / jc

CLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.
MIT License
7.78k stars 196 forks source link

PostgreSQL INI files #548

Open chriscroome opened 6 months ago

chriscroome commented 6 months ago

An extract from the main PostgreSQL configuration file from Debian Bookworm, /etc/postgresql/15/main/postgresql.conf:

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)
max_connections = 100                   # (change requires restart)
#superuser_reserved_connections = 3     # (change requires restart)
unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories
                                        # (change requires restart)
#unix_socket_group = ''                 # (change requires restart)
#unix_socket_permissions = 0777         # begin with 0 to use octal notation
                                        # (change requires restart)
#bonjour = off                          # advertise server via Bonjour
                                        # (change requires restart)
#bonjour_name = ''                      # defaults to the computer name
                                        # (change requires restart)

The JC ini filter returns the following from the above:


{
  "port": "5432                             # (change requires restart)",
  "max_connections": "100                   # (change requires restart)",
  "unix_socket_directories": "'/var/run/postgresql' # comma-separated list of directories"
}

I wonder if this needs a special case, if values are not quoted assume that any white space (tabs in this case) and anything else after a # can be discarded? Or if the ini parser should be updated for this format?

kellyjonbrazil commented 5 months ago

This looks like it would need to be a separate parser, possibly reusing the INI parser with some pre-processing to remove inline comments. The INI parser documentation states that all comments must be on their own line.

chriscroome commented 5 months ago

Thanks, I'd missed the fact that the existing parser doesn't allow inline comments, I'll use sed for now:

cat /etc/postgresql/15/main/postgresql.conf | sed 's/[#].*$//' | jc --ini -p
{
  "data_directory": "/var/lib/postgresql/15/main",
  "hba_file": "/etc/postgresql/15/main/pg_hba.conf",
  "ident_file": "/etc/postgresql/15/main/pg_ident.conf",
  "external_pid_file": "/var/run/postgresql/15-main.pid",
  "port": "5432",
  "max_connections": "100",
  "unix_socket_directories": "/var/run/postgresql",
  "ssl": "on",
  "ssl_cert_file": "/etc/ssl/certs/ssl-cert-snakeoil.pem",
  "ssl_key_file": "/etc/ssl/private/ssl-cert-snakeoil.key",
  "shared_buffers": "128MB",
  "dynamic_shared_memory_type": "posix",
  "max_wal_size": "1GB",
  "min_wal_size": "80MB",
  "log_line_prefix": "%m [%p] %q%u@%d ",
  "log_timezone": "Etc/UTC",
  "cluster_name": "15/main",
  "datestyle": "iso, dmy",
  "timezone": "Etc/UTC",
  "lc_messages": "en_GB.UTF-8",
  "lc_monetary": "en_GB.UTF-8",
  "lc_numeric": "en_GB.UTF-8",
  "lc_time": "en_GB.UTF-8",
  "default_text_search_config": "pg_catalog.english",
  "include_dir": "conf.d"
}