Skip to content

Commit 4b70b44

Browse files
authored
Merge pull request #1350 from bgilbert/userdata
Delete userdata from VirtualBox/VMware after Ignition completes
2 parents fd557bb + b0562e3 commit 4b70b44

27 files changed

+3342
-290
lines changed

Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@ install: all
2323
install -m 0644 -D -t $(DESTDIR)/usr/lib/dracut/modules.d/$${bn} $$x/*; \
2424
done
2525
chmod a+x $(DESTDIR)/usr/lib/dracut/modules.d/*/*.sh $(DESTDIR)/usr/lib/dracut/modules.d/*/*-generator
26+
install -m 0644 -D -t $(DESTDIR)/usr/lib/systemd/system systemd/ignition-delete-config.service
2627
install -m 0755 -D -t $(DESTDIR)/usr/lib/dracut/modules.d/30ignition bin/$(GOARCH)/ignition
2728
install -m 0755 -D -t $(DESTDIR)/usr/bin bin/$(GOARCH)/ignition-validate
29+
install -m 0755 -d $(DESTDIR)/usr/libexec
30+
ln -sf ../lib/dracut/modules.d/30ignition/ignition $(DESTDIR)/usr/libexec/ignition-rmcfg
2831

2932
.PHONY: vendor
3033
vendor:

go.mod

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,17 @@ require (
66
cloud.google.com/go v0.58.0
77
cloud.google.com/go/storage v1.9.0
88
github.com/aws/aws-sdk-go v1.30.28
9+
github.com/beevik/etree v1.1.1-0.20200718192613-4a2f8b9d084c
910
github.com/coreos/go-semver v0.3.0
1011
github.com/coreos/go-systemd/v22 v22.0.0
1112
github.com/coreos/vcontext v0.0.0-20211021162308-f1dbbca7bef4
1213
github.com/google/renameio v0.1.0
1314
github.com/google/uuid v1.1.1
1415
github.com/pin/tftp v2.1.0+incompatible
15-
github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa // indirect
1616
github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace
1717
github.com/stretchr/testify v1.7.0
1818
github.com/vincent-petithory/dataurl v1.0.0
1919
github.com/vmware/vmw-guestinfo v0.0.0-20220317130741-510905f0efa3
20-
github.com/vmware/vmw-ovflib v0.0.0-20170608004843-1f217b9dc714
2120
go.opencensus.io v0.22.5 // indirect
2221
golang.org/x/net v0.0.0-20200602114024-627f9648deb9
2322
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d

go.sum

+2-10
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
4040
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
4141
github.com/aws/aws-sdk-go v1.30.28 h1:SaPM7dlmp7h3Lj1nJ4jdzOkTdom08+g20k7AU5heZYg=
4242
github.com/aws/aws-sdk-go v1.30.28/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
43+
github.com/beevik/etree v1.1.1-0.20200718192613-4a2f8b9d084c h1:uYq6BD31fkfeNKQmfLj7ODcEfkb5JLsKrXVSqgnfGg8=
44+
github.com/beevik/etree v1.1.1-0.20200718192613-4a2f8b9d084c/go.mod h1:0yGO2rna3S9DkITDWHY1bMtcY4IJ4w+4S+EooZUR0bE=
4345
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
4446
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
4547
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
@@ -115,8 +117,6 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
115117
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
116118
github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
117119
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
118-
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
119-
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
120120
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
121121
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
122122
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
@@ -125,8 +125,6 @@ github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeY
125125
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
126126
github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o=
127127
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
128-
github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE=
129-
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
130128
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
131129
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
132130
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
@@ -140,10 +138,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
140138
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
141139
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
142140
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
143-
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
144-
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
145-
github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa h1:E+gaaifzi2xF65PbDmuKI3PhLWY6G5opMLniFq8vmXA=
146-
github.com/smartystreets/goconvey v0.0.0-20190222223459-a17d461953aa/go.mod h1:2RVY1rIf+2J2o/IM9+vPq9RzmHDSseB7FoXiSNIUsoU=
147141
github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace h1:9PNP1jnUjRhfmGMlkXHjYPishpcw4jpSt/V/xYY3FMA=
148142
github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
149143
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -155,8 +149,6 @@ github.com/vincent-petithory/dataurl v1.0.0 h1:cXw+kPto8NLuJtlMsI152irrVw9fRDX8A
155149
github.com/vincent-petithory/dataurl v1.0.0/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U=
156150
github.com/vmware/vmw-guestinfo v0.0.0-20220317130741-510905f0efa3 h1:v6jG/tdl4O07LNVp74Nt7/OyL+1JsIW1M2f/nSvQheY=
157151
github.com/vmware/vmw-guestinfo v0.0.0-20220317130741-510905f0efa3/go.mod h1:CSBTxrhePCm0cmXNKDGeu+6bOQzpaEklfCqEpn89JWk=
158-
github.com/vmware/vmw-ovflib v0.0.0-20170608004843-1f217b9dc714 h1:wJqF3m4Tj8I4beSi6vGxIyNtsq6wwGqhK3UnA99ltL4=
159-
github.com/vmware/vmw-ovflib v0.0.0-20170608004843-1f217b9dc714/go.mod h1:jiPk45kn7klhByRvUq5i2vo1RtHKBHj+iWGFpxbXuuI=
160152
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
161153
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
162154
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=

internal/main.go

+57-3
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,13 @@ import (
4141
)
4242

4343
func main() {
44-
if filepath.Base(os.Args[0]) == "ignition-apply" {
44+
switch filepath.Base(os.Args[0]) {
45+
case "ignition-apply":
4546
ignitionApplyMain()
46-
} else {
47-
// otherwise, assume regular Ignition
47+
case "ignition-rmcfg":
48+
ignitionRmCfgMain()
49+
default:
50+
// assume regular Ignition
4851
ignitionMain()
4952
}
5053
}
@@ -187,3 +190,54 @@ func ignitionApplyMain() {
187190
os.Exit(1)
188191
}
189192
}
193+
194+
func ignitionRmCfgMain() {
195+
flags := struct {
196+
logToStdout bool
197+
platform string
198+
version bool
199+
}{}
200+
pflag.StringVar(&flags.platform, "platform", "", fmt.Sprintf("current platform. %v", platform.Names()))
201+
pflag.BoolVar(&flags.logToStdout, "log-to-stdout", false, "log to stdout instead of the system log")
202+
pflag.BoolVar(&flags.version, "version", false, "print the version and exit")
203+
pflag.Usage = func() {
204+
fmt.Fprintf(pflag.CommandLine.Output(), "Usage: %s [options]\n", os.Args[0])
205+
fmt.Fprintf(pflag.CommandLine.Output(), "Options:\n")
206+
pflag.PrintDefaults()
207+
}
208+
pflag.Parse()
209+
210+
if flags.version {
211+
fmt.Printf("%s\n", version.String)
212+
return
213+
}
214+
215+
if pflag.NArg() != 0 {
216+
pflag.Usage()
217+
os.Exit(2)
218+
}
219+
220+
if flags.platform == "" {
221+
fmt.Fprint(os.Stderr, "'--platform' must be provided\n")
222+
os.Exit(2)
223+
}
224+
225+
logger := log.New(flags.logToStdout)
226+
defer logger.Close()
227+
228+
logger.Info(version.String)
229+
230+
platformConfig := platform.MustGet(flags.platform)
231+
fetcher, err := platformConfig.NewFetcherFunc()(&logger)
232+
if err != nil {
233+
logger.Crit("failed to generate fetcher: %s", err)
234+
os.Exit(3)
235+
}
236+
237+
if err := platformConfig.DelConfig(&fetcher); err != nil {
238+
logger.Crit("couldn't delete config: %s", err)
239+
os.Exit(1)
240+
}
241+
242+
logger.Info("Successfully deleted config")
243+
}

internal/platform/platform.go

+20-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package platform
1616

1717
import (
18+
"errors"
1819
"fmt"
1920

2021
"github.com/coreos/ignition/v2/internal/log"
@@ -44,13 +45,18 @@ import (
4445
"github.com/coreos/ignition/v2/internal/resource"
4546
)
4647

48+
var (
49+
ErrCannotDelete = errors.New("cannot delete config on this platform")
50+
)
51+
4752
// Config represents a set of options that map to a particular platform.
4853
type Config struct {
4954
name string
5055
fetch providers.FuncFetchConfig
5156
init providers.FuncInit
5257
newFetcher providers.FuncNewFetcher
5358
status providers.FuncPostStatus
59+
delConfig providers.FuncDelConfig
5460
}
5561

5662
func (c Config) Name() string {
@@ -93,6 +99,14 @@ func (c Config) Status(stageName string, f resource.Fetcher, statusErr error) er
9399
return nil
94100
}
95101

102+
func (c Config) DelConfig(f *resource.Fetcher) error {
103+
if c.delConfig != nil {
104+
return c.delConfig(f)
105+
} else {
106+
return ErrCannotDelete
107+
}
108+
}
109+
96110
var configs = registry.Create("platform configs")
97111

98112
func init() {
@@ -172,12 +186,14 @@ func init() {
172186
fetch: qemu.FetchConfig,
173187
})
174188
configs.Register(Config{
175-
name: "virtualbox",
176-
fetch: virtualbox.FetchConfig,
189+
name: "virtualbox",
190+
fetch: virtualbox.FetchConfig,
191+
delConfig: virtualbox.DelConfig,
177192
})
178193
configs.Register(Config{
179-
name: "vmware",
180-
fetch: vmware.FetchConfig,
194+
name: "vmware",
195+
fetch: vmware.FetchConfig,
196+
delConfig: vmware.DelConfig,
181197
})
182198
configs.Register(Config{
183199
name: "vultr",

internal/providers/providers.go

+1
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ type FuncFetchConfig func(f *resource.Fetcher) (types.Config, report.Report, err
3232
type FuncInit func(f *resource.Fetcher) error
3333
type FuncNewFetcher func(logger *log.Logger) (resource.Fetcher, error)
3434
type FuncPostStatus func(stageName string, f resource.Fetcher, e error) error
35+
type FuncDelConfig func(f *resource.Fetcher) error

internal/providers/virtualbox/virtualbox.c

+86-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
#include <errno.h>
2525
#include "virtualbox.h"
2626

27+
// From virtualbox/include/VBox/HostServices/GuestPropertySvc.h
28+
#define GUEST_PROP_FN_GET_PROP 1
29+
#define GUEST_PROP_FN_DEL_PROP 4
30+
2731
static void _cleanup_close(int *fd) {
2832
if (*fd != -1) {
2933
close(*fd);
@@ -86,13 +90,16 @@ static int connect(int fd, uint32_t *client_id) {
8690
}
8791

8892
static int get_prop(int fd, uint32_t client_id, const char *name, void **value, size_t *size) {
93+
// xref VbglR3GuestPropRead() in
94+
// virtualbox/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibGuestProp.cpp
95+
8996
// init header
9097
size_t msg_size = sizeof(struct vbg_ioctl_hgcm_call) + 4 * sizeof(struct vmmdev_hgcm_function_parameter64);
9198
struct vbg_ioctl_hgcm_call _cleanup_free_ *msg = calloc(1, msg_size);
9299
// init_header re-adds the size of msg->hdr
93100
init_header(&msg->hdr, msg_size - sizeof(msg->hdr), msg_size - sizeof(msg->hdr));
94101
msg->client_id = client_id;
95-
msg->function = 1; // GUEST_PROP_FN_GET_PROP
102+
msg->function = GUEST_PROP_FN_GET_PROP;
96103
msg->timeout_ms = -1; // inf
97104
msg->interruptible = 1;
98105
msg->parm_count = 4;
@@ -147,6 +154,38 @@ static int get_prop(int fd, uint32_t client_id, const char *name, void **value,
147154
}
148155
}
149156

157+
static int del_prop(int fd, uint32_t client_id, const char *name) {
158+
// xref VbglR3GuestPropDelete() in
159+
// virtualbox/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR3LibGuestProp.cpp
160+
161+
// init header
162+
size_t msg_size = sizeof(struct vbg_ioctl_hgcm_call) + sizeof(struct vmmdev_hgcm_function_parameter64);
163+
struct vbg_ioctl_hgcm_call _cleanup_free_ *msg = calloc(1, msg_size);
164+
// init_header re-adds the size of msg->hdr
165+
init_header(&msg->hdr, msg_size - sizeof(msg->hdr), msg_size - sizeof(msg->hdr));
166+
msg->client_id = client_id;
167+
msg->function = GUEST_PROP_FN_DEL_PROP;
168+
msg->timeout_ms = -1; // inf
169+
msg->interruptible = 1;
170+
msg->parm_count = 1;
171+
172+
// init arguments
173+
struct vmmdev_hgcm_function_parameter64 *params = (void *) (msg + 1);
174+
// property name (in)
175+
params[0].type = VMMDEV_HGCM_PARM_TYPE_LINADDR_IN;
176+
params[0].u.pointer.size = strlen(name) + 1;
177+
params[0].u.pointer.u.linear_addr = (uintptr_t) name;
178+
179+
// delete value
180+
if (ioctl(fd, VBG_IOCTL_HGCM_CALL_64(msg_size), msg)) {
181+
return VERR_GENERAL_FAILURE;
182+
}
183+
if (msg->hdr.rc != VINF_SUCCESS) {
184+
return msg->hdr.rc;
185+
}
186+
return VINF_SUCCESS;
187+
}
188+
150189
static int disconnect(int fd, uint32_t client_id) {
151190
struct vbg_ioctl_hgcm_disconnect msg = {
152191
.u = {
@@ -162,7 +201,7 @@ static int disconnect(int fd, uint32_t client_id) {
162201
return msg.hdr.rc;
163202
}
164203

165-
int virtualbox_get_guest_property(char *name, void **value, size_t *size) {
204+
static int start_connection(uint32_t *client_id) {
166205
// clear any previous garbage in errno for error returns
167206
errno = 0;
168207

@@ -179,12 +218,26 @@ int virtualbox_get_guest_property(char *name, void **value, size_t *size) {
179218
}
180219

181220
// connect to property service
182-
uint32_t client_id;
183-
ret = connect(fd, &client_id);
221+
ret = connect(fd, client_id);
184222
if (ret != VINF_SUCCESS) {
185223
return ret;
186224
}
187225

226+
// return fd
227+
ret = fd;
228+
fd = -1;
229+
return ret;
230+
}
231+
232+
int virtualbox_get_guest_property(char *name, void **value, size_t *size) {
233+
// connect
234+
uint32_t client_id;
235+
int ret = start_connection(&client_id);
236+
if (ret < 0) {
237+
return ret;
238+
}
239+
int _cleanup_close_ fd = ret;
240+
188241
// get property
189242
ret = get_prop(fd, client_id, name, value, size);
190243
if (ret != VINF_SUCCESS) {
@@ -206,3 +259,32 @@ int virtualbox_get_guest_property(char *name, void **value, size_t *size) {
206259
errno = 0;
207260
return 0;
208261
}
262+
263+
int virtualbox_delete_guest_property(char *name) {
264+
// connect
265+
uint32_t client_id;
266+
int ret = start_connection(&client_id);
267+
if (ret < 0) {
268+
return ret;
269+
}
270+
int _cleanup_close_ fd = ret;
271+
272+
// delete property
273+
ret = del_prop(fd, client_id, name);
274+
if (ret != VINF_SUCCESS) {
275+
disconnect(fd, client_id);
276+
return ret;
277+
}
278+
279+
// disconnect
280+
ret = disconnect(fd, client_id);
281+
if (ret != VINF_SUCCESS) {
282+
// we could ignore the failure, but better to make sure bugs
283+
// are noticed
284+
return ret;
285+
}
286+
287+
// for clarity, ensure the Go error return is nil
288+
errno = 0;
289+
return 0;
290+
}

internal/providers/virtualbox/virtualbox.go

+31
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,19 @@ func FetchConfig(f *resource.Fetcher) (types.Config, report.Report, error) {
6969
return util.ParseConfig(f.Logger, config)
7070
}
7171

72+
func DelConfig(f *resource.Fetcher) error {
73+
f.Logger.Info("deleting Ignition config from VirtualBox guest property")
74+
err := deleteProperty(configEncodingProperty)
75+
if err != nil {
76+
return err
77+
}
78+
err = deleteProperty(configProperty)
79+
if err != nil {
80+
return err
81+
}
82+
return nil
83+
}
84+
7285
func fetchProperty(name string) ([]byte, error) {
7386
cName := C.CString(name)
7487
defer C.free(unsafe.Pointer(cName))
@@ -96,3 +109,21 @@ func fetchProperty(name string) ([]byte, error) {
96109
}
97110
return s[0:len], nil
98111
}
112+
113+
func deleteProperty(name string) error {
114+
cName := C.CString(name)
115+
defer C.free(unsafe.Pointer(cName))
116+
117+
ret, errno := C.virtualbox_delete_guest_property(cName)
118+
if ret != C.VINF_SUCCESS {
119+
if ret == C.VERR_GENERAL_FAILURE && errno != nil {
120+
return fmt.Errorf("deleting VirtualBox guest property %q: %w", name, errno)
121+
}
122+
if ret == C.VERR_PERMISSION_DENIED {
123+
return fmt.Errorf("deleting VirtualBox guest property %q: permission denied; is the property read-only?", name)
124+
}
125+
// see <linux/vbox_err.h>
126+
return fmt.Errorf("deleting VirtualBox guest property %q: error %d", name, ret)
127+
}
128+
return nil
129+
}

0 commit comments

Comments
 (0)