xref: /netbsd-src/etc/rc.d/iscsid_volumes (revision 50379ee0d831743c5a14ca3039b7df967a1fd049)
1b526349cSmlelstv#!/bin/sh
2b526349cSmlelstv#
3*50379ee0Skre# $NetBSD: iscsid_volumes,v 1.5 2023/12/25 08:29:05 kre Exp $
4b526349cSmlelstv#
5b526349cSmlelstv
6b526349cSmlelstv# PROVIDE: iscsid_volumes
7b526349cSmlelstv# REQUIRE: iscsid
8b526349cSmlelstv# BEFORE:  securelevel mountcritremote
9b526349cSmlelstv
10b526349cSmlelstv$_rc_subr_loaded . /etc/rc.subr
11b526349cSmlelstv
12b526349cSmlelstvname="iscsid_volumes"
13b526349cSmlelstvrcvar=$name
14b526349cSmlelstvstart_cmd="iscsid_volumes_start"
15b526349cSmlelstvstop_cmd="iscsid_volumes_stop"
16b526349cSmlelstv
17b526349cSmlelstviscsid_volumes_start()
18b526349cSmlelstv{
19faf47f20Smartin	test -f /etc/iscsi/volumes || return 0
20b526349cSmlelstv
21b526349cSmlelstv	while read host target digest auth user alias; do
22b526349cSmlelstv		case $host in
23469d9aaeSmlelstv		\#*|"") ;;
24b526349cSmlelstv		*)
25b526349cSmlelstv			topts=''
26b526349cSmlelstv			case $digest in
27b526349cSmlelstv			*d*) topts="$topts -d";;
28b526349cSmlelstv			esac
29b526349cSmlelstv			case $digest in
30b526349cSmlelstv			*h*) topts="$topts -h";;
31b526349cSmlelstv			esac
32b526349cSmlelstv
33b526349cSmlelstv			pass="-"
34b526349cSmlelstv			mpass="-"
35b526349cSmlelstv
36469d9aaeSmlelstv			if [ -f /etc/iscsi/auths ]; then
37b526349cSmlelstv				while read entry dummy; do
38e6c0de62Smlelstv
39e6c0de62Smlelstv					case $entry in
40e6c0de62Smlelstv					*:chap:*|\
41e6c0de62Smlelstv					*:CHAP:*|\
42e6c0de62Smlelstv					*:none:*)
43e6c0de62Smlelstv						dummy=${entry#*:}
44e6c0de62Smlelstv						entry=${entry%%:*}:${dummy#*:}
45e6c0de62Smlelstv						;;
46e6c0de62Smlelstv					esac
47e6c0de62Smlelstv
48b526349cSmlelstv					case $entry in
49469d9aaeSmlelstv					\#*|"") ;;
50b526349cSmlelstv					"$user":*) pass=${entry#*:} ;;
51b526349cSmlelstv					"$target":*) mpass=${entry#*:} ;;
52b526349cSmlelstv					esac
53b526349cSmlelstv				done < /etc/iscsi/auths
54469d9aaeSmlelstv			fi
55b526349cSmlelstv
56b526349cSmlelstv			case $host in
57b526349cSmlelstv			*:*)
58b526349cSmlelstv				port=${host#*:}
59b526349cSmlelstv				host=${host%%:*}
60b526349cSmlelstv				;;
61b526349cSmlelstv			*)
62b526349cSmlelstv				port=3260
63b526349cSmlelstv				;;
64b526349cSmlelstv			esac
65b526349cSmlelstv
66b526349cSmlelstv			echo "Add target ${alias:-$target}"
67b526349cSmlelstv
68b526349cSmlelstv			out=$(/sbin/iscsictl add_target$topts \
69b526349cSmlelstv				-a "$host" \
70b526349cSmlelstv				-p "$port" \
71b526349cSmlelstv				-n "$target" \
72b526349cSmlelstv				-t "$auth" \
73b526349cSmlelstv				-u "$user" \
74b526349cSmlelstv				-s "$pass" \
75b526349cSmlelstv				-S "$mpass" \
76e6c0de62Smlelstv				${alias:+-N} ${alias:+"$alias"})
77b526349cSmlelstv			echo "$out"
78b526349cSmlelstv
79b526349cSmlelstv			case $out in
80b526349cSmlelstv			Added\ Target\ [1-9]*,\ Portal\ [1-9]*\ )
81b526349cSmlelstv				out=${out% }
82b526349cSmlelstv				portal=${out##* }
83b526349cSmlelstv				echo "Login $target via Portal $portal"
84b526349cSmlelstv				/sbin/iscsictl login -P "$portal"
85b526349cSmlelstv				;;
86b526349cSmlelstv			esac
87b526349cSmlelstv		esac
88b526349cSmlelstv	done < /etc/iscsi/volumes
89b526349cSmlelstv}
90b526349cSmlelstv
91b526349cSmlelstviscsid_volumes_stop()
92b526349cSmlelstv{
93faf47f20Smartin	test -f /etc/iscsi/volumes || return 0
94b526349cSmlelstv
95b526349cSmlelstv	while read host target digest auth user alias; do
96b526349cSmlelstv		case $host in
97469d9aaeSmlelstv		\#*|"") ;;
98b526349cSmlelstv		*)
99b526349cSmlelstv			echo "Remove target ${alias:-$target}"
100b526349cSmlelstv
101*50379ee0Skre			/sbin/iscsictl list_sessions |
102*50379ee0Skre			    while read key1 num key2 sesstarget; do
103*50379ee0Skre				if [ x"$key1" = x"Session" ] &&
104*50379ee0Skre				   [ x"$key2" = x"Target"  ] &&
105*50379ee0Skre				   [ x"$sesstarget" = x"$target" ]
106*50379ee0Skre				then
107*50379ee0Skre					/sbin/iscsictl logout -I "$num" |
108*50379ee0Skre					    grep -v '^OK$'
109b526349cSmlelstv				fi
110b526349cSmlelstv			done
111b526349cSmlelstv
112*50379ee0Skre			/sbin/iscsictl list_targets |
113*50379ee0Skre			    while read num talias ttarget; do
114b526349cSmlelstv				if [ x"$ttarget" = x"$target" ]; then
115b526349cSmlelstv					/sbin/iscsictl remove_target -I "$num"
116b526349cSmlelstv				fi
117b526349cSmlelstv			done
118b526349cSmlelstv			;;
119b526349cSmlelstv		esac
120b526349cSmlelstv	done < /etc/iscsi/volumes
121b526349cSmlelstv}
122b526349cSmlelstv
123b526349cSmlelstvload_rc_config $name
124b526349cSmlelstvrun_rc_command "$1"
125