Files
fleet/tools/dibble/pkg/command/idp.go
T
George Karr a25ae3ddfc Adding initial tool - dibble the tapir for seeding data (#46122)
## Overview

`dibble` is a one-stop CLI for seeding a Fleet server with test data —
users, teams, policies, reports, labels, scripts, MDM profiles,
software, secrets, CAs, and vulns — replacing ~8 ad-hoc seeding tools
with a single binary.

It makes it easy to:
- **Spin up a populated dev/test server in one command** — `dibble all`
plants everything with sensible, idempotent defaults.
- **Skip the flag-memorization** — running `dibble` with no args
launches an interactive wizard that prompts for Fleet URL, API token,
theme, and which entities to seed, and offers to save the config to
`~/.dibble.yaml`.
- **Seed individual entity types** — `dibble users`, `dibble teams`,
`dibble policies`, etc., when you only need one slice.
- **Get themed, recognizable test data** — pick a theme (hitchhikers,
tng, lotr, ghibli, parksrec, …) so seeded names are easy to eyeball in
the UI.

Hosts are intentionally out of scope — `cmd/osquery-perf` still owns
that. `dibble hosts` is a thin convenience wrapper that picks a fleet,
fetches its enroll secret, and prints/runs the osquery-perf invocation
for you.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Dibble: a CLI tool to seed realistic test data, including an
interactive wizard and subcommands for
teams/users/software/policies/scripts/reports/profiles/labels/activities/enroll-secrets/hosts/vulns,
plus theme-driven “cas” and “ping”.
* Theme system: multiple curated themes to generate consistent seeded
identities, policies, software, labels, and scripts.
* **Chores**
* Ignored the built dibble binary and added a Makefile build target to
compile the dibble tool.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-06-17 11:07:05 -05:00

53 lines
1.8 KiB
Go

package command
import (
"context"
"github.com/spf13/cobra"
"github.com/fleetdm/fleet/v4/tools/dibble/pkg/seed"
)
// newIDPCmd wires `dibble idp` — populates mdm_idp_accounts for the most
// recently seeded users and assigns those accounts round-robin to the first
// N hosts. Like vulns and activities, this seeder writes directly to MySQL
// (those tables have no public API).
func newIDPCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "idp",
Short: "Create IDP accounts for seeded users and assign them to hosts (direct MySQL)",
Long: `Plants rows in mdm_idp_accounts (one per seeded user, matched by email)
and host_mdm_idp_accounts (round-robin assignment to existing hosts).
Users are fetched via the Fleet API sorted by created_at DESC so dibble-seeded
users surface ahead of the bootstrap admin. Hosts are fetched via the Fleet
API — enroll some first with osquery-perf (try ` + "`dibble hosts`" + `).
Requires direct MySQL access; the default DSN matches the local docker-compose
dev environment.`,
RunE: func(cmd *cobra.Command, args []string) error {
if err := requireConfig(); err != nil {
return err
}
c, err := newClientFromViper()
if err != nil {
return err
}
dsn, _ := cmd.Flags().GetString("dsn")
users, _ := cmd.Flags().GetInt("user-count")
hosts, _ := cmd.Flags().GetInt("host-count")
res := seed.IDP(context.Background(), c, seederLogger{}, seed.IDPOptions{
DSN: dsn,
UserCount: users,
HostCount: hosts,
})
printf("%s", res.Summary())
return reportErrors(res.Errors)
},
}
cmd.Flags().String("dsn", "fleet:insecure@tcp(localhost:3306)/fleet", "MySQL DSN")
cmd.Flags().Int("user-count", 3, "How many seeded users to give an IDP account")
cmd.Flags().Int("host-count", 5, "How many hosts to assign IDP accounts to (round-robin)")
return cmd
}