newer pg module
[mirror/dsa-puppet.git] / 3rdparty / modules / postgresql / manifests / server / config_entry.pp
1 # Manage a postgresql.conf entry. See README.md for more details.
2 define postgresql::server::config_entry (
3   $ensure = 'present',
4   $value  = undef,
5   $path   = false
6 ) {
7   $postgresql_conf_path = $postgresql::server::postgresql_conf_path
8
9   $target = $path ? {
10     false   => $postgresql_conf_path,
11     default => $path,
12   }
13
14   # Those are the variables that are marked as "(change requires restart)"
15   # on postgresql.conf.  Items are ordered as on postgresql.conf.
16   #
17   # XXX: This resource supports setting other variables without knowing
18   # their names.  Do not add them here.
19   $requires_restart_until = {
20     'data_directory'                      => undef,
21     'hba_file'                            => undef,
22     'ident_file'                          => undef,
23     'external_pid_file'                   => undef,
24     'listen_addresses'                    => undef,
25     'port'                                => undef,
26     'max_connections'                     => undef,
27     'superuser_reserved_connections'      => undef,
28     'unix_socket_directory'               => '9.3',   # Turned into "unix_socket_directories"
29     'unix_socket_directories'             => undef,
30     'unix_socket_group'                   => undef,
31     'unix_socket_permissions'             => undef,
32     'bonjour'                             => undef,
33     'bonjour_name'                        => undef,
34     'ssl'                                 => '10',
35     'ssl_ciphers'                         => '10',
36     'ssl_prefer_server_ciphers'           => '10',    # New on 9.4
37     'ssl_ecdh_curve'                      => '10',    # New on 9.4
38     'ssl_cert_file'                       => '10',    # New on 9.2
39     'ssl_key_file'                        => '10',    # New on 9.2
40     'ssl_ca_file'                         => '10',    # New on 9.2
41     'ssl_crl_file'                        => '10',    # New on 9.2
42     'shared_buffers'                      => undef,
43     'huge_pages'                          => undef,   # New on 9.4
44     'max_prepared_transactions'           => undef,
45     'max_files_per_process'               => undef,
46     'shared_preload_libraries'            => undef,
47     'max_worker_processes'                => undef,   # New on 9.4
48     'old_snapshot_threshold'              => undef,   # New on 9.6
49     'wal_level'                           => undef,
50     'wal_log_hints'                       => undef,   # New on 9.4
51     'wal_buffers'                         => undef,
52     'archive_mode'                        => undef,
53     'max_wal_senders'                     => undef,
54     'max_replication_slots'               => undef,   # New on 9.4
55     'track_commit_timestamp'              => undef,   # New on 9.5
56     'hot_standby'                         => undef,
57     'logging_collector'                   => undef,
58     'cluster_name'                        => undef,   # New on 9.5
59     'silent_mode'                         => '9.2',   # Removed
60     'track_activity_query_size'           => undef,
61     'autovacuum_max_workers'              => undef,
62     'autovacuum_freeze_max_age'           => undef,
63     'autovacuum_multixact_freeze_max_age' => undef,   # New on 9.5
64     'max_locks_per_transaction'           => undef,
65     'max_pred_locks_per_transaction'      => undef,
66   }
67
68   Exec {
69     logoutput => 'on_failure',
70   }
71
72   if ! ($name in $requires_restart_until and (
73     ! $requires_restart_until[$name] or
74     versioncmp($postgresql::server::_version, $requires_restart_until[$name]) < 0
75   )) {
76     Postgresql_conf {
77       notify => Class['postgresql::server::reload'],
78     }
79   } elsif $postgresql::server::service_restart_on_change {
80     Postgresql_conf {
81       notify => Class['postgresql::server::service'],
82     }
83   } else {
84     Postgresql_conf {
85       before => Class['postgresql::server::service'],
86     }
87   }
88
89   # We have to handle ports and the data directory in a weird and
90   # special way.  On early Debian and Ubuntu and RHEL we have to ensure
91   # we stop the service completely. On RHEL 7 we either have to create
92   # a systemd override for the port or update the sysconfig file, but this
93   # is managed for us in postgresql::server::config.
94   if $::operatingsystem == 'Debian' or $::operatingsystem == 'Ubuntu' {
95     if $name == 'port' and ( $::operatingsystemrelease =~ /^6/ or $::operatingsystemrelease =~ /^10\.04/ ) {
96         exec { "postgresql_stop_${name}":
97           command => "service ${::postgresql::server::service_name} stop",
98           onlyif  => "service ${::postgresql::server::service_name} status",
99           unless  => "grep 'port = ${value}' ${::postgresql::server::postgresql_conf_path}",
100           path    => '/usr/sbin:/sbin:/bin:/usr/bin:/usr/local/bin',
101           before  => Postgresql_conf[$name],
102         }
103     }
104     elsif $name == 'data_directory' {
105       exec { "postgresql_stop_${name}":
106         command => "service ${::postgresql::server::service_name} stop",
107         onlyif  => "service ${::postgresql::server::service_name} status",
108         unless  => "grep \"data_directory = '${value}'\" ${::postgresql::server::postgresql_conf_path}",
109         path    => '/usr/sbin:/sbin:/bin:/usr/bin:/usr/local/bin',
110         before  => Postgresql_conf[$name],
111       }
112     }
113   }
114   if $::osfamily == 'RedHat' {
115     if ! ($::operatingsystemrelease =~ /^7/ or $::operatingsystem == 'Fedora') {
116       if $name == 'port' {
117         # We need to force postgresql to stop before updating the port
118         # because puppet becomes confused and is unable to manage the
119         # service appropriately.
120         exec { "postgresql_stop_${name}":
121           command => "service ${::postgresql::server::service_name} stop",
122           onlyif  => "service ${::postgresql::server::service_name} status",
123           unless  => "grep 'PGPORT=${value}' /etc/sysconfig/pgsql/postgresql",
124           path    => '/sbin:/bin:/usr/bin:/usr/local/bin',
125           require => File['/etc/sysconfig/pgsql/postgresql'],
126         }
127         -> augeas { 'override PGPORT in /etc/sysconfig/pgsql/postgresql':
128           lens    => 'Shellvars.lns',
129           incl    => '/etc/sysconfig/pgsql/*',
130           context => '/files/etc/sysconfig/pgsql/postgresql',
131           changes => "set PGPORT ${value}",
132           require => File['/etc/sysconfig/pgsql/postgresql'],
133           notify  => Class['postgresql::server::service'],
134           before  => Class['postgresql::server::reload'],
135         }
136       } elsif $name == 'data_directory' {
137         # We need to force postgresql to stop before updating the data directory
138         # otherwise init script breaks
139         exec { "postgresql_${name}":
140           command => "service ${::postgresql::server::service_name} stop",
141           onlyif  => "service ${::postgresql::server::service_name} status",
142           unless  => "grep 'PGDATA=${value}' /etc/sysconfig/pgsql/postgresql",
143           path    => '/sbin:/bin:/usr/bin:/usr/local/bin',
144           require => File['/etc/sysconfig/pgsql/postgresql'],
145         }
146         -> augeas { 'override PGDATA in /etc/sysconfig/pgsql/postgresql':
147           lens    => 'Shellvars.lns',
148           incl    => '/etc/sysconfig/pgsql/*',
149           context => '/files/etc/sysconfig/pgsql/postgresql',
150           changes => "set PGDATA ${value}",
151           require => File['/etc/sysconfig/pgsql/postgresql'],
152           notify  => Class['postgresql::server::service'],
153           before  => Class['postgresql::server::reload'],
154         }
155       }
156     }
157   }
158
159   case $ensure {
160     /present|absent/: {
161       postgresql_conf { $name:
162         ensure  => $ensure,
163         target  => $target,
164         value   => $value,
165         require => Class['postgresql::server::initdb'],
166       }
167     }
168
169     default: {
170       fail("Unknown value for ensure '${ensure}'.")
171     }
172   }
173 }