1*4882a593SmuzhiyunFrom eb5a36e6e0caedf06008e48eb77b7bf7c6534ee5 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Changqing Li <changqing.li@windriver.com>
3*4882a593SmuzhiyunDate: Mon, 26 Nov 2018 09:55:12 +0800
4*4882a593SmuzhiyunSubject: [PATCH] From 0000000000000000000000000000000000000000 Mon Sep 17
5*4882a593Smuzhiyun 00:00:00 2001 From: Benjamin Marzinski <bmarzins@redhat.com> Date: Thu, 16
6*4882a593Smuzhiyun Oct 2014 15:49:01 -0500 Subject: [PATCH] RH: add mpathconf
7*4882a593Smuzhiyun
8*4882a593Smuzhiyunmpathconf is a program (largely based on lvmcomf) to help users
9*4882a593Smuzhiyunconfigure /etc/multipath.conf and enable or disable multipathing.  It
10*4882a593Smuzhiyunhas a couple of built-in options that can be set directly from the
11*4882a593Smuzhiyuncommand line.  But, mostly it is used to get a multipath.conf file
12*4882a593Smuzhiyunwith the OS defaults, and to enable and disable multipathing via
13*4882a593Smuzhiyuna single command.
14*4882a593Smuzhiyun
15*4882a593SmuzhiyunSigned-off-by: Benjamin Marzinski <bmarzins@redhat.com>
16*4882a593Smuzhiyun
17*4882a593SmuzhiyunUpstream-Status: Pending
18*4882a593Smuzhiyun
19*4882a593Smuzhiyunupdate this patch to new version
20*4882a593Smuzhiyun
21*4882a593SmuzhiyunSigned-off-by: Changqing Li <changqing.li@windriver.com>
22*4882a593Smuzhiyun---
23*4882a593Smuzhiyun libmultipath/config.c |   1 +
24*4882a593Smuzhiyun multipath/Makefile    |   5 +
25*4882a593Smuzhiyun multipath/mpathconf   | 464 ++++++++++++++++++++++++++++++++++++++++++++++++++
26*4882a593Smuzhiyun multipath/mpathconf.8 | 101 +++++++++++
27*4882a593Smuzhiyun 4 files changed, 571 insertions(+)
28*4882a593Smuzhiyun create mode 100644 multipath/mpathconf
29*4882a593Smuzhiyun create mode 100644 multipath/mpathconf.8
30*4882a593Smuzhiyun
31*4882a593Smuzhiyundiff --git a/libmultipath/config.c b/libmultipath/config.c
32*4882a593Smuzhiyunindex e4233f1..b779505 100644
33*4882a593Smuzhiyun--- a/libmultipath/config.c
34*4882a593Smuzhiyun+++ b/libmultipath/config.c
35*4882a593Smuzhiyun@@ -747,6 +747,7 @@ load_config (char * file)
36*4882a593Smuzhiyun 		factorize_hwtable(conf->hwtable, builtin_hwtable_size, file);
37*4882a593Smuzhiyun 	} else {
38*4882a593Smuzhiyun 		condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices.");
39*4882a593Smuzhiyun+		condlog(0, "You can run /sbin/mpathconf to create or modify /etc/multipath.conf");
40*4882a593Smuzhiyun 		if (conf->blist_devnode == NULL) {
41*4882a593Smuzhiyun 			conf->blist_devnode = vector_alloc();
42*4882a593Smuzhiyun 			if (!conf->blist_devnode) {
43*4882a593Smuzhiyundiff --git a/multipath/Makefile b/multipath/Makefile
44*4882a593Smuzhiyunindex b9bbb3c..e720c7f 100644
45*4882a593Smuzhiyun--- a/multipath/Makefile
46*4882a593Smuzhiyun+++ b/multipath/Makefile
47*4882a593Smuzhiyun@@ -18,10 +18,12 @@ $(EXEC): $(OBJS) $(multipathdir)/libmultipath.so $(mpathcmddir)/libmpathcmd.so
48*4882a593Smuzhiyun 	$(CC) $(CFLAGS) $(OBJS) -o $(EXEC) $(LDFLAGS) $(LIBDEPS)
49*4882a593Smuzhiyun 	$(GZIP) $(EXEC).8 > $(EXEC).8.gz
50*4882a593Smuzhiyun 	$(GZIP) $(EXEC).conf.5 > $(EXEC).conf.5.gz
51*4882a593Smuzhiyun+	$(GZIP) mpathconf.8 > mpathconf.8.gz
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun install:
54*4882a593Smuzhiyun 	$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
55*4882a593Smuzhiyun 	$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
56*4882a593Smuzhiyun+	$(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
57*4882a593Smuzhiyun 	$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir)
58*4882a593Smuzhiyun 	$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir)
59*4882a593Smuzhiyun 	$(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
60*4882a593Smuzhiyun@@ -29,13 +31,16 @@ install:
61*4882a593Smuzhiyun 	$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(man8dir)
62*4882a593Smuzhiyun 	$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
63*4882a593Smuzhiyun 	$(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir)
64*4882a593Smuzhiyun+	$(INSTALL_PROGRAM) -m 644 mpathconf.8.gz $(DESTDIR)$(man8dir)
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun uninstall:
67*4882a593Smuzhiyun 	$(RM) $(DESTDIR)$(bindir)/$(EXEC)
68*4882a593Smuzhiyun 	$(RM) $(DESTDIR)$(udevrulesdir)/11-dm-mpath.rules
69*4882a593Smuzhiyun 	$(RM) $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
70*4882a593Smuzhiyun+	$(RM) $(DESTDIR)$(bindir)/mpathconf
71*4882a593Smuzhiyun 	$(RM) $(DESTDIR)$(man8dir)/$(EXEC).8.gz
72*4882a593Smuzhiyun 	$(RM) $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz
73*4882a593Smuzhiyun+	$(RM) $(DESTDIR)$(man8dir)/mpathconf.8.gz
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun clean: dep_clean
76*4882a593Smuzhiyun 	$(RM) core *.o $(EXEC) *.gz
77*4882a593Smuzhiyundiff --git a/multipath/mpathconf b/multipath/mpathconf
78*4882a593Smuzhiyunnew file mode 100644
79*4882a593Smuzhiyunindex 0000000..e839134
80*4882a593Smuzhiyun--- /dev/null
81*4882a593Smuzhiyun+++ b/multipath/mpathconf
82*4882a593Smuzhiyun@@ -0,0 +1,464 @@
83*4882a593Smuzhiyun+#!/bin/bash
84*4882a593Smuzhiyun+#
85*4882a593Smuzhiyun+# Copyright (C) 2010 Red Hat, Inc. All rights reserved.
86*4882a593Smuzhiyun+#
87*4882a593Smuzhiyun+# This file is part of the device-mapper-multipath package.
88*4882a593Smuzhiyun+#
89*4882a593Smuzhiyun+# This copyrighted material is made available to anyone wishing to use,
90*4882a593Smuzhiyun+# modify, copy, or redistribute it subject to the terms and conditions
91*4882a593Smuzhiyun+# of the GNU General Public License v.2.
92*4882a593Smuzhiyun+#
93*4882a593Smuzhiyun+# You should have received a copy of the GNU General Public License
94*4882a593Smuzhiyun+# along with this program; if not, write to the Free Software Foundation,
95*4882a593Smuzhiyun+# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
96*4882a593Smuzhiyun+
97*4882a593Smuzhiyun+#
98*4882a593Smuzhiyun+# Simple editting of /etc/multipath.conf
99*4882a593Smuzhiyun+# This program was largely ripped off from lvmconf
100*4882a593Smuzhiyun+#
101*4882a593Smuzhiyun+
102*4882a593Smuzhiyun+unset ENABLE FIND FRIENDLY MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST
103*4882a593Smuzhiyun+
104*4882a593Smuzhiyun+DEFAULT_CONFIG="# device-mapper-multipath configuration file
105*4882a593Smuzhiyun+
106*4882a593Smuzhiyun+# For a complete list of the default configuration values, run either:
107*4882a593Smuzhiyun+# # multipath -t
108*4882a593Smuzhiyun+# or
109*4882a593Smuzhiyun+# # multipathd show config
110*4882a593Smuzhiyun+
111*4882a593Smuzhiyun+# For a list of configuration options with descriptions, see the
112*4882a593Smuzhiyun+# multipath.conf man page.
113*4882a593Smuzhiyun+
114*4882a593Smuzhiyun+defaults {
115*4882a593Smuzhiyun+	user_friendly_names yes
116*4882a593Smuzhiyun+	find_multipaths yes
117*4882a593Smuzhiyun+}
118*4882a593Smuzhiyun+
119*4882a593Smuzhiyun+blacklist_exceptions {
120*4882a593Smuzhiyun+        property \"(SCSI_IDENT_|ID_WWN)\"
121*4882a593Smuzhiyun+}"
122*4882a593Smuzhiyun+
123*4882a593Smuzhiyun+CONFIGFILE="/etc/multipath.conf"
124*4882a593Smuzhiyun+OUTPUTFILE="/etc/multipath.conf"
125*4882a593Smuzhiyun+MULTIPATHDIR="/etc/multipath"
126*4882a593Smuzhiyun+TMPFILE="/etc/multipath/.multipath.conf.tmp"
127*4882a593Smuzhiyun+WWIDS=0
128*4882a593Smuzhiyun+
129*4882a593Smuzhiyun+function usage
130*4882a593Smuzhiyun+{
131*4882a593Smuzhiyun+	echo "usage: $0 <command>"
132*4882a593Smuzhiyun+	echo ""
133*4882a593Smuzhiyun+	echo "Commands:"
134*4882a593Smuzhiyun+	echo "Enable: --enable "
135*4882a593Smuzhiyun+	echo "Disable: --disable"
136*4882a593Smuzhiyun+	echo "Only allow certain wwids (instead of enable): --allow <WWID>"
137*4882a593Smuzhiyun+	echo "Set user_friendly_names (Default y): --user_friendly_names <y|n>"
138*4882a593Smuzhiyun+	echo "Set find_multipaths (Default y): --find_multipaths <y|n>"
139*4882a593Smuzhiyun+	echo "Load the dm-multipath modules on enable (Default y): --with_module <y|n>"
140*4882a593Smuzhiyun+	echo "start/stop/reload multipathd (Default n): --with_multipathd <y|n>"
141*4882a593Smuzhiyun+	echo "select output file (Default /etc/multipath.conf): --outfile <FILE>"
142*4882a593Smuzhiyun+	echo ""
143*4882a593Smuzhiyun+}
144*4882a593Smuzhiyun+
145*4882a593Smuzhiyun+function add_wwid
146*4882a593Smuzhiyun+{
147*4882a593Smuzhiyun+	INDEX=0
148*4882a593Smuzhiyun+	while [ "$INDEX" -lt "$WWIDS" ] ; do
149*4882a593Smuzhiyun+		if [ "$1" = "${WWID_LIST[$INDEX]}" ] ; then
150*4882a593Smuzhiyun+			return
151*4882a593Smuzhiyun+		fi
152*4882a593Smuzhiyun+		((INDEX++))
153*4882a593Smuzhiyun+	done
154*4882a593Smuzhiyun+	WWID_LIST[$WWIDS]="$1"
155*4882a593Smuzhiyun+	((WWIDS++))
156*4882a593Smuzhiyun+}
157*4882a593Smuzhiyun+
158*4882a593Smuzhiyun+function get_dm_deps
159*4882a593Smuzhiyun+{
160*4882a593Smuzhiyun+	shift 3
161*4882a593Smuzhiyun+	while [ -n "$1" -a -n "$2" ]; do
162*4882a593Smuzhiyun+		MAJOR=$(echo $1 | tr -d '(,')
163*4882a593Smuzhiyun+		MINOR=$(echo $2 | tr -d ')')
164*4882a593Smuzhiyun+		UUID=`dmsetup info -c --noheadings -o uuid -j $MAJOR -m $MINOR  2> /dev/null`
165*4882a593Smuzhiyun+		if [ -n "$UUID" ] ; then
166*4882a593Smuzhiyun+			set_dm_wwid $UUID
167*4882a593Smuzhiyun+		fi
168*4882a593Smuzhiyun+		shift 2
169*4882a593Smuzhiyun+	done
170*4882a593Smuzhiyun+}
171*4882a593Smuzhiyun+
172*4882a593Smuzhiyun+function set_dm_wwid
173*4882a593Smuzhiyun+{
174*4882a593Smuzhiyun+	if [[ "$1" =~ ^part[[:digit:]]+-mpath- ]] ; then
175*4882a593Smuzhiyun+		add_wwid "${1##part*-mpath-}"
176*4882a593Smuzhiyun+	elif [[ "$1" =~ ^mpath- ]] ; then
177*4882a593Smuzhiyun+		add_wwid "${1##mpath-}"
178*4882a593Smuzhiyun+	else
179*4882a593Smuzhiyun+		get_dm_deps `dmsetup deps -u $1`
180*4882a593Smuzhiyun+	fi
181*4882a593Smuzhiyun+}
182*4882a593Smuzhiyun+
183*4882a593Smuzhiyun+function set_wwid
184*4882a593Smuzhiyun+{
185*4882a593Smuzhiyun+	UUID=""
186*4882a593Smuzhiyun+	if [[ "$1" =~ ^[[:digit:]]+:[[:digit:]]+$ ]] ; then
187*4882a593Smuzhiyun+		MAJOR=${1%%:*}
188*4882a593Smuzhiyun+		MINOR=${1##*:}
189*4882a593Smuzhiyun+		UUID=`dmsetup info -c --noheadings -o uuid -j $MAJOR -m $MINOR  2> /dev/null`
190*4882a593Smuzhiyun+	else
191*4882a593Smuzhiyun+		UUID=`dmsetup info -c --noheadings -o uuid $1 2> /dev/null`
192*4882a593Smuzhiyun+	fi
193*4882a593Smuzhiyun+	if [ -n "$UUID" ] ; then
194*4882a593Smuzhiyun+		set_dm_wwid $UUID
195*4882a593Smuzhiyun+	else
196*4882a593Smuzhiyun+		add_wwid "$1"
197*4882a593Smuzhiyun+	fi
198*4882a593Smuzhiyun+}
199*4882a593Smuzhiyun+
200*4882a593Smuzhiyun+function parse_args
201*4882a593Smuzhiyun+{
202*4882a593Smuzhiyun+	while [ -n "$1" ]; do
203*4882a593Smuzhiyun+		case $1 in
204*4882a593Smuzhiyun+			--enable)
205*4882a593Smuzhiyun+				ENABLE=1
206*4882a593Smuzhiyun+				shift
207*4882a593Smuzhiyun+				;;
208*4882a593Smuzhiyun+			--disable)
209*4882a593Smuzhiyun+				ENABLE=0
210*4882a593Smuzhiyun+				shift
211*4882a593Smuzhiyun+				;;
212*4882a593Smuzhiyun+			--allow)
213*4882a593Smuzhiyun+				ENABLE=2
214*4882a593Smuzhiyun+				if [ -n "$2" ]; then
215*4882a593Smuzhiyun+					set_wwid $2
216*4882a593Smuzhiyun+					shift 2
217*4882a593Smuzhiyun+				else
218*4882a593Smuzhiyun+					usage
219*4882a593Smuzhiyun+					exit 1
220*4882a593Smuzhiyun+				fi
221*4882a593Smuzhiyun+				;;
222*4882a593Smuzhiyun+			--user_friendly_names)
223*4882a593Smuzhiyun+				if [ -n "$2" ]; then
224*4882a593Smuzhiyun+					FRIENDLY=$2
225*4882a593Smuzhiyun+					shift 2
226*4882a593Smuzhiyun+				else
227*4882a593Smuzhiyun+					usage
228*4882a593Smuzhiyun+					exit 1
229*4882a593Smuzhiyun+				fi
230*4882a593Smuzhiyun+				;;
231*4882a593Smuzhiyun+			--find_multipaths)
232*4882a593Smuzhiyun+				if [ -n "$2" ]; then
233*4882a593Smuzhiyun+					FIND=$2
234*4882a593Smuzhiyun+					shift 2
235*4882a593Smuzhiyun+				else
236*4882a593Smuzhiyun+					usage
237*4882a593Smuzhiyun+					exit 1
238*4882a593Smuzhiyun+				fi
239*4882a593Smuzhiyun+				;;
240*4882a593Smuzhiyun+			--with_module)
241*4882a593Smuzhiyun+				if [ -n "$2" ]; then
242*4882a593Smuzhiyun+					MODULE=$2
243*4882a593Smuzhiyun+					shift 2
244*4882a593Smuzhiyun+				else
245*4882a593Smuzhiyun+					usage
246*4882a593Smuzhiyun+					exit 1
247*4882a593Smuzhiyun+				fi
248*4882a593Smuzhiyun+				;;
249*4882a593Smuzhiyun+			--with_multipathd)
250*4882a593Smuzhiyun+				if [ -n "$2" ]; then
251*4882a593Smuzhiyun+					MULTIPATHD=$2
252*4882a593Smuzhiyun+					shift 2
253*4882a593Smuzhiyun+				else
254*4882a593Smuzhiyun+					usage
255*4882a593Smuzhiyun+					exit 1
256*4882a593Smuzhiyun+				fi
257*4882a593Smuzhiyun+				;;
258*4882a593Smuzhiyun+			--outfile)
259*4882a593Smuzhiyun+				if [ -n "$2" ]; then
260*4882a593Smuzhiyun+					OUTPUTFILE=$2
261*4882a593Smuzhiyun+					HAVE_OUTFILE=1
262*4882a593Smuzhiyun+					shift 2
263*4882a593Smuzhiyun+				else
264*4882a593Smuzhiyun+					usage
265*4882a593Smuzhiyun+					exit 1
266*4882a593Smuzhiyun+				fi
267*4882a593Smuzhiyun+				;;
268*4882a593Smuzhiyun+			*)
269*4882a593Smuzhiyun+				usage
270*4882a593Smuzhiyun+				exit
271*4882a593Smuzhiyun+		esac
272*4882a593Smuzhiyun+	done
273*4882a593Smuzhiyun+}
274*4882a593Smuzhiyun+
275*4882a593Smuzhiyun+function validate_args
276*4882a593Smuzhiyun+{
277*4882a593Smuzhiyun+	if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$MODULE" ]; then
278*4882a593Smuzhiyun+		echo "ignoring extra parameters on disable"
279*4882a593Smuzhiyun+		FRIENDLY=""
280*4882a593Smuzhiyun+		FIND=""
281*4882a593Smuzhiyun+		MODULE=""
282*4882a593Smuzhiyun+	fi
283*4882a593Smuzhiyun+	if [ -n "$FRIENDLY" ] && [ "$FRIENDLY" != "y" -a "$FRIENDLY" != "n" ]; then
284*4882a593Smuzhiyun+		echo "--user_friendly_names must be either 'y' or 'n'"
285*4882a593Smuzhiyun+		exit 1
286*4882a593Smuzhiyun+	fi
287*4882a593Smuzhiyun+	if [ -n "$FIND" ] && [ "$FIND" != "y" -a "$FIND" != "n" ]; then
288*4882a593Smuzhiyun+		echo "--find_multipaths must be either 'y' or 'n'"
289*4882a593Smuzhiyun+		exit 1
290*4882a593Smuzhiyun+	fi
291*4882a593Smuzhiyun+	if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" ]; then
292*4882a593Smuzhiyun+		SHOW_STATUS=1
293*4882a593Smuzhiyun+	fi
294*4882a593Smuzhiyun+	if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then
295*4882a593Smuzhiyun+		echo "--with_module must be either 'y' or 'n'"
296*4882a593Smuzhiyun+		exit 1
297*4882a593Smuzhiyun+	fi
298*4882a593Smuzhiyun+	if [ -n "$MULTIPATHD" ] && [ "$MULTIPATHD" != "y" -a "$MULTIPATHD" != "n" ]; then
299*4882a593Smuzhiyun+		echo "--with_multipathd must be either 'y' or 'n'"
300*4882a593Smuzhiyun+		exit 1
301*4882a593Smuzhiyun+	fi
302*4882a593Smuzhiyun+	if [ "$ENABLE" = 2 -a -z "$HAVE_OUTFILE" ]; then
303*4882a593Smuzhiyun+		echo "Because --allow makes changes that cannot be automatically reversed,"
304*4882a593Smuzhiyun+		echo "you must set --outfile when you set --allow"
305*4882a593Smuzhiyun+		exit 1
306*4882a593Smuzhiyun+	fi
307*4882a593Smuzhiyun+}
308*4882a593Smuzhiyun+
309*4882a593Smuzhiyun+function add_blacklist_exceptions
310*4882a593Smuzhiyun+{
311*4882a593Smuzhiyun+	INDEX=0
312*4882a593Smuzhiyun+	while [ "$INDEX" -lt "$WWIDS" ] ; do
313*4882a593Smuzhiyun+		sed -i '/^blacklist_exceptions[[:space:]]*{/ a\
314*4882a593Smuzhiyun+	wwid '"\"${WWID_LIST[$INDEX]}\""'
315*4882a593Smuzhiyun+' $TMPFILE
316*4882a593Smuzhiyun+		((INDEX++))
317*4882a593Smuzhiyun+	done
318*4882a593Smuzhiyun+}
319*4882a593Smuzhiyun+
320*4882a593Smuzhiyun+umask 0077
321*4882a593Smuzhiyun+
322*4882a593Smuzhiyun+parse_args "$@"
323*4882a593Smuzhiyun+
324*4882a593Smuzhiyun+validate_args
325*4882a593Smuzhiyun+
326*4882a593Smuzhiyun+if [ ! -d "$MULTIPATHDIR" ]; then
327*4882a593Smuzhiyun+	echo "/etc/multipath/ does not exist. failing"
328*4882a593Smuzhiyun+	exit 1
329*4882a593Smuzhiyun+fi
330*4882a593Smuzhiyun+
331*4882a593Smuzhiyun+rm $TMPFILE 2> /dev/null
332*4882a593Smuzhiyun+echo "$DEFAULT_CONFIG" > $TMPFILE
333*4882a593Smuzhiyun+if [ -f "$CONFIGFILE" ]; then
334*4882a593Smuzhiyun+	cp $CONFIGFILE $TMPFILE
335*4882a593Smuzhiyun+fi
336*4882a593Smuzhiyun+
337*4882a593Smuzhiyun+if grep -q "^blacklist[[:space:]]*{" $TMPFILE ; then
338*4882a593Smuzhiyun+	HAVE_BLACKLIST=1
339*4882a593Smuzhiyun+fi
340*4882a593Smuzhiyun+
341*4882a593Smuzhiyun+if grep -q "^blacklist_exceptions[[:space:]]*{" $TMPFILE ; then
342*4882a593Smuzhiyun+	HAVE_EXCEPTIONS=1
343*4882a593Smuzhiyun+fi
344*4882a593Smuzhiyun+
345*4882a593Smuzhiyun+if grep -q "^defaults[[:space:]]*{" $TMPFILE ; then
346*4882a593Smuzhiyun+	HAVE_DEFAULTS=1
347*4882a593Smuzhiyun+fi
348*4882a593Smuzhiyun+
349*4882a593Smuzhiyun+if [ -z "$MODULE" -o "$MODULE" = "y" ]; then
350*4882a593Smuzhiyun+	if lsmod | grep -q "dm_multipath" ; then
351*4882a593Smuzhiyun+		HAVE_MODULE=1
352*4882a593Smuzhiyun+	else
353*4882a593Smuzhiyun+		HAVE_MODULE=0
354*4882a593Smuzhiyun+	fi
355*4882a593Smuzhiyun+fi
356*4882a593Smuzhiyun+
357*4882a593Smuzhiyun+if [ "$MULTIPATHD" = "y" ]; then
358*4882a593Smuzhiyun+	if /bin/systemctl status multipathd.service > /dev/null 2>&1 ; then
359*4882a593Smuzhiyun+		HAVE_MULTIPATHD=1
360*4882a593Smuzhiyun+	else
361*4882a593Smuzhiyun+		HAVE_MULTIPATHD=0
362*4882a593Smuzhiyun+	fi
363*4882a593Smuzhiyun+fi
364*4882a593Smuzhiyun+
365*4882a593Smuzhiyun+if [ "$HAVE_BLACKLIST" = "1" ]; then
366*4882a593Smuzhiyun+	if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*devnode \"\.\?\*\"" ; then
367*4882a593Smuzhiyun+		HAVE_DISABLE=1
368*4882a593Smuzhiyun+	elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*devnode \"\.\?\*\"" ; then
369*4882a593Smuzhiyun+		HAVE_DISABLE=0
370*4882a593Smuzhiyun+	fi
371*4882a593Smuzhiyun+fi
372*4882a593Smuzhiyun+
373*4882a593Smuzhiyun+if [ "$HAVE_BLACKLIST" = "1" ]; then
374*4882a593Smuzhiyun+	if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*wwid \"\.\?\*\"" ; then
375*4882a593Smuzhiyun+		HAVE_WWID_DISABLE=1
376*4882a593Smuzhiyun+	elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*wwid \"\.\?\*\"" ; then
377*4882a593Smuzhiyun+		HAVE_WWID_DISABLE=0
378*4882a593Smuzhiyun+	fi
379*4882a593Smuzhiyun+fi
380*4882a593Smuzhiyun+
381*4882a593Smuzhiyun+if [ "$HAVE_DEFAULTS" = "1" ]; then
382*4882a593Smuzhiyun+	if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*find_multipaths[[:space:]]*\(yes\|1\)" ; then
383*4882a593Smuzhiyun+		HAVE_FIND=1
384*4882a593Smuzhiyun+	elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*find_multipaths[[:space:]]*\(no\|0\)" ; then
385*4882a593Smuzhiyun+		HAVE_FIND=0
386*4882a593Smuzhiyun+	fi
387*4882a593Smuzhiyun+	if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]]*\(yes\|1\)" ; then
388*4882a593Smuzhiyun+		HAVE_FRIENDLY=1
389*4882a593Smuzhiyun+	elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]]*\(no\|0\)" ; then
390*4882a593Smuzhiyun+		HAVE_FRIENDLY=0
391*4882a593Smuzhiyun+	fi
392*4882a593Smuzhiyun+fi
393*4882a593Smuzhiyun+
394*4882a593Smuzhiyun+if [ -n "$SHOW_STATUS" ]; then
395*4882a593Smuzhiyun+	if [ -z "$HAVE_DISABLE" -o "$HAVE_DISABLE" = 0 ]; then
396*4882a593Smuzhiyun+		echo "multipath is enabled"
397*4882a593Smuzhiyun+	else
398*4882a593Smuzhiyun+		echo "multipath is disabled"
399*4882a593Smuzhiyun+	fi
400*4882a593Smuzhiyun+	if [ -z "$HAVE_FIND"  -o "$HAVE_FIND" = 0 ]; then
401*4882a593Smuzhiyun+		echo "find_multipaths is disabled"
402*4882a593Smuzhiyun+	else
403*4882a593Smuzhiyun+		echo "find_multipaths is enabled"
404*4882a593Smuzhiyun+	fi
405*4882a593Smuzhiyun+	if [ -z "$HAVE_FRIENDLY" -o "$HAVE_FRIENDLY" = 0 ]; then
406*4882a593Smuzhiyun+		echo "user_friendly_names is disabled"
407*4882a593Smuzhiyun+	else
408*4882a593Smuzhiyun+		echo "user_friendly_names is enabled"
409*4882a593Smuzhiyun+	fi
410*4882a593Smuzhiyun+	if [ -n "$HAVE_MODULE" ]; then
411*4882a593Smuzhiyun+		if [ "$HAVE_MODULE" = 1 ]; then
412*4882a593Smuzhiyun+			echo "dm_multipath module is loaded"
413*4882a593Smuzhiyun+		else
414*4882a593Smuzhiyun+			echo "dm_multipath module is not loaded"
415*4882a593Smuzhiyun+		fi
416*4882a593Smuzhiyun+	fi
417*4882a593Smuzhiyun+	if [ -z "$HAVE_MULTIPATHD" ]; then
418*4882a593Smuzhiyun+		if /bin/systemctl status multipathd.service > /dev/null 2>&1 ; then
419*4882a593Smuzhiyun+			HAVE_MULTIPATHD=1
420*4882a593Smuzhiyun+		else
421*4882a593Smuzhiyun+			HAVE_MULTIPATHD=0
422*4882a593Smuzhiyun+		fi
423*4882a593Smuzhiyun+	fi
424*4882a593Smuzhiyun+	if [ "$HAVE_MULTIPATHD" = 1 ]; then
425*4882a593Smuzhiyun+		echo "multipathd is running"
426*4882a593Smuzhiyun+	else
427*4882a593Smuzhiyun+		echo "multipathd is not running"
428*4882a593Smuzhiyun+	fi
429*4882a593Smuzhiyun+	exit 0
430*4882a593Smuzhiyun+fi
431*4882a593Smuzhiyun+
432*4882a593Smuzhiyun+if [ -z "$HAVE_BLACKLIST" ]; then
433*4882a593Smuzhiyun+	cat >> $TMPFILE <<- _EOF_
434*4882a593Smuzhiyun+
435*4882a593Smuzhiyun+blacklist {
436*4882a593Smuzhiyun+}
437*4882a593Smuzhiyun+_EOF_
438*4882a593Smuzhiyun+fi
439*4882a593Smuzhiyun+
440*4882a593Smuzhiyun+if [ -z "$HAVE_DEFAULTS" ]; then
441*4882a593Smuzhiyun+	cat >> $TMPFILE <<- _EOF_
442*4882a593Smuzhiyun+
443*4882a593Smuzhiyun+defaults {
444*4882a593Smuzhiyun+}
445*4882a593Smuzhiyun+_EOF_
446*4882a593Smuzhiyun+fi
447*4882a593Smuzhiyun+
448*4882a593Smuzhiyun+if [ "$ENABLE" = 2 ]; then
449*4882a593Smuzhiyun+	if [ "$HAVE_DISABLE" = 1 ]; then
450*4882a593Smuzhiyun+		sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode \"\.\?\*\"/#	devnode ".*"/' $TMPFILE
451*4882a593Smuzhiyun+	fi
452*4882a593Smuzhiyun+	if [ -z "$HAVE_WWID_DISABLE" ]; then
453*4882a593Smuzhiyun+		sed -i '/^blacklist[[:space:]]*{/ a\
454*4882a593Smuzhiyun+	wwid ".*"
455*4882a593Smuzhiyun+' $TMPFILE
456*4882a593Smuzhiyun+	elif [ "$HAVE_WWID_DISABLE" = 0 ]; then
457*4882a593Smuzhiyun+		sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*wwid \"\.\?\*\"/	wwid ".*"/' $TMPFILE
458*4882a593Smuzhiyun+	fi
459*4882a593Smuzhiyun+	if [ "$HAVE_EXCEPTIONS" = 1 ]; then
460*4882a593Smuzhiyun+		sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ {/^[[:space:]]*wwid/ d}' $TMPFILE
461*4882a593Smuzhiyun+	else
462*4882a593Smuzhiyun+		cat >> $TMPFILE <<- _EOF_
463*4882a593Smuzhiyun+
464*4882a593Smuzhiyun+blacklist_exceptions {
465*4882a593Smuzhiyun+}
466*4882a593Smuzhiyun+_EOF_
467*4882a593Smuzhiyun+	fi
468*4882a593Smuzhiyun+	add_blacklist_exceptions
469*4882a593Smuzhiyun+elif [ "$ENABLE" = 1 ]; then
470*4882a593Smuzhiyun+	if [ "$HAVE_DISABLE" = 1 ]; then
471*4882a593Smuzhiyun+		sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode \"\.\?\*\"/#	devnode ".*"/' $TMPFILE
472*4882a593Smuzhiyun+	fi
473*4882a593Smuzhiyun+elif [ "$ENABLE" = 0 ]; then
474*4882a593Smuzhiyun+	if [ -z "$HAVE_DISABLE" ]; then
475*4882a593Smuzhiyun+		sed -i '/^blacklist[[:space:]]*{/ a\
476*4882a593Smuzhiyun+	devnode ".*"
477*4882a593Smuzhiyun+' $TMPFILE
478*4882a593Smuzhiyun+	elif [ "$HAVE_DISABLE" = 0 ]; then
479*4882a593Smuzhiyun+		sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*devnode \"\.\?\*\"/	devnode ".*"/' $TMPFILE
480*4882a593Smuzhiyun+	fi
481*4882a593Smuzhiyun+fi
482*4882a593Smuzhiyun+
483*4882a593Smuzhiyun+if [ "$FIND" = "n" ]; then
484*4882a593Smuzhiyun+	if [ "$HAVE_FIND" = 1 ]; then
485*4882a593Smuzhiyun+		sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*find_multipaths[[:space:]]*\(yes\|1\)/	find_multipaths no/' $TMPFILE
486*4882a593Smuzhiyun+		CHANGED_CONFIG=1
487*4882a593Smuzhiyun+	fi
488*4882a593Smuzhiyun+elif [ "$FIND" = "y" ]; then
489*4882a593Smuzhiyun+	if [ -z "$HAVE_FIND" ]; then
490*4882a593Smuzhiyun+		sed -i '/^defaults[[:space:]]*{/ a\
491*4882a593Smuzhiyun+	find_multipaths yes
492*4882a593Smuzhiyun+' $TMPFILE
493*4882a593Smuzhiyun+		CHANGED_CONFIG=1
494*4882a593Smuzhiyun+	elif [ "$HAVE_FIND" = 0 ]; then
495*4882a593Smuzhiyun+		sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*find_multipaths[[:space:]]*\(no\|0\)/	find_multipaths yes/' $TMPFILE
496*4882a593Smuzhiyun+		CHANGED_CONFIG=1
497*4882a593Smuzhiyun+	fi
498*4882a593Smuzhiyun+fi
499*4882a593Smuzhiyun+
500*4882a593Smuzhiyun+if [ "$FRIENDLY" = "n" ]; then
501*4882a593Smuzhiyun+	if [ "$HAVE_FRIENDLY" = 1 ]; then
502*4882a593Smuzhiyun+		sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]]*\(yes\|1\)/	user_friendly_names no/' $TMPFILE
503*4882a593Smuzhiyun+		CHANGED_CONFIG=1
504*4882a593Smuzhiyun+	fi
505*4882a593Smuzhiyun+elif [ "$FRIENDLY" = "y" ]; then
506*4882a593Smuzhiyun+	if [ -z "$HAVE_FRIENDLY" ]; then
507*4882a593Smuzhiyun+		sed -i '/^defaults[[:space:]]*{/ a\
508*4882a593Smuzhiyun+	user_friendly_names yes
509*4882a593Smuzhiyun+' $TMPFILE
510*4882a593Smuzhiyun+		CHANGED_CONFIG=1
511*4882a593Smuzhiyun+	elif [ "$HAVE_FRIENDLY" = 0 ]; then
512*4882a593Smuzhiyun+		sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]]*\(no\|0\)/	user_friendly_names yes/' $TMPFILE
513*4882a593Smuzhiyun+		CHANGED_CONFIG=1
514*4882a593Smuzhiyun+	fi
515*4882a593Smuzhiyun+fi
516*4882a593Smuzhiyun+
517*4882a593Smuzhiyun+if [ -f "$OUTPUTFILE" ]; then
518*4882a593Smuzhiyun+	cp $OUTPUTFILE $OUTPUTFILE.old
519*4882a593Smuzhiyun+	if [ $? != 0 ]; then
520*4882a593Smuzhiyun+		echo "failed to backup old config file, $OUTPUTFILE not updated"
521*4882a593Smuzhiyun+		exit 1
522*4882a593Smuzhiyun+	fi
523*4882a593Smuzhiyun+fi
524*4882a593Smuzhiyun+
525*4882a593Smuzhiyun+cp $TMPFILE $OUTPUTFILE
526*4882a593Smuzhiyun+if [ $? != 0 ]; then
527*4882a593Smuzhiyun+	echo "failed to copy new config file into place, check $OUTPUTFILE is still OK"
528*4882a593Smuzhiyun+	exit 1
529*4882a593Smuzhiyun+fi
530*4882a593Smuzhiyun+
531*4882a593Smuzhiyun+rm -f $TMPFILE
532*4882a593Smuzhiyun+
533*4882a593Smuzhiyun+if [ "$ENABLE" = 1 ]; then
534*4882a593Smuzhiyun+	if [ "$HAVE_MODULE" = 0 ]; then
535*4882a593Smuzhiyun+		modprobe dm_multipath
536*4882a593Smuzhiyun+	fi
537*4882a593Smuzhiyun+	if [ "$HAVE_MULTIPATHD" = 0 ]; then
538*4882a593Smuzhiyun+		systemctl start multipathd.service
539*4882a593Smuzhiyun+	fi
540*4882a593Smuzhiyun+elif [ "$ENABLE" = 0 ]; then
541*4882a593Smuzhiyun+	if [ "$HAVE_MULTIPATHD" = 1 ]; then
542*4882a593Smuzhiyun+		systemctl stop multipathd.service
543*4882a593Smuzhiyun+	fi
544*4882a593Smuzhiyun+elif [ -n "$CHANGED_CONFIG" -a "$HAVE_MULTIPATHD" = 1 ]; then
545*4882a593Smuzhiyun+	systemctl reload multipathd.service
546*4882a593Smuzhiyun+fi
547*4882a593Smuzhiyundiff --git a/multipath/mpathconf.8 b/multipath/mpathconf.8
548*4882a593Smuzhiyunnew file mode 100644
549*4882a593Smuzhiyunindex 0000000..4cd3267
550*4882a593Smuzhiyun--- /dev/null
551*4882a593Smuzhiyun+++ b/multipath/mpathconf.8
552*4882a593Smuzhiyun@@ -0,0 +1,101 @@
553*4882a593Smuzhiyun+.TH MPATHCONF 8 "June 2010" "" "Linux Administrator's Manual"
554*4882a593Smuzhiyun+.SH NAME
555*4882a593Smuzhiyun+mpathconf - A tool for configuring device-mapper-multipath
556*4882a593Smuzhiyun+.SH SYNOPSIS
557*4882a593Smuzhiyun+.B mpathconf
558*4882a593Smuzhiyun+.RB [\| commands \|]
559*4882a593Smuzhiyun+.RB [\| options \|]
560*4882a593Smuzhiyun+.SH DESCRIPTION
561*4882a593Smuzhiyun+.B mpathconf
562*4882a593Smuzhiyun+is a utility that creates or modifies
563*4882a593Smuzhiyun+.B /etc/multipath.conf.
564*4882a593Smuzhiyun+It can enable or disable multipathing and configure some common options.
565*4882a593Smuzhiyun+.B mpathconf
566*4882a593Smuzhiyun+can also load the
567*4882a593Smuzhiyun+.B dm_multipath
568*4882a593Smuzhiyun+module, start and stop the
569*4882a593Smuzhiyun+.B multipathd
570*4882a593Smuzhiyun+daemon, and configure the
571*4882a593Smuzhiyun+.B multipathd
572*4882a593Smuzhiyun+service to start automatically or not. If
573*4882a593Smuzhiyun+.B mpathconf
574*4882a593Smuzhiyun+is called with no commands, it will display the current configuration.
575*4882a593Smuzhiyun+
576*4882a593Smuzhiyun+The default options for mpathconf are
577*4882a593Smuzhiyun+.B --with_module
578*4882a593Smuzhiyun+The
579*4882a593Smuzhiyun+.B --with_multipathd
580*4882a593Smuzhiyun+option is not set by default.  Enabling multipathing will load the
581*4882a593Smuzhiyun+.B dm_multipath
582*4882a593Smuzhiyun+module but it will not immediately start it. This is so
583*4882a593Smuzhiyun+that users can manually edit their config file if necessary, before starting
584*4882a593Smuzhiyun+.B multipathd.
585*4882a593Smuzhiyun+
586*4882a593Smuzhiyun+If
587*4882a593Smuzhiyun+.B /etc/multipath.conf
588*4882a593Smuzhiyun+already exists, mpathconf will edit it. If it does not exist, mpathconf will
589*4882a593Smuzhiyun+create a default file with
590*4882a593Smuzhiyun+.B user_friendly_names
591*4882a593Smuzhiyun+and
592*4882a593Smuzhiyun+.B find_multipaths
593*4882a593Smuzhiyun+set. To disable these, use the
594*4882a593Smuzhiyun+.B --user_friendly_names n
595*4882a593Smuzhiyun+and
596*4882a593Smuzhiyun+.B --find_multipaths n
597*4882a593Smuzhiyun+options
598*4882a593Smuzhiyun+.SH COMMANDS
599*4882a593Smuzhiyun+.TP
600*4882a593Smuzhiyun+.B --enable
601*4882a593Smuzhiyun+Removes any line that blacklists all device nodes from the
602*4882a593Smuzhiyun+.B /etc/multipath.conf
603*4882a593Smuzhiyun+blacklist section.
604*4882a593Smuzhiyun+.TP
605*4882a593Smuzhiyun+.B --disable
606*4882a593Smuzhiyun+Adds a line that blacklists all device nodes to the
607*4882a593Smuzhiyun+.B /etc/multipath.conf
608*4882a593Smuzhiyun+blacklist section. If no blacklist section exists, it will create one.
609*4882a593Smuzhiyun+.TP
610*4882a593Smuzhiyun+.B --user_friendly_name \fP { \fBy\fP | \fBn\fP }
611*4882a593Smuzhiyun+If set to \fBy\fP, this adds the line
612*4882a593Smuzhiyun+.B user_friendly_names yes
613*4882a593Smuzhiyun+to the
614*4882a593Smuzhiyun+.B /etc/multipath.conf
615*4882a593Smuzhiyun+defaults section. If set to \fBn\fP, this removes the line, if present. This
616*4882a593Smuzhiyun+command can be used along with any other command.
617*4882a593Smuzhiyun+.TP
618*4882a593Smuzhiyun+.B --find_multipaths\fP { \fBy\fP | \fBn\fP }
619*4882a593Smuzhiyun+If set to \fBy\fP, this adds the line
620*4882a593Smuzhiyun+.B find_multipaths yes
621*4882a593Smuzhiyun+to the
622*4882a593Smuzhiyun+.B /etc/multipath.conf
623*4882a593Smuzhiyun+defaults section. If set to \fBn\fP, this removes the line, if present. This
624*4882a593Smuzhiyun+command can be used aldong with any other command.
625*4882a593Smuzhiyun+.SH OPTIONS
626*4882a593Smuzhiyun+.TP
627*4882a593Smuzhiyun+.B --with_module\fP { \fBy\fP | \fBn\fP }
628*4882a593Smuzhiyun+If set to \fBy\fP, this runs
629*4882a593Smuzhiyun+.B modprobe dm_multipath
630*4882a593Smuzhiyun+to install the multipath modules. This option only works with the
631*4882a593Smuzhiyun+.B --enable
632*4882a593Smuzhiyun+command. This option is set to \fBy\fP by default.
633*4882a593Smuzhiyun+.TP
634*4882a593Smuzhiyun+.B --with_multipathd { \fBy\fP | \fBn\fP }
635*4882a593Smuzhiyun+If set to \fBy\fP, this runs
636*4882a593Smuzhiyun+.B service multipathd start
637*4882a593Smuzhiyun+to start the multipathd daemon on \fB--enable\fP,
638*4882a593Smuzhiyun+.B service multipathd stop
639*4882a593Smuzhiyun+to stop the multipathd daemon on \fB--disable\fP, and
640*4882a593Smuzhiyun+.B service multipathd reload
641*4882a593Smuzhiyun+to reconfigure multipathd on \fB--user_frindly_names\fP and
642*4882a593Smuzhiyun+\fB--find_multipaths\fP.
643*4882a593Smuzhiyun+This option is set to \fBn\fP by default.
644*4882a593Smuzhiyun+.SH FILES
645*4882a593Smuzhiyun+.BR /etc/multipath.conf
646*4882a593Smuzhiyun+.SH "SEE ALSO"
647*4882a593Smuzhiyun+.BR multipath.conf (5),
648*4882a593Smuzhiyun+.BR modprobe (8),
649*4882a593Smuzhiyun+.BR multipath (8),
650*4882a593Smuzhiyun+.BR multipathd (8),
651*4882a593Smuzhiyun+.BR service (8),
652*4882a593Smuzhiyun+.SH AUTHOR
653*4882a593Smuzhiyun+Benjamin Marzinski <bmarzins@redhat.com>
654*4882a593Smuzhiyun--
655*4882a593Smuzhiyun2.7.4
656*4882a593Smuzhiyun
657