Hi,

I'd like to add an ability to validate the corectness of PostgreSQL
configuration files, i.e. postgresql.conf, pg_hba.conf, pg_ident.conf without
actually applying them. The idea is that it would be a command-line option to
postgres for a stand-alone case, or a user-callable function when postmaster
is running.

Per the former discussion of a validator for PostgreSQL configuration files
(see http://archives.postgresql.org/pgsql-hackers/2008-08/msg00048.php),
here's an implementation proposal. The development plan consists of 2 parts.
The first one is to add new code that would allow running the checks in both a
stand-alone process, when postmaster is not running, and as a function call
from a backend postgres process. Initially the code would simply loads
configuration files, without performing any of the validation checks. The
second part consists of adding specific checks.

I think most of the code related to this feature should be put into the
auxiliary process. The rationale is that we already have a stand-alone
CheckerProcess, which nowadays only parses postgresql.conf, runs BaseInit and
exists. We can easily load pg_hba.conf and pg_ident.conf and run all the
necessary checks there. Moreover, the same process can be used when checks are
launched from a built-in function. In that case, it would save the postgres
backend from reloading postgresql.conf, pg_hba.conf and pg_ident.conf
internally and restoring the previous configuration options when the function
exists. Below is a more detailed description of implementation steps:

1.1. Stand-alone process (postmaster is not running):

- Add a new option (--check-config) to main.c. Run AuxiliaryProcessMain with
  auxType= CheckerProcess if this option is specified.
- In CheckerModeMain load pg_hba.conf, pg_ident.conf


1.2. Built-in function, called from a backend process.
- Add a new built-in function
- Add LastCheckState shared flag to denote whether the check has been
  successful or failed
- Add a new PMSignalReason 
- From the function call SendPostmasterSignal with the reason added on the
  previous step.
- In the postmaster add a check for this reason in sigusr1_handler, spawning
  a checker process. Set LastCheckStatus to InProgress.
- Store current configuration options in AuxillaryProcessMain before reloading
  configuration files to avoid checking for options that haven't changed.
- In AuxillaryProcessMain, modify SelectConfigFiles invocation to call it
  if IsUnderPostmaster = true if auxType process type is CheckerProcess.
- In the CheckerModeMain, set LastCheckState to either success or failure at the
  end of all checks.
- The built-in function would wait until LastCheckState changes its value from
  InProgress to either Succcess or Failure, or until some predefined timeout
  expires, in which case it would emit an error.

2. Add following configuration checks:

postgresql.conf:

Check that:
  1. postgres can bind to listen address:port
  2. unix_socket_directory has proper permissions (n/a on Windows).
  3. unix_socket_group group exists on a target system (n/a Windows).
  4. unix_socket_permissions are valid (write permission is not revoked from
        the owner, or a group, if group is different from the user).
  5. server.crt and server.key exist in the data directory if ssl is
        set to true (and server is compiled with openssl)
  6. krb_server_keyfile is readable by the server (if  set)
  7. server is not requesting more shared memory than it's available in the 
system.
  8. shared_preload_libraries and local_preload_libraries exist.
  9. synchronous_standby_names are not empty and max_wal_senders
        are > 0 if synchronous_replication = true
  10. all enable_*  query planner parameters are on.
  11. seq_page_cost <= random_page_cost, and cpu_ costs are lower than page_ 
costs.
  12. effective_cache_size is less than the amount of physical memory available.
  13. geqo is turned on
  14. default_statistics_target is >= 100
  15. logging collector is enabled if log destination is stderr
  16. log directory either exists and writable or that the parent
         directory allows creating subdris
  17. track counts is on if autovacuum is enabled
  18. stats_temp_directory is writeable
  19. default tablespace exists (if set)
  20. temp_tablespace exists (if set)
  21. statement_timeout is 0 (disabled)
  22. dynamic_library_path exists
  23. sql_inheritance is off
  24. zero_damaged_pages is off
         
pg_hba.conf:
Check that:
  1. the server is compiled with ssl if hostssl is specified
  2. ssl is not required if hostnossl is specified

- Add a Warning value to LastCheckState for cases when configuration
files were loaded successfully, but one or more validation checks have failed.

Note that these are basic checks don't require the checker process to have
access to the database, Also, with this implementation, a client won't receive
an exact error message in case validation is unsuccessful, however, it would
receive a status (success, failure, warnings), and an exact error message
would be available in the server's log. It's possible to address these
shortcomings in the future.

Ideas, suggestions are welcome.

--
Alexey Klyukin
The PostgreSQL Company - Command Prompt, Inc.





-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to