Files
2022-11-17 22:50:05 +08:00

601 lines
14 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package Controllers
import (
"fmt"
"forward-core/Constant"
"forward-core/Models"
"forward-core/Utils"
"forward-server/Controllers/BaseCtrl"
"forward-server/Service"
"github.com/astaxie/beego"
"github.com/astaxie/beego/logs"
)
type ForwardCtrl struct {
BaseCtrl.ConsoleCtrl
}
// @router /u/ForwardList [get]
func (c *ForwardCtrl) ForwardList() {
c.Data["ForWardDebug"] = Service.ForWardDebug
c.TplName = "ucenter/forwardList.html"
}
// @router /u/ForwardList/json [post]
func (c *ForwardCtrl) ForwardListJson() {
pageParam := new(Models.PageParam)
pageParam.PIndex, _ = c.GetInt64("pIndex")
pageParam.PSize, _ = c.GetInt64("pSize")
port, _ := c.GetInt("port")
targetAddr := c.GetString("targetAddr", "")
targetPort, _ := c.GetInt("targetPort")
query := &Models.PortForward{}
query.Port = port
query.TargetAddr = targetAddr
query.TargetPort = targetPort
query.FType = -1
pageData := Service.SysDataS.GetPortForwardList(query, pageParam.PIndex, pageParam.PSize)
for _, entity := range pageData.Data.([]*Models.PortForward) {
forwardJob := Service.SysDataS.GetForwardJob(entity)
//entity.Status = Utils.If(forwardJob!=nil, int(forwardJob.Status), 0).(int)
if forwardJob != nil {
entity.Status = int(forwardJob.Status)
} else {
entity.Status = 0
}
}
c.Data["json"] = Models.FuncResult{Code: 0, Msg: "success", Data: pageData}
c.ServeJSON()
}
// @router /u/AddForward [get,post]
func (c *ForwardCtrl) AddForward() {
entity := Models.PortForward{}
entity.Status = 1
c.Data["entity"] = entity
c.TplName = "ucenter/forwardForm.html"
}
// @router /u/EditForward [get,post]
func (c *ForwardCtrl) EditForward() {
id, _ := c.GetInt("id")
entity := Service.SysDataS.GetPortForwardById(id)
c.Data["entity"] = entity
c.TplName = "ucenter/forwardForm.html"
}
// @router /u/DelForward [post]
func (c *ForwardCtrl) DelForward() {
ids := c.GetString("ids")
var idArray []int
for _, id := range Utils.Split(ids, ",") {
_id := Utils.ToInt(id)
//检查是否正在转发中
entity := Service.SysDataS.GetPortForwardById(_id)
forwardJob := Service.SysDataS.GetForwardJob(entity)
if forwardJob != nil && forwardJob.Status == Constant.RunStatus_Running {
c.Data["json"] = Models.FuncResult{Code: 1, Msg: fmt.Sprint("[", entity.Name, "] 正在转发中,不能删除")}
c.ServeJSON()
return
} else {
idArray = append(idArray, _id)
}
}
err := Service.SysDataS.DelPortForwards(idArray)
if err == nil {
//
c.Data["json"] = Models.FuncResult{Code: 0, Msg: "success"}
} else {
c.Data["json"] = Models.FuncResult{Code: 1, Msg: err.Error()}
logs.Error("DelForward err", err)
}
c.ServeJSON()
}
// @router /u/SaveForward [post]
func (c *ForwardCtrl) SaveForward() {
id, _ := c.GetInt("id")
name := c.GetString("name", "")
addr := c.GetString("addr", "")
port, _ := c.GetInt("port")
protocol := c.GetString("protocol", "TCP")
targetAddr := c.GetString("targetAddr", "")
targetPort, _ := c.GetInt("targetPort")
others := c.GetString("others", "")
fType, _ := c.GetInt("fType")
status, _ := c.GetInt("status")
if Utils.IsEmpty(name) {
//
//c.Data["json"] = Models.FuncResult{Code: 1, Msg: "名称 不能为空"}
//c.ServeJSON()
//return
name = "-"
}
if port < 0 || port > 65535 {
//
c.Data["json"] = Models.FuncResult{Code: 1, Msg: "监听端口 不在允许的范围"}
c.ServeJSON()
return
}
if Utils.IsEmpty(targetAddr) {
//
c.Data["json"] = Models.FuncResult{Code: 1, Msg: "目标地址 不能为空"}
c.ServeJSON()
return
}
if targetPort < 0 || targetPort > 65535 {
//
c.Data["json"] = Models.FuncResult{Code: 1, Msg: "目标端口 不在允许的范围"}
c.ServeJSON()
return
}
if status != 0 && status != 1 {
//
c.Data["json"] = Models.FuncResult{Code: 1, Msg: "输入的 启用/禁用 值不正确"}
c.ServeJSON()
return
}
// if Utils.IsNotEmpty(others) {
// //如果有others信息,则检查
// }
if fType > 0 {
//内网穿透模式,暂不支持多端口分发
others = ""
}
if id > 0 {
entity := Service.SysDataS.GetPortForwardById(id)
forwardJob := Service.SysDataS.GetForwardJob(entity)
if forwardJob != nil && forwardJob.Status == Constant.RunStatus_Running {
//正在转发中,修改前先关闭
c.Data["json"] = Models.FuncResult{Code: 1, Msg: fmt.Sprint("[", entity.Name, "] 正在转发中,不能修改")}
c.ServeJSON()
return
}
}
name = Utils.FilterHtml(name)
entity := &Models.PortForward{}
entity.Id = id
entity.Name = name
entity.Addr = addr
entity.Port = port
entity.Protocol = protocol
entity.TargetAddr = targetAddr
entity.TargetPort = targetPort
entity.Others = others
entity.FType = fType
entity.Status = status
err := Service.SysDataS.SavePortForward(entity)
if err == nil {
c.Data["json"] = Models.FuncResult{Code: 0, Msg: ""}
} else {
logs.Error("SaveForward ", err.Error())
c.Data["json"] = Models.FuncResult{Code: 1, Msg: err.Error()}
}
c.ServeJSON()
}
// @router /u/OpenForward [get,post]
func (c *ForwardCtrl) OpenForward() {
id, _ := c.GetInt("id")
entity := Service.SysDataS.GetPortForwardById(id)
resultChan := make(chan Models.FuncResult)
config := Service.SysDataS.ToForwardConfig(entity)
go Service.ForWardServ.OpenForward(config, resultChan)
c.Data["json"] = <-resultChan
c.ServeJSON()
}
// @router /u/CloseForward [get,post]
func (c *ForwardCtrl) CloseForward() {
id, _ := c.GetInt("id")
entity := Service.SysDataS.GetPortForwardById(id)
config := Service.SysDataS.ToForwardConfig(entity)
Service.ForWardServ.CloseForward(config)
c.Data["json"] = Models.FuncResult{Code: 0, Msg: ""}
c.ServeJSON()
}
// @router /u/OpenAllForward [get,post]
func (c *ForwardCtrl) OpenAllForward() {
forwards := Service.SysDataS.GetAllPortForwardList(1)
for _, entity := range forwards {
resultChan := make(chan Models.FuncResult)
forwardJob := Service.SysDataS.GetForwardJob(entity)
if forwardJob != nil && forwardJob.Status == Constant.RunStatus_Running {
//正在转发中
continue
}
config := Service.SysDataS.ToForwardConfig(entity)
go Service.ForWardServ.OpenForward(config, resultChan)
fmt.Println(<-resultChan)
}
c.Data["json"] = Models.FuncResult{Code: 0, Msg: ""}
c.ServeJSON()
}
// @router /u/CloseAllForward [get,post]
func (c *ForwardCtrl) CloseAllForward() {
//forwards := Service.SysDataS.GetAllPortForwardList(1)
//for _, entity := range forwards {
// config := Service.SysDataS.ToForwardConfig(entity)
// Service.ForWardServ.CloseForward(config)
//}
Service.ForWardServ.CloseAllForward()
c.Data["json"] = Models.FuncResult{Code: 0, Msg: ""}
c.ServeJSON()
}
// @router /u/ApiDoc [get]
func (c *ForwardCtrl) ApiDoc() {
c.TplName = "ucenter/apiDoc.html"
}
// @router /u/NetAgent [get]
func (c *ForwardCtrl) NetAgent() {
magicAddr := beego.AppConfig.DefaultString("magic.service", ":7000")
c.Data["magicAddr"] = magicAddr
agentForward := Service.MagicServ.ForwardInfo
if agentForward == nil {
agentForward = new(Models.PortForward)
agentForward.Addr = ""
agentForward.Port = 3307
agentForward.Protocol = "TCP"
agentForward.TargetAddr = "127.0.0.1"
agentForward.TargetPort = 3306
agentForward.FType = 2
}
c.Data["agentForward"] = agentForward
c.TplName = "ucenter/netAgent.html"
}
// @router /u/OpenMagicService [post]
func (c *ForwardCtrl) OpenMagicService() {
addr := beego.AppConfig.DefaultString("magic.service", ":7000")
resultChan := make(chan Models.FuncResult)
go Service.MagicServ.StartMagicService(addr, resultChan)
c.Data["json"] = <-resultChan
//c.Data["json"] = Models.FuncResult{Code: 0, Msg: ""}
c.ServeJSON()
}
// @router /u/CloseMagicService [post]
func (c *ForwardCtrl) CloseMagicService() {
resultChan := make(chan Models.FuncResult)
go Service.MagicServ.StopMagicService(resultChan)
c.Data["json"] = <-resultChan
c.ServeJSON()
}
// @router /u/GetMagicStatus [post]
func (c *ForwardCtrl) GetMagicStatus() {
magicListener := Service.MagicServ.GetMagicListener()
if magicListener == nil {
c.Data["json"] = Models.FuncResult{Code: 1, Msg: "未运行"}
} else {
c.Data["json"] = Models.FuncResult{Code: 0, Msg: "正在运行中..."}
}
c.ServeJSON()
}
// @router /u/GetNetAgentStatus [post]
func (c *ForwardCtrl) GetNetAgentStatus() {
agentMap := Service.MagicServ.GetMagicClient()
if len(agentMap) > 0 {
count := len(agentMap)
for k, _ := range agentMap {
c.Data["json"] = Models.FuncResult{Code: 0, Msg: k, Data: count}
//只取1个先
break
}
} else {
c.Data["json"] = Models.FuncResult{Code: 1, Msg: "未检测到Agent连接"}
}
c.ServeJSON()
}
// @router /u/ClearNetAgentStatus [post]
func (c *ForwardCtrl) ClearNetAgentStatus() {
agentMap := Service.MagicServ.GetMagicClient()
if len(agentMap) > 0 {
for k, v := range agentMap {
if v != nil {
v.Close()
Service.MagicServ.UnRegistryMagicClient(k)
logs.Debug("关闭Agent", k)
}
}
}
c.Data["json"] = Models.FuncResult{Code: 0, Msg: ""}
c.ServeJSON()
}
// @router /u/StartAgentJob [post]
func (c *ForwardCtrl) StartAgentJob() {
lAddr := c.GetString("lAddr", "")
protocol := c.GetString("protocol", "TCP")
targetAddr := c.GetString("targetAddr", "")
fType, _ := c.GetInt("fType")
portForward := new(Models.PortForward)
portForward.Addr = Utils.Split(lAddr, ":")[0]
portForward.Port = Utils.ToInt(Utils.Split(lAddr, ":")[1])
portForward.Protocol = protocol
portForward.TargetAddr = Utils.Split(targetAddr, ":")[0]
portForward.TargetPort = Utils.ToInt(Utils.Split(targetAddr, ":")[1])
portForward.FType = fType
resultChan := make(chan Models.FuncResult)
go Service.MagicServ.StartMagicForward(portForward, resultChan)
c.Data["json"] = <-resultChan
c.ServeJSON()
}
// @router /u/StopAgentJob [post]
func (c *ForwardCtrl) StopAgentJob() {
c.Data["json"] = Models.FuncResult{Code: 0, Msg: ""}
c.ServeJSON()
}
// @router /u/ChangeForwardDebug [get,post]
func (c *ForwardCtrl) ChangeForwardDebug() {
id, _ := c.GetInt("status")
Service.ForWardDebug = Utils.If(id == 1, true, false).(bool)
c.Data["json"] = Models.FuncResult{Code: 0, Msg: ""}
c.ServeJSON()
}
// @router /u/AddBatchForward [get]
func (c *ForwardCtrl) AddBatchForward() {
c.TplName = "ucenter/addBatchForward.html"
}
// @router /u/SaveBatchForward [post]
func (c *ForwardCtrl) SaveBatchForward() {
rows, _ := c.GetInt("rows")
var entities []*Models.PortForward
for i := 0; i < rows; i++ {
name := c.GetString(fmt.Sprint("name[", i, "]"), "-")
port, _ := c.GetInt(fmt.Sprint("port[", i, "]"))
protocol := c.GetString(fmt.Sprint("protocol[", i, "]"), "TCP")
targetAddr := c.GetString(fmt.Sprint("targetAddr[", i, "]"), "")
targetPort, _ := c.GetInt(fmt.Sprint("targetPort[", i, "]"))
if port < 0 || port > 65535 {
//
c.Data["json"] = Models.FuncResult{Code: 1, Msg: fmt.Sprint("监听端口 不在允许的范围 ", port)}
c.ServeJSON()
return
}
if targetPort < 0 || targetPort > 65535 {
//
c.Data["json"] = Models.FuncResult{Code: 1, Msg: fmt.Sprint("目标端口 不在允许的范围 ", targetPort)}
c.ServeJSON()
return
}
if Utils.IsEmpty(targetAddr) {
//
c.Data["json"] = Models.FuncResult{Code: 1, Msg: "目标地址 不能为空"}
c.ServeJSON()
return
}
name = Utils.FilterHtml(name)
entity := &Models.PortForward{}
entity.Id = 0
entity.Name = name
entity.Addr = ""
entity.Port = port
entity.Protocol = protocol
entity.TargetAddr = targetAddr
entity.TargetPort = targetPort
entity.Others = ""
entity.FType = 0
entity.Status = 1
entities = append(entities, entity)
}
for _, entity := range entities {
err := Service.SysDataS.SavePortForward(entity)
if err != nil {
logs.Error("SaveForward ", err.Error())
}
}
c.Data["json"] = Models.FuncResult{Code: 0, Msg: ""}
c.ServeJSON()
}
// @router /u/ImportForward [get]
func (c *ForwardCtrl) ImportForward() {
c.TplName = "ucenter/importForward.html"
}
// @router /u/SaveImportForward [post]
func (c *ForwardCtrl) SaveImportForward() {
splitChar := c.GetString("splitChar", ",")
inputDatas := c.GetString("inputDatas", "")
if Utils.IsEmpty(inputDatas) {
//
c.Data["json"] = Models.FuncResult{Code: 1, Msg: "导入的数据不能为空"}
c.ServeJSON()
return
}
dataRows := Utils.Split(inputDatas, "\n")
var entities []*Models.PortForward
for _, rowContent := range dataRows {
if Utils.IsEmpty(rowContent) {
continue
}
//名称,本地监听地址,本地监听端口,协议类型,目标地址,目标端口
rowDatas := Utils.Split(rowContent, splitChar)
if len(rowDatas) < 6 {
continue
}
name := rowDatas[0]
name = Utils.FilterHtml(name)
if Utils.IsEmpty(name) {
name = "-"
}
addr := rowDatas[1]
port := Utils.ToInt(rowDatas[2])
protocol := Utils.If(rowDatas[3] == "TCP", "TCP", "UDP").(string)
targetAddr := rowDatas[4]
targetPort := Utils.ToInt(rowDatas[5])
if Utils.IsEmpty(targetAddr) {
//
c.Data["json"] = Models.FuncResult{Code: 1, Msg: "目标地址 不能为空"}
c.ServeJSON()
return
}
if port < 0 || port > 65535 {
//
c.Data["json"] = Models.FuncResult{Code: 1, Msg: fmt.Sprint("监听端口 不在允许的范围 ", port)}
c.ServeJSON()
return
}
if targetPort < 0 || targetPort > 65535 {
//
c.Data["json"] = Models.FuncResult{Code: 1, Msg: fmt.Sprint("目标端口 不在允许的范围 ", targetPort)}
c.ServeJSON()
return
}
entity := &Models.PortForward{}
entity.Id = 0
entity.Name = name
entity.Addr = addr
entity.Port = port
entity.Protocol = protocol
entity.TargetAddr = targetAddr
entity.TargetPort = targetPort
entity.Others = ""
entity.FType = 0
entity.Status = 1
entities = append(entities, entity)
}
for _, entity := range entities {
err := Service.SysDataS.SavePortForward(entity)
if err != nil {
logs.Error("SaveForward ", err.Error())
}
}
c.Data["json"] = Models.FuncResult{Code: 0, Msg: ""}
c.ServeJSON()
}