Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: macOS setup experience - install software and run a script #23267

Merged
merged 48 commits into from
Oct 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
1cac6ff
Setup Experience Migration (#22405)
dantecatalfamo Sep 30, 2024
c255525
Merge branch 'main' into feat-setup-experience
ghernandez345 Oct 1, 2024
60bc54d
SE: prevent deleting used script content (#22545)
mna Oct 1, 2024
05e271a
Merge branch 'main' into feat-setup-experience
ghernandez345 Oct 2, 2024
cf8b3cd
SwiftDialog interface (#22321)
dantecatalfamo Oct 2, 2024
9598b76
fix: add some missing columns to migration (#22671)
jahzielv Oct 4, 2024
d3508f6
Merge branch 'main' into feat-setup-experience
ghernandez345 Oct 7, 2024
0a4107c
feat: orbit SE status endpoint (#22678)
jahzielv Oct 7, 2024
ab1b66e
Setup experience software API (#22507)
dantecatalfamo Oct 8, 2024
4e2791a
Merge branch 'main' into feat-setup-experience
ghernandez345 Oct 9, 2024
3729b4b
Install software setup experience UI (#22651)
ghernandez345 Oct 9, 2024
3c7d672
Add endpoints for setup experience script CRUD (#22604)
gillespi314 Oct 9, 2024
6707a8b
SE: update /status endpoint to add bootstrap package, profiles, contr…
mna Oct 9, 2024
a512b13
feat: updates to orbit to handle setup experience flow (#22752)
jahzielv Oct 9, 2024
33e7fc3
Merge branch 'main' into feat-setup-experience
ghernandez345 Oct 10, 2024
d034683
add UI for uploading setup experience script (#22691)
ghernandez345 Oct 10, 2024
6af7c23
Start/Enqueue setup experience (#22664)
dantecatalfamo Oct 10, 2024
fc697a2
Merge branch 'main' into feat-setup-experience
ghernandez345 Oct 11, 2024
3468adf
Feat UI api integration setup experieince (#22856)
ghernandez345 Oct 11, 2024
db407d5
Merge branch 'main' into feat-setup-experience
ghernandez345 Oct 11, 2024
d953350
UI tests for setup experience (#22861)
ghernandez345 Oct 14, 2024
5228a5f
Merge branch 'main' into feat-setup-experience
ghernandez345 Oct 14, 2024
b42f5ff
Add integration tests for the setup experience flow with automatic an…
mna Oct 14, 2024
b6cb8bc
feat: orbit notification for indicating setup experience should run (…
jahzielv Oct 14, 2024
9d7f51e
SE: prevent deletion of software package/VPP app used in setup experi…
mna Oct 16, 2024
54438a6
Update backend handlers to record setup experience results (#22911)
gillespi314 Oct 17, 2024
6646c6d
Setup experience state machine (#22845)
dantecatalfamo Oct 18, 2024
d5689dd
Merge branch 'main' into feat-setup-experience
ghernandez345 Oct 21, 2024
0da28fd
feat: swift dialog UI for setup experience (#22972)
jahzielv Oct 21, 2024
8838630
Merge branch 'main' into feat-setup-experience
ghernandez345 Oct 23, 2024
68cdcde
fix to PUT /setup_experience/software and GET /setup_experience/softw…
ghernandez345 Oct 23, 2024
d5e11a2
Fix UI build (#23129)
ghernandez345 Oct 23, 2024
aaea56d
fix: various setup experience bugs (#23091)
jahzielv Oct 23, 2024
d1c3b5b
SE: CLI setup experience changes (#22956)
mna Oct 23, 2024
37584ad
SE: add CLI automated tests for fleetctl gitops (#23125)
mna Oct 23, 2024
d6bd705
fix: make icon not as big (#23176)
jahzielv Oct 24, 2024
25ecc72
fix: update integration tests to use state machine, fix 402 error (#2…
jahzielv Oct 24, 2024
990206c
Fix issues around selecting software to install (#23223)
ghernandez345 Oct 25, 2024
2d7f9a3
various quick updates to UI for setup experience feature (#23226)
ghernandez345 Oct 25, 2024
0b21fb8
feat: update setup experience guide with new functionality (#23203)
jahzielv Oct 25, 2024
8af926a
Fix UI download set script (#23227)
ghernandez345 Oct 25, 2024
ef45ced
cleanup warnings
ghernandez345 Oct 25, 2024
33eea56
Reintroduce missing tests, fix empty slice case (#23206)
dantecatalfamo Oct 25, 2024
9fb657a
fix: correct the guide (#23261)
jahzielv Oct 25, 2024
0bf3317
chore: dump sql schema
jahzielv Oct 25, 2024
3bc1d50
fix: migration order
jahzielv Oct 25, 2024
8625854
fix: migration order
jahzielv Oct 25, 2024
9f32642
Merge branch 'main' into feat-setup-experience
georgekarrv Oct 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions articles/macos-setup-experience.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ In Fleet, you can customize the out-of-the-box macOS Setup Assistant with Remote

* Install a bootstrap package to gain full control over the setup experience by installing tools like Puppet, Munki, DEP notify, custom scripts, and more.

* Install software (App Store apps, custom packages, and Fleet-maintained apps).

* Run a script.

In addition to the customization above, Fleet automatically installs the fleetd agent during out-of-the-box macOS setup. This agent is responsible for reporting host vitals to Fleet and presenting Fleet Desktop to the end user.

macOS setup features require connecting Fleet to Apple Business Manager (ABM). Learn how [here](https://fleetdm.com/guides/macos-mdm-setup#apple-business-manager-abm).
Expand Down Expand Up @@ -161,6 +165,40 @@ Testing requires a test Mac that is present in your Apple Business Manager (ABM)

4. Boot up your test Mac and complete the custom out-of-the-box setup experience.

## Software and script

You can configure software installations and a script to be executed during Setup Assistant. This capability allows you to configure your end users' machines during the unboxing experience, speeding up their onboarding and reducing setup time.

If you configure software and/or a script for setup experience, users will see a window like this pop open after their device enrolls in MDM via ADE:

![screen shot of Fleet setup experience window](../website/assets/images/install-software-preview.png)

This window shows the status of the software installations as well as the script exectution. Once all steps have completed, the window can be closed and Setup Assistant will proceed as usual.

### Install software

To configure software to be installed during setup experience:

1. Click on the "Controls" tab in the main navigation bar. Click on "Setup experience", and then on "4. Install software".

2. Click the "Add software" button. In the modal, select the software that you want to have installed during the setup experience. You can search the list of software by using the search bar in the modal. Click "Save" to save your selection and close the modal.

### Run script

To configure a script to run during setup experience:

1. Click on the "Controls" tab in the main navigation bar. Click on "Setup experience", and then on "5. Run script".

2. Click "Upload" and select a script (.sh file) from the file picker modal. Once the script is uploaded, you can use the buttons on the script in the web UI to download or delete the script.

### Configuring via REST API

Fleet also provides a REST API for managing setup experience software and scripts programmatically. Learn more about Fleet's [REST API](https://fleetdm.com/docs/rest-api/rest-api).

### Configuring via GitOps

To manage setup experience software and script using Fleet's best practice GitOps, check out the `macos_setup` key in the GitOps reference documentation [here](https://fleetdm.com/docs/configuration/yaml-files#macos-setup)

<meta name="category" value="guides">
<meta name="authorGitHubUsername" value="noahtalerman">
<meta name="authorFullName" value="Noah Talerman">
Expand Down
Binary file added assets/images/install-software-preview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions changes/22373-install-software-for-setup-experience-ui
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- add UI for the isntall software setup experience
1 change: 1 addition & 0 deletions changes/22374-add-ui-for-setup-experience-script
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- add UI for adding a setup experience script
1 change: 1 addition & 0 deletions changes/22375-setup-experience-migration
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Add database migrations to support Setup Experience
1 change: 1 addition & 0 deletions changes/22377-setup-experience-software-api
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Add software experience software title selection API
1 change: 1 addition & 0 deletions changes/22379-queue-setup-experience-software
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Add integration to queue setup experience software installation on automatic enrollment
1 change: 1 addition & 0 deletions changes/22381-setup-experience-state-machine
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Add service to track install status
1 change: 1 addition & 0 deletions changes/22382-prevent-delete-software-used-in-setup
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* Added a validation to prevent removing a software package or a VPP app from a team if that software is selected to be installed during the setup experience.
1 change: 1 addition & 0 deletions changes/22385-cli-gitops-macos-setup-software-and-script
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* Added support to `fleetctl gitops` to specify a setup experience script to run and software to install, for a team or no team.
2 changes: 2 additions & 0 deletions changes/22637-status
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Adds an Orbit endpoint (`POST /orbit/setup_experience/status`) for checking the status of a macOS
host's setup experience steps.
1 change: 1 addition & 0 deletions changes/22783-release-ade-enrolled-device
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* Deprecated the worker-based job to release macOS devices automatically after the setup experience, replace it with the fleetd-specific "/status" endpoint that is polled by the Setup Experience dialog controlled by Fleet during the setup flow.
2 changes: 1 addition & 1 deletion cmd/fleetctl/apply.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func applyCommand() *cli.Command {
teamsSoftwareInstallers := make(map[string][]fleet.SoftwarePackageResponse)
teamsScripts := make(map[string][]fleet.ScriptResponse)

_, _, _, err = fleetClient.ApplyGroup(c.Context, specs, baseDir, logf, nil, opts, teamsSoftwareInstallers, teamsScripts)
_, _, _, err = fleetClient.ApplyGroup(c.Context, false, specs, baseDir, logf, nil, opts, teamsSoftwareInstallers, teamsScripts)
if err != nil {
return err
}
Expand Down
171 changes: 125 additions & 46 deletions cmd/fleetctl/gitops_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,9 @@ func TestGitOpsBasicTeam(t *testing.T) {
ds.ListSoftwareTitlesFunc = func(ctx context.Context, opt fleet.SoftwareTitleListOptions, tmFilter fleet.TeamFilter) ([]fleet.SoftwareTitleListResult, int, *fleet.PaginationMetadata, error) {
return nil, 0, nil, nil
}
ds.DeleteSetupExperienceScriptFunc = func(ctx context.Context, teamID *uint) error {
return nil
}

tmpFile, err := os.CreateTemp(t.TempDir(), "*.yml")
require.NoError(t, err)
Expand Down Expand Up @@ -903,6 +906,9 @@ func TestGitOpsFullTeam(t *testing.T) {
ds.ListSoftwareTitlesFunc = func(ctx context.Context, opt fleet.SoftwareTitleListOptions, tmFilter fleet.TeamFilter) ([]fleet.SoftwareTitleListResult, int, *fleet.PaginationMetadata, error) {
return nil, 0, nil, nil
}
ds.DeleteSetupExperienceScriptFunc = func(ctx context.Context, teamID *uint) error {
return nil
}

startSoftwareInstallerServer(t)

Expand Down Expand Up @@ -1211,6 +1217,9 @@ func TestGitOpsBasicGlobalAndTeam(t *testing.T) {
ds.ListABMTokensFunc = func(ctx context.Context) ([]*fleet.ABMToken, error) {
return []*fleet.ABMToken{}, nil
}
ds.DeleteSetupExperienceScriptFunc = func(ctx context.Context, teamID *uint) error {
return nil
}

ds.TeamsSummaryFunc = func(ctx context.Context) ([]*fleet.TeamSummary, error) {
var teamsSummary []*fleet.TeamSummary
Expand Down Expand Up @@ -1532,6 +1541,9 @@ func TestGitOpsBasicGlobalAndNoTeam(t *testing.T) {
ds.ListABMTokensFunc = func(ctx context.Context) ([]*fleet.ABMToken, error) {
return []*fleet.ABMToken{}, nil
}
ds.DeleteSetupExperienceScriptFunc = func(ctx context.Context, teamID *uint) error {
return nil
}

globalFileBasic, err := os.CreateTemp(t.TempDir(), "*.yml")
require.NoError(t, err)
Expand Down Expand Up @@ -1852,6 +1864,7 @@ func TestGitOpsFullGlobalAndTeam(t *testing.T) {

func TestGitOpsTeamSofwareInstallers(t *testing.T) {
startSoftwareInstallerServer(t)
startAndServeVPPServer(t)

cases := []struct {
file string
Expand All @@ -1871,12 +1884,37 @@ func TestGitOpsTeamSofwareInstallers(t *testing.T) {
{"testdata/gitops/team_software_installer_post_install_not_found.yml", "no such file or directory"},
{"testdata/gitops/team_software_installer_no_url.yml", "software URL is required"},
{"testdata/gitops/team_software_installer_invalid_self_service_value.yml", "\"packages.self_service\" must be a bool, found string"},
// team tests for setup experience software/script
{"testdata/gitops/team_setup_software_valid.yml", ""},
{"testdata/gitops/team_setup_software_invalid_script.yml", "no_such_script.sh: no such file"},
{"testdata/gitops/team_setup_software_invalid_software_package.yml", "no_such_software.yml\" does not exist for that team"},
{"testdata/gitops/team_setup_software_invalid_vpp_app.yml", "\"no_such_app\" does not exist for that team"},
}
for _, c := range cases {
t.Run(filepath.Base(c.file), func(t *testing.T) {
setupFullGitOpsPremiumServer(t)
ds, _, _ := setupFullGitOpsPremiumServer(t)
tokExpire := time.Now().Add(time.Hour)
token, err := test.CreateVPPTokenEncoded(tokExpire, "fleet", "ca")
require.NoError(t, err)

_, err := runAppNoChecks([]string{"gitops", "-f", c.file})
ds.SetTeamVPPAppsFunc = func(ctx context.Context, teamID *uint, adamIDs []fleet.VPPAppTeam) error {
return nil
}
ds.BatchInsertVPPAppsFunc = func(ctx context.Context, apps []*fleet.VPPApp) error {
return nil
}
ds.GetVPPTokenByTeamIDFunc = func(ctx context.Context, teamID *uint) (*fleet.VPPTokenDB, error) {
return &fleet.VPPTokenDB{
ID: 1,
OrgName: "Fleet",
Location: "Earth",
RenewDate: tokExpire,
Token: string(token),
Teams: nil,
}, nil
}

_, err = runAppNoChecks([]string{"gitops", "-f", c.file})
if c.wantErr == "" {
require.NoError(t, err)
} else {
Expand Down Expand Up @@ -1908,6 +1946,7 @@ func TestGitOpsTeamSoftwareInstallersQueryEnv(t *testing.T) {

func TestGitOpsNoTeamSoftwareInstallers(t *testing.T) {
startSoftwareInstallerServer(t)
startAndServeVPPServer(t)

cases := []struct {
noTeamFile string
Expand All @@ -1925,18 +1964,48 @@ func TestGitOpsNoTeamSoftwareInstallers(t *testing.T) {
{"testdata/gitops/no_team_software_installer_post_install_not_found.yml", "no such file or directory"},
{"testdata/gitops/no_team_software_installer_no_url.yml", "software URL is required"},
{"testdata/gitops/no_team_software_installer_invalid_self_service_value.yml", "\"packages.self_service\" must be a bool, found string"},
// No team tests for setup experience software/script
{"testdata/gitops/no_team_setup_software_valid.yml", ""},
{"testdata/gitops/no_team_setup_software_invalid_script.yml", "no_such_script.sh: no such file"},
{"testdata/gitops/no_team_setup_software_invalid_software_package.yml", "no_such_software.yml\" does not exist for that team"},
// VPP apps for No Team is unsupported at the moment : https://github.com/fleetdm/fleet/issues/22970
// {"testdata/gitops/no_team_setup_software_invalid_vpp_app.yml", "\"no_such_app\" does not exist for that team"},
}
for _, c := range cases {
t.Run(filepath.Base(c.noTeamFile), func(t *testing.T) {
setupFullGitOpsPremiumServer(t)
ds, _, _ := setupFullGitOpsPremiumServer(t)
tokExpire := time.Now().Add(time.Hour)
token, err := test.CreateVPPTokenEncoded(tokExpire, "fleet", "ca")
require.NoError(t, err)

ds.SetTeamVPPAppsFunc = func(ctx context.Context, teamID *uint, adamIDs []fleet.VPPAppTeam) error {
return nil
}
ds.BatchInsertVPPAppsFunc = func(ctx context.Context, apps []*fleet.VPPApp) error {
return nil
}
ds.GetVPPTokenByTeamIDFunc = func(ctx context.Context, teamID *uint) (*fleet.VPPTokenDB, error) {
return &fleet.VPPTokenDB{
ID: 1,
OrgName: "Fleet",
Location: "Earth",
RenewDate: tokExpire,
Token: string(token),
Teams: nil,
}, nil
}

t.Setenv("APPLE_BM_DEFAULT_TEAM", "")
globalFile := "./testdata/gitops/global_config_no_paths.yml"
if strings.HasPrefix(filepath.Base(c.noTeamFile), "no_team_setup_software") {
// the controls section is in the no-team test file, so use a global file without that section
globalFile = "./testdata/gitops/global_config_no_paths_no_controls.yml"
}
dstPath := filepath.Join(filepath.Dir(c.noTeamFile), "no-team.yml")
t.Cleanup(func() {
os.Remove(dstPath)
})
err := file.Copy(c.noTeamFile, dstPath, 0o755)
err = file.Copy(c.noTeamFile, dstPath, 0o755)
require.NoError(t, err)
_, err = runAppNoChecks([]string{"gitops", "-f", globalFile, "-f", dstPath})
if c.wantErr == "" {
Expand All @@ -1949,48 +2018,7 @@ func TestGitOpsNoTeamSoftwareInstallers(t *testing.T) {
}

func TestGitOpsTeamVPPApps(t *testing.T) {
config := &appleVPPConfigSrvConf{
Assets: []vpp.Asset{
{
AdamID: "1",
PricingParam: "STDQ",
AvailableCount: 12,
},
{
AdamID: "2",
PricingParam: "STDQ",
AvailableCount: 3,
},
},
SerialNumbers: []string{"123", "456"},
}

startVPPApplyServer(t, config)

appleITunesSrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// a map of apps we can respond with
db := map[string]string{
// macos app
"1": `{"bundleId": "a-1", "artworkUrl512": "https://example.com/images/1", "version": "1.0.0", "trackName": "App 1", "TrackID": 1}`,
// macos, ios, ipados app
"2": `{"bundleId": "b-2", "artworkUrl512": "https://example.com/images/2", "version": "2.0.0", "trackName": "App 2", "TrackID": 2,
"supportedDevices": ["MacDesktop-MacDesktop", "iPhone5s-iPhone5s", "iPadAir-iPadAir"] }`,
// ipados app
"3": `{"bundleId": "c-3", "artworkUrl512": "https://example.com/images/3", "version": "3.0.0", "trackName": "App 3", "TrackID": 3,
"supportedDevices": ["iPadAir-iPadAir"] }`,
}

adamIDString := r.URL.Query().Get("id")
adamIDs := strings.Split(adamIDString, ",")

var objs []string
for _, a := range adamIDs {
objs = append(objs, db[a])
}

_, _ = w.Write([]byte(fmt.Sprintf(`{"results": [%s]}`, strings.Join(objs, ","))))
}))
t.Setenv("FLEET_DEV_ITUNES_URL", appleITunesSrv.URL)
startAndServeVPPServer(t)

cases := []struct {
file string
Expand Down Expand Up @@ -2262,6 +2290,51 @@ func startVPPApplyServer(t *testing.T, config *appleVPPConfigSrvConf) {
t.Cleanup(srv.Close)
}

func startAndServeVPPServer(t *testing.T) {
config := &appleVPPConfigSrvConf{
Assets: []vpp.Asset{
{
AdamID: "1",
PricingParam: "STDQ",
AvailableCount: 12,
},
{
AdamID: "2",
PricingParam: "STDQ",
AvailableCount: 3,
},
},
SerialNumbers: []string{"123", "456"},
}

startVPPApplyServer(t, config)

appleITunesSrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// a map of apps we can respond with
db := map[string]string{
// macos app
"1": `{"bundleId": "a-1", "artworkUrl512": "https://example.com/images/1", "version": "1.0.0", "trackName": "App 1", "TrackID": 1}`,
// macos, ios, ipados app
"2": `{"bundleId": "b-2", "artworkUrl512": "https://example.com/images/2", "version": "2.0.0", "trackName": "App 2", "TrackID": 2,
"supportedDevices": ["MacDesktop-MacDesktop", "iPhone5s-iPhone5s", "iPadAir-iPadAir"] }`,
// ipados app
"3": `{"bundleId": "c-3", "artworkUrl512": "https://example.com/images/3", "version": "3.0.0", "trackName": "App 3", "TrackID": 3,
"supportedDevices": ["iPadAir-iPadAir"] }`,
}

adamIDString := r.URL.Query().Get("id")
adamIDs := strings.Split(adamIDString, ",")

var objs []string
for _, a := range adamIDs {
objs = append(objs, db[a])
}

_, _ = w.Write([]byte(fmt.Sprintf(`{"results": [%s]}`, strings.Join(objs, ","))))
}))
t.Setenv("FLEET_DEV_ITUNES_URL", appleITunesSrv.URL)
}

func setupFullGitOpsPremiumServer(t *testing.T) (*mock.Store, **fleet.AppConfig, map[string]**fleet.Team) {
testCert, testKey, err := apple_mdm.NewSCEPCACertKey()
require.NoError(t, err)
Expand Down Expand Up @@ -2449,6 +2522,12 @@ func setupFullGitOpsPremiumServer(t *testing.T) (*mock.Store, **fleet.AppConfig,
ds.ListABMTokensFunc = func(ctx context.Context) ([]*fleet.ABMToken, error) {
return []*fleet.ABMToken{}, nil
}
ds.DeleteSetupExperienceScriptFunc = func(ctx context.Context, teamID *uint) error {
return nil
}
ds.SetSetupExperienceScriptFunc = func(ctx context.Context, script *fleet.Script) error {
return nil
}

t.Setenv("FLEET_SERVER_URL", fleetServerURL)
t.Setenv("ORG_NAME", orgName)
Expand Down
2 changes: 1 addition & 1 deletion cmd/fleetctl/preview.go
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,7 @@ Use the stop and reset subcommands to manage the server and dependencies once st
// so pass in the current working directory.
teamsSoftwareInstallers := make(map[string][]fleet.SoftwarePackageResponse)
teamsScripts := make(map[string][]fleet.ScriptResponse)
_, _, _, err = client.ApplyGroup(c.Context, specs, ".", logf, nil, fleet.ApplyClientSpecOptions{}, teamsSoftwareInstallers, teamsScripts)
_, _, _, err = client.ApplyGroup(c.Context, false, specs, ".", logf, nil, fleet.ApplyClientSpecOptions{}, teamsSoftwareInstallers, teamsScripts)
if err != nil {
return err
}
Expand Down
4 changes: 3 additions & 1 deletion cmd/fleetctl/testdata/expectedGetConfigAppConfigJson.json
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,9 @@
"bootstrap_package": null,
"enable_end_user_authentication": false,
"macos_setup_assistant": null,
"enable_release_device_manually": false
"enable_release_device_manually": false,
"script": null,
"software": null
},
"windows_settings": {
"custom_settings": null
Expand Down
2 changes: 2 additions & 0 deletions cmd/fleetctl/testdata/expectedGetConfigAppConfigYaml.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ spec:
enable_end_user_authentication: false
enable_release_device_manually: false
macos_setup_assistant:
script:
software:
windows_settings:
custom_settings: null
end_user_authentication:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,9 @@
"bootstrap_package": null,
"enable_end_user_authentication": false,
"macos_setup_assistant": null,
"enable_release_device_manually": false
"enable_release_device_manually": false,
"script": null,
"software": null
},
"windows_settings": {
"custom_settings": null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ spec:
enable_end_user_authentication: false
enable_release_device_manually: false
macos_setup_assistant:
script:
software:
windows_settings:
custom_settings:
end_user_authentication:
Expand Down
Loading
Loading