xref: /dragonfly/contrib/lvm2/dist/scripts/lvmconf.sh (revision 89a89091)
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