Attached is an improved patch.

1. It parses unix_socket_directory out from PostgreSQL configuration
file and used its value as a default value of OCF_RESKEY_socketdir.
(Perl is used for that)

2. It creates OCF_RESKEY_socketdir if it doesn't exist otherwise
checks if PostgreSQL DBA use can create files in that directory.

3. If OCF_RESKEY_socketdir is set bug OCF_RESKEY_pghost isn't it uses
OCF_RESKEY_socketdir as -h parameter for psql command. Otherwise
monitor function could fail because psql doesn't tolerate non-default
socket directory and doesn't use posgresql.conf.

4. It replaced $(command) syntax with `command` syntax in 2 places
just to make it consistent with the rest of the script.

Perl parsing script may seem ugly but the rules of that config file
are pretty wide open: equal sign is optional, spaces are optional,
in-line comments are allowed.

On Thu, Jun 24, 2010 at 8:37 AM, Serge Dubrouski <[email protected]> wrote:
> That was I though to do with one exception:
>
> check_socket_dir() {
>     if [ ! -d "$1" ]
>     then
>            mkdir
>            chmod
>            chown
>     else
>           if ! touch $OCF_RESKEY_socketdir/test_file
>           then
>                   ocf_log err "Can't create files in $OCF_RESKEY_socketdir!"
>                   exit
>           else
>                   rm $OCF_RESKEY_socketdir/test_file
>           fi
>    fi
>
> I'll provide an appropriate patch a bit later.
>
> On Thu, Jun 24, 2010 at 8:33 AM, Dejan Muhamedagic <[email protected]> 
> wrote:
>> On Wed, Jun 23, 2010 at 02:07:09PM +0200, Lars Ellenberg wrote:
>>> On Tue, Jun 22, 2010 at 10:05:10AM -0600, Serge Dubrouski wrote:
>>> > Yes it is possible to parse it from postgresql.conf of from provided
>>> > config file.
>>>
>>> Then that should be done, IMO.
>>> Otherwise it has to be changed in two places again,
>>> and it will be forgotten in one or the other,
>>> which will lead to very hard to debug misbehaviour.
>>
>> It would indeed be better to fetch it from the configuration
>> file. However, there's also the concern that Serge mentioned on
>> directories such as /tmp which should be handled differently.
>>
>> I'd suggest to drop the parameter and get it from the
>> configuration file and create/modify the directory _only_ in case
>> the directory doesn't exist. Codewise:
>>
>> check_socket_dir() {
>>    if [ ! -d "$1" ]
>>    then
>>           mkdir
>>           chmod
>>           chown
>>        fi
>> }
>>
>> I think that this should be safe enough.
>>
>> Thanks,
>>
>> Dejan
>>
>>> > Attached is an improved patch with double quotes and error checks.
>>> > >> > @@ -238,6 +248,11 @@
>>> > >> >          ocf_log err "PostgreSQL can't write to the log file: 
>>> > >> > $OCF_RESKEY_logfile"
>>> > >> >     return $OCF_ERR_GENERIC
>>> > >> >      fi
>>> > >> > +    # Check if we need to create a socket directory
>>> > >> > +    if [ -n "$OCF_RESKEY_socketdir" ]
>>> > >> > +    then
>>> > >> > +        check_socket_dir $OCF_RESKEY_socketdir
>>>
>>> double quotes missing here already, btw.
>>> and as OCF_RESKEY_socketdir is a "global" anyways,
>>> why pass it as argument to subfunctions at all?
>>>
>>> --
>>> : Lars Ellenberg
>>> : LINBIT | Your Way to High Availability
>>> : DRBD/HA support and consulting http://www.linbit.com
>>>
>>> DRBD® and LINBIT® are registered trademarks of LINBIT, Austria.
>>> _______________________________________________________
>>> Linux-HA-Dev: [email protected]
>>> http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
>>> Home Page: http://linux-ha.org/
>> _______________________________________________________
>> Linux-HA-Dev: [email protected]
>> http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
>> Home Page: http://linux-ha.org/
>>
>
>
>
> --
> Serge Dubrouski.
>



-- 
Serge Dubrouski.
--- a/heartbeat/pgsql	2010-06-24 08:40:18.000000000 -0600
+++ b/heartbeat/pgsql	2010-06-24 11:44:11.000000000 -0600
@@ -16,6 +16,38 @@
 : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/resource.d/heartbeat}
 . ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs
 
+#
+# Get PostgreSQL Configuration parameter
+#
+get_pgsql_param() {
+    local config_file
+    local param_name
+    local param_value
+
+    param_name=$1
+ 
+    #Check that config file exists 
+    if [ -n $OCF_RESKEY_config ]; then
+        config=$OCF_RESKEY_pgdata/postgresql.conf
+    else
+        config=$OCF_RESKEY_config
+    fi
+
+    if [ ! -f "$config" ]; then
+        ocf_log err "Cannot find configuration file $config"
+        exit $OCF_ERR_GENERIC
+    fi
+
+    perl_code="if (/^\s*$param_name[\s=]+\s*(.*)$/) {
+       \$dir=\$1;
+       \$dir =~ s/\s*\#.*//;
+       \$dir =~ s/^'(\S*)'/\$1/;
+       print \$dir;}"
+
+    param_value=`cat $config | perl -ne "$perl_code"`
+    echo "$param_value"
+}
+
 # Defaults
 OCF_RESKEY_pgctl_default=/usr/bin/pg_ctl
 OCF_RESKEY_psql_default=/usr/bin/psql
@@ -27,7 +59,6 @@
 OCF_RESKEY_start_opt_default=""
 OCF_RESKEY_pgdb_default=template1
 OCF_RESKEY_logfile_default=/dev/null
-OCF_RESKEY_socketdir_default=""
 OCF_RESKEY_stop_escalate_default=30
 
 : ${OCF_RESKEY_pgctl=${OCF_RESKEY_pgctl_default}}
@@ -40,9 +71,12 @@
 : ${OCF_RESKEY_start_opt=${OCF_RESKEY_start_opt_default}}
 : ${OCF_RESKEY_pgdb=${OCF_RESKEY_pgdb_default}}
 : ${OCF_RESKEY_logfile=${OCF_RESKEY_logfile_default}}
-: ${OCF_RESKEY_socketdir=${OCF_RESKEY_socketdir_default}}
 : ${OCF_RESKEY_stop_escalate=${OCF_RESKEY_stop_escalate_default}}
 
+# $OCF_RESKEY_pgdata has to be initialized at this momemnt
+OCF_RESKEY_socketdir_default=`get_pgsql_param unix_socket_directory`
+: ${OCF_RESKEY_socketdir=${OCF_RESKEY_socketdir_default}}
+
 usage() {
     cat <<EOF
 	usage: $0 start|stop|status|monitor|meta-data|validate-all|methods
@@ -248,10 +282,11 @@
         ocf_log err "PostgreSQL can't write to the log file: $OCF_RESKEY_logfile"
 	return $OCF_ERR_GENERIC
     fi
-    # Check if we need to create a socket directory
+
+    # Check socket directory
     if [ -n "$OCF_RESKEY_socketdir" ]
     then
-        check_socket_dir $OCF_RESKEY_socketdir
+        check_socket_dir
     fi
 
     # Set options passed to pg_ctl
@@ -385,6 +420,10 @@
     psql_options="-p $OCF_RESKEY_pgport -U $OCF_RESKEY_pgdba $OCF_RESKEY_pgdb"
     if [ -n "$OCF_RESKEY_pghost" ]; then
 	psql_options="$psql_options -h $OCF_RESKEY_pghost"
+    else
+       if [ -n "$OCF_RESKEY_socketdir" ]; then
+           psql_options="$psql_options -h $OCF_RESKEY_socketdir"
+       fi
     fi
     runasowner "$OCF_RESKEY_psql $psql_options -c 'select now();'"
 
@@ -422,7 +461,7 @@
     if [ ! -f "$1" ]
     then
         touch $1 > /dev/null 2>&1
-        chown $OCF_RESKEY_pgdba:$(getent passwd $OCF_RESKEY_pgdba | cut -d ":" -f 4) $1
+        chown $OCF_RESKEY_pgdba:`getent passwd $OCF_RESKEY_pgdba | cut -d ":" -f 4` $1
     fi
 
     #Check if $OCF_RESKEY_pgdba can write to the log file
@@ -434,27 +473,33 @@
     return 0
 }
 
+#
 # Check socket directory
+#
 check_socket_dir() {
-    if [ ! -d "$1" ]
-    then
-        if ! mkdir "$1"
+    if [ ! -d "$OCF_RESKEY_socketdir" ]; then
+        if ! mkdir "$OCF_RESKEY_socketdir"; then
+            ocf_log err "Cannot create directory $OCF_RESKEY_socketdir"
+            exit $OCF_ERR_GENERIC
+        fi
+
+        if ! chown $OCF_RESKEY_pgdba:`getent passwd \
+             $OCF_RESKEY_pgdba | cut -d ":" -f 4` "$OCF_RESKEY_socketdir" 
         then
-            ocf_log err "Cannot create directory $1"
+            ocf_log err "Cannot change ownership for $OCF_RESKEY_socketdir"
             exit $OCF_ERR_GENERIC
-       fi
-    fi
-    
-    if ! chown $OCF_RESKEY_pgdba:$(getent passwd $OCF_RESKEY_pgdba | cut -d ":" -f 4) "$1" 
-    then
-        ocf_log err "Cannot change ownership for $1"
-        exit $OCF_ERR_GENERIC
-    fi
+        fi
 
-    if ! chmod 2775 "$1"
-    then
-        ocf_log err "Cannot change permissions for $1"
-        exit $OCF_ERR_GENERIC
+        if ! chmod 2775 "$OCF_RESKEY_socketdir"; then
+            ocf_log err "Cannot change permissions for $OCF_RESKEY_socketdir"
+            exit $OCF_ERR_GENERIC
+        fi
+    else
+        if ! runasowner "touch $OCF_RESKEY_socketdir/test.$$"; then
+            ocf_log err "$OCF_RESKEY_pgdba cannot create files in $OCF_RESKEY_socketdir"
+            exit $OCF_ERR_GENERIC
+        fi
+        rm $OCF_RESKEY_socketdir/test.$$
     fi
 }
 
_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/

Reply via email to