2010-05-14 15:33:20 +04:00
#!/bin/bash
2005-06-10 21:11:48 +04:00
#
2009-11-27 17:32:16 +03:00
# Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved.
2005-08-17 00:38:33 +04:00
#
2010-05-20 15:20:35 +04:00
# This file is part of the lvm2 package.
2005-06-10 21:11:48 +04:00
#
2005-08-17 00:38:33 +04:00
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
2005-06-10 21:11:48 +04:00
#
2005-08-17 00:38:33 +04:00
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Edit an lvm.conf file to adjust various properties
2005-06-10 21:11:48 +04:00
#
function usage
{
echo " usage: $0 <command> "
echo ""
echo "Commands:"
2006-09-20 21:36:47 +04:00
echo "Enable clvm: --enable-cluster [--lockinglibdir <dir>] [--lockinglib <lib>]"
2005-06-10 21:11:48 +04:00
echo "Disable clvm: --disable-cluster"
2006-09-20 21:36:47 +04:00
echo "Set locking library: --lockinglibdir <dir> [--lockinglib <lib>]"
2005-06-10 21:11:48 +04:00
echo ""
echo "Global options:"
echo "Config file location: --file <configfile>"
echo ""
}
function parse_args
{
while [ -n " $1 " ] ; do
case $1 in
--enable-cluster)
2009-11-27 17:32:16 +03:00
LOCKING_TYPE = 3
2005-06-10 21:11:48 +04:00
shift
; ;
--disable-cluster)
LOCKING_TYPE = 1
shift
; ;
--lockinglibdir)
if [ -n " $2 " ] ; then
LOCKINGLIBDIR = $2
shift 2
else
usage
exit 1
fi
; ;
--lockinglib)
if [ -n " $2 " ] ; then
LOCKINGLIB = $2
shift 2
else
usage
exit 1
fi
; ;
--file)
if [ -n " $2 " ] ; then
CONFIGFILE = $2
shift 2
else
usage
exit 1
fi
; ;
*)
usage
exit 1
esac
done
}
function validate_args
{
[ -z " $CONFIGFILE " ] && CONFIGFILE = "/etc/lvm/lvm.conf"
if [ ! -f " $CONFIGFILE " ]
then
echo " $CONFIGFILE does not exist "
exit 10
fi
2006-09-20 21:36:47 +04:00
if [ -z " $LOCKING_TYPE " ] && [ -z " $LOCKINGLIBDIR " ] ; then
2005-06-10 21:11:48 +04:00
usage
exit 1
fi
2006-09-20 21:36:47 +04:00
if [ -n " $LOCKINGLIBDIR " ] ; then
2005-06-10 21:11:48 +04:00
if [ " ${ LOCKINGLIBDIR : 0 : 1 } " != "/" ]
then
echo "Prefix must be an absolute path name (starting with a /)"
exit 12
fi
2009-11-27 17:32:16 +03:00
if [ -n " $LOCKINGLIB " ] && [ ! -f " $LOCKINGLIBDIR / $LOCKINGLIB " ]
2005-06-10 21:11:48 +04:00
then
echo " $LOCKINGLIBDIR / $LOCKINGLIB does not exist, did you do a \"make install\" ? "
exit 11
fi
2009-11-27 17:32:16 +03:00
2005-06-10 21:11:48 +04:00
fi
2006-09-20 21:36:47 +04:00
if [ " $LOCKING_TYPE " = "1" ] && [ -n " $LOCKINGLIBDIR " -o -n " $LOCKINGLIB " ] ; then
echo "Superfluous locking lib parameter, ignoring"
fi
2005-06-10 21:11:48 +04:00
}
2005-06-10 23:10:45 +04:00
umask 0077
2005-06-10 21:11:48 +04:00
parse_args " $@ "
validate_args
2005-06-10 23:10:45 +04:00
SCRIPTFILE = /etc/lvm/.lvmconf-script.tmp
TMPFILE = /etc/lvm/.lvmconf-tmp.tmp
2005-06-10 21:11:48 +04:00
# Flags so we know which parts of the file we can replace and which need
# adding. These are return codes from grep, so zero means it IS present!
have_type = 1
have_dir = 1
have_library = 1
have_global = 1
grep -q '^[[:blank:]]*locking_type[[:blank:]]*=' $CONFIGFILE
have_type = $?
grep -q '^[[:blank:]]*library_dir[[:blank:]]*=' $CONFIGFILE
have_dir = $?
grep -q '^[[:blank:]]*locking_library[[:blank:]]*=' $CONFIGFILE
have_library = $?
# Those options are in section "global {" so we must have one if any are present.
if [ " $have_type " = "0" -o " $have_dir " = "0" -o " $have_library " = "0" ]
then
# See if we can find it...
grep -q '^[[:blank:]]*global[[:blank:]]*{' $CONFIGFILE
have_global = $?
2009-11-27 17:32:16 +03:00
2005-06-10 21:11:48 +04:00
if [ " $have_global " = "1" ]
then
echo "global keys but no 'global {' found, can't edit file"
2005-08-17 00:38:33 +04:00
exit 13
2005-06-10 21:11:48 +04:00
fi
fi
2006-09-20 21:36:47 +04:00
if [ " $LOCKING_TYPE " = "2" ] && [ -z " $LOCKINGLIBDIR " ] && [ " $have_dir " = "1" ] ; then
echo " no library_dir specified in $CONFIGFILE "
exit 16
fi
2005-06-10 21:11:48 +04:00
# So if we don't have "global {" we need to create one and
# populate it
if [ " $have_global " = "1" ]
then
2006-09-20 21:36:47 +04:00
if [ -z " $LOCKING_TYPE " ] ; then
LOCKING_TYPE = 1
fi
2009-11-27 17:32:16 +03:00
if [ " $LOCKING_TYPE " = "3" ] || [ " $LOCKING_TYPE " = "2" ] ; then
2005-06-10 21:11:48 +04:00
cat $CONFIGFILE - <<EOF > $TMPFILE
global {
# Enable locking for cluster LVM
locking_type = $LOCKING_TYPE
library_dir = " $LOCKINGLIBDIR "
2009-11-27 17:32:16 +03:00
EOF
if [ $? != 0 ]
then
echo " failed to create temporary config file, $CONFIGFILE not updated "
exit 14
fi
if [ -n " $LOCKINGLIB " ] ; then
cat - <<EOF >> $TMPFILE
2005-06-10 21:11:48 +04:00
locking_library = " $LOCKINGLIB "
2009-11-27 17:32:16 +03:00
EOF
if [ $? != 0 ]
then
echo " failed to create temporary config file, $CONFIGFILE not updated "
exit 16
fi
fi
cat - <<EOF >> $TMPFILE
2005-06-10 21:11:48 +04:00
}
EOF
fi # if we aren't setting cluster locking, we don't need to create a global section
if [ $? != 0 ]
then
echo " failed to create temporary config file, $CONFIGFILE not updated "
2009-11-27 17:32:16 +03:00
exit 17
2005-06-10 21:11:48 +04:00
fi
else
#
# We have a "global {" section, so add or replace the
# locking entries as appropriate
#
2006-09-20 21:36:47 +04:00
if [ -n " $LOCKING_TYPE " ] ; then
if [ " $have_type " = "0" ]
then
SEDCMD = " s/^[[:blank:]]*locking_type[[:blank:]]*=.*/\ \ \ \ locking_type = $LOCKING_TYPE /g "
else
SEDCMD = " /global[[:blank:]]*{/a\ \ \ \ locking_type = $LOCKING_TYPE "
fi
2005-06-10 21:11:48 +04:00
fi
2009-11-27 17:32:16 +03:00
2006-09-20 21:36:47 +04:00
if [ -n " $LOCKINGLIBDIR " ] ; then
2005-06-10 21:11:48 +04:00
if [ " $have_dir " = "0" ]
then
SEDCMD = " ${ SEDCMD } \ns'^[[:blank:]]*library_dir[[:blank:]]*=.*'\ \ \ \ library_dir = \" $LOCKINGLIBDIR \"'g "
else
SEDCMD = " ${ SEDCMD } \n/global[[:blank:]]*{/a\ \ \ \ library_dir = \" $LOCKINGLIBDIR \" "
fi
2009-11-27 17:32:16 +03:00
fi
2005-06-10 21:11:48 +04:00
2009-11-27 17:32:16 +03:00
if [ -n " $LOCKINGLIB " ] ; then
if [ " $have_library " = "0" ]
2005-06-10 21:11:48 +04:00
then
SEDCMD = " ${ SEDCMD } \ns/^[[:blank:]]*locking_library[[:blank:]]*=.*/\ \ \ \ locking_library = \" $LOCKINGLIB \"/g "
else
SEDCMD = " ${ SEDCMD } \n/global[[:blank:]]*{/a\ \ \ \ locking_library = \" $LOCKINGLIB \" "
fi
2006-09-20 21:36:47 +04:00
fi
2005-06-10 21:11:48 +04:00
echo -e $SEDCMD > $SCRIPTFILE
sed <$CONFIGFILE >$TMPFILE -f $SCRIPTFILE
if [ $? != 0 ]
then
echo " sed failed, $CONFIGFILE not updated "
2005-08-17 00:38:33 +04:00
exit 15
2005-06-10 21:11:48 +04:00
fi
fi
# Now we have a suitably editted config file in a temp place,
# backup the original and copy our new one into place.
cp $CONFIGFILE $CONFIGFILE .lvmconfold
if [ $? != 0 ]
then
echo " failed to backup old config file, $CONFIGFILE not updated "
exit 2
fi
cp $TMPFILE $CONFIGFILE
if [ $? != 0 ]
then
echo " failed to copy new config file into place, check $CONFIGFILE is still OK "
exit 3
fi
rm -f $SCRIPTFILE $TMPFILE