From 9f6b33a62b97c925b784d6432f970706304fad28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Fri, 15 Feb 2019 22:59:28 +0800 Subject: [PATCH] =?UTF-8?q?Url=E8=B7=AF=E7=94=B1=20=E6=B3=9B=E8=A7=A3?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- bridge/bridge.go | 34 ++++++++++++++---- client/client.go | 37 ++++++++++--------- client/client_test.go | 2 +- conf/app.conf | 2 +- conf/clients.csv | 1 + conf/hosts.csv | 1 + conf/npc.conf | 45 ++++++++++++----------- lib/common/util.go | 42 +++++++++++++++++++++- lib/config/config.go | 2 +- lib/conn/conn.go | 6 ++-- lib/conn/link.go | 1 - lib/file/file.go | 73 ++++++++++++++++++++++++++++++++------ lib/file/obj.go | 5 ++- server/proxy/http.go | 24 +++++++------ server/proxy/socks5.go | 10 ++---- server/server.go | 25 +++++++------ server/tool/utils.go | 32 ++--------------- web/controllers/client.go | 2 +- web/controllers/index.go | 33 +++++++++-------- web/views/index/add.html | 4 +-- web/views/index/edit.html | 4 +-- web/views/index/hadd.html | 4 +++ web/views/index/hedit.html | 9 +++-- web/views/index/hlist.html | 16 +++++---- web/views/index/index.html | 2 +- 26 files changed, 262 insertions(+), 156 deletions(-) diff --git a/README.md b/README.md index 2adf649..db88970 100644 --- a/README.md +++ b/README.md @@ -326,7 +326,7 @@ nps.exe test|start|stop|restart|status - 服务端 ``` -./nps -mode=tunnelServer -vkey=DKibZF5TXvic1g3kY -tcpport=8284 -httpport=8024 -target=10.1.50.203:80 +./nps -mode=tcpServer -vkey=DKibZF5TXvic1g3kY -tcpport=8284 -httpport=8024 -target=10.1.50.203:80 ``` 名称 | 含义 diff --git a/bridge/bridge.go b/bridge/bridge.go index 6b08d5b..ac34d5f 100755 --- a/bridge/bridge.go +++ b/bridge/bridge.go @@ -314,15 +314,37 @@ func (s *Bridge) GetConfig(c *conn.Conn) { c.WriteAddFail() break } else { - t.Client = client - file.GetCsvDb().NewTask(t) - if b := tool.TestServerPort(t.Port, t.Mode); !b { + ports := common.GetPorts(t.Ports) + targets := common.GetPorts(t.Target) + if len(ports) > 1 && (t.Mode == "tcpServer" || t.Mode == "udpServer") && (len(ports) != len(targets)) { fail = true c.WriteAddFail() - } else { - s.OpenTask <- t + break + } + for i := 0; i < len(ports); i++ { + tl := new(file.Tunnel) + tl.Mode = t.Mode + tl.Port = ports[i] + if len(ports) == 1 { + tl.Target = t.Target + } else { + tl.Target = strconv.Itoa(targets[i]) + } + tl.Id = file.GetCsvDb().GetTaskId() + tl.Status = true + tl.Flow = new(file.Flow) + tl.Remark = t.Remark + tl.NoStore = true + tl.Client = client + file.GetCsvDb().NewTask(tl) + if b := tool.TestServerPort(tl.Port, tl.Mode); !b { + fail = true + c.WriteAddFail() + } else { + s.OpenTask <- tl + } + c.WriteAddOk() } - c.WriteAddOk() } } } diff --git a/client/client.go b/client/client.go index a7b3a8f..2f0988b 100755 --- a/client/client.go +++ b/client/client.go @@ -54,7 +54,9 @@ func (s *TRPClient) Close() { s.tunnel.Close() s.stop <- true for _, v := range s.linkMap { - v.Stop <- true + if v.Conn != nil { + v.Conn.Close() + } } } @@ -74,7 +76,6 @@ func (s *TRPClient) processor(c *conn.Conn) { if link, err := c.GetLinkInfo(); err != nil { break } else { - link.Stop = make(chan bool) s.Lock() s.linkMap[link.Id] = link s.Unlock() @@ -95,6 +96,7 @@ func (s *TRPClient) processor(c *conn.Conn) { } func (s *TRPClient) linkProcess(link *conn.Link, c *conn.Conn) { + link.Host = common.FormatAddress(link.Host) //与目标建立连接 server, err := net.DialTimeout(link.ConnType, link.Host, time.Second*3) @@ -106,26 +108,23 @@ func (s *TRPClient) linkProcess(link *conn.Link, c *conn.Conn) { c.WriteSuccess(link.Id) - go func() { - link.Conn = conn.NewConn(server) - buf := pool.BufPoolCopy.Get().([]byte) - for { - if n, err := server.Read(buf); err != nil { - s.tunnel.SendMsg([]byte(common.IO_EOF), link) + link.Conn = conn.NewConn(server) + buf := pool.BufPoolCopy.Get().([]byte) + for { + if n, err := server.Read(buf); err != nil { + s.tunnel.SendMsg([]byte(common.IO_EOF), link) + break + } else { + if _, err := s.tunnel.SendMsg(buf[:n], link); err != nil { + c.Close() break - } else { - if _, err := s.tunnel.SendMsg(buf[:n], link); err != nil { - c.Close() - break - } } } - pool.PutBufPoolCopy(buf) - s.Lock() - delete(s.linkMap, link.Id) - s.Unlock() - }() - <-link.Stop + } + pool.PutBufPoolCopy(buf) + s.Lock() + delete(s.linkMap, link.Id) + s.Unlock() } //隧道模式处理 diff --git a/client/client_test.go b/client/client_test.go index 4b88dea..aa51af4 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -43,7 +43,7 @@ func TestConfig(t *testing.T) { } tunnel := &file.Tunnel{ Port: 9001, - Mode: "tunnelServer", + Mode: "tcpServer", Target: "127.0.0.1:8082", Remark: "333", } diff --git a/conf/app.conf b/conf/app.conf index 5b869f7..9e55cc4 100755 --- a/conf/app.conf +++ b/conf/app.conf @@ -37,4 +37,4 @@ bridgeType=tcp publicVkey=123 #Open ports allowed on the server side -allowPorts=9001-9009,10001,11000-12000 \ No newline at end of file +allowPorts=9001-9100,10001,11000-12000 \ No newline at end of file diff --git a/conf/clients.csv b/conf/clients.csv index e69de29..ab4f932 100644 --- a/conf/clients.csv +++ b/conf/clients.csv @@ -0,0 +1 @@ +7,7hv3avgeg2ldzvx7,,true,,,0,,0,0 diff --git a/conf/hosts.csv b/conf/hosts.csv index e69de29..8d7d25d 100644 --- a/conf/hosts.csv +++ b/conf/hosts.csv @@ -0,0 +1 @@ +a.o.com,127.0.0.1:8080,7,,,,,1 diff --git a/conf/npc.conf b/conf/npc.conf index 3699e98..e834271 100644 --- a/conf/npc.conf +++ b/conf/npc.conf @@ -2,32 +2,35 @@ server=127.0.0.1:8284 tp=tcp vkey=123 -username=111 -password=222 compress=snappy crypt=true auto_reconnection=true + [web1] host=a.o.com -host_change=www.sina.com -target=127.0.0.1:8080,127.0.0.1:8082 -header_cookkile=122123 -header_user-Agent=122123 +host_change=www.proxy.com +target=127.0.0.1:8080 + [web2] -host=www.baidu.com -host_change=www.sina.com +host=a.proxy.com target=127.0.0.1:8080,127.0.0.1:8082 -header_cookkile="122123" -header_user-Agent=122123 -[tunnel1] +host_change=www.proxy.com +header_set_proxy=nps + +[tcp] +mode=tcpServer +target=8001-8005,8006 +port=9001-9005,9006 + +[socks5] +mode=socks5Server +port=9007 + +[http] +mode=httpProxyServer +port=9008 + +[udp] mode=udpServer -target=127.0.0.1:8080 -port=9001 -[tunnel2] -mode=tunnelServer -target=127.0.0.1:8080 -port=9001 -[tunnel3] -mode=tunnelServer -target=127.0.0.1:8080 -port=9002 \ No newline at end of file +port=9009 +target=114.114.114.114:53 diff --git a/lib/common/util.go b/lib/common/util.go index dbaf605..9534a94 100755 --- a/lib/common/util.go +++ b/lib/common/util.go @@ -200,4 +200,44 @@ func InIntArr(arr []int, val int) bool { } } return false -} \ No newline at end of file +} + +func GetPorts(p string) []int { + var ps []int + arr := strings.Split(p, ",") + for _, v := range arr { + fw := strings.Split(v, "-") + if len(fw) == 2 { + if IsPort(fw[0]) && IsPort(fw[1]) { + start, _ := strconv.Atoi(fw[0]) + end, _ := strconv.Atoi(fw[1]) + for i := start; i <= end; i++ { + ps = append(ps, i) + } + } else { + continue + } + } else if IsPort(v) { + p, _ := strconv.Atoi(v) + ps = append(ps, p) + } + } + return ps +} +func IsPort(p string) bool { + pi, err := strconv.Atoi(p) + if err != nil { + return false + } + if pi > 65536 || pi < 1 { + return false + } + return true +} + +func FormatAddress(s string) string { + if strings.Contains(s, ":") { + return s + } + return "127.0.0.1:" + s +} diff --git a/lib/config/config.go b/lib/config/config.go index 6815b9f..5c87527 100644 --- a/lib/config/config.go +++ b/lib/config/config.go @@ -136,7 +136,7 @@ func dealTunnel(s string) *file.Tunnel { } switch item[0] { case "port": - t.Port = common.GetIntNoErrByStr(item[1]) + t.Ports = item[1] case "mode": t.Mode = item[1] case "target": diff --git a/lib/conn/conn.go b/lib/conn/conn.go index 420ed54..5594b77 100755 --- a/lib/conn/conn.go +++ b/lib/conn/conn.go @@ -82,7 +82,7 @@ func (s *Conn) ReadLen(cLen int) ([]byte, error) { defer pool.BufPoolMax.Put(buf) } if n, err := io.ReadFull(s, buf); err != nil || n != cLen { - return buf, errors.New("读取指定长度错误" + err.Error()) + return buf, errors.New("Error reading specified length" + err.Error()) } return buf, nil } @@ -368,7 +368,7 @@ func (s *Conn) SendTaskInfo(t *file.Tunnel) (int, error) { */ raw := bytes.NewBuffer([]byte{}) binary.Write(raw, binary.LittleEndian, []byte(common.NEW_TASK)) - common.BinaryWrite(raw, t.Mode, strconv.Itoa(t.Port), t.Target, t.Remark) + common.BinaryWrite(raw, t.Mode, t.Ports, t.Target, t.Remark) s.Lock() defer s.Unlock() return s.Write(raw.Bytes()) @@ -386,7 +386,7 @@ func (s *Conn) GetTaskInfo() (t *file.Tunnel, err error) { arr := strings.Split(string(b), common.CONN_DATA_SEQ) t = new(file.Tunnel) t.Mode = arr[0] - t.Port, _ = strconv.Atoi(arr[1]) + t.Ports = arr[1] t.Target = arr[2] t.Id = file.GetCsvDb().GetTaskId() t.Status = true diff --git a/lib/conn/link.go b/lib/conn/link.go index e762820..9f50681 100644 --- a/lib/conn/link.go +++ b/lib/conn/link.go @@ -18,7 +18,6 @@ type Link struct { UdpListener *net.UDPConn Rate *rate.Rate UdpRemoteAddr *net.UDPAddr - Stop chan bool } func NewLink(id int, connType string, host string, en, de int, crypt bool, c *Conn, flow *file.Flow, udpListener *net.UDPConn, rate *rate.Rate, UdpRemoteAddr *net.UDPAddr) *Link { diff --git a/lib/file/file.go b/lib/file/file.go index d2f753a..bad041d 100644 --- a/lib/file/file.go +++ b/lib/file/file.go @@ -6,8 +6,10 @@ import ( "github.com/cnlh/nps/lib/common" "github.com/cnlh/nps/lib/lg" "github.com/cnlh/nps/lib/rate" + "net/http" "os" "path/filepath" + "regexp" "strconv" "strings" "sync" @@ -27,6 +29,7 @@ type Csv struct { RunPath string //存储根目录 ClientIncreaseId int //客户端id TaskIncreaseId int //任务自增ID + HostIncreaseId int sync.Mutex } @@ -119,6 +122,12 @@ func (s *Csv) GetTaskId() int { s.TaskIncreaseId++ return s.TaskIncreaseId } +func (s *Csv) GetHostId() int { + s.Lock() + defer s.Unlock() + s.HostIncreaseId++ + return s.HostIncreaseId +} func (s *Csv) GetIdByVerifyKey(vKey string, addr string) (int, error) { s.Lock() @@ -195,6 +204,8 @@ func (s *Csv) StoreHostToCsv() { host.HeaderChange, host.HostChange, host.Remark, + host.Location, + strconv.Itoa(host.Id), } err1 := writer.Write(record) if err1 != nil { @@ -256,19 +267,24 @@ func (s *Csv) LoadHostFromCsv() { HeaderChange: item[3], HostChange: item[4], Remark: item[5], + Location: item[6], + Id: common.GetIntNoErrByStr(item[7]), } if post.Client, err = s.GetClient(common.GetIntNoErrByStr(item[2])); err != nil { continue } post.Flow = new(Flow) hosts = append(hosts, post) + if post.Id > s.HostIncreaseId { + s.HostIncreaseId = post.Id + } } s.Hosts = hosts } -func (s *Csv) DelHost(host string) error { +func (s *Csv) DelHost(id int) error { for k, v := range s.Hosts { - if v.Host == host { + if v.Id == id { s.Hosts = append(s.Hosts[:k], s.Hosts[k+1:]...) s.StoreHostToCsv() return nil @@ -287,9 +303,6 @@ func (s *Csv) IsHostExist(host string) bool { } func (s *Csv) NewHost(t *Host) { - if s.IsHostExist(t.Host) { - return - } t.Flow = new(Flow) s.Hosts = append(s.Hosts, t) s.StoreHostToCsv() @@ -367,7 +380,7 @@ func (s *Csv) UpdateClient(t *Client) error { return nil } } - return errors.New("不存在") + return errors.New("该客户端不存在") } func (s *Csv) GetClientList(start, length int) ([]*Client, int) { @@ -407,16 +420,54 @@ func (s *Csv) GetClientIdByVkey(vkey string) (id int, err error) { return } -//get key by host from x -func (s *Csv) GetInfoByHost(host string) (h *Host, err error) { +func (s *Csv) GetHostById(id int) (h *Host, err error) { for _, v := range s.Hosts { - s := strings.Split(host, ":") - if s[0] == v.Host { + if v.Id == id { h = v return } } - err = errors.New("未找到host对应的内网目标") + err = errors.New("The host could not be parsed") + return +} + +//get key by host from x +func (s *Csv) GetInfoByHost(host string, r *http.Request) (h *Host, err error) { + var hosts []*Host + for _, v := range s.Hosts { + //Remove http(s) http(s)://a.proxy.com + //*.proxy.com *.a.proxy.com Do some pan-parsing + tmp := strings.Replace(v.Host, "*", `\w+?`, -1) + var re *regexp.Regexp + if re, err = regexp.Compile(tmp); err != nil { + return + } + if len(re.FindAllString(host, -1)) > 0 { + //URL routing + hosts = append(hosts, v) + } + } + for _, v := range hosts { + //If not set, default matches all + if v.Location == "" { + v.Location = "/" + } + if strings.Index(r.RequestURI, v.Location) == 0 { + if h == nil || (len(v.Location) > len(h.Location)) { + h = v + } + } + } + if h != nil { + if h.Location != "/" { + r.RequestURI = strings.Replace(r.RequestURI, h.Location, "", 1) + } + if r.RequestURI == "" { + r.RequestURI = "/" + } + return + } + err = errors.New("The host could not be parsed") return } func (s *Csv) StoreClientsToCsv() { diff --git a/lib/file/obj.go b/lib/file/obj.go index f20c07e..bbb4253 100644 --- a/lib/file/obj.go +++ b/lib/file/obj.go @@ -64,12 +64,13 @@ func (s *Client) GetId() int { type Tunnel struct { Id int //Id - Port int //服务端监听端口 + Port int //服务端监听端口 Mode string //启动方式 Target string //目标 Status bool //设置是否开启 RunStatus bool //当前运行状态 Client *Client //所属客户端id + Ports string //客户端与服务端传递 Flow *Flow Remark string //备注 NoStore bool @@ -85,10 +86,12 @@ type Config struct { } type Host struct { + Id int Host string //启动方式 Target string //目标 HeaderChange string //host修改 HostChange string //host修改 + Location string //url 路由 Flow *Flow Client *Client Remark string //备注 diff --git a/server/proxy/http.go b/server/proxy/http.go index a66a06a..7bcaf3c 100644 --- a/server/proxy/http.go +++ b/server/proxy/http.go @@ -110,19 +110,22 @@ func (s *httpServer) handleTunneling(w http.ResponseWriter, r *http.Request) { func (s *httpServer) process(c *conn.Conn, r *http.Request) { //多客户端域名代理 var ( - isConn = true - lk *conn.Link - host *file.Host - tunnel *conn.Conn - err error + isConn = true + lk *conn.Link + host *file.Host + tunnel *conn.Conn + lastHost *file.Host + err error ) for { - //首次获取conn + if host, err = file.GetCsvDb().GetInfoByHost(r.Host, r); err != nil { + lg.Printf("the url %s %s is not found !", r.Host, r.RequestURI) + break + } else if host != lastHost { + lastHost = host + isConn = true + } if isConn { - if host, err = file.GetCsvDb().GetInfoByHost(r.Host); err != nil { - lg.Printf("the host %s is not found !", r.Host) - break - } //流量限制 if host.Client.Flow.FlowLimit > 0 && (host.Client.Flow.FlowLimit<<20) < (host.Client.Flow.ExportFlow+host.Client.Flow.InletFlow) { break @@ -147,6 +150,7 @@ func (s *httpServer) process(c *conn.Conn, r *http.Request) { //根据设定,修改header和host common.ChangeHostAndHeader(r, host.HostChange, host.HeaderChange, c.Conn.RemoteAddr().String()) b, err := httputil.DumpRequest(r, true) + lg.Println(string(b), r.RequestURI) if err != nil { break } diff --git a/server/proxy/socks5.go b/server/proxy/socks5.go index d23330d..5e07825 100755 --- a/server/proxy/socks5.go +++ b/server/proxy/socks5.go @@ -49,7 +49,6 @@ const ( type Sock5ModeServer struct { server - isVerify bool listener net.Listener } @@ -208,12 +207,12 @@ func (s *Sock5ModeServer) handleConn(c net.Conn) { c.Close() return } - if s.isVerify { + if s.task.Client.Cnf.U != "" && s.task.Client.Cnf.P != "" { buf[1] = UserPassAuth c.Write(buf) if err := s.Auth(c); err != nil { c.Close() - lg.Println("验证失败:", err) + lg.Println("Validation failed:", err) return } } else { @@ -289,10 +288,5 @@ func NewSock5ModeServer(bridge *bridge.Bridge, task *file.Tunnel) *Sock5ModeServ s := new(Sock5ModeServer) s.bridge = bridge s.task = task - if s.task.Client.Cnf.U != "" && s.task.Client.Cnf.P != "" { - s.isVerify = true - } else { - s.isVerify = false - } return s } diff --git a/server/server.go b/server/server.go index 120ed91..866fb3a 100644 --- a/server/server.go +++ b/server/server.go @@ -69,7 +69,7 @@ func StartNewServer(bridgePort int, cnf *file.Tunnel, bridgeType string) { //new a server by mode name func NewMode(Bridge *bridge.Bridge, c *file.Tunnel) interface{} { switch c.Mode { - case "tunnelServer": + case "tcpServer": return proxy.NewTunnelModeServer(proxy.ProcessTunnel, Bridge, c) case "socks5Server": return proxy.NewSock5ModeServer(Bridge, c) @@ -96,12 +96,15 @@ func NewMode(Bridge *bridge.Bridge, c *file.Tunnel) interface{} { //stop server func StopServer(id int) error { if v, ok := RunList[id]; ok { - reflect.ValueOf(v).MethodByName("Close").Call(nil) - if t, err := file.GetCsvDb().GetTask(id); err != nil { - return err - } else { - t.Status = false - file.GetCsvDb().UpdateTask(t) + if reflect.ValueOf(v).IsValid() { + //TODO 错误处理 + reflect.ValueOf(v).MethodByName("Close").Call(nil) + if t, err := file.GetCsvDb().GetTask(id); err != nil { + return err + } else { + t.Status = false + file.GetCsvDb().UpdateTask(t) + } } delete(RunList, id) return nil @@ -113,7 +116,7 @@ func StopServer(id int) error { func AddTask(t *file.Tunnel) error { if b := tool.TestServerPort(t.Port, t.Mode); !b && t.Mode != "httpHostServer" { lg.Printf("taskId %d start error Port %d Open Failed", t.Id, t.Port) - return errors.New("error") + return errors.New("the port open error") } if svr := NewMode(Bridge, t); svr != nil { RunList[t.Id] = svr @@ -226,7 +229,7 @@ func DelTunnelAndHostByClientId(clientId int) { } for _, v := range file.GetCsvDb().Hosts { if v.Client.Id == clientId { - file.GetCsvDb().DelHost(v.Host) + file.GetCsvDb().DelHost(v.Id) } } } @@ -256,8 +259,8 @@ func GetDashboardData() map[string]int { data["exportFlowCount"] = int(out) for _, v := range file.GetCsvDb().Tasks { switch v.Mode { - case "tunnelServer": - data["tunnelServerCount"] += 1 + case "tcpServer": + data["tcpServerCount"] += 1 case "socks5Server": data["socks5ServerCount"] += 1 case "httpProxyServer": diff --git a/server/tool/utils.go b/server/tool/utils.go index 2cfac13..0274a22 100644 --- a/server/tool/utils.go +++ b/server/tool/utils.go @@ -3,43 +3,15 @@ package tool import ( "github.com/cnlh/nps/lib/beego" "github.com/cnlh/nps/lib/common" - "strconv" - "strings" ) var ports []int func init() { p := beego.AppConfig.String("allowPorts") - arr := strings.Split(p, ",") - for _, v := range arr { - fw := strings.Split(v, "-") - if len(fw) == 2 { - if isPort(fw[0]) && isPort(fw[1]) { - start, _ := strconv.Atoi(fw[0]) - end, _ := strconv.Atoi(fw[1]) - for i := start; i <= end; i++ { - ports = append(ports, i) - } - } else { - continue - } - } else if isPort(v) { - p, _ := strconv.Atoi(v) - ports = append(ports, p) - } - } -} -func isPort(p string) bool { - pi, err := strconv.Atoi(p) - if err != nil { - return false - } - if pi > 65536 || pi < 1 { - return false - } - return true + ports = common.GetPorts(p) } + func TestServerPort(p int, m string) (b bool) { if len(ports) != 0 { if !common.InIntArr(ports, p) { diff --git a/web/controllers/client.go b/web/controllers/client.go index 907957f..10e9153 100644 --- a/web/controllers/client.go +++ b/web/controllers/client.go @@ -103,7 +103,7 @@ func (s *ClientController) Edit() { } else { c.Rate = nil } - file.GetCsvDb().UpdateClient(c) + file.GetCsvDb().StoreClientsToCsv() } s.AjaxOk("修改成功") } diff --git a/web/controllers/index.go b/web/controllers/index.go index ef7ab25..06e60f9 100755 --- a/web/controllers/index.go +++ b/web/controllers/index.go @@ -21,7 +21,7 @@ func (s *IndexController) Help() { func (s *IndexController) Tcp() { s.SetInfo("tcp隧道管理") - s.SetType("tunnelServer") + s.SetType("tcpServer") s.display("index/list") } @@ -73,13 +73,13 @@ func (s *IndexController) Add() { s.display() } else { t := &file.Tunnel{ - Port: s.GetIntNoErr("port"), - Mode: s.GetString("type"), - Target: s.GetString("target"), - Id: file.GetCsvDb().GetTaskId(), - Status: true, - Remark: s.GetString("remark"), - Flow: &file.Flow{}, + Port: s.GetIntNoErr("port"), + Mode: s.GetString("type"), + Target: s.GetString("target"), + Id: file.GetCsvDb().GetTaskId(), + Status: true, + Remark: s.GetString("remark"), + Flow: &file.Flow{}, } var err error if t.Client, err = file.GetCsvDb().GetClient(s.GetIntNoErr("client_id")); err != nil { @@ -175,7 +175,7 @@ func (s *IndexController) HostList() { func (s *IndexController) GetHost() { if s.Ctx.Request.Method == "POST" { data := make(map[string]interface{}) - if h, err := file.GetCsvDb().GetInfoByHost(s.GetString("host")); err != nil { + if h, err := file.GetCsvDb().GetHostById(s.GetIntNoErr("id")); err != nil { data["code"] = 0 } else { data["data"] = h @@ -187,8 +187,8 @@ func (s *IndexController) GetHost() { } func (s *IndexController) DelHost() { - host := s.GetString("host") - if err := file.GetCsvDb().DelHost(host); err != nil { + id := s.GetIntNoErr("id") + if err := file.GetCsvDb().DelHost(id); err != nil { s.AjaxErr("删除失败") } s.AjaxOk("删除成功") @@ -202,11 +202,13 @@ func (s *IndexController) AddHost() { s.display("index/hadd") } else { h := &file.Host{ + Id: file.GetCsvDb().GetHostId(), Host: s.GetString("host"), Target: s.GetString("target"), HeaderChange: s.GetString("header"), HostChange: s.GetString("hostchange"), Remark: s.GetString("remark"), + Location: s.GetString("location"), Flow: &file.Flow{}, } var err error @@ -219,10 +221,10 @@ func (s *IndexController) AddHost() { } func (s *IndexController) EditHost() { - host := s.GetString("host") + id := s.GetIntNoErr("id") if s.Ctx.Request.Method == "GET" { s.Data["menu"] = "host" - if h, err := file.GetCsvDb().GetInfoByHost(host); err != nil { + if h, err := file.GetCsvDb().GetHostById(id); err != nil { s.error() } else { s.Data["h"] = h @@ -230,15 +232,16 @@ func (s *IndexController) EditHost() { s.SetInfo("修改") s.display("index/hedit") } else { - if h, err := file.GetCsvDb().GetInfoByHost(host); err != nil { + if h, err := file.GetCsvDb().GetHostById(id); err != nil { s.error() } else { - h.Host = s.GetString("nhost") + h.Host = s.GetString("host") h.Target = s.GetString("target") h.HeaderChange = s.GetString("header") h.HostChange = s.GetString("hostchange") h.Remark = s.GetString("remark") h.TargetArr = nil + h.Location = s.GetString("location") file.GetCsvDb().UpdateHost(h) var err error if h.Client, err = file.GetCsvDb().GetClient(s.GetIntNoErr("client_id")); err != nil { diff --git a/web/views/index/add.html b/web/views/index/add.html index 97a27f5..ca26ae3 100755 --- a/web/views/index/add.html +++ b/web/views/index/add.html @@ -7,7 +7,7 @@