Merge pull request #106 from shubham14bajpai/login

Add flag to disable login on multiple hosts
This commit is contained in:
Lei Xue
2021-07-01 18:31:44 +08:00
committed by GitHub
3 changed files with 45 additions and 16 deletions

View File

@@ -37,22 +37,24 @@ func newDaemonCommand(cli *client.Client) *cobra.Command {
var host string var host string
var driver string var driver string
var logLevel string var logLevel string
var blockMultipleHosts bool
var cmd = &cobra.Command{ var cmd = &cobra.Command{
Use: "daemon", Use: "daemon",
Short: "Setup a daemon", Short: "Setup a daemon",
Long: `Setup the Gotgt's daemon`, Long: `Setup the Gotgt's daemon`,
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
return createDaemon(host, driver, logLevel) return createDaemon(host, driver, logLevel, blockMultipleHosts)
}, },
} }
flags := cmd.Flags() flags := cmd.Flags()
flags.StringVar(&logLevel, "log", "info", "Log level of SCSI target daemon") flags.StringVar(&logLevel, "log", "info", "Log level of SCSI target daemon")
flags.StringVar(&host, "host", "tcp://127.0.0.1:23457", "Host for SCSI target daemon") flags.StringVar(&host, "host", "tcp://127.0.0.1:23457", "Host for SCSI target daemon")
flags.StringVar(&driver, "driver", "iscsi", "SCSI low level driver") flags.StringVar(&driver, "driver", "iscsi", "SCSI low level driver")
flags.BoolVar(&blockMultipleHosts, "block-multiple-hosts", false, "Disable login from multiple hosts")
return cmd return cmd
} }
func createDaemon(host, driver, level string) error { func createDaemon(host, driver, level string, blockMultipleHosts bool) error {
switch level { switch level {
case "info": case "info":
log.SetLevel(log.InfoLevel) log.SetLevel(log.InfoLevel)
@@ -88,6 +90,10 @@ func createDaemon(host, driver, level string) error {
targetDriver.NewTarget(tgtname, config) targetDriver.NewTarget(tgtname, config)
} }
if blockMultipleHosts {
targetDriver.EnableBlockMultipleHostLogin()
}
// comment this to avoid concurrent issue // comment this to avoid concurrent issue
// runtime.GOMAXPROCS(runtime.NumCPU()) // runtime.GOMAXPROCS(runtime.NumCPU())
// run a service // run a service

View File

@@ -21,6 +21,7 @@ import (
"net" "net"
"os" "os"
"strconv" "strconv"
"strings"
"sync" "sync"
"time" "time"
@@ -44,23 +45,25 @@ const (
) )
var ( var (
EnableStats bool EnableStats bool
CurrentHostIP string
) )
type ISCSITargetDriver struct { type ISCSITargetDriver struct {
SCSI *scsi.SCSITargetService SCSI *scsi.SCSITargetService
Name string Name string
iSCSITargets map[string]*ISCSITarget iSCSITargets map[string]*ISCSITarget
TSIHPool map[uint16]bool TSIHPool map[uint16]bool
TSIHPoolMutex sync.Mutex TSIHPoolMutex sync.Mutex
isClientConnected bool isClientConnected bool
enableStats bool enableStats bool
mu *sync.RWMutex mu *sync.RWMutex
l net.Listener l net.Listener
state uint8 state uint8
OpCode int OpCode int
TargetStats scsi.Stats TargetStats scsi.Stats
clusterIP string clusterIP string
blockMultipleHostLogin bool
} }
func init() { func init() {
@@ -133,6 +136,10 @@ func (s *ISCSITargetDriver) SetClusterIP(ip string) {
s.clusterIP = ip s.clusterIP = ip
} }
func (s *ISCSITargetDriver) EnableBlockMultipleHostLogin() {
s.blockMultipleHostLogin = true
}
func (s *ISCSITargetDriver) RereadTargetLUNMap() { func (s *ISCSITargetDriver) RereadTargetLUNMap() {
s.SCSI.RereadTargetLUNMap() s.SCSI.RereadTargetLUNMap()
} }
@@ -210,6 +217,19 @@ func (s *ISCSITargetDriver) Run() error {
continue continue
} }
remoteIP := strings.Split(conn.RemoteAddr().String(), ":")[0]
if CurrentHostIP == "" {
CurrentHostIP = remoteIP
}
if s.blockMultipleHostLogin && remoteIP != CurrentHostIP {
conn.Close()
log.Infof("rejecting connection: %s target already connected at %s",
remoteIP, CurrentHostIP)
continue
}
log.Info(conn.LocalAddr().String()) log.Info(conn.LocalAddr().String())
s.setClientStatus(true) s.setClientStatus(true)
@@ -273,6 +293,7 @@ func (s *ISCSITargetDriver) handler(events byte, conn *iscsiConnection) {
if conn.state == CONN_STATE_CLOSE { if conn.state == CONN_STATE_CLOSE {
log.Warningf("iscsi connection[%d] closed", conn.cid) log.Warningf("iscsi connection[%d] closed", conn.cid)
conn.close() conn.close()
CurrentHostIP = ""
} }
} }
@@ -457,6 +478,7 @@ func iscsiExecLogout(conn *iscsiConnection) error {
conn.resp.ExpCmdSN = conn.session.ExpCmdSN conn.resp.ExpCmdSN = conn.session.ExpCmdSN
conn.resp.MaxCmdSN = conn.session.ExpCmdSN + conn.session.MaxQueueCommand conn.resp.MaxCmdSN = conn.session.ExpCmdSN + conn.session.MaxQueueCommand
} }
CurrentHostIP = ""
return nil return nil
} }

View File

@@ -31,6 +31,7 @@ type SCSITargetDriver interface {
Resize(uint64) error Resize(uint64) error
Stats() Stats Stats() Stats
SetClusterIP(string) SetClusterIP(string)
EnableBlockMultipleHostLogin()
} }
type Stats struct { type Stats struct {