wal-g

Форк
0
/
client.go 
75 строк · 2.2 Кб
1
package daemon
2

3
import (
4
	"context"
5
	"encoding/binary"
6
	"fmt"
7
	"net"
8
	"time"
9
)
10

11
type RunOptions struct {
12
	MessageType SocketMessageType
13
	SocketName  string
14
	MessageArgs []string
15

16
	DaemonOperationTimeout        time.Duration
17
	DaemonSocketConnectionTimeout time.Duration
18
}
19

20
func getMessage(messageType SocketMessageType, messageArgs []string) ([]byte, error) {
21
	switch len(messageArgs) {
22
	case 0:
23
		return binary.BigEndian.AppendUint16(messageType.ToBytes(), uint16(3)), nil
24
	case 1:
25
		res := binary.BigEndian.AppendUint16(messageType.ToBytes(), uint16(len(messageArgs[0])+3))
26
		return append(res, []byte(messageArgs[0])...), nil
27
	}
28

29
	messageBody, err := ArgsToBytes(messageArgs...)
30
	if err != nil {
31
		return nil, err
32
	}
33
	res := binary.BigEndian.AppendUint16(messageType.ToBytes(), uint16(len(messageBody)+3))
34
	return append(res, messageBody...), nil
35
}
36

37
func SendCommand(opts *RunOptions) (SocketMessageType, error) {
38
	ctx, cancel := context.WithTimeout(context.Background(), opts.DaemonSocketConnectionTimeout)
39
	defer cancel()
40

41
	dialer := net.Dialer{}
42
	daemonAddr := net.UnixAddr{Name: opts.SocketName, Net: "unix"}
43
	socketConnection, err := dialer.DialContext(ctx, "unix", daemonAddr.String())
44
	if err != nil {
45
		return ErrorType, fmt.Errorf("unix socket dial error: %w", err)
46
	}
47
	defer socketConnection.Close()
48
	err = socketConnection.SetDeadline(time.Now().Add(opts.DaemonOperationTimeout))
49
	if err != nil {
50
		return ErrorType, fmt.Errorf("unix socket set deadline error: %w", err)
51
	}
52

53
	msg, err := getMessage(opts.MessageType, opts.MessageArgs)
54
	if err != nil {
55
		return ErrorType, err
56
	}
57
	_, err = socketConnection.Write(msg)
58
	if err != nil {
59
		return ErrorType, fmt.Errorf("unix socket write error: %w", err)
60
	}
61

62
	resp := make([]byte, 512)
63
	n, err := socketConnection.Read(resp)
64
	if err != nil {
65
		return ErrorType, fmt.Errorf("unix socket read error: %w", err)
66
	}
67
	if n < 1 {
68
		return ErrorType, fmt.Errorf("daemon response error [message type: %v, args: %v]", string(opts.MessageType), opts.MessageArgs)
69
	}
70
	if !OkType.IsEqual(resp[0]) {
71
		return SocketMessageType(resp[0]), fmt.Errorf("daemon command run error [message type: %v, args: %v, daemon response: %v]",
72
			string(opts.MessageType), opts.MessageArgs, string(resp[0]))
73
	}
74
	return OkType, nil
75
}
76

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.