Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/pkg/networks/commands.go
2601 views
1
// SPDX-FileCopyrightText: Copyright The Lima Authors
2
// SPDX-License-Identifier: Apache-2.0
3
4
package networks
5
6
import (
7
"errors"
8
"fmt"
9
"io/fs"
10
"os/exec"
11
"path/filepath"
12
13
"github.com/lima-vm/lima/v2/pkg/limatype/dirnames"
14
"github.com/lima-vm/lima/v2/pkg/osutil"
15
)
16
17
const (
18
SocketVMNet = "socket_vmnet"
19
)
20
21
// Commands in `sudoers` cannot use quotes, so all arguments are printed via "%s"
22
// and not "%q". cfg.Paths.* entries must not include any whitespace!
23
24
func (c *Config) Check(name string) error {
25
if _, ok := c.Networks[name]; ok {
26
return nil
27
}
28
return fmt.Errorf("network %q is not defined", name)
29
}
30
31
// Usernet returns true if the mode of given network is ModeUserV2.
32
func (c *Config) Usernet(name string) (bool, error) {
33
if nw, ok := c.Networks[name]; ok {
34
return nw.Mode == ModeUserV2, nil
35
}
36
return false, fmt.Errorf("network %q is not defined", name)
37
}
38
39
// DaemonPath returns the daemon path.
40
func (c *Config) DaemonPath(daemon string) (string, error) {
41
switch daemon {
42
case SocketVMNet:
43
return c.Paths.SocketVMNet, nil
44
default:
45
return "", fmt.Errorf("unknown daemon type %q", daemon)
46
}
47
}
48
49
// IsDaemonInstalled checks whether the daemon is installed.
50
func (c *Config) IsDaemonInstalled(daemon string) (bool, error) {
51
p, err := c.DaemonPath(daemon)
52
if err != nil {
53
return false, err
54
}
55
if p == "" {
56
return false, nil
57
}
58
if _, err := exec.LookPath(p); err != nil {
59
if errors.Is(err, fs.ErrNotExist) {
60
return false, nil
61
}
62
return false, err
63
}
64
return true, nil
65
}
66
67
// Sock returns a socket_vmnet socket.
68
func (c *Config) Sock(name string) string {
69
return filepath.Join(c.Paths.VarRun, fmt.Sprintf("socket_vmnet.%s", name))
70
}
71
72
func (c *Config) PIDFile(name, daemon string) string {
73
return filepath.Join(c.Paths.VarRun, fmt.Sprintf("%s_%s.pid", name, daemon))
74
}
75
76
func (c *Config) LogFile(name, daemon, stream string) string {
77
networksDir, _ := dirnames.LimaNetworksDir()
78
return filepath.Join(networksDir, fmt.Sprintf("%s_%s.%s.log", name, daemon, stream))
79
}
80
81
func (c *Config) User(daemon string) (osutil.User, error) {
82
if ok, _ := c.IsDaemonInstalled(daemon); !ok {
83
daemonPath, _ := c.DaemonPath(daemon)
84
return osutil.User{}, fmt.Errorf("daemon %q (path=%q) is not available", daemon, daemonPath)
85
}
86
//nolint:gocritic // singleCaseSwitch: should rewrite switch statement to if statement
87
switch daemon {
88
case SocketVMNet:
89
return osutil.LookupUser("root")
90
}
91
return osutil.User{}, fmt.Errorf("daemon %q not defined", daemon)
92
}
93
94
func (c *Config) MkdirCmd() string {
95
return fmt.Sprintf("/bin/mkdir -m 775 -p %s", c.Paths.VarRun)
96
}
97
98
func (c *Config) StartCmd(name, daemon string) string {
99
if ok, _ := c.IsDaemonInstalled(daemon); !ok {
100
panic(fmt.Errorf("daemon %q is not available", daemon))
101
}
102
var cmd string
103
switch daemon {
104
case SocketVMNet:
105
nw := c.Networks[name]
106
if c.Paths.SocketVMNet == "" {
107
panic("c.Paths.SocketVMNet is empty")
108
}
109
cmd = fmt.Sprintf("%s --pidfile=%s --socket-group=%s --vmnet-mode=%s",
110
c.Paths.SocketVMNet, c.PIDFile(name, SocketVMNet), c.Group, nw.Mode)
111
switch nw.Mode {
112
case ModeBridged:
113
cmd += fmt.Sprintf(" --vmnet-interface=%s", nw.Interface)
114
case ModeHost, ModeShared:
115
cmd += fmt.Sprintf(" --vmnet-gateway=%s --vmnet-dhcp-end=%s --vmnet-mask=%s",
116
nw.Gateway, nw.DHCPEnd, nw.NetMask)
117
}
118
cmd += " " + c.Sock(name)
119
default:
120
panic(fmt.Errorf("unexpected daemon %q", daemon))
121
}
122
return cmd
123
}
124
125
func (c *Config) StopCmd(name, daemon string) string {
126
return fmt.Sprintf("/usr/bin/pkill -F %s", c.PIDFile(name, daemon))
127
}
128
129