阶段性提交

This commit is contained in:
刘祥超
2020-09-16 09:09:10 +08:00
parent eadf69b147
commit 5b35be650b
44 changed files with 959 additions and 279 deletions

View File

@@ -28,6 +28,7 @@ type RPCClient struct {
originNodeClients []pb.OriginServerServiceClient originNodeClients []pb.OriginServerServiceClient
httpWebClients []pb.HTTPWebServiceClient httpWebClients []pb.HTTPWebServiceClient
reverseProxyClients []pb.ReverseProxyServiceClient reverseProxyClients []pb.ReverseProxyServiceClient
httpGzipClients []pb.HTTPGzipServiceClient
} }
func NewRPCClient(apiConfig *configs.APIConfig) (*RPCClient, error) { func NewRPCClient(apiConfig *configs.APIConfig) (*RPCClient, error) {
@@ -45,6 +46,7 @@ func NewRPCClient(apiConfig *configs.APIConfig) (*RPCClient, error) {
originNodeClients := []pb.OriginServerServiceClient{} originNodeClients := []pb.OriginServerServiceClient{}
httpWebClients := []pb.HTTPWebServiceClient{} httpWebClients := []pb.HTTPWebServiceClient{}
reverseProxyClients := []pb.ReverseProxyServiceClient{} reverseProxyClients := []pb.ReverseProxyServiceClient{}
httpGzipClients := []pb.HTTPGzipServiceClient{}
conns := []*grpc.ClientConn{} conns := []*grpc.ClientConn{}
for _, endpoint := range apiConfig.RPC.Endpoints { for _, endpoint := range apiConfig.RPC.Endpoints {
@@ -70,6 +72,7 @@ func NewRPCClient(apiConfig *configs.APIConfig) (*RPCClient, error) {
originNodeClients = append(originNodeClients, pb.NewOriginServerServiceClient(conn)) originNodeClients = append(originNodeClients, pb.NewOriginServerServiceClient(conn))
httpWebClients = append(httpWebClients, pb.NewHTTPWebServiceClient(conn)) httpWebClients = append(httpWebClients, pb.NewHTTPWebServiceClient(conn))
reverseProxyClients = append(reverseProxyClients, pb.NewReverseProxyServiceClient(conn)) reverseProxyClients = append(reverseProxyClients, pb.NewReverseProxyServiceClient(conn))
httpGzipClients = append(httpGzipClients, pb.NewHTTPGzipServiceClient(conn))
} }
return &RPCClient{ return &RPCClient{
@@ -84,6 +87,7 @@ func NewRPCClient(apiConfig *configs.APIConfig) (*RPCClient, error) {
originNodeClients: originNodeClients, originNodeClients: originNodeClients,
httpWebClients: httpWebClients, httpWebClients: httpWebClients,
reverseProxyClients: reverseProxyClients, reverseProxyClients: reverseProxyClients,
httpGzipClients: httpGzipClients,
}, nil }, nil
} }
@@ -157,6 +161,13 @@ func (this *RPCClient) ReverseProxyRPC() pb.ReverseProxyServiceClient {
return nil return nil
} }
func (this *RPCClient) HTTPGzipRPC() pb.HTTPGzipServiceClient {
if len(this.httpGzipClients) > 0 {
return this.httpGzipClients[rands.Int(0, len(this.httpGzipClients)-1)]
}
return nil
}
func (this *RPCClient) Context(adminId int64) context.Context { func (this *RPCClient) Context(adminId int64) context.Context {
ctx := context.Background() ctx := context.Background()
m := maps.Map{ m := maps.Map{

View File

@@ -19,8 +19,19 @@ func (this *AddPortPopupAction) Init() {
func (this *AddPortPopupAction) RunGet(params struct { func (this *AddPortPopupAction) RunGet(params struct {
ServerType string ServerType string
Protocol string
}) { }) {
this.Data["protocols"] = serverconfigs.AllServerProtocolsForType(params.ServerType) protocols := serverconfigs.AllServerProtocolsForType(params.ServerType)
if len(params.Protocol) > 0 {
result := []maps.Map{}
for _, p := range protocols {
if p.GetString("code") == params.Protocol {
result = append(result, p)
}
}
protocols = result
}
this.Data["protocols"] = protocols
this.Show() this.Show()
} }

View File

@@ -1,7 +1,13 @@
package gzip package gzip
import ( import (
"encoding/json"
"errors"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/iwind/TeaGo/actions"
) )
type IndexAction struct { type IndexAction struct {
@@ -16,7 +22,119 @@ func (this *IndexAction) Init() {
func (this *IndexAction) RunGet(params struct { func (this *IndexAction) RunGet(params struct {
ServerId int64 ServerId int64
}) { }) {
// TODO server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId)
if !isOk {
return
}
webId := server.WebId
if webId <= 0 {
resp, err := this.RPC().ServerRPC().InitServerWeb(this.AdminContext(), &pb.InitServerWebRequest{ServerId: params.ServerId})
if err != nil {
this.ErrorPage(err)
return
}
webId = resp.WebId
}
webResp, err := this.RPC().HTTPWebRPC().FindEnabledHTTPWeb(this.AdminContext(), &pb.FindEnabledHTTPWebRequest{WebId: webId})
if err != nil {
this.ErrorPage(err)
return
}
web := webResp.Web
if web == nil {
this.ErrorPage(errors.New("web should not be nil"))
return
}
this.Data["webId"] = web.Id
gzipId := web.GzipId
gzipConfig := &serverconfigs.HTTPGzipConfig{
Id: 0,
IsOn: true,
}
if gzipId > 0 {
resp, err := this.RPC().HTTPGzipRPC().FindEnabledHTTPGzipConfig(this.AdminContext(), &pb.FindEnabledGzipConfigRequest{GzipId: gzipId})
if err != nil {
this.ErrorPage(err)
return
}
err = json.Unmarshal(resp.Config, gzipConfig)
if err != nil {
this.ErrorPage(err)
return
}
}
this.Data["gzipConfig"] = gzipConfig
this.Show() this.Show()
} }
func (this *IndexAction) RunPost(params struct {
WebId int64
GzipId int64
Level int
MinLength string
MaxLength string
Must *actions.Must
}) {
if params.Level < 0 || params.Level > 9 {
this.Fail("请选择正确的压缩级别")
}
minLength := &pb.SizeCapacity{Count: -1}
if len(params.MinLength) > 0 {
err := json.Unmarshal([]byte(params.MinLength), minLength)
if err != nil {
this.ErrorPage(err)
return
}
}
maxLength := &pb.SizeCapacity{Count: -1}
if len(params.MaxLength) > 0 {
err := json.Unmarshal([]byte(params.MaxLength), maxLength)
if err != nil {
this.ErrorPage(err)
return
}
}
if params.GzipId > 0 {
_, err := this.RPC().HTTPGzipRPC().UpdateHTTPGzip(this.AdminContext(), &pb.UpdateHTTPGzipRequest{
GzipId: params.GzipId,
Level: int32(params.Level),
MinLength: minLength,
MaxLength: maxLength,
})
if err != nil {
this.ErrorPage(err)
return
}
} else {
resp, err := this.RPC().HTTPGzipRPC().CreateHTTPGzip(this.AdminContext(), &pb.CreateHTTPGzipRequest{
Level: 0,
MinLength: nil,
MaxLength: nil,
})
if err != nil {
this.ErrorPage(err)
return
}
gzipId := resp.GzipId
_, err = this.RPC().HTTPWebRPC().UpdateHTTPWebGzip(this.AdminContext(), &pb.UpdateHTTPWebGzipRequest{
WebId: params.WebId,
GzipId: gzipId,
})
if err != nil {
this.ErrorPage(err)
}
}
this.Success()
}

View File

@@ -12,7 +12,7 @@ func init() {
Helper(helpers.NewUserMustAuth()). Helper(helpers.NewUserMustAuth()).
Helper(serverutils.NewServerHelper()). Helper(serverutils.NewServerHelper()).
Prefix("/servers/server/settings/gzip"). Prefix("/servers/server/settings/gzip").
Get("", new(IndexAction)). GetPost("", new(IndexAction)).
EndAll() EndAll()
}) })
} }

View File

@@ -1,7 +1,13 @@
package http package http
import ( import (
"encoding/json"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
) )
type IndexAction struct { type IndexAction struct {
@@ -16,7 +22,72 @@ func (this *IndexAction) Init() {
func (this *IndexAction) RunGet(params struct { func (this *IndexAction) RunGet(params struct {
ServerId int64 ServerId int64
}) { }) {
// TODO server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId)
if !isOk {
return
}
httpConfig := &serverconfigs.HTTPProtocolConfig{}
if len(server.HttpJSON) > 0 {
err := json.Unmarshal(server.HttpJSON, httpConfig)
if err != nil {
this.ErrorPage(err)
return
}
} else {
httpConfig.IsOn = true
}
this.Data["serverType"] = server.Type
this.Data["httpConfig"] = maps.Map{
"isOn": httpConfig.IsOn,
"addresses": httpConfig.Listen,
}
this.Show() this.Show()
} }
func (this *IndexAction) RunPost(params struct {
ServerId int64
Addresses string
Must *actions.Must
}) {
addresses := []*serverconfigs.NetworkAddressConfig{}
err := json.Unmarshal([]byte(params.Addresses), &addresses)
if err != nil {
this.Fail("端口地址解析失败:" + err.Error())
}
server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId)
if !isOk {
return
}
httpConfig := &serverconfigs.HTTPProtocolConfig{}
if len(server.HttpJSON) > 0 {
err = json.Unmarshal(server.HttpJSON, httpConfig)
if err != nil {
this.ErrorPage(err)
return
}
} else {
httpConfig.IsOn = true
}
httpConfig.Listen = addresses
configData, err := json.Marshal(httpConfig)
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().ServerRPC().UpdateServerHTTP(this.AdminContext(), &pb.UpdateServerHTTPRequest{
ServerId: params.ServerId,
Config: configData,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -12,7 +12,7 @@ func init() {
Helper(helpers.NewUserMustAuth()). Helper(helpers.NewUserMustAuth()).
Helper(serverutils.NewServerHelper()). Helper(serverutils.NewServerHelper()).
Prefix("/servers/server/settings/http"). Prefix("/servers/server/settings/http").
Get("", new(IndexAction)). GetPost("", new(IndexAction)).
EndAll() EndAll()
}) })
} }

View File

@@ -1,7 +1,13 @@
package https package https
import ( import (
"encoding/json"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
) )
type IndexAction struct { type IndexAction struct {
@@ -16,5 +22,72 @@ func (this *IndexAction) Init() {
func (this *IndexAction) RunGet(params struct { func (this *IndexAction) RunGet(params struct {
ServerId int64 ServerId int64
}) { }) {
server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId)
if !isOk {
return
}
httpsConfig := &serverconfigs.HTTPSProtocolConfig{}
if len(server.HttpsJSON) > 0 {
err := json.Unmarshal(server.HttpsJSON, httpsConfig)
if err != nil {
this.ErrorPage(err)
return
}
} else {
httpsConfig.IsOn = true
}
this.Data["serverType"] = server.Type
this.Data["httpsConfig"] = maps.Map{
"isOn": httpsConfig.IsOn,
"addresses": httpsConfig.Listen,
}
this.Show() this.Show()
} }
func (this *IndexAction) RunPost(params struct {
ServerId int64
Addresses string
Must *actions.Must
}) {
addresses := []*serverconfigs.NetworkAddressConfig{}
err := json.Unmarshal([]byte(params.Addresses), &addresses)
if err != nil {
this.Fail("端口地址解析失败:" + err.Error())
}
server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId)
if !isOk {
return
}
httpsConfig := &serverconfigs.HTTPSProtocolConfig{}
if len(server.HttpsJSON) > 0 {
err = json.Unmarshal(server.HttpsJSON, httpsConfig)
if err != nil {
this.ErrorPage(err)
return
}
} else {
httpsConfig.IsOn = true
}
httpsConfig.Listen = addresses
configData, err := json.Marshal(httpsConfig)
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().ServerRPC().UpdateServerHTTPS(this.AdminContext(), &pb.UpdateServerHTTPSRequest{
ServerId: params.ServerId,
Config: configData,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -12,7 +12,7 @@ func init() {
Helper(helpers.NewUserMustAuth()). Helper(helpers.NewUserMustAuth()).
Helper(serverutils.NewServerHelper()). Helper(serverutils.NewServerHelper()).
Prefix("/servers/server/settings/https"). Prefix("/servers/server/settings/https").
Get("", new(IndexAction)). GetPost("", new(IndexAction)).
EndAll() EndAll()
}) })
} }

View File

@@ -29,61 +29,60 @@ func (this *IndexAction) RunGet(params struct {
this.Data["serverType"] = server.Type this.Data["serverType"] = server.Type
this.Data["reverseProxyId"] = server.ReverseProxyId this.Data["reverseProxyId"] = server.ReverseProxyId
if server.ReverseProxyId <= 0 { isOn := false
// TODO 应该在界面上提示用户开启 if server.ReverseProxyId > 0 {
this.ErrorPage(errors.New("reverse proxy should not be nil")) reverseProxyResp, err := this.RPC().ReverseProxyRPC().FindEnabledReverseProxy(this.AdminContext(), &pb.FindEnabledReverseProxyRequest{ReverseProxyId: server.ReverseProxyId})
return
}
reverseProxyResp, err := this.RPC().ReverseProxyRPC().FindEnabledReverseProxy(this.AdminContext(), &pb.FindEnabledReverseProxyRequest{ReverseProxyId: server.ReverseProxyId})
if err != nil {
this.ErrorPage(err)
return
}
reverseProxy := reverseProxyResp.ReverseProxy
if reverseProxy == nil {
// TODO 应该在界面上提示用户开启
this.ErrorPage(errors.New("reverse proxy should not be nil"))
return
}
primaryOrigins := []*serverconfigs.OriginServerConfig{}
backupOrigins := []*serverconfigs.OriginServerConfig{}
if len(reverseProxy.PrimaryOriginsJSON) > 0 {
err = json.Unmarshal(reverseProxy.PrimaryOriginsJSON, &primaryOrigins)
if err != nil { if err != nil {
this.ErrorPage(err) this.ErrorPage(err)
return return
} }
} reverseProxy := reverseProxyResp.ReverseProxy
if len(reverseProxy.BackupOriginsJSON) > 0 { if reverseProxy == nil {
err = json.Unmarshal(reverseProxy.BackupOriginsJSON, &backupOrigins) // TODO 应该在界面上提示用户开启
if err != nil { this.ErrorPage(errors.New("reverse proxy should not be nil"))
this.ErrorPage(err)
return return
} }
} isOn = true
primaryOriginMaps := []maps.Map{} primaryOrigins := []*serverconfigs.OriginServerConfig{}
backupOriginMaps := []maps.Map{} backupOrigins := []*serverconfigs.OriginServerConfig{}
for _, originConfig := range primaryOrigins { if len(reverseProxy.PrimaryOriginsJSON) > 0 {
m := maps.Map{ err = json.Unmarshal(reverseProxy.PrimaryOriginsJSON, &primaryOrigins)
"id": originConfig.Id, if err != nil {
"weight": originConfig.Weight, this.ErrorPage(err)
"addr": originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange, return
}
} }
primaryOriginMaps = append(primaryOriginMaps, m) if len(reverseProxy.BackupOriginsJSON) > 0 {
} err = json.Unmarshal(reverseProxy.BackupOriginsJSON, &backupOrigins)
for _, originConfig := range backupOrigins { if err != nil {
m := maps.Map{ this.ErrorPage(err)
"id": originConfig.Id, return
"weight": originConfig.Weight, }
"addr": originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange,
} }
backupOriginMaps = append(backupOriginMaps, m)
primaryOriginMaps := []maps.Map{}
backupOriginMaps := []maps.Map{}
for _, originConfig := range primaryOrigins {
m := maps.Map{
"id": originConfig.Id,
"weight": originConfig.Weight,
"addr": originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange,
}
primaryOriginMaps = append(primaryOriginMaps, m)
}
for _, originConfig := range backupOrigins {
m := maps.Map{
"id": originConfig.Id,
"weight": originConfig.Weight,
"addr": originConfig.Addr.Protocol.String() + "://" + originConfig.Addr.Host + ":" + originConfig.Addr.PortRange,
}
backupOriginMaps = append(backupOriginMaps, m)
}
this.Data["primaryOrigins"] = primaryOriginMaps
this.Data["backupOrigins"] = backupOriginMaps
} }
this.Data["primaryOrigins"] = primaryOriginMaps this.Data["isOn"] = isOn
this.Data["backupOrigins"] = backupOriginMaps
this.Show() this.Show()
} }

View File

@@ -17,6 +17,7 @@ func init() {
Get("", new(IndexAction)). Get("", new(IndexAction)).
GetPost("/scheduling", new(SchedulingAction)). GetPost("/scheduling", new(SchedulingAction)).
GetPost("/updateSchedulingPopup", new(UpdateSchedulingPopupAction)). GetPost("/updateSchedulingPopup", new(UpdateSchedulingPopupAction)).
Post("/updateOn", new(UpdateOnAction)).
EndAll() EndAll()
}) })
} }

View File

@@ -0,0 +1,55 @@
package reverseProxy
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
type UpdateOnAction struct {
actionutils.ParentAction
}
func (this *UpdateOnAction) RunPost(params struct {
ServerId int64
ReverseProxyId int64
IsOn bool
}) {
// 如果没有配置过,则配置
if params.ReverseProxyId <= 0 {
if !params.IsOn {
this.Success()
}
resp, err := this.RPC().ReverseProxyRPC().CreateReverseProxy(this.AdminContext(), &pb.CreateReverseProxyRequest{
SchedulingJSON: nil,
PrimaryOriginsJSON: nil,
BackupOriginsJSON: nil,
})
if err != nil {
this.ErrorPage(err)
return
}
reverseProxyId := resp.ReverseProxyId
_, err = this.RPC().ServerRPC().UpdateServerReverseProxy(this.AdminContext(), &pb.UpdateServerReverseProxyRequest{
ServerId: params.ServerId,
ReverseProxyId: reverseProxyId,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}
// 如果已经配置过
_, err := this.RPC().ReverseProxyRPC().UpdateReverseProxyIsOn(this.AdminContext(), &pb.UpdateReverseProxyIsOnRequest{
ReverseProxyId: params.ReverseProxyId,
IsOn: params.IsOn,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -0,0 +1,63 @@
package serverNames
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/iwind/TeaGo/actions"
)
// 域名管理
type IndexAction struct {
actionutils.ParentAction
}
func (this *IndexAction) Init() {
this.FirstMenu("index")
}
func (this *IndexAction) RunGet(params struct {
ServerId int64
}) {
server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId)
if !isOk {
return
}
serverNamesConfig := []*serverconfigs.ServerNameConfig{}
if len(server.ServerNamesJON) > 0 {
err := json.Unmarshal(server.ServerNamesJON, &serverNamesConfig)
if err != nil {
this.ErrorPage(err)
return
}
}
this.Data["serverNames"] = serverNamesConfig
this.Show()
}
func (this *IndexAction) RunPost(params struct {
ServerId int64
ServerNames string
Must *actions.Must
}) {
serverNames := []*serverconfigs.ServerNameConfig{}
err := json.Unmarshal([]byte(params.ServerNames), &serverNames)
if err != nil {
this.Fail("域名解析失败:" + err.Error())
}
_, err = this.RPC().ServerRPC().UpdateServerNames(this.AdminContext(), &pb.UpdateServerNamesRequest{
ServerId: params.ServerId,
Config: []byte(params.ServerNames),
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -0,0 +1,20 @@
package serverNames
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
"github.com/iwind/TeaGo"
)
func init() {
TeaGo.BeforeStart(func(server *TeaGo.Server) {
server.
Helper(helpers.NewUserMustAuth()).
Helper(serverutils.NewServerHelper()).
Data("mainTab", "setting").
Data("secondMenuItem", "serverName").
Prefix("/servers/server/settings/serverNames").
GetPost("", new(IndexAction)).
EndAll()
})
}

View File

@@ -2,7 +2,6 @@ package tcp
import ( import (
"encoding/json" "encoding/json"
"errors"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
@@ -23,21 +22,22 @@ func (this *IndexAction) Init() {
func (this *IndexAction) RunGet(params struct { func (this *IndexAction) RunGet(params struct {
ServerId int64 ServerId int64
}) { }) {
server, config, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId) server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId)
if !isOk { if !isOk {
return return
} }
if config.TCP == nil { tcpConfig := &serverconfigs.TCPProtocolConfig{}
this.ErrorPage(errors.New("there is no tcp setting")) if len(server.TcpJSON) > 0 {
return err := json.Unmarshal(server.TcpJSON, tcpConfig)
} if err != nil {
this.ErrorPage(err)
if config.TCP.Listen == nil { }
config.TCP.Listen = []*serverconfigs.NetworkAddressConfig{} } else {
tcpConfig.IsOn = true
} }
this.Data["serverType"] = server.Type this.Data["serverType"] = server.Type
this.Data["addresses"] = config.TCP.Listen this.Data["tcpConfig"] = tcpConfig
this.Show() this.Show()
} }
@@ -49,8 +49,6 @@ func (this *IndexAction) RunPost(params struct {
Must *actions.Must Must *actions.Must
}) { }) {
serverId := params.ServerId
server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId) server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId)
if !isOk { if !isOk {
return return
@@ -62,188 +60,30 @@ func (this *IndexAction) RunPost(params struct {
this.Fail("端口地址解析失败:" + err.Error()) this.Fail("端口地址解析失败:" + err.Error())
} }
switch server.Type { tcpConfig := &serverconfigs.TCPProtocolConfig{}
case serverconfigs.ServerTypeHTTPProxy, serverconfigs.ServerTypeHTTPWeb: if len(server.TcpJSON) > 0 {
var httpConfig = &serverconfigs.HTTPProtocolConfig{} err := json.Unmarshal(server.TcpJSON, tcpConfig)
if len(server.HttpJSON) > 0 { if err != nil {
err = json.Unmarshal(server.HttpJSON, httpConfig) this.ErrorPage(err)
if err != nil {
this.ErrorPage(err)
return
}
httpConfig.Listen = []*serverconfigs.NetworkAddressConfig{}
} else {
httpConfig.IsOn = true
} }
} else {
tcpConfig.IsOn = true
}
tcpConfig.Listen = addresses
var httpsConfig = &serverconfigs.HTTPSProtocolConfig{} configData, err := json.Marshal(tcpConfig)
if len(server.HttpsJSON) > 0 { if err != nil {
err = json.Unmarshal(server.HttpsJSON, httpsConfig) this.ErrorPage(err)
if err != nil { return
this.ErrorPage(err) }
return
}
httpsConfig.Listen = []*serverconfigs.NetworkAddressConfig{}
} else {
httpsConfig.IsOn = true
}
for _, addr := range addresses { _, err = this.RPC().ServerRPC().UpdateServerTCP(this.AdminContext(), &pb.UpdateServerTCPRequest{
switch addr.Protocol.Primary() { ServerId: params.ServerId,
case serverconfigs.ProtocolHTTP: Config: configData,
httpConfig.AddListen(addr) })
case serverconfigs.ProtocolHTTPS: if err != nil {
httpsConfig.AddListen(addr) this.ErrorPage(err)
} return
}
httpData, err := json.Marshal(httpConfig)
if err != nil {
this.ErrorPage(err)
return
}
httpsData, err := json.Marshal(httpsConfig)
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().ServerRPC().UpdateServerHTTP(this.AdminContext(), &pb.UpdateServerHTTPRequest{
ServerId: serverId,
Config: httpData,
})
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().ServerRPC().UpdateServerHTTPS(this.AdminContext(), &pb.UpdateServerHTTPSRequest{
ServerId: serverId,
Config: httpsData,
})
if err != nil {
this.ErrorPage(err)
return
}
case serverconfigs.ServerTypeTCPProxy:
tcpProxy := &serverconfigs.TCPProtocolConfig{}
if len(server.TcpJSON) > 0 {
err = json.Unmarshal(server.TcpJSON, tcpProxy)
if err != nil {
this.ErrorPage(err)
return
}
tcpProxy.Listen = []*serverconfigs.NetworkAddressConfig{}
} else {
tcpProxy.IsOn = true
}
tlsProxy := &serverconfigs.TLSProtocolConfig{}
if len(server.TlsJSON) > 0 {
err = json.Unmarshal(server.TlsJSON, tlsProxy)
if err != nil {
this.ErrorPage(err)
return
}
tlsProxy.Listen = []*serverconfigs.NetworkAddressConfig{}
} else {
tlsProxy.IsOn = true
}
for _, addr := range addresses {
switch addr.Protocol.Primary() {
case serverconfigs.ProtocolTCP:
tcpProxy.AddListen(addr)
case serverconfigs.ProtocolTLS:
tlsProxy.AddListen(addr)
}
}
tcpData, err := json.Marshal(tcpProxy)
if err != nil {
this.ErrorPage(err)
return
}
tlsData, err := json.Marshal(tlsProxy)
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().ServerRPC().UpdateServerTCP(this.AdminContext(), &pb.UpdateServerTCPRequest{
ServerId: serverId,
Config: tcpData,
})
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().ServerRPC().UpdateServerTLS(this.AdminContext(), &pb.UpdateServerTLSRequest{
ServerId: serverId,
Config: tlsData,
})
if err != nil {
this.ErrorPage(err)
return
}
case serverconfigs.ServerTypeUnixProxy:
unixConfig := &serverconfigs.UnixProtocolConfig{}
if len(server.UnixJSON) > 0 {
err = json.Unmarshal(server.UnixJSON, unixConfig)
if err != nil {
this.ErrorPage(err)
return
}
unixConfig.Listen = []*serverconfigs.NetworkAddressConfig{}
}
for _, addr := range addresses {
switch addr.Protocol.Primary() {
case serverconfigs.ProtocolUnix:
unixConfig.AddListen(addr)
}
}
unixData, err := json.Marshal(unixConfig)
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().ServerRPC().UpdateServerUnix(this.AdminContext(), &pb.UpdateServerUnixRequest{
ServerId: serverId,
Config: unixData,
})
if err != nil {
this.ErrorPage(err)
return
}
case serverconfigs.ServerTypeUDPProxy:
udpConfig := &serverconfigs.UDPProtocolConfig{}
if len(server.UdpJSON) > 0 {
err = json.Unmarshal(server.UdpJSON, udpConfig)
if err != nil {
this.ErrorPage(err)
return
}
udpConfig.Listen = []*serverconfigs.NetworkAddressConfig{}
}
for _, addr := range addresses {
switch addr.Protocol.Primary() {
case serverconfigs.ProtocolUDP:
udpConfig.AddListen(addr)
}
}
udpData, err := json.Marshal(udpConfig)
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().ServerRPC().UpdateServerUDP(this.AdminContext(), &pb.UpdateServerUDPRequest{
ServerId: serverId,
Config: udpData,
})
if err != nil {
this.ErrorPage(err)
return
}
} }
this.Success() this.Success()

View File

@@ -0,0 +1,90 @@
package tls
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/iwind/TeaGo/actions"
)
// TLS设置
type IndexAction struct {
actionutils.ParentAction
}
func (this *IndexAction) Init() {
this.Nav("", "setting", "index")
this.SecondMenu("tls")
}
func (this *IndexAction) RunGet(params struct {
ServerId int64
}) {
server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId)
if !isOk {
return
}
tlsConfig := &serverconfigs.TLSProtocolConfig{}
if len(server.TlsJSON) > 0 {
err := json.Unmarshal(server.TlsJSON, tlsConfig)
if err != nil {
this.ErrorPage(err)
}
} else {
tlsConfig.IsOn = true
}
this.Data["serverType"] = server.Type
this.Data["tlsConfig"] = tlsConfig
this.Show()
}
func (this *IndexAction) RunPost(params struct {
ServerId int64
ServerType string
Addresses string
Must *actions.Must
}) {
server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId)
if !isOk {
return
}
addresses := []*serverconfigs.NetworkAddressConfig{}
err := json.Unmarshal([]byte(params.Addresses), &addresses)
if err != nil {
this.Fail("端口地址解析失败:" + err.Error())
}
tlsConfig := &serverconfigs.TLSProtocolConfig{}
if len(server.TlsJSON) > 0 {
err := json.Unmarshal(server.TlsJSON, tlsConfig)
if err != nil {
this.ErrorPage(err)
}
} else {
tlsConfig.IsOn = true
}
tlsConfig.Listen = addresses
configData, err := json.Marshal(tlsConfig)
if err != nil {
this.ErrorPage(err)
return
}
_, err = this.RPC().ServerRPC().UpdateServerTLS(this.AdminContext(), &pb.UpdateServerTLSRequest{
ServerId: params.ServerId,
Config: configData,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -0,0 +1,18 @@
package tls
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
"github.com/iwind/TeaGo"
)
func init() {
TeaGo.BeforeStart(func(server *TeaGo.Server) {
server.
Helper(helpers.NewUserMustAuth()).
Helper(serverutils.NewServerHelper()).
Prefix("/servers/server/settings/tls").
GetPost("", new(IndexAction)).
EndAll()
})
}

View File

@@ -2,6 +2,10 @@ package web
import ( import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/serverutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/iwind/TeaGo/actions"
) )
type IndexAction struct { type IndexAction struct {
@@ -16,7 +20,70 @@ func (this *IndexAction) Init() {
func (this *IndexAction) RunGet(params struct { func (this *IndexAction) RunGet(params struct {
ServerId int64 ServerId int64
}) { }) {
// TODO server, _, isOk := serverutils.FindServer(&this.ParentAction, params.ServerId)
if !isOk {
return
}
webId := server.WebId
webConfig := &serverconfigs.HTTPWebConfig{
Id: webId,
IsOn: true,
}
if webId > 0 {
resp, err := this.RPC().HTTPWebRPC().FindEnabledHTTPWeb(this.AdminContext(), &pb.FindEnabledHTTPWebRequest{WebId: webId})
if err != nil {
this.ErrorPage(err)
return
}
if resp.Web != nil {
web := resp.Web
webConfig.Id = webId
webConfig.IsOn = web.IsOn
webConfig.Root = web.Root
}
}
this.Data["webConfig"] = webConfig
this.Show() this.Show()
} }
func (this *IndexAction) RunPost(params struct {
ServerId int64
WebId int64
Root string
Must *actions.Must
}) {
if params.WebId <= 0 {
resp, err := this.RPC().HTTPWebRPC().CreateHTTPWeb(this.AdminContext(), &pb.CreateHTTPWebRequest{
Root: params.Root,
})
if err != nil {
this.ErrorPage(err)
return
}
webId := resp.WebId
_, err = this.RPC().ServerRPC().UpdateServerWeb(this.AdminContext(), &pb.UpdateServerWebRequest{
ServerId: params.ServerId,
WebId: webId,
})
if err != nil {
this.ErrorPage(err)
return
}
} else {
_, err := this.RPC().HTTPWebRPC().UpdateHTTPWeb(this.AdminContext(), &pb.UpdateHTTPWebRequest{
WebId: params.WebId,
Root: params.Root,
})
if err != nil {
this.ErrorPage(err)
return
}
}
this.Success()
}

View File

@@ -12,7 +12,7 @@ func init() {
Helper(helpers.NewUserMustAuth()). Helper(helpers.NewUserMustAuth()).
Helper(serverutils.NewServerHelper()). Helper(serverutils.NewServerHelper()).
Prefix("/servers/server/settings/web"). Prefix("/servers/server/settings/web").
Get("", new(IndexAction)). GetPost("", new(IndexAction)).
EndAll() EndAll()
}) })
} }

View File

@@ -141,6 +141,12 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri
// HTTP // HTTP
if serverConfig.IsHTTP() { if serverConfig.IsHTTP() {
menuItems = append(menuItems, maps.Map{
"name": "域名",
"url": "/servers/server/settings/serverNames?serverId=" + serverIdString,
"isActive": secondMenuItem == "serverName",
})
menuItems = append(menuItems, maps.Map{ menuItems = append(menuItems, maps.Map{
"name": "HTTP", "name": "HTTP",
"url": "/servers/server/settings/http?serverId=" + serverIdString, "url": "/servers/server/settings/http?serverId=" + serverIdString,
@@ -235,6 +241,11 @@ func (this *ServerHelper) createSettingsMenu(secondMenuItem string, serverIdStri
"url": "/servers/server/settings/tcp?serverId=" + serverIdString, "url": "/servers/server/settings/tcp?serverId=" + serverIdString,
"isActive": secondMenuItem == "tcp", "isActive": secondMenuItem == "tcp",
}) })
menuItems = append(menuItems, maps.Map{
"name": "TLS",
"url": "/servers/server/settings/tls?serverId=" + serverIdString,
"isActive": secondMenuItem == "tls",
})
menuItems = append(menuItems, maps.Map{ menuItems = append(menuItems, maps.Map{
"name": "反向代理", "name": "反向代理",
"url": "/servers/server/settings/reverseProxy?serverId=" + serverIdString, "url": "/servers/server/settings/reverseProxy?serverId=" + serverIdString,

View File

@@ -38,8 +38,10 @@ import (
_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/origins" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/origins"
_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/pages" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/pages"
_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/reverseProxy" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/reverseProxy"
_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/serverNames"
_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/stat" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/stat"
_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/tcp" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/tcp"
_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/tls"
_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/udp" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/udp"
_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/unix" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/unix"
_ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/waf" _ "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/servers/server/settings/waf"

View File

@@ -1,12 +1,17 @@
Vue.component("network-addresses-box", { Vue.component("network-addresses-box", {
props: ["vServerType", "vAddresses"], props: ["v-server-type", "v-addresses", "v-protocol"],
data: function () { data: function () {
let addresses = this.vAddresses let addresses = this.vAddresses
if (addresses == null) { if (addresses == null) {
addresses = [] addresses = []
} }
let protocol = this.vProtocol
if (protocol == null) {
protocol = ""
}
return { return {
addresses: addresses addresses: addresses,
protocol: protocol
} }
}, },
watch: { watch: {
@@ -17,7 +22,7 @@ Vue.component("network-addresses-box", {
methods: { methods: {
addAddr: function () { addAddr: function () {
let that = this let that = this
teaweb.popup("/servers/addPortPopup?serverType=" + this.vServerType, { teaweb.popup("/servers/addPortPopup?serverType=" + this.vServerType + "&protocol=" + this.protocol, {
callback: function (resp) { callback: function (resp) {
var addr = resp.data.address; var addr = resp.data.address;
that.addresses.push(addr); that.addresses.push(addr);

View File

@@ -0,0 +1,46 @@
Vue.component("size-capacity-box", {
props: ["v-name", "v-value", "v-count", "v-unit"],
data: function () {
let v = this.vValue
if (v == null) {
v = {
count: this.vCount,
unit: this.vUnit
}
}
if (typeof (v["count"]) != "number") {
v["count"] = -1
}
return {
"size": v,
countString: (v.count >= 0) ? v.count.toString() : ""
}
},
watch: {
"countString": function (newValue) {
let value = newValue.trim()
if (value.length == 0) {
this.size.count = -1
return
}
let count = parseInt(value)
if (!isNaN(count)) {
this.size.count = count
}
}
},
template: `<div class="ui fields inline">
<input type="hidden" :name="vName" :value="JSON.stringify(size)"/>
<div class="ui field">
<input type="text" v-model="countString" maxlength="11" size="11"/>
</div>
<div class="ui field">
<select class="ui dropdown" v-model="size.unit">
<option value="byte">字节</option>
<option value="kb">KB</option>
<option value="mb">MB</option>
<option value="gb">GB</option>
</select>
</div>
</div>`
})

View File

@@ -0,0 +1,46 @@
Vue.component("gzip-box", {
props: ["v-gzip-config"],
data: function () {
let gzip = this.vGzipConfig
if (gzip == null) {
gzip = {
isOn: true,
level: 0,
minLength: null,
maxLength: null
}
}
return {
gzip: gzip,
}
},
template: `<div>
<table class="ui table selectable definition">
<tr>
<td class="title">压缩级别</td>
<td>
<select class="dropdown auto-width" name="level" v-model="gzip.level">
<option value="0">不压缩</option>
<option v-for="i in 9" :value="i">{{i}}</option>
</select>
<p class="comment">级别越高,压缩比例越大。</p>
</td>
</tr>
<tr>
<td>Gzip内容最小长度</td>
<td>
<size-capacity-box :v-name="'minLength'" :v-value="gzip.minLength" :v-unit="'kb'"></size-capacity-box>
<p class="comment">0表示不限制内容长度从文件尺寸或Content-Length中获取。</p>
</td>
</tr>
<tr>
<td>Gzip内容最大长度</td>
<td>
<size-capacity-box :v-name="'maxLength'" :v-value="gzip.maxLength" :v-unit="'mb'"></size-capacity-box>
<p class="comment">0表示不限制内容长度从文件尺寸或Content-Length中获取。</p>
</td>
</tr>
</table>
</div>`
})

View File

@@ -0,0 +1,37 @@
Vue.component("server-name-box", {
props: ["v-server-names"],
data: function () {
let serverNames = this.vServerNames;
if (serverNames == null) {
serverNames = []
}
return {
serverNames: serverNames
}
},
methods: {
addServerName: function () {
let that = this
teaweb.popup("/servers/addServerNamePopup", {
callback: function (resp) {
var serverName = resp.data.serverName
that.serverNames.push(serverName)
}
});
},
removeServerName: function (index) {
this.serverNames.$remove(index)
}
},
template: `<div>
<input type="hidden" name="serverNames" :value="JSON.stringify(serverNames)"/>
<div v-if="serverNames.length > 0">
<div v-for="(serverName, index) in serverNames" class="ui label small">
<em v-if="serverName.type != 'full'">{{serverName.type}}</em> {{serverName.name}} <a href="" title="删除" @click.prevent="removeServerName(index)"><i class="icon remove"></i></a>
</div>
<div class="ui divider"></div>
</div>
<a href="" @click.prevent="addServerName()">[添加域名绑定]</a>
</div>`
})

View File

@@ -54,14 +54,7 @@
<tr v-if="serverType == 'httpProxy' || serverType == 'httpWeb'"> <tr v-if="serverType == 'httpProxy' || serverType == 'httpWeb'">
<td>绑定域名</td> <td>绑定域名</td>
<td> <td>
<input type="hidden" name="serverNames" :value="JSON.stringify(serverNames)"/> <server-name-box></server-name-box>
<div v-if="serverNames.length > 0">
<div v-for="(serverName, index) in serverNames" class="ui label small">
<em v-if="serverName.type != 'full'">{{serverName.type}}</em> {{serverName.name}} <a href="" title="删除" @click.prevent="removeServerName(index)"><i class="icon remove"></i></a>
</div>
<div class="ui divider"></div>
</div>
<a href="" @click.prevent="addServerName()">[添加域名绑定]</a>
</td> </td>
</tr> </tr>

View File

@@ -1,11 +1,8 @@
Tea.context(function () { Tea.context(function () {
this.serverType = "httpProxy"; this.serverType = "httpProxy";
this.tlsProtocolName = "" this.tlsProtocolName = ""
this.serverNames = [];
this.origins = []; this.origins = [];
this.success = NotifySuccess("保存成功", "/servers"); this.success = NotifySuccess("保存成功", "/servers");
this.changeServerType = function () { this.changeServerType = function () {
@@ -13,22 +10,9 @@ Tea.context(function () {
this.tlsProtocolName = ""; this.tlsProtocolName = "";
}; };
this.addServerName = function () {
teaweb.popup("/servers/addServerNamePopup", {
callback: function (resp) {
var serverName = resp.data.serverName;
this.serverNames.push(serverName);
}
});
};
this.removeServerName = function (index) {
this.serverNames.$remove(index);
};
this.addOrigin = function () { this.addOrigin = function () {
teaweb.popup("/servers/addOriginPopup?serverType=" + this.serverType, { teaweb.popup("/servers/addOriginPopup?serverType=" + this.serverType, {
callback: function (resp){ callback: function (resp) {
this.origins.push(resp.data.origin); this.origins.push(resp.data.origin);
} }
}); });

View File

@@ -3,5 +3,13 @@
{$template "/left_menu"} {$template "/left_menu"}
<div class="right-box"> <div class="right-box">
<p class="ui message">此功能暂未开放,敬请期待。</p> <form class="ui form" data-tea-success="success" data-tea-action="$">
<input type="hidden" name="webId" :value="webId"/>
<input type="hidden" name="gzipId" :value="gzipConfig.id"/>
<gzip-box :v-gzip-config="gzipConfig"></gzip-box>
<div class="margin"></div>
<submit-btn></submit-btn>
</form>
</div> </div>

View File

@@ -0,0 +1,3 @@
Tea.context(function () {
this.success = NotifyReloadSuccess("保存成功")
})

View File

@@ -3,5 +3,17 @@
{$template "/left_menu"} {$template "/left_menu"}
<div class="right-box"> <div class="right-box">
<p class="ui message">此功能暂未开放,敬请期待。</p> <form class="ui form" data-tea-action="$" data-tea-success="success">
<input type="hidden" name="serverId" :value="serverId"/>
<input type="hidden" name="serverType" :value="serverType"/>
<table class="ui table selectable definition">
<tr>
<td class="title">绑定端口 *</td>
<td>
<network-addresses-box :v-server-type="serverType" :v-addresses="httpConfig.addresses" :v-protocol="'http'"></network-addresses-box>
</td>
</tr>
</table>
<submit-btn></submit-btn>
</form>
</div> </div>

View File

@@ -0,0 +1,3 @@
Tea.context(function () {
this.success = NotifyReloadSuccess("保存成功")
})

View File

@@ -3,5 +3,17 @@
{$template "/left_menu"} {$template "/left_menu"}
<div class="right-box"> <div class="right-box">
<p class="ui message">此功能暂未开放,敬请期待。</p> <form class="ui form" data-tea-action="$" data-tea-success="success">
<input type="hidden" name="serverId" :value="serverId"/>
<input type="hidden" name="serverType" :value="serverType"/>
<table class="ui table selectable definition">
<tr>
<td class="title">绑定端口 *</td>
<td>
<network-addresses-box :v-server-type="serverType" :v-addresses="httpsConfig.addresses" :v-protocol="'https'"></network-addresses-box>
</td>
</tr>
</table>
<submit-btn></submit-btn>
</form>
</div> </div>

View File

@@ -0,0 +1,3 @@
Tea.context(function () {
this.success = NotifyReloadSuccess("保存成功")
})

View File

@@ -2,7 +2,12 @@
{$template "/left_menu"} {$template "/left_menu"}
<div class="right-box"> <div class="right-box">
{$template "menu"} {$ if not .isOn}
<div class="ui message">暂未启用反向代理功能,<a href="" @click.prevent="updateOn(true)">[启用]</a></div>
{$end}
{$ if .isOn}
{$template "menu"}
<origin-list-box :v-primary-origins="primaryOrigins" :v-backup-origins="backupOrigins" :v-server-type="serverType" :v-params="'type=server&serverId=' + serverId + '&reverseProxyId=' + reverseProxyId"></origin-list-box> <origin-list-box :v-primary-origins="primaryOrigins" :v-backup-origins="backupOrigins" :v-server-type="serverType" :v-params="'type=server&serverId=' + serverId + '&reverseProxyId=' + reverseProxyId"></origin-list-box>
{$end}
</div> </div>

View File

@@ -0,0 +1,15 @@
Tea.context(function () {
this.updateOn = function (b) {
teaweb.confirm(b ? "确定要启用反向代理服务吗?" : "确定要停用反向代理服务吗?", function () {
this.$post(".updateOn")
.params({
"serverId": this.serverId,
"isOn": b ? 1 : 0,
"reverseProxyId": this.reverseProxyId
})
.success(function () {
window.location.reload()
})
})
}
})

View File

@@ -0,0 +1,17 @@
{$layout}
{$template "/left_menu"}
<div class="right-box">
<form class="ui form" data-tea-action="$" data-tea-success="success">
<input type="hidden" name="serverId" :value="serverId"/>
<table class="ui table definition selectable">
<tr>
<td class="title">已绑定的域名</td>
<td>
<server-name-box :v-server-names="serverNames"></server-name-box>
</td>
</tr>
</table>
<submit-btn></submit-btn>
</form>
</div>

View File

@@ -0,0 +1,3 @@
Tea.context(function () {
this.success = NotifyReloadSuccess("保存成功")
})

View File

@@ -10,7 +10,7 @@
<tr> <tr>
<td class="title">绑定端口 *</td> <td class="title">绑定端口 *</td>
<td> <td>
<network-addresses-box :v-server-type="serverType" :v-addresses="addresses"></network-addresses-box> <network-addresses-box :v-server-type="serverType" :v-addresses="tcpConfig.listen" :v-protocol="'tcp'"></network-addresses-box>
</td> </td>
</tr> </tr>
</table> </table>

View File

@@ -0,0 +1 @@
undefined

View File

@@ -0,0 +1,19 @@
{$layout}
{$template "/left_menu"}
<div class="right-box">
<form class="ui form" data-tea-action="$" data-tea-success="success">
<input type="hidden" name="serverId" :value="serverId"/>
<input type="hidden" name="serverType" :value="serverType"/>
<table class="ui table selectable definition">
<tr>
<td class="title">绑定端口 *</td>
<td>
<network-addresses-box :v-server-type="serverType" :v-addresses="tlsConfig.listen" :v-protocol="'tls'"></network-addresses-box>
</td>
</tr>
</table>
<submit-btn></submit-btn>
</form>
</div>

View File

@@ -0,0 +1,3 @@
Tea.context(function () {
this.success = NotifyReloadSuccess("保存成功")
})

View File

@@ -3,5 +3,17 @@
{$template "/left_menu"} {$template "/left_menu"}
<div class="right-box"> <div class="right-box">
<p class="ui message">此功能暂未开放,敬请期待。</p> <form class="ui form" data-tea-success="success" data-tea-action="$">
<input type="hidden" name="serverId" :value="serverId"/>
<input type="hidden" name="webId" :value="webConfig.id"/>
<table class="ui table selectable definition">
<tr>
<td class="title">Web目录</td>
<td>
<input type="text" name="root" v-model="webConfig.root"/>
</td>
</tr>
</table>
<submit-btn></submit-btn>
</form>
</div> </div>

View File

@@ -0,0 +1,3 @@
Tea.context(function () {
this.success = NotifyReloadSuccess("保存成功")
})