| #!/bin/bash |
| # |
| # Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved. |
| # |
| # This file is part of the lvm2 package. |
| # |
| # 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. |
| # |
| # 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| |
| # |
| # Edit an lvm.conf file to adjust various properties |
| # |
| |
| # cluster with clvmd and/or locking lib? |
| HANDLE_CLUSTER=0 |
| |
| # cluster without clvmd? |
| HANDLE_HALVM=0 |
| |
| # also enable services appropriately (lvmetad, clvmd)? |
| HANDLE_SERVICES=0 |
| |
| # also enable cmirrord service in addition? |
| HANDLE_MIRROR_SERVICE=0 |
| |
| # also start/start services in addition to enabling/disabling them? |
| START_STOP_SERVICES=0 |
| |
| function usage |
| { |
| echo "Usage: $0 <command>" |
| echo "" |
| echo "Commands:" |
| echo "Enable clvm: --enable-cluster [--lockinglibdir <dir>] [--lockinglib <lib>]" |
| echo "Disable clvm: --disable-cluster" |
| echo "Enable halvm: --enable-halvm" |
| echo "Disable halvm: --disable-halvm" |
| echo "Set locking library: --lockinglibdir <dir> [--lockinglib <lib>]" |
| echo "" |
| echo "Global options:" |
| echo "Config file location: --file <configfile>" |
| echo "Set services: --services [--mirrorservice] [--startstopservices]" |
| echo "" |
| echo "Use the separate command 'lvmconfig' to display configuration information" |
| } |
| |
| function set_default_use_lvmetad_var |
| { |
| eval $(lvm dumpconfig --type default global/use_lvmetad 2>/dev/null) |
| if [ "$?" != "0" ]; then |
| USE_LVMETAD=0 |
| else |
| USE_LVMETAD=$use_lvmetad |
| fi |
| } |
| |
| function parse_args |
| { |
| while [ -n "$1" ]; do |
| case $1 in |
| --enable-cluster) |
| LOCKING_TYPE=3 |
| USE_LVMETAD=0 |
| HANDLE_CLUSTER=1 |
| shift |
| ;; |
| --disable-cluster) |
| LOCKING_TYPE=1 |
| set_default_use_lvmetad_var |
| HANDLE_CLUSTER=1 |
| shift |
| ;; |
| --enable-halvm) |
| LOCKING_TYPE=1 |
| USE_LVMETAD=0 |
| HANDLE_HALVM=1 |
| shift |
| ;; |
| --disable-halvm) |
| LOCKING_TYPE=1 |
| set_default_use_lvmetad_var |
| HANDLE_HALVM=1 |
| shift |
| ;; |
| --lockinglibdir) |
| if [ -n "$2" ]; then |
| LOCKINGLIBDIR=$2 |
| shift 2 |
| else |
| usage |
| exit 1 |
| fi |
| HANDLE_CLUSTER=1 |
| ;; |
| --lockinglib) |
| if [ -n "$2" ]; then |
| LOCKINGLIB=$2 |
| shift 2 |
| else |
| usage |
| exit 1 |
| fi |
| HANDLE_CLUSTER=1 |
| ;; |
| --file) |
| if [ -n "$2" ]; then |
| CONFIGFILE=$2 |
| shift 2 |
| else |
| usage |
| exit 1 |
| fi |
| ;; |
| --services) |
| HANDLE_SERVICES=1 |
| shift |
| ;; |
| --mirrorservice) |
| HANDLE_MIRROR_SERVICE=1 |
| shift |
| ;; |
| --startstopservices) |
| START_STOP_SERVICES=1 |
| shift |
| ;; |
| *) |
| usage |
| exit 1 |
| esac |
| done |
| |
| if [ "$LOCKINGLIBDIR" -o "$LOCKINGLIB" ]; then |
| LOCKING_TYPE=2 |
| USE_LVMETAD=0 |
| fi |
| } |
| |
| function validate_args |
| { |
| [ -z "$CONFIGFILE" ] && CONFIGFILE="/etc/lvm/lvm.conf" |
| |
| if [ ! -f "$CONFIGFILE" ] |
| then |
| echo "$CONFIGFILE does not exist" |
| exit 10 |
| fi |
| |
| if [ "$HANDLE_CLUSTER" = "1" -a "$HANDLE_HALVM" = "1" ]; then |
| echo "Either HA LVM or cluster method may be used at one time" |
| exit 18 |
| fi |
| |
| if [ "$HANDLE_SERVICES" = "0" ]; then |
| if [ "$HANDLE_MIRROR_SERVICE" = "1" ]; then |
| echo "--mirrorservice may be used only with --services" |
| exit 19 |
| fi |
| if [ "$START_STOP_SERVICES" = "1" ]; then |
| echo "--startstopservices may be used only with --services" |
| exit 19 |
| fi |
| fi |
| |
| if [ -z "$LOCKING_TYPE" ] && [ -z "$LOCKINGLIBDIR" ]; then |
| usage |
| exit 1 |
| fi |
| |
| if [ -n "$LOCKINGLIBDIR" ]; then |
| |
| if [ "${LOCKINGLIBDIR:0:1}" != "/" ] |
| then |
| echo "Prefix must be an absolute path name (starting with a /)" |
| exit 12 |
| fi |
| |
| if [ -n "$LOCKINGLIB" ] && [ ! -f "$LOCKINGLIBDIR/$LOCKINGLIB" ] |
| then |
| echo "$LOCKINGLIBDIR/$LOCKINGLIB does not exist, did you do a \"make install\" ?" |
| exit 11 |
| fi |
| |
| fi |
| |
| if [ "$LOCKING_TYPE" = "1" ] && [ -n "$LOCKINGLIBDIR" -o -n "$LOCKINGLIB" ]; then |
| echo "Superfluous locking lib parameter, ignoring" |
| fi |
| } |
| |
| umask 0077 |
| |
| parse_args "$@" |
| |
| validate_args |
| |
| |
| SCRIPTFILE=/etc/lvm/.lvmconf-script.tmp |
| TMPFILE=/etc/lvm/.lvmconf-tmp.tmp |
| |
| |
| # 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_use_lvmetad=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=$? |
| |
| grep -q '^[[:blank:]]*use_lvmetad[[:blank:]]*=' $CONFIGFILE |
| have_use_lvmetad=$? |
| |
| # 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" -o "$have_use_lvmetad" = "0" ] |
| then |
| |
| # See if we can find it... |
| grep -q '^[[:blank:]]*global[[:blank:]]*{' $CONFIGFILE |
| have_global=$? |
| |
| if [ "$have_global" = "1" ] |
| then |
| echo "global keys but no 'global {' found, can't edit file" |
| exit 13 |
| fi |
| fi |
| |
| if [ "$LOCKING_TYPE" = "2" ] && [ -z "$LOCKINGLIBDIR" ] && [ "$have_dir" = "1" ]; then |
| echo "no library_dir specified in $CONFIGFILE" |
| exit 16 |
| fi |
| |
| # So if we don't have "global {" we need to create one and |
| # populate it |
| |
| if [ "$have_global" = "1" ] |
| then |
| if [ -z "$LOCKING_TYPE" ]; then |
| LOCKING_TYPE=1 |
| fi |
| if [ "$LOCKING_TYPE" = "3" ] || [ "$LOCKING_TYPE" = "2" ]; then |
| cat $CONFIGFILE - <<EOF > $TMPFILE |
| global { |
| # Enable locking for cluster LVM |
| locking_type = $LOCKING_TYPE |
| library_dir = "$LOCKINGLIBDIR" |
| # Disable lvmetad in cluster |
| use_lvmetad = 0 |
| EOF |
| if [ $? != 0 ] |
| then |
| echo "failed to create temporary config file, $CONFIGFILE not updated" |
| exit 14 |
| fi |
| if [ -n "$LOCKINGLIB" ]; then |
| cat - <<EOF >> $TMPFILE |
| locking_library = "$LOCKINGLIB" |
| EOF |
| if [ $? != 0 ] |
| then |
| echo "failed to create temporary config file, $CONFIGFILE not updated" |
| exit 16 |
| fi |
| fi |
| cat - <<EOF >> $TMPFILE |
| } |
| 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" |
| exit 17 |
| fi |
| else |
| # |
| # We have a "global {" section, so add or replace the |
| # locking entries as appropriate |
| # |
| |
| 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 |
| fi |
| |
| if [ -n "$LOCKINGLIBDIR" ]; then |
| 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 |
| fi |
| |
| if [ -n "$LOCKINGLIB" ]; then |
| if [ "$have_library" = "0" ] |
| then |
| SEDCMD="${SEDCMD}\ns/^[[:blank:]]*locking_library[[:blank:]]*=.*/\ \ \ \ locking_library = \"$LOCKINGLIB\"/g" |
| else |
| SEDCMD="${SEDCMD}\n/global[[:blank:]]*{/a\ \ \ \ locking_library = \"$LOCKINGLIB\"" |
| fi |
| fi |
| |
| if [ "$have_use_lvmetad" = "0" ] |
| then |
| SEDCMD="${SEDCMD}\ns'^[[:blank:]]*use_lvmetad[[:blank:]]*=.*'\ \ \ \ use_lvmetad = $USE_LVMETAD'g" |
| else |
| SEDCMD="${SEDCMD}\n/global[[:blank:]]*{/a\ \ \ \ use_lvmetad = $USE_LVMETAD" |
| fi |
| |
| echo -e $SEDCMD > $SCRIPTFILE |
| sed <$CONFIGFILE >$TMPFILE -f $SCRIPTFILE |
| if [ $? != 0 ] |
| then |
| echo "sed failed, $CONFIGFILE not updated" |
| exit 15 |
| 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 |
| |
| function set_service { |
| local type="$1" |
| local action="$2" |
| shift 2 |
| |
| if [ "$type" = "systemd" ]; then |
| if [ "$action" = "activate" ]; then |
| for i in $@; do |
| eval $($SYSTEMCTL_BIN show $i -p LoadState) |
| test "$LoadState" = "loaded" || continue |
| $SYSTEMCTL_BIN enable $i |
| if [ "$START_STOP_SERVICES" = "1" ]; then |
| $SYSTEMCTL_BIN start $i |
| fi |
| done |
| elif [ "$action" = "deactivate" ]; then |
| for i in $@; do |
| eval $($SYSTEMCTL_BIN show $i -p LoadState) |
| test "$LoadState" = "loaded" || continue |
| $SYSTEMCTL_BIN disable $i |
| if [ "$START_STOP_SERVICES" = "1" ]; then |
| $SYSTEMCTL_BIN stop $i |
| fi |
| done |
| fi |
| elif [ "$type" = "sysv" ]; then |
| if [ "$action" = "activate" ]; then |
| for i in $@; do |
| $CHKCONFIG_BIN --list $i > /dev/null || continue |
| $CHKCONFIG_BIN $i on |
| if [ "$START_STOP_SERVICES" = "1" ]; then |
| $SERVICE_BIN $i start |
| fi |
| done |
| elif [ "$action" = "deactivate" ]; then |
| for i in $@; do |
| $CHKCONFIG_BIN --list $i > /dev/null || continue |
| if [ "$START_STOP_SERVICES" = "1" ]; then |
| $SERVICE_BIN $i stop |
| fi |
| $CHKCONFIG_BIN $i off |
| done |
| fi |
| fi |
| } |
| |
| # Start/stop and enable/disable services if needed. |
| |
| if [ "$HANDLE_SERVICES" == "1" ]; then |
| |
| SYSTEMCTL_BIN=$(which systemctl 2>/dev/null) |
| CHKCONFIG_BIN=$(which chkconfig 2>/dev/null) |
| SERVICE_BIN=$(which service 2>/dev/null) |
| |
| # Systemd services |
| if [ -n "$SYSTEMCTL_BIN" ]; then |
| if [ "$USE_LVMETAD" = "0" ]; then |
| set_service systemd deactivate lvm2-lvmetad.service lvm2-lvmetad.socket |
| else |
| set_service systemd activate lvm2-lvmetad.socket |
| fi |
| |
| if [ "$LOCKING_TYPE" = "3" ]; then |
| set_service systemd activate lvm2-cluster-activation.service |
| if [ "$HANDLE_MIRROR_SERVICE" = "1" ]; then |
| set_service activate lvm2-cmirrord.service |
| fi |
| else |
| set_service systemd deactivate lvm2-cluster-activation.service |
| if [ "$HANDLE_MIRROR_SERVICE" = "1" ]; then |
| set_service systemd deactivate lvm2-cmirrord.service |
| fi |
| fi |
| |
| # System V init scripts |
| elif [ -n "$SERVICE_BIN" -a -n "$CHKCONFIG_BIN" ]; then |
| if [ "$USE_LVMETAD" = "0" ]; then |
| set_service sysv deactivate lvm2-lvmetad |
| else |
| set_service sysv activate lvm2-lvmetad |
| fi |
| |
| if [ "$LOCKING_TYPE" = "3" ]; then |
| set_service sysv activate clvmd |
| if [ "$HANDLE_MIRROR_SERVICE" = "1" ]; then |
| set_service sysv activate cmirrord |
| fi |
| else |
| set_service sysv deactivate clvmd |
| if [ "$HANDLE_MIRROR_SERVICE" = "1" ]; then |
| set_service sysv deactivate cmirrord |
| fi |
| fi |
| |
| # None of the service tools found, error out |
| else |
| echo "Missing tools to handle services" |
| exit 20 |
| fi |
| fi |