File: iscsi-base.sh

package info (click to toggle)
partman-iscsi 76
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 828 kB
  • sloc: sh: 356; makefile: 2
file content (206 lines) | stat: -rw-r--r-- 6,198 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
. /usr/share/debconf/confmodule

iscsi_login () {
	local portal discovery targets target
	local state=0
	while :; do
		case $state in
		    0)
			# Ask for target address.
			db_input critical partman-iscsi/login/address || true
			;;

		    1)
			# Validate target address.
			db_get partman-iscsi/login/address
			if [ -z "$RET" ]; then
				state=0
				continue
			fi

			portal="$RET"
			if [ "${portal%:*}" = "$portal" ]; then
				portal="$portal:3260"
			fi

			# Ask for initiator username.
			db_subst partman-iscsi/login/username PORTAL "$portal"
			db_input critical partman-iscsi/login/username || true
			;;

		    2)
			db_get partman-iscsi/login/username
			if [ "$RET" ]; then
				# Ask for initiator password.
				db_subst partman-iscsi/login/password PORTAL "$portal"
				db_input critical partman-iscsi/login/password || true
			fi
			;;

		    3)
			db_get partman-iscsi/login/username
			if [ "$RET" ]; then
				# Validate initiator password.
				db_get partman-iscsi/login/password
				if [ -z "$RET" ]; then
					db_capb align
					db_input critical partman-iscsi/login/empty_password || true
					db_go || true
					db_capb backup align
					state=2
					continue
				fi

				# Ask for target username.
				db_subst partman-iscsi/login/incoming_username PORTAL "$portal"
				db_input critical partman-iscsi/login/incoming_username || true
			fi
			;;

		    4)
			db_get partman-iscsi/login/username
			if [ "$RET" ]; then
				db_get partman-iscsi/login/incoming_username
				if [ "$RET" ]; then
					# Ask for target password.
					db_subst partman-iscsi/login/incoming_password PORTAL "$portal"
					db_input critical partman-iscsi/login/incoming_password || true
				fi
			fi
			;;

		    5)
			db_get partman-iscsi/login/username
			if [ "$RET" ]; then
				db_get partman-iscsi/login/incoming_username
				if [ "$RET" ]; then
					# Validate target password.
					db_get partman-iscsi/login/incoming_password
					if [ -z "$RET" ]; then
						db_capb align
						db_input critical partman-iscsi/login/empty_password || true
						db_go || true
						db_capb backup align
						state=4
						continue
					fi
				fi
			fi
			;;

		    6)
			# Set up discovery authentication. We have to do a
			# spurious no-op sendtargets in order to create the
			# discovery record.
			iscsiadm -m discovery --type sendtargets --portal "$portal" >/dev/null 2>&1 || true
			db_get partman-iscsi/login/username
			if [ "$RET" ]; then
				iscsiadm -m discovery --portal "$portal" -o update -n discovery.sendtargets.auth.authmethod -v CHAP
				iscsiadm -m discovery --portal "$portal" -o update -n discovery.sendtargets.auth.username -v "$RET"
				db_get partman-iscsi/login/password
				iscsiadm -m discovery --portal "$portal" -o update -n discovery.sendtargets.auth.password -v "$RET"
				db_get partman-iscsi/login/incoming_username
				if [ "$RET" ]; then
					iscsiadm -m discovery --portal "$portal" -o update -n discovery.sendtargets.auth.username_in -v "$RET"
					db_get partman-iscsi/login/incoming_password
					iscsiadm -m discovery --portal "$portal" -o update -n discovery.sendtargets.auth.password_in -v "$RET"
				else
					iscsiadm -m discovery --portal "$portal" -o update -n discovery.sendtargets.auth.username_in -v ''
				fi
			else
				iscsiadm -m discovery --portal "$portal" -o update -n discovery.sendtargets.auth.authmethod -v None
			fi

			# Discover targets.
			if ! discovery="$(iscsiadm -m discovery --type sendtargets \
						   --portal "$portal")"; then
				db_capb align
				db_subst partman-iscsi/login/no_targets \
					PORTAL "$portal"
				db_input critical partman-iscsi/login/no_targets || true
				db_go || true
				db_capb backup align
				state=0
				continue
			fi

			# Ask for targets.
			targets="$(echo "$discovery" | sort -t' ' -k2 -u | \
				while read portal target; do
					printf ', %s' "$(echo "$target" | sed 's/,/\\,/g')"
				done | sed 's/^, //')"
			db_subst partman-iscsi/login/targets PORTAL "$portal"
			db_subst partman-iscsi/login/targets TARGETS "$targets"
			if db_get partman-iscsi/login/all_targets && \
			   [ "$RET" = true ]; then
				db_set partman-iscsi/login/targets "$targets"
			else
				db_input critical partman-iscsi/login/targets || true
			fi
			;;

		    7)
			# Log into targets.
			db_get partman-iscsi/login/targets
			targets="$RET"
			while [ "$targets" ]; do
				target="${targets%%, *}"

				# Set up node authentication.
				iscsiadm -m node --portal "$portal" --target "$target" -o new >/dev/null 2>&1 || true
				db_get partman-iscsi/login/username
				if [ "$RET" ]; then
					iscsiadm -m node --portal "$portal" --target "$target" -o update -n node.session.auth.authmethod -v CHAP
					iscsiadm -m node --portal "$portal" --target "$target" -o update -n node.session.auth.username -v "$RET"
					db_get partman-iscsi/login/password
					iscsiadm -m node --portal "$portal" --target "$target" -o update -n node.session.auth.password -v "$RET"
					db_get partman-iscsi/login/incoming_username
					if [ "$RET" ]; then
						iscsiadm -m node --portal "$portal" --target "$target" -o update -n node.session.auth.username_in -v "$RET"
						db_get partman-iscsi/login/incoming_password
						iscsiadm -m node --portal "$portal" --target "$target" -o update -n node.session.auth.password_in -v "$RET"
					fi
				else
					iscsiadm -m node --portal "$portal" --target "$target" -o update -n node.session.auth.authmethod -v None
				fi

				if ! iscsiadm -m node --portal "$portal" \
					      --target "$target" --login; then
					db_capb align
					db_subst partman-iscsi/login/failed \
						PORTAL "$portal"
					db_subst partman-iscsi/login/failed \
						TARGET "$target"
					db_input critical partman-iscsi/login/failed || true
					db_go || true
					db_capb backup align
				fi

				if [ "$target" = "$targets" ]; then
					targets=
				else
					targets="${targets#*, }"
				fi
			done

			# Clear passwords from the database.
			db_set partman-iscsi/login/password ''
			db_set partman-iscsi/login/incoming_password ''
			;;

		    *)
			break
			;;
		esac

		if db_go; then
			state=$(($state + 1))
		else
			state=$(($state - 1))
		fi
	done

	if [ "$state" = -1 ]; then
		return 1
	fi
}