#!/bin/sh /etc/rc.common START=91 STOP=10 EXTRA_COMMANDS="show" EXTRA_HELP=" show Show current configuration of tgtd" NAME=tgt PROG=/usr/sbin/tgtd USE_PROCD=1 tgtadm="/usr/sbin/tgtadm --lld iscsi" handle_lun() { local tgt_lun=$1 local tgtid=$2 local ro device type bstype sync direct local my_tgtid=${tgt_lun%_*} local lun=${tgt_lun#*_} [ $my_tgtid -eq $tgtid ] || return 0 config_get device $1 device "" [ "$device" ] || return 1 config_get type $1 type disk config_get bstype $1 bstype rdwr config_get_bool readonly $1 readonly 0 config_get_bool sync $1 sync 0 config_get_bool direct $1 direct 0 if [ $sync -ne 0 -o $direct -ne 0 ]; then local bsoflags [ $sync -ne 0 ] && bsoflags="sync" [ $direct -ne 0 ] && bsoflags="direct" [ $sync -ne 0 -a $direct -ne 0 ] && bsoflags="sync:direct" bsoflags="--bsoflags $bsoflags" fi local _tgtadm="$tgtadm --mode logicalunit --tid $tgtid --lun $lun" $_tgtadm --op new --backing-store $device --device-type $type --bstype $bstype --bstype $bstype $bsoflags || return 1 $_tgtadm --op update --param readonly=$readonly || return 1 } handle_account() { local tgtid=$2 local _tgtadm="$tgtadm --mode account" local target user password outgoing config_get target $1 target "" [ "$target" ] || return 1 [ $target -eq $tgtid ] || return 0 config_get user $1 user "" [ "$user" ] || return 1 config_get password $1 password "" config_get_bool outgoing $1 outgoing 0 [ "$outgoing" -ne 0 ] && outgoing=--outgoing || outgoing="" $_tgtadm --op new --user "$user" --password "$password" || return 1 $_tgtadm --op bind --tid $tgtid --user "$user" $outgoing || return 1 } handle_target() { local tgtid=$1 local tgtname allow local _tgtadm="$tgtadm --mode target" [ $tgtid -ge 0 ] || return 1 config_get tgtname $1 name iqn.2012-06.org.openwrt config_get allow $1 allow ALL $_tgtadm --op new --tid $tgtid --targetname $tgtname || return 1 $_tgtadm --op bind --tid $tgtid -I $allow || return 1 config_foreach handle_lun lun $tgtid || return 1 config_foreach handle_account account $tgtid || return 1 } configure() { config_load $NAME $tgtadm --mode sys --op update --name State -v offline || return 1 config_foreach handle_target target || return 1 $tgtadm --mode sys --op update --name State -v ready || return 1 return 0 } start_service() { procd_open_instance procd_set_param command $PROG -f procd_set_param respawn procd_close_instance logger -t $NAME -s "Configuration will be loaded in seconds" ( sleep 5; configure || { stop_service; exit 1; } ) & } stop_service() { $tgtadm --mode sys --op update --name State -v offline $tgtadm --mode target --op show \ | awk '$1 == "Target" {sub(/:/,"",$2); print $2}' \ | xargs -n1 $tgtadm --mode target --op delete --force --tid $tgtadm --mode sys --op delete } show() { $tgtadm --mode target --op show }