Dejan -

After a second thought I think that your way of handling checking
binaries is more appropriate since it allows that "case" statement
down the script work properly. I'd like to add a small change to
patch2 though. See attached.

pgsql3.patch has a mistypo:

+    if [ -n "$OCF_RESKEY_config" -a ! -f "$OCF_RESKEY_config" ]; then
+        ocf_log err "the configuration file $OCF_RESKEY_config doesn't exist"
+        return $OCF_ERR_INSTALLED
+    if

Should be

+    if [ -n "$OCF_RESKEY_config" -a ! -f "$OCF_RESKEY_config" ]; then
+        ocf_log err "the configuration file $OCF_RESKEY_config doesn't exist"
+        return $OCF_ERR_INSTALLED
+    fi


On Fri, Jun 25, 2010 at 8:28 AM, Serge Dubrouski <[email protected]> wrote:
> Hi, Dejan -
>
> What's the point of introducing check_binary2 ? The old version of
> script used to use have_binary for checking binary tools but then
> Florian replaced it with check_binary and threw away "if" statements.
> Now you kind of reversing it. Why?
>
>
> On Fri, Jun 25, 2010 at 4:22 AM, Dejan Muhamedagic <[email protected]> 
> wrote:
>> Hi,
>>
>> On Thu, Jun 24, 2010 at 11:59:55AM -0600, Serge Dubrouski wrote:
>>> 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.
>>
>> Thanks for the patch. I amended some parts of it (in
>> pgsql2.patch) and updated the validate action (pgsql3.patch). Can
>> you please test these.
>>
>> Thanks,
>>
>> Dejan
>>
>>> 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/
>>
>>
>> _______________________________________________________
>> 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-25 09:22:42.000000000 -0600
+++ b/heartbeat/pgsql	2010-06-25 09:22:29.000000000 -0600
@@ -22,20 +22,19 @@
 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
+    if [ -n "$OCF_RESKEY_config" ]; then
         config=$OCF_RESKEY_config
+    else
+        config=$OCF_RESKEY_pgdata/postgresql.conf
     fi
 
     if [ ! -f "$config" ]; then
         ocf_log err "Cannot find configuration file $config"
-        exit $OCF_ERR_GENERIC
+        return
     fi
 
     perl_code="if (/^\s*$param_name[\s=]+\s*(.*)$/) {
@@ -44,8 +43,7 @@
        \$dir =~ s/^'(\S*)'/\$1/;
        print \$dir;}"
 
-    param_value=`cat $config | perl -ne "$perl_code"`
-    echo "$param_value"
+    perl -ne "$perl_code" < $config
 }
 
 # Defaults
@@ -74,8 +72,7 @@
 : ${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}}
+: ${OCF_RESKEY_socketdir=`get_pgsql_param unix_socket_directory`}
 
 usage() {
     cat <<EOF
_______________________________________________________
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