xref: /netbsd-src/external/gpl2/lvm2/dist/scripts/lvmconf.sh (revision 56a34939419542e88b386b2229be7565f4f45461)
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