Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/cmd/limactl/usernet.go
2624 views
1
// SPDX-FileCopyrightText: Copyright The Lima Authors
2
// SPDX-License-Identifier: Apache-2.0
3
4
package main
5
6
import (
7
"errors"
8
"fmt"
9
"os"
10
"os/signal"
11
"strconv"
12
"syscall"
13
14
"github.com/spf13/cobra"
15
16
"github.com/lima-vm/lima/v2/pkg/networks/usernet"
17
)
18
19
func newUsernetCommand() *cobra.Command {
20
hostagentCommand := &cobra.Command{
21
Use: "usernet",
22
Short: "Run usernet",
23
Args: cobra.ExactArgs(0),
24
RunE: usernetAction,
25
Hidden: true,
26
}
27
hostagentCommand.Flags().StringP("pidfile", "p", "", "Write PID to file")
28
hostagentCommand.Flags().StringP("endpoint", "e", "", "Exposes usernet API(s) on this endpoint")
29
hostagentCommand.Flags().String("listen-qemu", "", "Listen for QMEU connections")
30
hostagentCommand.Flags().String("listen", "", "Listen on a Unix socket and receive Bess-compatible FDs as SCM_RIGHTS messages")
31
hostagentCommand.Flags().String("subnet", "192.168.5.0/24", "Sets subnet value for the usernet network")
32
hostagentCommand.Flags().Int("mtu", 1500, "mtu")
33
hostagentCommand.Flags().StringToString("leases", nil, "Pass default static leases for startup. Eg: '192.168.104.1=52:55:55:b3:bc:d9,192.168.104.2=5a:94:ef:e4:0c:df' ")
34
return hostagentCommand
35
}
36
37
func usernetAction(cmd *cobra.Command, _ []string) error {
38
pidfile, err := cmd.Flags().GetString("pidfile")
39
if err != nil {
40
return err
41
}
42
if pidfile != "" {
43
if _, err := os.Stat(pidfile); !errors.Is(err, os.ErrNotExist) {
44
return fmt.Errorf("pidfile %q already exists", pidfile)
45
}
46
if err := os.WriteFile(pidfile, []byte(strconv.Itoa(os.Getpid())+"\n"), 0o644); err != nil {
47
return err
48
}
49
defer os.RemoveAll(pidfile)
50
}
51
endpoint, err := cmd.Flags().GetString("endpoint")
52
if err != nil {
53
return err
54
}
55
qemuSocket, err := cmd.Flags().GetString("listen-qemu")
56
if err != nil {
57
return err
58
}
59
fdSocket, err := cmd.Flags().GetString("listen")
60
if err != nil {
61
return err
62
}
63
subnet, err := cmd.Flags().GetString("subnet")
64
if err != nil {
65
return err
66
}
67
68
leases, err := cmd.Flags().GetStringToString("leases")
69
if err != nil {
70
return err
71
}
72
73
mtu, err := cmd.Flags().GetInt("mtu")
74
if err != nil {
75
return err
76
}
77
78
os.RemoveAll(endpoint)
79
os.RemoveAll(qemuSocket)
80
os.RemoveAll(fdSocket)
81
82
ctx, cancel := signal.NotifyContext(cmd.Context(), os.Interrupt, syscall.SIGTERM)
83
defer cancel()
84
85
// Environment Variables
86
// LIMA_USERNET_RESOLVE_IP_ADDRESS_TIMEOUT: Specifies the timeout duration for resolving IP addresses in minutes. Default is 2 minutes.
87
88
return usernet.StartGVisorNetstack(ctx, &usernet.GVisorNetstackOpts{
89
MTU: mtu,
90
Endpoint: endpoint,
91
QemuSocket: qemuSocket,
92
FdSocket: fdSocket,
93
Subnet: subnet,
94
DefaultLeases: leases,
95
})
96
}
97
98