mirror of https://github.com/ehang-io/nps
change server global value to concurrency safety, fix #315
parent
b2d1de472b
commit
b4f72d295e
|
@ -50,10 +50,10 @@ type Bridge struct {
|
||||||
CloseClient chan int
|
CloseClient chan int
|
||||||
SecretChan chan *conn.Secret
|
SecretChan chan *conn.Secret
|
||||||
ipVerify bool
|
ipVerify bool
|
||||||
runList map[int]interface{}
|
runList sync.Map //map[int]interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTunnel(tunnelPort int, tunnelType string, ipVerify bool, runList map[int]interface{}) *Bridge {
|
func NewTunnel(tunnelPort int, tunnelType string, ipVerify bool, runList sync.Map) *Bridge {
|
||||||
return &Bridge{
|
return &Bridge{
|
||||||
TunnelPort: tunnelPort,
|
TunnelPort: tunnelPort,
|
||||||
tunnelType: tunnelType,
|
tunnelType: tunnelType,
|
||||||
|
@ -407,7 +407,8 @@ loop:
|
||||||
})
|
})
|
||||||
file.GetDb().JsonDb.Tasks.Range(func(key, value interface{}) bool {
|
file.GetDb().JsonDb.Tasks.Range(func(key, value interface{}) bool {
|
||||||
v := value.(*file.Tunnel)
|
v := value.(*file.Tunnel)
|
||||||
if _, ok := s.runList[v.Id]; ok && v.Client.Id == id {
|
//if _, ok := s.runList[v.Id]; ok && v.Client.Id == id {
|
||||||
|
if _, ok := s.runList.Load(v.Id); ok && v.Client.Id == id {
|
||||||
str += v.Remark + common.CONN_DATA_SEQ
|
str += v.Remark + common.CONN_DATA_SEQ
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"ehang.io/nps/bridge"
|
"ehang.io/nps/bridge"
|
||||||
|
@ -24,11 +25,11 @@ import (
|
||||||
|
|
||||||
var (
|
var (
|
||||||
Bridge *bridge.Bridge
|
Bridge *bridge.Bridge
|
||||||
RunList map[int]interface{}
|
RunList sync.Map //map[int]interface{}
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RunList = make(map[int]interface{})
|
RunList = sync.Map{}
|
||||||
}
|
}
|
||||||
|
|
||||||
//init task from db
|
//init task from db
|
||||||
|
@ -37,7 +38,8 @@ func InitFromCsv() {
|
||||||
if vkey := beego.AppConfig.String("public_vkey"); vkey != "" {
|
if vkey := beego.AppConfig.String("public_vkey"); vkey != "" {
|
||||||
c := file.NewClient(vkey, true, true)
|
c := file.NewClient(vkey, true, true)
|
||||||
file.GetDb().NewClient(c)
|
file.GetDb().NewClient(c)
|
||||||
RunList[c.Id] = nil
|
RunList.Store(c.Id, nil)
|
||||||
|
//RunList[c.Id] = nil
|
||||||
}
|
}
|
||||||
//Initialize services in server-side files
|
//Initialize services in server-side files
|
||||||
file.GetDb().JsonDb.Tasks.Range(func(key, value interface{}) bool {
|
file.GetDb().JsonDb.Tasks.Range(func(key, value interface{}) bool {
|
||||||
|
@ -102,7 +104,8 @@ func StartNewServer(bridgePort int, cnf *file.Tunnel, bridgeType string) {
|
||||||
if err := svr.Start(); err != nil {
|
if err := svr.Start(); err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
}
|
}
|
||||||
RunList[cnf.Id] = svr
|
RunList.Store(cnf.Id, svr)
|
||||||
|
//RunList[cnf.Id] = svr
|
||||||
} else {
|
} else {
|
||||||
logs.Error("Incorrect startup mode %s", cnf.Mode)
|
logs.Error("Incorrect startup mode %s", cnf.Mode)
|
||||||
}
|
}
|
||||||
|
@ -155,7 +158,8 @@ func NewMode(Bridge *bridge.Bridge, c *file.Tunnel) proxy.Service {
|
||||||
|
|
||||||
//stop server
|
//stop server
|
||||||
func StopServer(id int) error {
|
func StopServer(id int) error {
|
||||||
if v, ok := RunList[id]; ok {
|
//if v, ok := RunList[id]; ok {
|
||||||
|
if v, ok := RunList.Load(id); ok {
|
||||||
if svr, ok := v.(proxy.Service); ok {
|
if svr, ok := v.(proxy.Service); ok {
|
||||||
if err := svr.Close(); err != nil {
|
if err := svr.Close(); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -170,7 +174,8 @@ func StopServer(id int) error {
|
||||||
t.Status = false
|
t.Status = false
|
||||||
file.GetDb().UpdateTask(t)
|
file.GetDb().UpdateTask(t)
|
||||||
}
|
}
|
||||||
delete(RunList, id)
|
//delete(RunList, id)
|
||||||
|
RunList.Delete(id)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return errors.New("task is not running")
|
return errors.New("task is not running")
|
||||||
|
@ -180,7 +185,8 @@ func StopServer(id int) error {
|
||||||
func AddTask(t *file.Tunnel) error {
|
func AddTask(t *file.Tunnel) error {
|
||||||
if t.Mode == "secret" || t.Mode == "p2p" {
|
if t.Mode == "secret" || t.Mode == "p2p" {
|
||||||
logs.Info("secret task %s start ", t.Remark)
|
logs.Info("secret task %s start ", t.Remark)
|
||||||
RunList[t.Id] = nil
|
//RunList[t.Id] = nil
|
||||||
|
RunList.Store(t.Id, nil)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if b := tool.TestServerPort(t.Port, t.Mode); !b && t.Mode != "httpHostServer" {
|
if b := tool.TestServerPort(t.Port, t.Mode); !b && t.Mode != "httpHostServer" {
|
||||||
|
@ -192,11 +198,13 @@ func AddTask(t *file.Tunnel) error {
|
||||||
}
|
}
|
||||||
if svr := NewMode(Bridge, t); svr != nil {
|
if svr := NewMode(Bridge, t); svr != nil {
|
||||||
logs.Info("tunnel task %s start mode:%s port %d", t.Remark, t.Mode, t.Port)
|
logs.Info("tunnel task %s start mode:%s port %d", t.Remark, t.Mode, t.Port)
|
||||||
RunList[t.Id] = svr
|
//RunList[t.Id] = svr
|
||||||
|
RunList.Store(t.Id, svr)
|
||||||
go func() {
|
go func() {
|
||||||
if err := svr.Start(); err != nil {
|
if err := svr.Start(); err != nil {
|
||||||
logs.Error("clientId %d taskId %d start error %s", t.Client.Id, t.Id, err)
|
logs.Error("clientId %d taskId %d start error %s", t.Client.Id, t.Id, err)
|
||||||
delete(RunList, t.Id)
|
//delete(RunList, t.Id)
|
||||||
|
RunList.Delete(t.Id)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
@ -220,7 +228,8 @@ func StartTask(id int) error {
|
||||||
|
|
||||||
//delete task
|
//delete task
|
||||||
func DelTask(id int) error {
|
func DelTask(id int) error {
|
||||||
if _, ok := RunList[id]; ok {
|
//if _, ok := RunList[id]; ok {
|
||||||
|
if _, ok := RunList.Load(id); ok {
|
||||||
if err := StopServer(id); err != nil {
|
if err := StopServer(id); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -250,7 +259,8 @@ func GetTunnel(start, length int, typeVal string, clientId int, search string) (
|
||||||
}
|
}
|
||||||
if start--; start < 0 {
|
if start--; start < 0 {
|
||||||
if length--; length >= 0 {
|
if length--; length >= 0 {
|
||||||
if _, ok := RunList[v.Id]; ok {
|
//if _, ok := RunList[v.Id]; ok {
|
||||||
|
if _, ok := RunList.Load(v.Id); ok {
|
||||||
v.RunStatus = true
|
v.RunStatus = true
|
||||||
} else {
|
} else {
|
||||||
v.RunStatus = false
|
v.RunStatus = false
|
||||||
|
|
Loading…
Reference in New Issue