1#!/bin/sh 2# 3# Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. 4# 5# This file is part of the lvm2-cluster package. 6# 7# This copyrighted material is made available to anyone wishing to use, 8# modify, copy, or redistribute it subject to the terms and conditions 9# of the GNU General Public License v.2. 10# 11# You should have received a copy of the GNU General Public License 12# along with this program; if not, write to the Free Software Foundation, 13# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 14 15# 16# Edit an lvm.conf file to adjust various properties 17# 18 19function usage 20{ 21 echo "usage: $0 <command>" 22 echo "" 23 echo "Commands:" 24 echo "Enable clvm: --enable-cluster [--lockinglibdir <dir>] [--lockinglib <lib>]" 25 echo "Disable clvm: --disable-cluster" 26 echo "Set locking library: --lockinglibdir <dir> [--lockinglib <lib>]" 27 echo "" 28 echo "Global options:" 29 echo "Config file location: --file <configfile>" 30 echo "" 31} 32 33 34function parse_args 35{ 36 while [ -n "$1" ]; do 37 case $1 in 38 --enable-cluster) 39 LOCKING_TYPE=2 40 shift 41 ;; 42 --disable-cluster) 43 LOCKING_TYPE=1 44 shift 45 ;; 46 --lockinglibdir) 47 if [ -n "$2" ]; then 48 LOCKINGLIBDIR=$2 49 shift 2 50 else 51 usage 52 exit 1 53 fi 54 ;; 55 --lockinglib) 56 if [ -n "$2" ]; then 57 LOCKINGLIB=$2 58 shift 2 59 else 60 usage 61 exit 1 62 fi 63 ;; 64 --file) 65 if [ -n "$2" ]; then 66 CONFIGFILE=$2 67 shift 2 68 else 69 usage 70 exit 1 71 fi 72 ;; 73 *) 74 usage 75 exit 1 76 esac 77 done 78} 79 80function validate_args 81{ 82 [ -z "$CONFIGFILE" ] && CONFIGFILE="/etc/lvm/lvm.conf" 83 84 if [ ! -f "$CONFIGFILE" ] 85 then 86 echo "$CONFIGFILE does not exist" 87 exit 10 88 fi 89 90 if [ -z "$LOCKING_TYPE" ] && [ -z "$LOCKINGLIBDIR" ]; then 91 usage 92 exit 1 93 fi 94 95 if [ -n "$LOCKINGLIBDIR" ]; then 96 97 [ -z "$LOCKINGLIB" ] && LOCKINGLIB="liblvm2clusterlock.so" 98 99 if [ "${LOCKINGLIBDIR:0:1}" != "/" ] 100 then 101 echo "Prefix must be an absolute path name (starting with a /)" 102 exit 12 103 fi 104 105 if [ ! -f "$LOCKINGLIBDIR/$LOCKINGLIB" ] 106 then 107 echo "$LOCKINGLIBDIR/$LOCKINGLIB does not exist, did you do a \"make install\" ?" 108 exit 11 109 fi 110 111 fi 112 113 if [ "$LOCKING_TYPE" = "1" ] && [ -n "$LOCKINGLIBDIR" -o -n "$LOCKINGLIB" ]; then 114 echo "Superfluous locking lib parameter, ignoring" 115 fi 116} 117 118umask 0077 119 120parse_args "$@" 121 122validate_args 123 124 125SCRIPTFILE=/etc/lvm/.lvmconf-script.tmp 126TMPFILE=/etc/lvm/.lvmconf-tmp.tmp 127 128 129# Flags so we know which parts of the file we can replace and which need 130# adding. These are return codes from grep, so zero means it IS present! 131have_type=1 132have_dir=1 133have_library=1 134have_global=1 135 136grep -q '^[[:blank:]]*locking_type[[:blank:]]*=' $CONFIGFILE 137have_type=$? 138 139grep -q '^[[:blank:]]*library_dir[[:blank:]]*=' $CONFIGFILE 140have_dir=$? 141 142grep -q '^[[:blank:]]*locking_library[[:blank:]]*=' $CONFIGFILE 143have_library=$? 144 145# Those options are in section "global {" so we must have one if any are present. 146if [ "$have_type" = "0" -o "$have_dir" = "0" -o "$have_library" = "0" ] 147then 148 149 # See if we can find it... 150 grep -q '^[[:blank:]]*global[[:blank:]]*{' $CONFIGFILE 151 have_global=$? 152 153 if [ "$have_global" = "1" ] 154 then 155 echo "global keys but no 'global {' found, can't edit file" 156 exit 13 157 fi 158fi 159 160if [ "$LOCKING_TYPE" = "2" ] && [ -z "$LOCKINGLIBDIR" ] && [ "$have_dir" = "1" ]; then 161 echo "no library_dir specified in $CONFIGFILE" 162 exit 16 163fi 164 165# So if we don't have "global {" we need to create one and 166# populate it 167 168if [ "$have_global" = "1" ] 169then 170 if [ -z "$LOCKING_TYPE" ]; then 171 LOCKING_TYPE=1 172 fi 173 if [ "$LOCKING_TYPE" = "2" ]; then 174 cat $CONFIGFILE - <<EOF > $TMPFILE 175global { 176 # Enable locking for cluster LVM 177 locking_type = $LOCKING_TYPE 178 library_dir = "$LOCKINGLIBDIR" 179 locking_library = "$LOCKINGLIB" 180} 181EOF 182 fi # if we aren't setting cluster locking, we don't need to create a global section 183 184 if [ $? != 0 ] 185 then 186 echo "failed to create temporary config file, $CONFIGFILE not updated" 187 exit 14 188 fi 189else 190 # 191 # We have a "global {" section, so add or replace the 192 # locking entries as appropriate 193 # 194 195 if [ -n "$LOCKING_TYPE" ]; then 196 if [ "$have_type" = "0" ] 197 then 198 SEDCMD=" s/^[[:blank:]]*locking_type[[:blank:]]*=.*/\ \ \ \ locking_type = $LOCKING_TYPE/g" 199 else 200 SEDCMD=" /global[[:blank:]]*{/a\ \ \ \ locking_type = $LOCKING_TYPE" 201 fi 202 fi 203 204 if [ -n "$LOCKINGLIBDIR" ]; then 205 if [ "$have_dir" = "0" ] 206 then 207 SEDCMD="${SEDCMD}\ns'^[[:blank:]]*library_dir[[:blank:]]*=.*'\ \ \ \ library_dir = \"$LOCKINGLIBDIR\"'g" 208 else 209 SEDCMD="${SEDCMD}\n/global[[:blank:]]*{/a\ \ \ \ library_dir = \"$LOCKINGLIBDIR\"" 210 fi 211 212 if [ "$have_library" = "0" ] 213 then 214 SEDCMD="${SEDCMD}\ns/^[[:blank:]]*locking_library[[:blank:]]*=.*/\ \ \ \ locking_library = \"$LOCKINGLIB\"/g" 215 else 216 SEDCMD="${SEDCMD}\n/global[[:blank:]]*{/a\ \ \ \ locking_library = \"$LOCKINGLIB\"" 217 fi 218 fi 219 220 if [ "$LOCKING_TYPE" = "1" ]; then 221 # if we're not using cluster locking, remove the library dir and locking library name 222 if [ "$have_dir" = "0" ] 223 then 224 SEDCMD="${SEDCMD}\n/^[[:blank:]]*library_dir[[:blank:]]*=.*/d" 225 fi 226 227 if [ "$have_library" = "0" ] 228 then 229 SEDCMD="${SEDCMD}\n/^[[:blank:]]*locking_library[[:blank:]]*=.*/d" 230 fi 231 fi 232 233 echo -e $SEDCMD > $SCRIPTFILE 234 sed <$CONFIGFILE >$TMPFILE -f $SCRIPTFILE 235 if [ $? != 0 ] 236 then 237 echo "sed failed, $CONFIGFILE not updated" 238 exit 15 239 fi 240fi 241 242# Now we have a suitably editted config file in a temp place, 243# backup the original and copy our new one into place. 244 245cp $CONFIGFILE $CONFIGFILE.lvmconfold 246if [ $? != 0 ] 247 then 248 echo "failed to backup old config file, $CONFIGFILE not updated" 249 exit 2 250fi 251 252cp $TMPFILE $CONFIGFILE 253if [ $? != 0 ] 254 then 255 echo "failed to copy new config file into place, check $CONFIGFILE is still OK" 256 exit 3 257fi 258 259rm -f $SCRIPTFILE $TMPFILE 260