@@ -3,12 +3,14 @@ package usernet
3
3
import (
4
4
"bytes"
5
5
"context"
6
+ "encoding/json"
6
7
"errors"
7
8
"fmt"
8
9
"os"
9
10
"os/exec"
10
11
"path"
11
12
"path/filepath"
13
+ "strings"
12
14
"time"
13
15
14
16
"github.com/lima-vm/lima/pkg/lockutil"
@@ -57,16 +59,25 @@ func Start(ctx context.Context, name string) error {
57
59
return err
58
60
}
59
61
62
+ leases , err := readLeases (name )
63
+ if err != nil {
64
+ return err
65
+ }
66
+
60
67
err = lockutil .WithDirLock (usernetDir , func () error {
61
68
self , err := os .Executable ()
62
69
if err != nil {
63
70
return err
64
71
}
72
+ leasesString := mapToCliString (leases )
65
73
args := []string {"usernet" , "-p" , pidFile ,
66
74
"-e" , endpointSock ,
67
75
"--listen-qemu" , qemuSock ,
68
76
"--listen" , fdSock ,
69
77
"--subnet" , subnet .String ()}
78
+ if leasesString != "" {
79
+ args = append (args , "--leases" , leasesString )
80
+ }
70
81
cmd := exec .CommandContext (ctx , self , args ... )
71
82
72
83
stdoutPath := filepath .Join (usernetDir , fmt .Sprintf ("%s.%s.%s.log" , "usernet" , name , "stdout" ))
@@ -119,6 +130,11 @@ func Stop(name string) error {
119
130
if pid != 0 {
120
131
logrus .Debugf ("Stopping usernet daemon" )
121
132
133
+ err = writeLeases (name )
134
+ if err != nil {
135
+ return err
136
+ }
137
+
122
138
var stdout , stderr bytes.Buffer
123
139
cmd := exec .Command ("/usr/bin/pkill" , "-F" , pidFile )
124
140
cmd .Stdout = & stdout
@@ -145,3 +161,51 @@ func Stop(name string) error {
145
161
}
146
162
return nil
147
163
}
164
+
165
+ func mapToCliString (m map [string ]string ) string {
166
+ var strArr []string
167
+ for key , value := range m {
168
+ strArr = append (strArr , fmt .Sprintf ("%s=%s" , key , value ))
169
+ }
170
+ return strings .Join (strArr , "," )
171
+ }
172
+
173
+ func readLeases (name string ) (map [string ]string , error ) {
174
+ leasesFile , err := Leases (name )
175
+ if err != nil {
176
+ return nil , err
177
+ }
178
+ var leases map [string ]string
179
+ if _ , err := os .Stat (leasesFile ); errors .Is (err , os .ErrNotExist ) {
180
+ return leases , nil
181
+ }
182
+ file , err := os .Open (leasesFile )
183
+ if err != nil {
184
+ return nil , err
185
+ }
186
+ decoder := json .NewDecoder (file )
187
+ err = decoder .Decode (& leases )
188
+ return leases , err
189
+ }
190
+
191
+ func writeLeases (nwName string ) error {
192
+ client := NewClientByName (nwName )
193
+ leases , err := client .Leases ()
194
+ if err != nil {
195
+ return err
196
+ }
197
+ leasesFile , err := Leases (nwName )
198
+ if err != nil {
199
+ return err
200
+ }
201
+ file , err := os .Create (leasesFile )
202
+ if err != nil {
203
+ return err
204
+ }
205
+ encoder := json .NewEncoder (file )
206
+ err = encoder .Encode (leases )
207
+ if err != nil {
208
+ return err
209
+ }
210
+ return nil
211
+ }
0 commit comments