|
@@ -0,0 +1,180 @@
|
|
|
+package client
|
|
|
+
|
|
|
+import (
|
|
|
+ "errors"
|
|
|
+ "github.com/cnlh/nps/lib/common"
|
|
|
+ "github.com/cnlh/nps/lib/config"
|
|
|
+ "github.com/cnlh/nps/lib/conn"
|
|
|
+ "github.com/cnlh/nps/lib/lg"
|
|
|
+ "github.com/cnlh/nps/vender/github.com/xtaci/kcp"
|
|
|
+ "github.com/cnlh/nps/vender/golang.org/x/net/proxy"
|
|
|
+ "io/ioutil"
|
|
|
+ "log"
|
|
|
+ "net"
|
|
|
+ "net/url"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+func GetTaskStatus(path string) {
|
|
|
+ cnf, err := config.NewConfig(path)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatalln(err)
|
|
|
+ }
|
|
|
+ c, err := NewConn(cnf.CommonConfig.Tp, cnf.CommonConfig.VKey, cnf.CommonConfig.Server, common.WORK_CONFIG, cnf.CommonConfig.ProxyUrl)
|
|
|
+ if err != nil {
|
|
|
+ log.Fatalln(err)
|
|
|
+ }
|
|
|
+ if _, err := c.Write([]byte(common.WORK_STATUS)); err != nil {
|
|
|
+ log.Fatalln(err)
|
|
|
+ }
|
|
|
+ if f, err := common.ReadAllFromFile(filepath.Join(common.GetTmpPath(), "npc_vkey.txt")); err != nil {
|
|
|
+ log.Fatalln(err)
|
|
|
+ } else if _, err := c.Write([]byte(string(f))); err != nil {
|
|
|
+ log.Fatalln(err)
|
|
|
+ }
|
|
|
+ if l, err := c.GetLen(); err != nil {
|
|
|
+ log.Fatalln(err)
|
|
|
+ } else if b, err := c.ReadLen(l); err != nil {
|
|
|
+ lg.Fatalln(err)
|
|
|
+ } else {
|
|
|
+ arr := strings.Split(string(b), common.CONN_DATA_SEQ)
|
|
|
+ for _, v := range cnf.Hosts {
|
|
|
+ if common.InStrArr(arr, v.Remark) {
|
|
|
+ log.Println(v.Remark, "ok")
|
|
|
+ } else {
|
|
|
+ log.Println(v.Remark, "not running")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for _, v := range cnf.Tasks {
|
|
|
+ ports := common.GetPorts(v.Ports)
|
|
|
+ for _, vv := range ports {
|
|
|
+ var remark string
|
|
|
+ if len(ports) > 1 {
|
|
|
+ remark = v.Remark + "_" + strconv.Itoa(vv)
|
|
|
+ } else {
|
|
|
+ remark = v.Remark
|
|
|
+ }
|
|
|
+ if common.InStrArr(arr, remark) {
|
|
|
+ log.Println(remark, "ok")
|
|
|
+ } else {
|
|
|
+ log.Println(remark, "not running")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ os.Exit(0)
|
|
|
+}
|
|
|
+
|
|
|
+var errAdd = errors.New("The server returned an error, which port or host may have been occupied or not allowed to open.")
|
|
|
+
|
|
|
+func StartFromFile(path string) {
|
|
|
+ first := true
|
|
|
+ cnf, err := config.NewConfig(path)
|
|
|
+ if err != nil {
|
|
|
+ lg.Fatalln(err)
|
|
|
+ }
|
|
|
+ lg.Printf("Loading configuration file %s successfully", path)
|
|
|
+re:
|
|
|
+ if first || cnf.CommonConfig.AutoReconnection {
|
|
|
+ if !first {
|
|
|
+ lg.Println("Reconnecting...")
|
|
|
+ time.Sleep(time.Second * 5)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ first = false
|
|
|
+ c, err := NewConn(cnf.CommonConfig.Tp, cnf.CommonConfig.VKey, cnf.CommonConfig.Server, common.WORK_CONFIG, cnf.CommonConfig.ProxyUrl)
|
|
|
+ if err != nil {
|
|
|
+ lg.Println(err)
|
|
|
+ goto re
|
|
|
+ }
|
|
|
+ if _, err := c.SendConfigInfo(cnf.CommonConfig.Cnf); err != nil {
|
|
|
+ lg.Println(err)
|
|
|
+ goto re
|
|
|
+ }
|
|
|
+ var b []byte
|
|
|
+ if b, err = c.ReadLen(16); err != nil {
|
|
|
+ lg.Println(err)
|
|
|
+ goto re
|
|
|
+ } else {
|
|
|
+ ioutil.WriteFile(filepath.Join(common.GetTmpPath(), "npc_vkey.txt"), []byte(string(b)), 0600)
|
|
|
+ }
|
|
|
+ if !c.GetAddStatus() {
|
|
|
+ lg.Println(errAdd)
|
|
|
+ goto re
|
|
|
+ }
|
|
|
+ for _, v := range cnf.Hosts {
|
|
|
+ if _, err := c.SendHostInfo(v); err != nil {
|
|
|
+ lg.Println(err)
|
|
|
+ goto re
|
|
|
+ }
|
|
|
+ if !c.GetAddStatus() {
|
|
|
+ lg.Println(errAdd, v.Host)
|
|
|
+ goto re
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for _, v := range cnf.Tasks {
|
|
|
+ if _, err := c.SendTaskInfo(v); err != nil {
|
|
|
+ lg.Println(err)
|
|
|
+ goto re
|
|
|
+ }
|
|
|
+ if !c.GetAddStatus() {
|
|
|
+ lg.Println(errAdd, v.Ports)
|
|
|
+ goto re
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ c.Close()
|
|
|
+
|
|
|
+ NewRPClient(cnf.CommonConfig.Server, string(b), cnf.CommonConfig.Tp, cnf.CommonConfig.ProxyUrl).Start()
|
|
|
+ goto re
|
|
|
+}
|
|
|
+
|
|
|
+//Create a new connection with the server and verify it
|
|
|
+func NewConn(tp string, vkey string, server string, connType string, proxyUrl string) (*conn.Conn, error) {
|
|
|
+ var err error
|
|
|
+ var connection net.Conn
|
|
|
+ var sess *kcp.UDPSession
|
|
|
+ if tp == "tcp" {
|
|
|
+ if proxyUrl != "" {
|
|
|
+ u, er := url.Parse(proxyUrl)
|
|
|
+ if er != nil {
|
|
|
+ return nil, er
|
|
|
+ }
|
|
|
+ n, er := proxy.FromURL(u, nil)
|
|
|
+ if er != nil {
|
|
|
+ return nil, er
|
|
|
+ }
|
|
|
+ connection, err = n.Dial("tcp", server)
|
|
|
+ } else {
|
|
|
+ connection, err = net.Dial("tcp", server)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ sess, err = kcp.DialWithOptions(server, nil, 10, 3)
|
|
|
+ conn.SetUdpSession(sess)
|
|
|
+ connection = sess
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ c := conn.NewConn(connection)
|
|
|
+ if _, err := c.Write([]byte(common.Getverifyval(vkey))); err != nil {
|
|
|
+ lg.Println(err)
|
|
|
+ }
|
|
|
+ if s, err := c.ReadFlag(); err != nil {
|
|
|
+ lg.Println(err)
|
|
|
+ } else if s == common.VERIFY_EER {
|
|
|
+ lg.Fatalf("Validation key %s incorrect", vkey)
|
|
|
+ }
|
|
|
+ if _, err := c.Write([]byte(connType)); err != nil {
|
|
|
+ lg.Println(err)
|
|
|
+ }
|
|
|
+ c.SetAlive(tp)
|
|
|
+
|
|
|
+ return c, nil
|
|
|
+}
|