xref: /illumos-gate/usr/src/cmd/iscsid/iscsi-initiator (revision 20a7641f9918de8574b8b3b47dbe35c4bfc78df1)
1#!/sbin/sh
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22
23#
24# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
25#
26
27#
28# Start/stop iscsi initiator service
29#
30. /lib/svc/share/smf_include.sh
31
32#	checkmessage "fsck_device | mount_point"
33#
34# Simple auxilary routine to the shell function checkfs. Prints out
35# instructions for a manual file system check before entering the shell.
36#
37checkmessage() {
38	echo "" > /dev/console
39	if [ "$1" != "" ] ; then
40		echo "WARNING - Unable to repair one or more \c" \
41			> /dev/console
42		echo "of the following filesystem(s):" > /dev/console
43		echo "\t$1" > /dev/console
44	else
45            	echo "WARNING - Unable to repair one or more filesystems." \
46			> /dev/console
47	fi
48        echo "Run fsck manually (fsck filesystem...)." > /dev/console
49	echo "" > /dev/console
50}
51
52#
53#	checkfs raw_device fstype mountpoint
54#
55# Check the file system specified. The return codes from fsck have the
56# following meanings.
57#	 0 - file system is unmounted and okay
58#	32 - file system is unmounted and needs checking (fsck -m only)
59#	33 - file system is already mounted
60#	34 - cannot stat device
61#	36 - uncorrectable errors detected - terminate normally (4.1 code 8)
62#	37 - a signal was caught during processing (4.1 exit 12)
63#	39 - uncorrectable errors detected - terminate rightaway (4.1 code 8)
64#	40 - for root, same as 0 (used by rcS to remount root)
65#
66checkfs() {
67        /usr/sbin/fsck -F $2 -m $1  >/dev/null 2>&1
68
69	if [ $? -ne 0 ]
70	then
71           	# Determine fsck options by file system type
72		case "$2" in
73		ufs)	foptions="-o p"
74                        ;;
75		*)	foptions="-y"
76                        ;;
77		esac
78
79		echo "The "$3" file system ("$1") is being checked."
80		/usr/sbin/fsck -F $2 ${foptions} $1
81
82       		case $? in
83		0|40)	# file system OK
84			;;
85
86		*)	# couldn't fix the file system
87			echo "/usr/sbin/fsck failed with exit code "$?"."
88                        checkmessage "$1"
89                        ;;
90		esac
91	fi
92}
93
94
95mount_iscsi() {
96	err=0
97	iscsilist=""
98        exec < /etc/vfstab
99	while  read special fsckdev mountp fstype fsckpass automnt mntopts; do
100		case $special in
101			'#'* | '' )	# Ignore comments, empty lines.
102					continue
103					;;
104		'-')		# Ignore "no-action" lines.
105					continue
106					;;
107		esac
108		if [ "$automnt" != "iscsi" ]; then
109			continue
110		fi
111		if [ "$fstype" = "-" ]; then
112			echo "iscsi-initiator: FSType of iscsi LUN \c" 1>&2
113			echo "$special cannot be identified" 1>&2
114			continue
115		fi
116
117		#
118		# Ignore entries already mounted
119		#
120		/usr/bin/grep "	$mountp	" /etc/mnttab >/dev/null \
121		2>&1 && continue
122
123		#
124		# Can't fsck if no fsckdev is specified
125		#
126		if [ "$fsckdev" = "-" ]; then
127			iscsilist="$iscsilist $mountp"
128			continue
129		fi
130
131		#
132		# fsck everything else:
133 		#
134	 	# fsck -m simply returns true if the filesystem is
135		# suitable for mounting.
136	 	#
137		/usr/sbin/fsck -m -F $fstype $fsckdev >/dev/null 2>&1
138		case $? in
139		0|40)	iscsilist="$iscsilist $mountp"
140			continue
141			;;
142		32)	checkfs $fsckdev $fstype $mountp
143			iscsilist="$iscsilist $mountp"
144			continue
145			;;
146		33)	# already mounted
147			echo "$special already mounted"
148			;;
149		34)	# bogus special device
150			echo "Cannot stat $fsckdev - ignoring"
151			err=1
152			;;
153		*)	# uncorrectable errors
154			echo "$fsckdev uncorrectable error"
155			err=1
156			;;
157		esac
158	done
159
160	[ -z "$iscsilist" ] || /sbin/mount -a $iscsilist
161	for iscsilun in $iscsilist
162	do
163		/usr/bin/grep "	$iscsilun	" /etc/mnttab >/dev/null 2>&1
164		if [ $? -ne 0 ]; then
165			echo "Fail to mount $iscsilun"
166			err=1
167		fi
168	done
169	return $err
170}
171
172umount_iscsi () {
173	#
174	# Generate iscsi mountp list from /etc/vfstab
175	exec < /etc/vfstab
176	while  read special fsckdev mountp fstype fsckpass automnt mntopts; do
177		case $special in
178			'#'* | '')      continue;;  # Ignore comments,
179						    # empty lines.
180			'-')            continue;;  # Ignore "no-action lines.
181		esac
182		if [ "$automnt" != "iscsi" ]; then
183			continue
184		fi
185		/usr/bin/grep "	$mountp	" /etc/mnttab >/dev/null 2>&1
186		if [ $? -ne 0 ]; then
187			continue
188		fi
189		iscsilist="$iscsilist $mountp"
190	done
191
192	if [ -n "$iscsilist" ]; then
193		umount -a $iscsilist 1>&2
194		rc=$?
195	else
196		rc=0;
197	fi
198	return $rc
199}
200
201case "$1" in
202'start')
203	/usr/bin/pgrep -P 1 -x iscsid
204	if [ $? -ne 0 ]; then
205		/lib/svc/method/iscsid
206	fi
207	if [ $? -eq 0 ]; then
208		delay=60
209		while [ $delay -gt 0 ]; do
210			delay=`expr $delay - 1`
211			mount_iscsi
212			if [ $? -eq 1 ]; then
213				if [ $delay -gt 0 ]; then
214					sleep 1
215					continue
216				else
217					echo "iscsi-initiator: mount iscsi \c"
218					echo "lun in /etc/vfstab fail."
219					umount_iscsi
220					exit $SMF_EXIT_ERR_CONFIG
221				fi
222			else
223				exit $SMF_EXIT_OK
224			fi
225		done
226	else
227		exit $?
228	fi
229	;;
230
231'stop')
232	umount_iscsi
233	/usr/bin/pkill -P 1 -x iscsid
234	exit 0
235	;;
236
237*)
238	echo "Usage: $0 { start | stop }"
239	exit 1
240	;;
241esac
242exit $SMF_EXIT_OK
243
244