inspektor-gadget

Форк
0
149 строк · 3.6 Кб
1
// Copyright 2019-2024 The Inspektor Gadget authors
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//     http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14

15
//go:build !withoutebpf
16

17
package tracer
18

19
import (
20
	"context"
21
	"errors"
22
	"fmt"
23
	"unsafe"
24

25
	gadgetcontext "github.com/inspektor-gadget/inspektor-gadget/pkg/gadget-context"
26
	"github.com/inspektor-gadget/inspektor-gadget/pkg/gadgets"
27
	"github.com/inspektor-gadget/inspektor-gadget/pkg/gadgets/trace/sni/types"
28
	"github.com/inspektor-gadget/inspektor-gadget/pkg/networktracer"
29
	eventtypes "github.com/inspektor-gadget/inspektor-gadget/pkg/types"
30
)
31

32
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go -target bpfel -cc clang -cflags ${CFLAGS} -type event_t snisnoop ./bpf/snisnoop.c -- $CLANG_OS_FLAGS -I./bpf/
33

34
const (
35
	TLSMaxServerNameLen = len(snisnoopEventT{}.Name)
36
)
37

38
type Tracer struct {
39
	*networktracer.Tracer[types.Event]
40

41
	ctx    context.Context
42
	cancel context.CancelFunc
43
}
44

45
func NewTracer() (*Tracer, error) {
46
	t := &Tracer{}
47

48
	if err := t.install(); err != nil {
49
		t.Close()
50
		return nil, fmt.Errorf("installing tracer: %w", err)
51
	}
52

53
	if err := t.run(); err != nil {
54
		t.Close()
55
		return nil, fmt.Errorf("running tracer: %w", err)
56
	}
57

58
	return t, nil
59
}
60

61
func parseSNIEvent(sample []byte, netns uint64) (*types.Event, error) {
62
	bpfEvent := (*snisnoopEventT)(unsafe.Pointer(&sample[0]))
63
	if len(sample) < int(unsafe.Sizeof(*bpfEvent)) {
64
		return nil, errors.New("invalid sample size")
65
	}
66

67
	timestamp := gadgets.WallTimeFromBootTime(bpfEvent.Timestamp)
68

69
	name := gadgets.FromCString(bpfEvent.Name[:])
70
	if len(name) == 0 {
71
		return nil, nil
72
	}
73

74
	event := types.Event{
75
		Event: eventtypes.Event{
76
			Type:      eventtypes.NORMAL,
77
			Timestamp: timestamp,
78
		},
79
		Pid:           bpfEvent.Pid,
80
		Tid:           bpfEvent.Tid,
81
		Uid:           bpfEvent.Uid,
82
		Gid:           bpfEvent.Gid,
83
		WithMountNsID: eventtypes.WithMountNsID{MountNsID: bpfEvent.MountNsId},
84
		WithNetNsID:   eventtypes.WithNetNsID{NetNsID: netns},
85
		Comm:          gadgets.FromCString(bpfEvent.Task[:]),
86

87
		Name: name,
88
	}
89

90
	return &event, nil
91
}
92

93
// --- Registry changes
94

95
func (g *GadgetDesc) NewInstance() (gadgets.Gadget, error) {
96
	return &Tracer{}, nil
97
}
98

99
func (t *Tracer) Init(gadgetCtx gadgets.GadgetContext) error {
100
	if err := t.install(); err != nil {
101
		t.Close()
102
		return fmt.Errorf("installing tracer: %w", err)
103
	}
104

105
	t.ctx, t.cancel = gadgetcontext.WithTimeoutOrCancel(gadgetCtx.Context(), gadgetCtx.Timeout())
106
	return nil
107
}
108

109
func (t *Tracer) install() error {
110
	networkTracer, err := networktracer.NewTracer[types.Event]()
111
	if err != nil {
112
		return fmt.Errorf("creating network tracer: %w", err)
113
	}
114
	t.Tracer = networkTracer
115
	return nil
116
}
117

118
func (t *Tracer) run() error {
119
	spec, err := loadSnisnoop()
120
	if err != nil {
121
		return fmt.Errorf("loading asset: %w", err)
122
	}
123

124
	err = t.Tracer.Run(spec, types.Base, parseSNIEvent)
125
	if err != nil {
126
		return fmt.Errorf("setting network tracer spec: %w", err)
127
	}
128

129
	return nil
130
}
131

132
func (t *Tracer) Run(gadgetCtx gadgets.GadgetContext) error {
133
	if err := t.run(); err != nil {
134
		return nil
135
	}
136

137
	<-t.ctx.Done()
138
	return nil
139
}
140

141
func (t *Tracer) Close() {
142
	if t.cancel != nil {
143
		t.cancel()
144
	}
145

146
	if t.Tracer != nil {
147
		t.Tracer.Close()
148
	}
149
}
150

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

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

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

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