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