mirror of
https://github.com/tavenli/port-forward.git
synced 2024-04-21 12:42:13 +00:00
601 lines
14 KiB
Go
601 lines
14 KiB
Go
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()
|
||
}
|