1 #!/bin/sh /etc/rc.common
6 EXTRA_HELP
=" show Show current configuration of tgtd"
12 tgtadm
="/usr/sbin/tgtadm --lld iscsi"
13 logger
="logger -p daemon.err -s -t $NAME"
15 validate_lun_section
() {
16 uci_validate_section tgt lun
$1 \
17 'device:or(file, device)' \
18 'type:or("disk", "cd", "pt"):disk' \
19 'bstype:or("rdwr", "aio", "sg"):rdwr' \
22 'blocksize:uinteger' \
25 'product_rev:string' \
30 'sense_format:range(0, 1)' \
37 local readonly device
type bstype sync direct
38 local my_tgtid
=${tgt_lun%_*}
39 local lun
=${tgt_lun#*_}
41 [ $my_tgtid -eq $tgtid ] ||
return 0
43 validate_lun_section
$tgt_lun ||
{
44 $logger "Validation failed for LUN $tgt_lun"
48 $logger "Device is required for target $tgt_lun"
52 if [ $sync -ne 0 -o $direct -ne 0 ]; then
54 [ $sync -ne 0 ] && bsoflags
="sync"
55 [ $direct -ne 0 ] && bsoflags
="direct"
56 [ $sync -ne 0 -a $direct -ne 0 ] && bsoflags
="sync:direct"
57 bsoflags
="--bsoflags $bsoflags"
60 blocksize
=${blocksize+--blocksize=$blocksize}
62 for i
in mode_page product_id product_rev
readonly removable scsi_id scsi_sn sense_format vendor_id
; do
63 eval params
=\
${$i+$i=\$$i,}\
$params
66 local _tgtadm
="$tgtadm --mode logicalunit --tid $tgtid --lun $lun"
67 $_tgtadm --op new
--backing-store $device --device-type $type --bstype $bstype --bstype $bstype $bsoflags $blocksize ||
{
68 $logger "Failed to create lun $tgt_lun"
71 $_tgtadm --op update
--param $params ||
{
72 $logger "Failed to update lun $tgt_lun"
77 validate_account_section
() {
78 uci_validate_section tgt account
$1 \
79 'target:list(uinteger)' \
86 local _tgtadm
="$tgtadm --mode account"
87 local user password target outgoing
89 validate_account_section
$1 ||
{
90 $logger "Validation failed for account ${user:-$1}"
94 $logger "User is required for account $1. Run 'uci show tgt.$1' and check options"
98 $logger "Target is required for account $user"
102 $logger "Password is required for account $user"
105 $_tgtadm --op new
--user "$user" --password "$password" ||
{
106 $logger "Failed to create user $username"
111 bind_account_to_target
() {
112 local _tgtadm
="$tgtadm --mode account"
113 local tgtid
=$2 user password outgoing
115 validate_account_section
$1 ||
{
116 $logger "Validation failed for account ${user:-$1}"
120 [ "$outgoing" -ne 0 ] && outgoing
=--outgoing || outgoing
=""
123 [ "$t" -eq "$tgtid" ] && {
124 $_tgtadm --op bind --tid $tgtid --user "$user" $outgoing ||
{
125 $logger "Failed to bind user $username to target $tgtid"
133 validate_target_section
() {
134 uci_validate_section tgt target
$1 \
135 'name:string:iqn.2012-06.org.openwrt' \
136 'allow_address:list(string):ALL' \
137 'allow_name:list(string)'
142 local _tgtadm
="$tgtadm --mode target"
145 [ $tgtid -ge 0 ] ||
return 1
146 validate_target_section
$tgtid ||
{
147 $logger "Validation failed for target $tgtid"
150 $_tgtadm --op new
--tid $tgtid --targetname $name ||
{
151 $logger "Failed to create target $tgtid"
155 for i
in $allow_address; do
156 $_tgtadm --op bind --tid $tgtid --initiator-address $i ||
{
157 $logger "Failed to set allow $i to connect to target $tgtid"
161 for i
in $allow_name; do
162 $_tgtadm --op bind --tid $tgtid --initiator-name $i ||
{
163 $logger "Failed to set allow $i to connect to target $tgtid"
167 config_foreach handle_lun lun
$tgtid ||
return 1
168 config_foreach bind_account_to_target account
$tgtid ||
return 1
173 $tgtadm --mode sys
--op update
--name State
-v offline ||
{
174 $logger "Failed to set system state to Offline"
177 config_foreach handle_account account ||
return 1
178 config_foreach handle_target target ||
return 1
179 $tgtadm --mode sys
--op update
--name State
-v ready ||
{
180 $logger "Failed to set system state to Ready"
186 validate_tgt_section
() {
187 uci_validate_section tgt options
$1 \
188 'iothreads:uinteger' \
189 'portal:list(string)' \
190 'nop_interval:uinteger' \
195 local iothreads portal nop_interval nop_count
196 validate_tgt_section tgt ||
{
197 $logger "Validation failed for tgt options"
201 procd_set_param
command $PROG -f
202 [ "$iothreads" ] && procd_append_param
command -t $iothreads
203 [ "${portal}${nop_interval}${nop_count}" ] && {
205 for i
in nop_interval nop_count
; do
206 eval iscsi
=\
${$i+$i=\$$i,}\
$iscsi
209 iscsi
="portal=$i,$iscsi"
211 procd_append_param
command --iscsi $iscsi
213 procd_set_param respawn
215 logger
-p daemon.info
-t $NAME -s "Configuration will be loaded in seconds"
216 ( sleep 5; configure ||
{ stop_service
; exit 1; } ) &
220 $tgtadm --mode sys
--op update
--name State
-v offline ||
{
221 $logger "Failed to set system state to Offline"
224 $tgtadm --mode target
--op show \
225 |
awk '$1 == "Target" {sub(/:/,"",$2); print $2}' \
226 |
xargs -r -n1 $tgtadm --mode target
--op delete
--force --tid
227 $tgtadm --mode sys
--op delete
236 $tgtadm --mode target
--op show