(mgr *manager.Manager, route string, uuid string)
| 24 | } |
| 25 | |
| 26 | func (socks *Socks) LetSocks(mgr *manager.Manager, route string, uuid string) error { |
| 27 | addr := fmt.Sprintf("0.0.0.0:%s", socks.Port) |
| 28 | listener, err := net.Listen("tcp", addr) |
| 29 | if err != nil { |
| 30 | return err |
| 31 | } |
| 32 | |
| 33 | // register brand new socks service |
| 34 | mgrTask := &manager.SocksTask{ |
| 35 | Mode: manager.S_NEWSOCKS, |
| 36 | UUID: uuid, |
| 37 | SocksPort: socks.Port, |
| 38 | SocksUsername: socks.Username, |
| 39 | SocksPassword: socks.Password, |
| 40 | SocksTCPListener: listener, |
| 41 | } |
| 42 | |
| 43 | mgr.SocksManager.TaskChan <- mgrTask |
| 44 | result := <-mgr.SocksManager.ResultChan // wait for "add" done |
| 45 | if !result.OK { // node and socks service must be one-to-one |
| 46 | err := errors.New("Socks has already running on current node! Use 'stopsocks' to stop the old one") |
| 47 | listener.Close() |
| 48 | return err |
| 49 | } |
| 50 | |
| 51 | sMessage := protocol.PrepareAndDecideWhichSProtoToLower(global.G_Component.Conn, global.G_Component.Secret, global.G_Component.UUID) |
| 52 | |
| 53 | header := &protocol.Header{ |
| 54 | Sender: protocol.ADMIN_UUID, |
| 55 | Accepter: uuid, |
| 56 | MessageType: protocol.SOCKSSTART, |
| 57 | RouteLen: uint32(len([]byte(route))), |
| 58 | Route: route, |
| 59 | } |
| 60 | |
| 61 | socksStartMess := &protocol.SocksStart{ |
| 62 | UsernameLen: uint64(len([]byte(socks.Username))), |
| 63 | Username: socks.Username, |
| 64 | PasswordLen: uint64(len([]byte(socks.Password))), |
| 65 | Password: socks.Password, |
| 66 | } |
| 67 | |
| 68 | protocol.ConstructMessage(sMessage, header, socksStartMess, false) |
| 69 | sMessage.SendMessage() |
| 70 | |
| 71 | if ready := <-mgr.SocksManager.SocksReady; !ready { |
| 72 | err := errors.New("fail to start socks.If you just stop socks service,please wait for the cleanup done") |
| 73 | StopSocks(mgr, uuid) |
| 74 | return err |
| 75 | } |
| 76 | |
| 77 | go socks.handleSocksListener(mgr, listener, route, uuid) |
| 78 | |
| 79 | return nil |
| 80 | } |
| 81 | |
| 82 | func (socks *Socks) handleSocksListener(mgr *manager.Manager, listener net.Listener, route string, uuid string) { |
| 83 | for { |
no test coverage detected