diff --git a/postgresql-firewall b/postgresql-firewall new file mode 100644 index 0000000..2391bdc --- /dev/null +++ b/postgresql-firewall @@ -0,0 +1,4 @@ +## Name: PostgreSQL Server +## Description: Opens TCP port 5432 to allow remote connections to the PostgreSQL server. + +TCP="5432" diff --git a/postgresql-init b/postgresql-init new file mode 100644 index 0000000..62b95be --- /dev/null +++ b/postgresql-init @@ -0,0 +1,199 @@ +#!/bin/sh +# Copyright (c) 1995-2004 SUSE Linux AG, Nuernberg, Germany. +# All rights reserved. +# +# System startup script for PostgreSQL +# +# LSB compatible service control script; see http://www.linuxbase.org/spec/ +# +### BEGIN INIT INFO +# Provides: postgresql +# Required-Start: $network $remote_fs +# Required-Stop: $network $remote_fs +# Default-Start: 3 5 +# Default-Stop: +# Description: Start the PostgreSQL master daemon +### END INIT INFO + +# Source SuSE config +PG_SYSCONFIG=/etc/sysconfig/postgresql +test -f $PG_SYSCONFIG && . $PG_SYSCONFIG + +# Shell functions sourced from /etc/rc.status: +# rc_check check and set local and overall rc status +# rc_status check and set local and overall rc status +# rc_status -v ditto but be verbose in local rc status +# rc_status -v -r ditto and clear the local rc status +# rc_failed set local and overall rc status to failed +# rc_reset clear local rc status (overall remains) +# rc_exit exit appropriate to overall rc status +. /etc/rc.status + +eval DATADIR=${POSTGRES_DATADIR:-~postgres/data} +OPTIONS=${POSTGRES_OPTIONS} +PIDFILE=$DATADIR/postmaster.pid + +# The echo return value for success (defined in /etc/rc.config). +rc_reset + +# Return values acc. to LSB for all commands but status: +# 0 - success +# 1 - generic or unspecified error +# 2 - invalid or excess argument(s) +# 3 - unimplemented feature (e.g. "reload") +# 4 - insufficient privilege +# 5 - program is not installed +# 6 - program is not configured +# 7 - program is not running +# +# Note that starting an already running service, stopping +# or restarting a not-running service as well as the restart +# with force-reload (in case signalling is not supported) are +# considered a success. + +# +if test -r $DATADIR/PG_VERSION ; then + DATA_VERSION=$(cat $DATADIR/PG_VERSION) + POSTGRES=/usr/lib/postgresql${DATA_VERSION/./}/bin/postgres +fi +if test -x /usr/bin/postgres; then + ACTIVE=$(readlink -q -f /usr/bin/postgres) + test -z "$POSTGRES" && POSTGRES="$ACTIVE" +fi +if test -z "$POSTGRESQL_QUIET"; then + export POSTGRESQL_QUIET=1 + if test -n "$DATA_VERSION"; then + if test -z "$ACTIVE" -o "$ACTIVE" != "$POSTGRES"; then + echo " Your database files were created by PostgreSQL version $DATA_VERSION." + if test -x "$POSTGRES"; then + echo " Using the executables in $(dirname $POSTGRES)." + else + echo " Could not find executables for this version." + echo " Please install the PostgreSQL server package for version $DATA_VERSION." + fi + fi + elif test -z "$ACTIVE"; then + echo " Cannot find an active PostgreSQL server binary. Please install one of the PostgreSQL" + echo " server packages or activate an already installed version using update-alternatives." + fi +fi +if test ! -x "$POSTGRES"; then + test "$1" = "stop" && exit 0 || exit 5 +fi +BINDIR=$(dirname $POSTGRES) +VERSION=$($POSTGRES --version|awk '{print $NF}') +LOGFILE=$DATADIR/postmaster.log +pg_ctl () { + CMD="$BINDIR/pg_ctl ${POSTGRES_TIMEOUT:+-t $POSTGRES_TIMEOUT} $@" + su - postgres -c "$CMD" +} + +case "$1" in + start) + if [ ! -f $DATADIR/PG_VERSION ]; then + echo -n "Initializing PostgreSQL $VERSION at location ${DATADIR}" + LANG_SYSCONFIG=/etc/sysconfig/language + test -f "$LANG_SYSCONFIG" && . $LANG_SYSCONFIG + LANG=${POSTGRES_LANG:-$RC_LANG} + INITDB=/usr/bin/initdb + V=$(printf "%02d%02d" $(echo $VERSION|awk -F. '{print $1, $2}')) + AUTH="ident"; test $V -lt 0804 && AUTH="ident sameuser" + install -d -o postgres -g postgres -m 700 ${DATADIR} && + su - postgres -c \ + "$INITDB --locale=$LANG --auth=\"$AUTH\" $DATADIR &> initlog" || + rc_failed + rc_status -v + rc_status || { + echo "You can find a log of the initialisation in ~postgres/initlog ." + rc_exit + } + fi + echo -n "Starting PostgreSQL $VERSION " + if pg_ctl status -s -D $DATADIR >/dev/null + then + rc_failed 0 + else + set -o pipefail + pg_ctl start -s -w -D $DATADIR -l $LOGFILE -o "\"$OPTIONS\"" + fi + rc_status -v + ;; + + stop) + echo -n "Shutting down PostgreSQL $VERSION " + if pg_ctl status -s -D $DATADIR >/dev/null + then + pg_ctl stop -s -D $DATADIR -m fast &> /dev/null + else + rc_failed 0 + fi + rc_status -v + ;; + + try-restart|condrestart) + ## Do a restart only if the service was active before. + ## Note: try-restart is now part of LSB (as of 1.9). + ## RH has a similar command named condrestart. + if test "$1" = "condrestart"; then + echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}" + fi + $0 status + if test $? = 0; then + $0 restart + else + rc_reset # Not running is not a failure. + fi + # Remember status and be quiet + rc_status + ;; + + restart) + ## Stop the service and regardless of whether it was + ## running or not, start it again. + $0 stop + $0 start + rc_status + ;; + + force-reload | reload) + echo -n "Reloading configuration for PostgreSQL $VERSION " + pg_ctl reload -s -D $DATADIR + rc_status -v + ;; + + status) + echo -n "Checking for PostgreSQL $VERSION: " + ## Check status with checkproc(8), if process is running + ## checkproc will return with exit status 0. + + # Status has a slightly different for the status command: + # 0 - service running + # 1 - service dead, but /var/run/ pid file exists + # 2 - service dead, but /var/lock/ lock file exists + # 3 - service not running + + # NOTE: checkproc returns LSB compliant status values. + if ! pg_ctl status -s -D $DATADIR >/dev/null + then + if test -f $DATADIR/postmaster.pid; then + rc_failed 1 + else + rc_failed 3 + fi + fi + rc_status -v + ;; + + probe) + rc_failed 3 + rc_status -v + ;; + + *) + echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}" + exit 1 + ;; +esac + +# Inform the caller not only verbosely and set an exit status. +rc_exit diff --git a/postgresql-sysconfig b/postgresql-sysconfig new file mode 100644 index 0000000..997c0fa --- /dev/null +++ b/postgresql-sysconfig @@ -0,0 +1,51 @@ +## Path: Applications/PostgreSQL +## Description: The PostgreSQL Database System +## Type: string() +## Default: "~postgres/data" +## ServiceRestart: postgresql +# +# In which directory should the PostgreSQL database reside? +# +POSTGRES_DATADIR="~postgres/data" + +## Path: Applications/PostgreSQL +## Description: The PostgreSQL Database System +## Type: string() +## Default: "" +## ServiceRestart: postgresql +# +# The options that are given to the PostgreSQL master daemon on startup. +# See the manual pages for postmaster and postgres for valid options. +# +# Don't put "-D datadir" here since it is set by the startup script +# based on the variable POSTGRES_DATADIR above. +# +POSTGRES_OPTIONS="" + + +## Path: Applications/PostgreSQL +## Description: The PostgreSQL Database System +## Type: string() +## Default: "600" +## ServiceRestart: postgresql +# +# This value controls how many seconds the pg_ctl helper program waits +# for the startup or shutdown of the PostgreSQL server to complete. +# +POSTGRES_TIMEOUT="600" + +## Path: Applications/PostgreSQL +## Description: The PostgreSQL Database System +## Type: string() +## Default: "C" +## ServiceRestart: "" +# +# Specifies the locale under which the PostgreSQL database location +# should be initialized and run. If needed, it has to be changed +# before PostgreSQL is started for the first time. To change the +# locale of an existsing PostgreSQL database location, it must be +# dumped, removed and initialized from scratch using the new locale. +# +# If unset or empty $RC_LANG from /etc/sysconfig/language is used. +# +POSTGRES_LANG="" diff --git a/postgresql-tmpfiles.conf b/postgresql-tmpfiles.conf new file mode 100644 index 0000000..ea21c99 --- /dev/null +++ b/postgresql-tmpfiles.conf @@ -0,0 +1,2 @@ +# For the PostgreSQL server's unix domain socket +d /var/run/postgresql 1777 root root - diff --git a/postgresql.changes b/postgresql.changes index b035fb8..eba9b3d 100644 --- a/postgresql.changes +++ b/postgresql.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Thu Sep 21 07:59:26 UTC 2017 - max@suse.com + +- Refine the dependencies between the "dummy" packages and the + actual implementation of PostgreSQL. The dummy packages now + require an arbitrary implementation and recommend the default + version. +- Move the contents of postgresql-init to the server package. + ------------------------------------------------------------------- Thu Aug 3 23:06:39 UTC 2017 - mrueckert@suse.de diff --git a/postgresql.service b/postgresql.service new file mode 100644 index 0000000..c439eef --- /dev/null +++ b/postgresql.service @@ -0,0 +1,19 @@ +[Unit] + +Description=PostgreSQL database server +After=syslog.target +After=network.target + +[Service] +Type=forking +User=postgres +EnvironmentFile=-/etc/sysconfig/postgresql +ExecStart=/usr/lib/postgresql-init start +ExecStop=/usr/lib/postgresql-init stop +ExecReload=/usr/lib/postgresql-init reload + +# The server might be slow to stop, and that's fine. Don't kill it +SendSIGKILL=no + +[Install] +WantedBy=multi-user.target diff --git a/postgresql.spec b/postgresql.spec index 2f50404..cbd5048 100644 --- a/postgresql.spec +++ b/postgresql.spec @@ -17,6 +17,12 @@ %define defaultpackage postgresql10 +%if 0%{?suse_version} >= 1300 +%bcond_without systemd +%else +%bcond_with systemd +%endif + Name: postgresql Summary: Basic Clients and Utilities for PostgreSQL License: PostgreSQL @@ -25,10 +31,24 @@ Version: 10 Release: 0 Url: https://www.postgresql.org/ BuildRoot: %{_tmppath}/%{name}-%{version}-build -Requires: %defaultpackage +Provides: postgresql-noarch = %version-%release +Requires: postgresql-implementation +Recommends: %defaultpackage BuildArch: noarch -Source0: postgresql-bashprofile +Source0: postgresql-init +Source1: postgresql-sysconfig +Source2: postgresql-firewall +Source3: postgresql-tmpfiles.conf +Source4: postgresql.service +Source5: postgresql-bashprofile +%if 0%{?suse_version} > 1100 + %define fwdir /etc/sysconfig/SuSEfirewall2.d/services + %define fwname postgresql +%else + %define fwdir /etc/sysconfig/scripts + %define fwname SuSEfirewall2-postgresql +%endif %description PostgreSQL is an advanced object-relational database management system @@ -45,7 +65,18 @@ package. %package server Summary: The Programs Needed to Create and Run a PostgreSQL Server Group: Productivity/Databases/Servers -Requires: %defaultpackage-server +Provides: postgresql-server-noarch = %version-%release +Requires: postgresql-server-implementation +Recommends: %defaultpackage-server +Provides: postgresql-init = %version +Obsoletes: postgresql-init < %version +%if %{with systemd} +BuildRequires: pkgconfig(systemd) +%{?systemd_requires} +%else +Requires(postun): %insserv_prereq +%endif + %description server PostgreSQL is an advanced object-relational database management system @@ -60,7 +91,9 @@ PostgreSQL databases. %package docs Summary: HTML Documentation for PostgreSQL Group: Productivity/Databases/Tools -Requires: %defaultpackage-docs +Provides: postgresql-docs-noarch = %version-%release +Requires: postgresql-docs-implementation +Recommends: %defaultpackage-docs %description docs PostgreSQL is an advanced object-relational database management system @@ -76,7 +109,9 @@ postgresql package. %package contrib Summary: Contributed Extensions and Additions to PostgreSQL Group: Productivity/Databases/Tools -Requires: %defaultpackage-contrib +Provides: postgresql-docs-noarch = %version-%release +Requires: postgresql-docs-implementation +Recommends: %defaultpackage-contrib %description contrib PostgreSQL is an advanced object-relational database management system @@ -94,7 +129,9 @@ Documentation for the modules contained in this package can be found in %package devel Summary: PostgreSQL development header files and libraries Group: Productivity/Databases/Tools -Requires: %defaultpackage-devel +Provides: postgresql-devel-noarch = %version-%release +Requires: postgresql-devel-implementation +Recommends: %defaultpackage-devel %description devel PostgreSQL is an advanced object-relational database management system @@ -111,7 +148,9 @@ which will interact with a PostgreSQL server. %package plperl Summary: The PL/Tcl, PL/Perl, and PL/Python procedural languages for PostgreSQL Group: Productivity/Databases/Servers -Requires: %defaultpackage-plperl +Provides: postgresql-plperl-noarch = %version-%release +Requires: postgresql-plperl-implementation +Recommends: %defaultpackage-plperl %description plperl PostgreSQL is an advanced object-relational database management system @@ -126,7 +165,9 @@ functions, and triggers. %package plpython Summary: The PL/Python Procedural Languages for PostgreSQL Group: Productivity/Databases/Servers -Requires: %defaultpackage-plpython +Provides: postgresql-devel-noarch = %version-%release +Requires: postgresql-plpython-implementation +Recommends: %defaultpackage-plpython %description plpython PostgreSQL is an advanced object-relational database management system @@ -141,7 +182,9 @@ functions, and triggers. %package pltcl Summary: PL/Tcl Procedural Language for PostgreSQL Group: Productivity/Databases/Tools -Requires: %defaultpackage-pltcl +Provides: postgresql-pltcl-noarch = %version-%release +Requires: postgresql-pltcl-implementation +Recommends: %defaultpackage-pltcl %description pltcl PostgreSQL is an advanced object-relational database management system @@ -158,8 +201,57 @@ echo "This is a dummy package to provide a dependency on the default PostgreSQL %install mkdir -p %buildroot/var/lib/pgsql/ -sed 's,@LIBDIR@,%_libdir,g' %{SOURCE0} > \ - %buildroot/var/lib/pgsql/.bash_profile +install -m640 %{SOURCE5} %buildroot/var/lib/pgsql/.bash_profile + +install -m755 -d %buildroot/var/adm/fillup-templates +install -m644 %{S:1} %buildroot/var/adm/fillup-templates/sysconfig.postgresql + +install -m755 -d %buildroot%fwdir +install -m644 %{S:2} %buildroot%fwdir/%fwname + +install -m755 -d %buildroot/usr/sbin +%if %{with systemd} +install -m755 -d %buildroot/%_tmpfilesdir +install -m644 %{S:3} %buildroot%_tmpfilesdir/postgresql.conf + +install -m755 -d %buildroot/usr/lib +install -m755 %{S:0} %buildroot/usr/lib + +install -m755 -d %buildroot%_unitdir +install -m444 %{S:4} %buildroot%_unitdir + +ln -sf service %buildroot/usr/sbin/rcpostgresql +%else +install -m755 -d %buildroot/etc/init.d +install -m755 %{S:0} %buildroot/etc/init.d/postgresql +ln -sf /etc/init.d/postgresql %buildroot/usr/sbin/rcpostgresql +%endif + +%pre server +groupadd -g 26 -o -r postgres >/dev/null 2>/dev/null || : +useradd -g postgres -o -r -d /var/lib/pgsql -s /bin/bash \ + -c "PostgreSQL Server" -u 26 postgres 2>/dev/null || : + +%post server +%fillup_only -n postgresql +%if %{with systemd} +%tmpfiles_create %_tmpfilesdir/postgresql.conf +%service_add_post postgresql.service +%endif + +%preun server +%if %{with systemd} +%service_del_preun postgresql.service +%else +%stop_on_removal postgresql +%endif + +%postun server +%if %{with systemd} +%service_del_postun postgresql.service +%else +%insserv_cleanup +%endif %files %defattr(-,root,root,-) @@ -171,6 +263,21 @@ sed 's,@LIBDIR@,%_libdir,g' %{SOURCE0} > \ %attr(750,postgres,postgres) %dir /var/lib/pgsql %attr(640,postgres,postgres) %config(noreplace) /var/lib/pgsql/.bash_profile +%if 0%{?suse_version} > 1110 +%dir %fwdir +%endif +%config %fwdir/%fwname +/var/adm/fillup-templates/sysconfig.postgresql +/usr/sbin/rcpostgresql +%if %{with systemd} +%_tmpfilesdir/postgresql.conf +%_unitdir/ +/usr/lib/* +%else +%config /etc/init.d/postgresql +%endif + + %files docs %defattr(-,root,root,-) %doc README