Merge pull request #106 from shubham14bajpai/login
Add flag to disable login on multiple hosts
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user