Skip to content

Commit

Permalink
tt: add tt connect module
Browse files Browse the repository at this point in the history
The minimum required part of the connect module from the
cartridge-cli (https://github.com/tarantool/cartridge-cli) was copied
without any changes.

Part of #15
  • Loading branch information
LeonidVas committed Apr 19, 2022
1 parent 8a27c27 commit 1d6759c
Show file tree
Hide file tree
Showing 22 changed files with 1,892 additions and 68 deletions.
47 changes: 47 additions & 0 deletions cli/cmd/connect.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package cmd

import (
"github.com/apex/log"
"github.com/spf13/cobra"
"github.com/tarantool/tt/cli/cmdcontext"
"github.com/tarantool/tt/cli/connect"
"github.com/tarantool/tt/cli/modules"
)

var (
connectUser string
connectPassword string
)

// NewConnectCmd creates connect command.
func NewConnectCmd() *cobra.Command {
var connectCmd = &cobra.Command{
Use: "connect [INSTANCE_NAME]",
Short: "Connect to the tarantool instance",
Run: func(cmd *cobra.Command, args []string) {
err := modules.RunCmd(&cmdCtx, cmd.Name(), &modulesInfo, internalConnectModule, args)
if err != nil {
log.Fatalf(err.Error())
}
},
}

connectCmd.Flags().StringVarP(&connectUser, "username", "u", "", "username")
connectCmd.Flags().StringVarP(&connectPassword, "password", "p", "", "password")

return connectCmd
}

// internalConnectModule is a default connect module.
func internalConnectModule(cmdCtx *cmdcontext.CmdCtx, args []string) error {
// Fill CmdCtx.
cmdCtx.Connect.Username = connectUser
cmdCtx.Connect.Password = connectPassword

log.Info("Connecting to the instance...")
if err := connect.Connect(cmdCtx, args); err != nil {
return err
}

return nil
}
1 change: 1 addition & 0 deletions cli/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ func NewCmdRoot() *cobra.Command {
NewRestartCmd(),
NewLogrotateCmd(),
NewCheckCmd(),
NewConnectCmd(),
)

rootCmd.InitDefaultHelpCmd()
Expand Down
9 changes: 9 additions & 0 deletions cli/cmdcontext/cmdcontext.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package cmdcontext
type CmdCtx struct {
Cli CliCtx
Running RunningCtx
Connect ConnectCtx
}

// CliCtx - CLI context. Contains flags passed when starting
Expand Down Expand Up @@ -55,3 +56,11 @@ type RunningCtx struct {
// Control UNIX socket for started instance.
ConsoleSocket string
}

// ConnectCtx contains information for connecting to the instance.
type ConnectCtx struct {
// Username of the tarantool user.
Username string
// Password of the tarantool.user.
Password string
}
17 changes: 17 additions & 0 deletions cli/codegen/generate_code.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,23 @@ var luaCodeFiles = []generateLuaCodeOpts{
"checkSyntax": "cli/running/lua/check.lua",
},
},
{
PackageName: "connect",
FileName: "cli/connect/lua_code_gen.go",
VariablesMap: map[string]string{
"evalFuncBody": "cli/connect/lua/eval_func_body.lua",
"getSuggestionsFuncBody": "cli/connect/lua/get_suggestions_func_body.lua",
"getTitleFuncBody": "cli/connect/lua/get_title_func_body.lua",
},
},
{
PackageName: "connector",
FileName: "cli/connector/lua_code_gen.go",
VariablesMap: map[string]string{
"callFuncTmpl": "cli/connector/lua/call_func_template.lua",
"evalFuncTmpl": "cli/connector/lua/eval_func_template.lua",
},
},
}

func generateLuaCodeVar() error {
Expand Down
70 changes: 70 additions & 0 deletions cli/connect/common.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package connect

import (
"strings"

"github.com/tarantool/tt/cli/cmdcontext"
)

const (
MaxHistoryLines = 10000

TCPNetwork = "tcp"
UnixNetwork = "unix"
)

type ConnOpts struct {
Network string
Address string
Username string
Password string
}

func getConnOpts(connString string, cmdCtx *cmdcontext.CmdCtx) (*ConnOpts, error) {
connOpts := ConnOpts{
Username: cmdCtx.Connect.Username,
Password: cmdCtx.Connect.Password,
}

connStringParts := strings.SplitN(connString, "@", 2)
address := connStringParts[len(connStringParts)-1]

if len(connStringParts) > 1 {
authString := connStringParts[0]
authStringParts := strings.SplitN(authString, ":", 2)

if connOpts.Username == "" {
connOpts.Username = authStringParts[0]
}
if len(authStringParts) > 1 && connOpts.Password == "" {
connOpts.Password = authStringParts[1]
}
}

addrLen := len(address)
switch {
case addrLen > 0 && (address[0] == '.' || address[0] == '/'):
connOpts.Network = UnixNetwork
connOpts.Address = address
case addrLen >= 7 && address[0:7] == "unix://":
connOpts.Network = UnixNetwork
connOpts.Address = address[7:]
case addrLen >= 5 && address[0:5] == "unix:":
connOpts.Network = UnixNetwork
connOpts.Address = address[5:]
case addrLen >= 6 && address[0:6] == "unix/:":
connOpts.Network = UnixNetwork
connOpts.Address = address[6:]
case addrLen >= 6 && address[0:6] == "tcp://":
connOpts.Network = TCPNetwork
connOpts.Address = address[6:]
case addrLen >= 4 && address[0:4] == "tcp:":
connOpts.Network = TCPNetwork
connOpts.Address = address[4:]
default:
connOpts.Network = TCPNetwork
connOpts.Address = address
}

return &connOpts, nil
}
45 changes: 45 additions & 0 deletions cli/connect/connect.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package connect

import (
"fmt"

"github.com/tarantool/tt/cli/cmdcontext"
)

const (
// see https://github.com/tarantool/tarantool/blob/b53cb2aeceedc39f356ceca30bd0087ee8de7c16/src/box/lua/console.c#L265
tarantoolWordSeparators = "\t\r\n !\"#$%&'()*+,-/;<=>?@[\\]^`{|}~"
)

func Connect(cmdCtx *cmdcontext.CmdCtx, args []string) error {
if len(args) != 1 {
return fmt.Errorf("Should be specified one connection string")
}

connString := args[0]

connOpts, err := getConnOpts(connString, cmdCtx)
if err != nil {
return fmt.Errorf("Failed to get connection opts: %s", err)
}

if err := runConsole(connOpts, ""); err != nil {
return fmt.Errorf("Failed to run interactive console: %s", err)
}

return nil
}

func runConsole(connOpts *ConnOpts, title string) error {
console, err := NewConsole(connOpts, title)
if err != nil {
return fmt.Errorf("Failed to create new console: %s", err)
}
defer console.Close()

if err := console.Run(); err != nil {
return fmt.Errorf("Failed to start new console: %s", err)
}

return nil
}
Loading

0 comments on commit 1d6759c

Please sign in to comment.