diff --git a/providers/core/resources/core.lr b/providers/core/resources/core.lr index 478161c364..b4cc44d609 100644 --- a/providers/core/resources/core.lr +++ b/providers/core/resources/core.lr @@ -144,4 +144,10 @@ cpe @defaults("uri") { targetHw() string // Other of the CPE other() string +} + +slow { + field() string + field2() string + list() []string } \ No newline at end of file diff --git a/providers/core/resources/core.lr.go b/providers/core/resources/core.lr.go index 40f40a9dd4..b82f655c0b 100644 --- a/providers/core/resources/core.lr.go +++ b/providers/core/resources/core.lr.go @@ -50,6 +50,10 @@ func init() { Init: initCpe, Create: createCpe, }, + "slow": { + // to override args, implement: initSlow(runtime *plugin.Runtime, args map[string]*llx.RawData) (map[string]*llx.RawData, plugin.Resource, error) + Create: createSlow, + }, } } @@ -274,6 +278,15 @@ var getDataFields = map[string]func(r plugin.Resource) *plugin.DataRes{ "cpe.other": func(r plugin.Resource) *plugin.DataRes { return (r.(*mqlCpe).GetOther()).ToDataRes(types.String) }, + "slow.field": func(r plugin.Resource) *plugin.DataRes { + return (r.(*mqlSlow).GetField()).ToDataRes(types.String) + }, + "slow.field2": func(r plugin.Resource) *plugin.DataRes { + return (r.(*mqlSlow).GetField2()).ToDataRes(types.String) + }, + "slow.list": func(r plugin.Resource) *plugin.DataRes { + return (r.(*mqlSlow).GetList()).ToDataRes(types.Array(types.String)) + }, } func GetData(resource plugin.Resource, field string, args map[string]*llx.RawData) *plugin.DataRes { @@ -526,6 +539,22 @@ var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool { r.(*mqlCpe).Other, ok = plugin.RawToTValue[string](v.Value, v.Error) return }, + "slow.__id": func(r plugin.Resource, v *llx.RawData) (ok bool) { + r.(*mqlSlow).__id, ok = v.Value.(string) + return + }, + "slow.field": func(r plugin.Resource, v *llx.RawData) (ok bool) { + r.(*mqlSlow).Field, ok = plugin.RawToTValue[string](v.Value, v.Error) + return + }, + "slow.field2": func(r plugin.Resource, v *llx.RawData) (ok bool) { + r.(*mqlSlow).Field2, ok = plugin.RawToTValue[string](v.Value, v.Error) + return + }, + "slow.list": func(r plugin.Resource, v *llx.RawData) (ok bool) { + r.(*mqlSlow).List, ok = plugin.RawToTValue[[]interface{}](v.Value, v.Error) + return + }, } func SetData(resource plugin.Resource, field string, val *llx.RawData) error { @@ -1206,3 +1235,68 @@ func (c *mqlCpe) GetOther() *plugin.TValue[string] { return c.other() }) } + +// mqlSlow for the slow resource +type mqlSlow struct { + MqlRuntime *plugin.Runtime + __id string + // optional: if you define mqlSlowInternal it will be used here + Field plugin.TValue[string] + Field2 plugin.TValue[string] + List plugin.TValue[[]interface{}] +} + +// createSlow creates a new instance of this resource +func createSlow(runtime *plugin.Runtime, args map[string]*llx.RawData) (plugin.Resource, error) { + res := &mqlSlow{ + MqlRuntime: runtime, + } + + err := SetAllData(res, args) + if err != nil { + return res, err + } + + if res.__id == "" { + res.__id, err = res.id() + if err != nil { + return nil, err + } + } + + if runtime.HasRecording { + args, err = runtime.ResourceFromRecording("slow", res.__id) + if err != nil || args == nil { + return res, err + } + return res, SetAllData(res, args) + } + + return res, nil +} + +func (c *mqlSlow) MqlName() string { + return "slow" +} + +func (c *mqlSlow) MqlID() string { + return c.__id +} + +func (c *mqlSlow) GetField() *plugin.TValue[string] { + return plugin.GetOrCompute[string](&c.Field, func() (string, error) { + return c.field() + }) +} + +func (c *mqlSlow) GetField2() *plugin.TValue[string] { + return plugin.GetOrCompute[string](&c.Field2, func() (string, error) { + return c.field2() + }) +} + +func (c *mqlSlow) GetList() *plugin.TValue[[]interface{}] { + return plugin.GetOrCompute[[]interface{}](&c.List, func() ([]interface{}, error) { + return c.list() + }) +} diff --git a/providers/core/resources/core.lr.manifest.yaml b/providers/core/resources/core.lr.manifest.yaml index 1d9c67db09..e0be1e3986 100644 --- a/providers/core/resources/core.lr.manifest.yaml +++ b/providers/core/resources/core.lr.manifest.yaml @@ -341,6 +341,12 @@ resources: url: {} uuid: {} min_mondoo_version: 5.15.0 + slow: + fields: + field: {} + field2: {} + list: {} + min_mondoo_version: latest socket: fields: address: {} diff --git a/providers/core/resources/core.resources.json b/providers/core/resources/core.resources.json index 0a6ed36117..64f2bd3ecd 100644 --- a/providers/core/resources/core.resources.json +++ b/providers/core/resources/core.resources.json @@ -1 +1 @@ -{"resources":{"asset":{"id":"asset","name":"asset","fields":{"arch":{"name":"arch","type":"\u0007","is_mandatory":true,"title":"Architecture this OS is running on","provider":"go.mondoo.com/cnquery/v9/providers/core"},"build":{"name":"build","type":"\u0007","is_mandatory":true,"title":"Build version of the platform (optional)","provider":"go.mondoo.com/cnquery/v9/providers/core"},"eol":{"name":"eol","type":"\u001basset.eol","title":"Information about the assets platform end-of-life.","is_implicit_resource":true,"provider":"go.mondoo.com/cnquery/v9/providers/core"},"family":{"name":"family","type":"\u0019\u0007","is_mandatory":true,"title":"List of platform families that this platform belongs to","provider":"go.mondoo.com/cnquery/v9/providers/core"},"fqdn":{"name":"fqdn","type":"\u0007","is_mandatory":true,"title":"Fully qualified domain name (optional)","provider":"go.mondoo.com/cnquery/v9/providers/core"},"ids":{"name":"ids","type":"\u0019\u0007","is_mandatory":true,"title":"All identifiers for this asset","provider":"go.mondoo.com/cnquery/v9/providers/core"},"kind":{"name":"kind","type":"\u0007","is_mandatory":true,"title":"Kind of platform, for example:","desc":"api, baremetal, vm, vm-image, container, container-image, network, ...","provider":"go.mondoo.com/cnquery/v9/providers/core"},"labels":{"name":"labels","type":"\u001a\u0007\u0007","is_mandatory":true,"title":"Optional platform information","provider":"go.mondoo.com/cnquery/v9/providers/core"},"name":{"name":"name","type":"\u0007","is_mandatory":true,"title":"Human readable name of the asset","provider":"go.mondoo.com/cnquery/v9/providers/core"},"platform":{"name":"platform","type":"\u0007","is_mandatory":true,"title":"Platform for this asset (redhat, windows, k8s-pod)","provider":"go.mondoo.com/cnquery/v9/providers/core"},"runtime":{"name":"runtime","type":"\u0007","is_mandatory":true,"title":"Runtime is the specific kind of the platform. Examples include:","desc":"docker-container, podman-container, aws-ec2-instance, ...","provider":"go.mondoo.com/cnquery/v9/providers/core"},"title":{"name":"title","type":"\u0007","is_mandatory":true,"title":"Human-readable title of the platform (e.g., \"Red Hat 8, Container\")","provider":"go.mondoo.com/cnquery/v9/providers/core"},"version":{"name":"version","type":"\u0007","is_mandatory":true,"title":"Version of the platform","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"title":"General asset information","min_mondoo_version":"6.13.0","defaults":"name platform version","provider":"go.mondoo.com/cnquery/v9/providers/core"},"asset.eol":{"id":"asset.eol","name":"asset.eol","fields":{"date":{"name":"date","type":"\t","is_mandatory":true,"title":"End-of-Life date","provider":"go.mondoo.com/cnquery/v9/providers/core"},"docsUrl":{"name":"docsUrl","type":"\u0007","is_mandatory":true,"title":"Documentation URL","provider":"go.mondoo.com/cnquery/v9/providers/core"},"productUrl":{"name":"productUrl","type":"\u0007","is_mandatory":true,"title":"Product URL","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"title":"Information about the assets platform end-of-life.","min_mondoo_version":"latest","defaults":"date","provider":"go.mondoo.com/cnquery/v9/providers/core"},"cpe":{"id":"cpe","name":"cpe","fields":{"edition":{"name":"edition","type":"\u0007","title":"Edition of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"language":{"name":"language","type":"\u0007","title":"Language of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"other":{"name":"other","type":"\u0007","title":"Other of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"part":{"name":"part","type":"\u0007","title":"Part of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"product":{"name":"product","type":"\u0007","title":"Product of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"swEdition":{"name":"swEdition","type":"\u0007","title":"Software edition of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"targetHw":{"name":"targetHw","type":"\u0007","title":"Target hardware of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"targetSw":{"name":"targetSw","type":"\u0007","title":"Target software of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"update":{"name":"update","type":"\u0007","title":"Update of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"uri":{"name":"uri","type":"\u0007","is_mandatory":true,"title":"URI binding of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"vendor":{"name":"vendor","type":"\u0007","title":"Vendor of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"version":{"name":"version","type":"\u0007","title":"Version of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"init":{"args":[{"name":"uri","type":"\u0007"}]},"title":"Common Platform Enumeration (CPE) identifiers","min_mondoo_version":"latest","defaults":"uri","provider":"go.mondoo.com/cnquery/v9/providers/core"},"mondoo":{"id":"mondoo","name":"mondoo","fields":{"arch":{"name":"arch","type":"\u0007","title":"Architecture of this client (e.g., linux-amd64)","min_mondoo_version":"latest","provider":"go.mondoo.com/cnquery/v9/providers/core"},"build":{"name":"build","type":"\u0007","title":"Build of the client (e.g., production, development)","provider":"go.mondoo.com/cnquery/v9/providers/core"},"capabilities":{"name":"capabilities","type":"\u0019\u0007","title":"Connection capabilities","provider":"go.mondoo.com/cnquery/v9/providers/core"},"jobEnvironment":{"name":"jobEnvironment","type":"\n","title":"Agent execution environment","provider":"go.mondoo.com/cnquery/v9/providers/core"},"version":{"name":"version","type":"\u0007","title":"Version of the client running on the asset","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"title":"Contextual information about MQL runtime and environment","min_mondoo_version":"5.15.0","defaults":"version","provider":"go.mondoo.com/cnquery/v9/providers/core"},"parse":{"id":"parse","name":"parse","title":"Provides common parsers (json, ini, certs, etc)","min_mondoo_version":"5.15.0","provider":"go.mondoo.com/cnquery/v9/providers/core"},"regex":{"id":"regex","name":"regex","fields":{"creditCard":{"name":"creditCard","type":"\u0008","title":"Matches credit card numbers","provider":"go.mondoo.com/cnquery/v9/providers/core"},"email":{"name":"email","type":"\u0008","title":"Matches email addresses","provider":"go.mondoo.com/cnquery/v9/providers/core"},"emoji":{"name":"emoji","type":"\u0008","title":"Matches emojis","provider":"go.mondoo.com/cnquery/v9/providers/core"},"ipv4":{"name":"ipv4","type":"\u0008","title":"Matches IPv4 addresses","provider":"go.mondoo.com/cnquery/v9/providers/core"},"ipv6":{"name":"ipv6","type":"\u0008","title":"Matches IPv6 addresses","provider":"go.mondoo.com/cnquery/v9/providers/core"},"mac":{"name":"mac","type":"\u0008","title":"Matches MAC addresses","provider":"go.mondoo.com/cnquery/v9/providers/core"},"semver":{"name":"semver","type":"\u0008","title":"Matches semantic version numbers","provider":"go.mondoo.com/cnquery/v9/providers/core"},"url":{"name":"url","type":"\u0008","title":"Matches URL addresses (HTTP/HTTPS)","provider":"go.mondoo.com/cnquery/v9/providers/core"},"uuid":{"name":"uuid","type":"\u0008","title":"Matches hyphen-deliminated UUIDs","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"title":"Built-in regular expression functions","min_mondoo_version":"5.15.0","provider":"go.mondoo.com/cnquery/v9/providers/core"},"time":{"id":"time","name":"time","fields":{"day":{"name":"day","type":"\t","title":"One day, used for durations","provider":"go.mondoo.com/cnquery/v9/providers/core"},"hour":{"name":"hour","type":"\t","title":"One hour, used for durations","provider":"go.mondoo.com/cnquery/v9/providers/core"},"minute":{"name":"minute","type":"\t","title":"One minute, used for durations","provider":"go.mondoo.com/cnquery/v9/providers/core"},"now":{"name":"now","type":"\t","title":"The current time on the local system","provider":"go.mondoo.com/cnquery/v9/providers/core"},"second":{"name":"second","type":"\t","title":"One second, used for durations","provider":"go.mondoo.com/cnquery/v9/providers/core"},"today":{"name":"today","type":"\t","title":"The current day starting at midnight","provider":"go.mondoo.com/cnquery/v9/providers/core"},"tomorrow":{"name":"tomorrow","type":"\t","title":"The next day starting at midnight","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"title":"Date and time functions","min_mondoo_version":"5.15.0","provider":"go.mondoo.com/cnquery/v9/providers/core"},"uuid":{"id":"uuid","name":"uuid","fields":{"urn":{"name":"urn","type":"\u0007","title":"URN returns the RFC 2141 URN form of uuid","provider":"go.mondoo.com/cnquery/v9/providers/core"},"value":{"name":"value","type":"\u0007","is_mandatory":true,"title":"Canonical string representation xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","provider":"go.mondoo.com/cnquery/v9/providers/core"},"variant":{"name":"variant","type":"\u0007","title":"Variant encoded in UUID","provider":"go.mondoo.com/cnquery/v9/providers/core"},"version":{"name":"version","type":"\u0005","title":"Version of UUID","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"init":{"args":[{"name":"value","type":"\u0007"}]},"title":"UUIDs based on RFC 4122 and DCE 1.1","min_mondoo_version":"5.15.0","defaults":"value","provider":"go.mondoo.com/cnquery/v9/providers/core"}}} \ No newline at end of file +{"resources":{"asset":{"id":"asset","name":"asset","fields":{"arch":{"name":"arch","type":"\u0007","is_mandatory":true,"title":"Architecture this OS is running on","provider":"go.mondoo.com/cnquery/v9/providers/core"},"build":{"name":"build","type":"\u0007","is_mandatory":true,"title":"Build version of the platform (optional)","provider":"go.mondoo.com/cnquery/v9/providers/core"},"eol":{"name":"eol","type":"\u001basset.eol","title":"Information about the assets platform end-of-life.","is_implicit_resource":true,"provider":"go.mondoo.com/cnquery/v9/providers/core"},"family":{"name":"family","type":"\u0019\u0007","is_mandatory":true,"title":"List of platform families that this platform belongs to","provider":"go.mondoo.com/cnquery/v9/providers/core"},"fqdn":{"name":"fqdn","type":"\u0007","is_mandatory":true,"title":"Fully qualified domain name (optional)","provider":"go.mondoo.com/cnquery/v9/providers/core"},"ids":{"name":"ids","type":"\u0019\u0007","is_mandatory":true,"title":"All identifiers for this asset","provider":"go.mondoo.com/cnquery/v9/providers/core"},"kind":{"name":"kind","type":"\u0007","is_mandatory":true,"title":"Kind of platform, for example:","desc":"api, baremetal, vm, vm-image, container, container-image, network, ...","provider":"go.mondoo.com/cnquery/v9/providers/core"},"labels":{"name":"labels","type":"\u001a\u0007\u0007","is_mandatory":true,"title":"Optional platform information","provider":"go.mondoo.com/cnquery/v9/providers/core"},"name":{"name":"name","type":"\u0007","is_mandatory":true,"title":"Human readable name of the asset","provider":"go.mondoo.com/cnquery/v9/providers/core"},"platform":{"name":"platform","type":"\u0007","is_mandatory":true,"title":"Platform for this asset (redhat, windows, k8s-pod)","provider":"go.mondoo.com/cnquery/v9/providers/core"},"runtime":{"name":"runtime","type":"\u0007","is_mandatory":true,"title":"Runtime is the specific kind of the platform. Examples include:","desc":"docker-container, podman-container, aws-ec2-instance, ...","provider":"go.mondoo.com/cnquery/v9/providers/core"},"title":{"name":"title","type":"\u0007","is_mandatory":true,"title":"Human-readable title of the platform (e.g., \"Red Hat 8, Container\")","provider":"go.mondoo.com/cnquery/v9/providers/core"},"version":{"name":"version","type":"\u0007","is_mandatory":true,"title":"Version of the platform","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"title":"General asset information","min_mondoo_version":"6.13.0","defaults":"name platform version","provider":"go.mondoo.com/cnquery/v9/providers/core"},"asset.eol":{"id":"asset.eol","name":"asset.eol","fields":{"date":{"name":"date","type":"\t","is_mandatory":true,"title":"End-of-Life date","provider":"go.mondoo.com/cnquery/v9/providers/core"},"docsUrl":{"name":"docsUrl","type":"\u0007","is_mandatory":true,"title":"Documentation URL","provider":"go.mondoo.com/cnquery/v9/providers/core"},"productUrl":{"name":"productUrl","type":"\u0007","is_mandatory":true,"title":"Product URL","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"title":"Information about the assets platform end-of-life.","min_mondoo_version":"latest","defaults":"date","provider":"go.mondoo.com/cnquery/v9/providers/core"},"cpe":{"id":"cpe","name":"cpe","fields":{"edition":{"name":"edition","type":"\u0007","title":"Edition of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"language":{"name":"language","type":"\u0007","title":"Language of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"other":{"name":"other","type":"\u0007","title":"Other of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"part":{"name":"part","type":"\u0007","title":"Part of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"product":{"name":"product","type":"\u0007","title":"Product of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"swEdition":{"name":"swEdition","type":"\u0007","title":"Software edition of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"targetHw":{"name":"targetHw","type":"\u0007","title":"Target hardware of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"targetSw":{"name":"targetSw","type":"\u0007","title":"Target software of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"update":{"name":"update","type":"\u0007","title":"Update of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"uri":{"name":"uri","type":"\u0007","is_mandatory":true,"title":"URI binding of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"vendor":{"name":"vendor","type":"\u0007","title":"Vendor of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"},"version":{"name":"version","type":"\u0007","title":"Version of the CPE","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"init":{"args":[{"name":"uri","type":"\u0007"}]},"title":"Common Platform Enumeration (CPE) identifiers","min_mondoo_version":"latest","defaults":"uri","provider":"go.mondoo.com/cnquery/v9/providers/core"},"mondoo":{"id":"mondoo","name":"mondoo","fields":{"arch":{"name":"arch","type":"\u0007","title":"Architecture of this client (e.g., linux-amd64)","min_mondoo_version":"latest","provider":"go.mondoo.com/cnquery/v9/providers/core"},"build":{"name":"build","type":"\u0007","title":"Build of the client (e.g., production, development)","provider":"go.mondoo.com/cnquery/v9/providers/core"},"capabilities":{"name":"capabilities","type":"\u0019\u0007","title":"Connection capabilities","provider":"go.mondoo.com/cnquery/v9/providers/core"},"jobEnvironment":{"name":"jobEnvironment","type":"\n","title":"Agent execution environment","provider":"go.mondoo.com/cnquery/v9/providers/core"},"version":{"name":"version","type":"\u0007","title":"Version of the client running on the asset","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"title":"Contextual information about MQL runtime and environment","min_mondoo_version":"5.15.0","defaults":"version","provider":"go.mondoo.com/cnquery/v9/providers/core"},"parse":{"id":"parse","name":"parse","title":"Provides common parsers (json, ini, certs, etc)","min_mondoo_version":"5.15.0","provider":"go.mondoo.com/cnquery/v9/providers/core"},"regex":{"id":"regex","name":"regex","fields":{"creditCard":{"name":"creditCard","type":"\u0008","title":"Matches credit card numbers","provider":"go.mondoo.com/cnquery/v9/providers/core"},"email":{"name":"email","type":"\u0008","title":"Matches email addresses","provider":"go.mondoo.com/cnquery/v9/providers/core"},"emoji":{"name":"emoji","type":"\u0008","title":"Matches emojis","provider":"go.mondoo.com/cnquery/v9/providers/core"},"ipv4":{"name":"ipv4","type":"\u0008","title":"Matches IPv4 addresses","provider":"go.mondoo.com/cnquery/v9/providers/core"},"ipv6":{"name":"ipv6","type":"\u0008","title":"Matches IPv6 addresses","provider":"go.mondoo.com/cnquery/v9/providers/core"},"mac":{"name":"mac","type":"\u0008","title":"Matches MAC addresses","provider":"go.mondoo.com/cnquery/v9/providers/core"},"semver":{"name":"semver","type":"\u0008","title":"Matches semantic version numbers","provider":"go.mondoo.com/cnquery/v9/providers/core"},"url":{"name":"url","type":"\u0008","title":"Matches URL addresses (HTTP/HTTPS)","provider":"go.mondoo.com/cnquery/v9/providers/core"},"uuid":{"name":"uuid","type":"\u0008","title":"Matches hyphen-deliminated UUIDs","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"title":"Built-in regular expression functions","min_mondoo_version":"5.15.0","provider":"go.mondoo.com/cnquery/v9/providers/core"},"slow":{"id":"slow","name":"slow","fields":{"field":{"name":"field","type":"\u0007","provider":"go.mondoo.com/cnquery/v9/providers/core"},"field2":{"name":"field2","type":"\u0007","provider":"go.mondoo.com/cnquery/v9/providers/core"},"list":{"name":"list","type":"\u0019\u0007","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"min_mondoo_version":"latest","provider":"go.mondoo.com/cnquery/v9/providers/core"},"time":{"id":"time","name":"time","fields":{"day":{"name":"day","type":"\t","title":"One day, used for durations","provider":"go.mondoo.com/cnquery/v9/providers/core"},"hour":{"name":"hour","type":"\t","title":"One hour, used for durations","provider":"go.mondoo.com/cnquery/v9/providers/core"},"minute":{"name":"minute","type":"\t","title":"One minute, used for durations","provider":"go.mondoo.com/cnquery/v9/providers/core"},"now":{"name":"now","type":"\t","title":"The current time on the local system","provider":"go.mondoo.com/cnquery/v9/providers/core"},"second":{"name":"second","type":"\t","title":"One second, used for durations","provider":"go.mondoo.com/cnquery/v9/providers/core"},"today":{"name":"today","type":"\t","title":"The current day starting at midnight","provider":"go.mondoo.com/cnquery/v9/providers/core"},"tomorrow":{"name":"tomorrow","type":"\t","title":"The next day starting at midnight","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"title":"Date and time functions","min_mondoo_version":"5.15.0","provider":"go.mondoo.com/cnquery/v9/providers/core"},"uuid":{"id":"uuid","name":"uuid","fields":{"urn":{"name":"urn","type":"\u0007","title":"URN returns the RFC 2141 URN form of uuid","provider":"go.mondoo.com/cnquery/v9/providers/core"},"value":{"name":"value","type":"\u0007","is_mandatory":true,"title":"Canonical string representation xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","provider":"go.mondoo.com/cnquery/v9/providers/core"},"variant":{"name":"variant","type":"\u0007","title":"Variant encoded in UUID","provider":"go.mondoo.com/cnquery/v9/providers/core"},"version":{"name":"version","type":"\u0005","title":"Version of UUID","provider":"go.mondoo.com/cnquery/v9/providers/core"}},"init":{"args":[{"name":"value","type":"\u0007"}]},"title":"UUIDs based on RFC 4122 and DCE 1.1","min_mondoo_version":"5.15.0","defaults":"value","provider":"go.mondoo.com/cnquery/v9/providers/core"}}} \ No newline at end of file diff --git a/providers/core/resources/slow.go b/providers/core/resources/slow.go new file mode 100644 index 0000000000..f8c45a320f --- /dev/null +++ b/providers/core/resources/slow.go @@ -0,0 +1,25 @@ +package resources + +import ( + "go.mondoo.com/cnquery/v9/providers-sdk/v1/util/convert" + "time" +) + +func (u *mqlSlow) id() (string, error) { + return "slow", nil +} + +func (u *mqlSlow) field() (string, error) { + time.Sleep(30 * time.Second) + return "field", nil +} + +func (u *mqlSlow) field2() (string, error) { + time.Sleep(60 * time.Second) + return "field", nil +} + +func (u *mqlSlow) list() ([]interface{}, error) { + time.Sleep(240 * time.Second) + return convert.SliceAnyToInterface([]string{"a", "b", "b", "d"}), nil +} diff --git a/providers/slack/resources/slack.lr.go b/providers/slack/resources/slack.lr.go index 0011e89bdd..a65d503c13 100644 --- a/providers/slack/resources/slack.lr.go +++ b/providers/slack/resources/slack.lr.go @@ -17,7 +17,7 @@ import ( var resourceFactories map[string]plugin.ResourceFactory func init() { - resourceFactories = map[string]plugin.ResourceFactory{ + resourceFactories = map[string]plugin.ResourceFactory { "slack": { // to override args, implement: initSlack(runtime *plugin.Runtime, args map[string]*llx.RawData) (map[string]*llx.RawData, plugin.Resource, error) Create: createSlack, @@ -27,7 +27,7 @@ func init() { Create: createSlackConversations, }, "slack.team": { - Init: initSlackTeam, + Init: initSlackTeam, Create: createSlackTeam, }, "slack.users": { @@ -35,7 +35,7 @@ func init() { Create: createSlackUsers, }, "slack.user": { - Init: initSlackUser, + Init: initSlackUser, Create: createSlackUser, }, "slack.enterpriseUser": { @@ -73,7 +73,7 @@ func NewResource(runtime *plugin.Runtime, name string, args map[string]*llx.RawD } if res != nil { - id := name + "\x00" + res.MqlID() + id := name+"\x00"+res.MqlID() if x, ok := runtime.Resources.Get(id); ok { return x, nil } @@ -89,7 +89,7 @@ func NewResource(runtime *plugin.Runtime, name string, args map[string]*llx.RawD return nil, err } - id := name + "\x00" + res.MqlID() + id := name+"\x00"+res.MqlID() if x, ok := runtime.Resources.Get(id); ok { return x, nil } @@ -112,7 +112,7 @@ func CreateResource(runtime *plugin.Runtime, name string, args map[string]*llx.R return nil, err } - id := name + "\x00" + res.MqlID() + id := name+"\x00"+res.MqlID() if x, ok := runtime.Resources.Get(id); ok { return x, nil } @@ -400,11 +400,11 @@ func GetData(resource plugin.Resource, field string, args map[string]*llx.RawDat return f(resource) } -var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool{ +var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool { "slack.__id": func(r plugin.Resource, v *llx.RawData) (ok bool) { - r.(*mqlSlack).__id, ok = v.Value.(string) - return - }, + r.(*mqlSlack).__id, ok = v.Value.(string) + return + }, "slack.accessLogs": func(r plugin.Resource, v *llx.RawData) (ok bool) { r.(*mqlSlack).AccessLogs, ok = plugin.RawToTValue[[]interface{}](v.Value, v.Error) return @@ -414,9 +414,9 @@ var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool{ return }, "slack.conversations.__id": func(r plugin.Resource, v *llx.RawData) (ok bool) { - r.(*mqlSlackConversations).__id, ok = v.Value.(string) - return - }, + r.(*mqlSlackConversations).__id, ok = v.Value.(string) + return + }, "slack.conversations.privateChannels": func(r plugin.Resource, v *llx.RawData) (ok bool) { r.(*mqlSlackConversations).PrivateChannels, ok = plugin.RawToTValue[[]interface{}](v.Value, v.Error) return @@ -434,9 +434,9 @@ var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool{ return }, "slack.team.__id": func(r plugin.Resource, v *llx.RawData) (ok bool) { - r.(*mqlSlackTeam).__id, ok = v.Value.(string) - return - }, + r.(*mqlSlackTeam).__id, ok = v.Value.(string) + return + }, "slack.team.id": func(r plugin.Resource, v *llx.RawData) (ok bool) { r.(*mqlSlackTeam).Id, ok = plugin.RawToTValue[string](v.Value, v.Error) return @@ -454,9 +454,9 @@ var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool{ return }, "slack.users.__id": func(r plugin.Resource, v *llx.RawData) (ok bool) { - r.(*mqlSlackUsers).__id, ok = v.Value.(string) - return - }, + r.(*mqlSlackUsers).__id, ok = v.Value.(string) + return + }, "slack.users.bots": func(r plugin.Resource, v *llx.RawData) (ok bool) { r.(*mqlSlackUsers).Bots, ok = plugin.RawToTValue[[]interface{}](v.Value, v.Error) return @@ -478,9 +478,9 @@ var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool{ return }, "slack.user.__id": func(r plugin.Resource, v *llx.RawData) (ok bool) { - r.(*mqlSlackUser).__id, ok = v.Value.(string) - return - }, + r.(*mqlSlackUser).__id, ok = v.Value.(string) + return + }, "slack.user.id": func(r plugin.Resource, v *llx.RawData) (ok bool) { r.(*mqlSlackUser).Id, ok = plugin.RawToTValue[string](v.Value, v.Error) return @@ -582,9 +582,9 @@ var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool{ return }, "slack.enterpriseUser.__id": func(r plugin.Resource, v *llx.RawData) (ok bool) { - r.(*mqlSlackEnterpriseUser).__id, ok = v.Value.(string) - return - }, + r.(*mqlSlackEnterpriseUser).__id, ok = v.Value.(string) + return + }, "slack.enterpriseUser.id": func(r plugin.Resource, v *llx.RawData) (ok bool) { r.(*mqlSlackEnterpriseUser).Id, ok = plugin.RawToTValue[string](v.Value, v.Error) return @@ -606,9 +606,9 @@ var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool{ return }, "slack.userGroup.__id": func(r plugin.Resource, v *llx.RawData) (ok bool) { - r.(*mqlSlackUserGroup).__id, ok = v.Value.(string) - return - }, + r.(*mqlSlackUserGroup).__id, ok = v.Value.(string) + return + }, "slack.userGroup.id": func(r plugin.Resource, v *llx.RawData) (ok bool) { r.(*mqlSlackUserGroup).Id, ok = plugin.RawToTValue[string](v.Value, v.Error) return @@ -666,9 +666,9 @@ var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool{ return }, "slack.login.__id": func(r plugin.Resource, v *llx.RawData) (ok bool) { - r.(*mqlSlackLogin).__id, ok = v.Value.(string) - return - }, + r.(*mqlSlackLogin).__id, ok = v.Value.(string) + return + }, "slack.login.userID": func(r plugin.Resource, v *llx.RawData) (ok bool) { r.(*mqlSlackLogin).UserID, ok = plugin.RawToTValue[string](v.Value, v.Error) return @@ -710,9 +710,9 @@ var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool{ return }, "slack.conversation.__id": func(r plugin.Resource, v *llx.RawData) (ok bool) { - r.(*mqlSlackConversation).__id, ok = v.Value.(string) - return - }, + r.(*mqlSlackConversation).__id, ok = v.Value.(string) + return + }, "slack.conversation.id": func(r plugin.Resource, v *llx.RawData) (ok bool) { r.(*mqlSlackConversation).Id, ok = plugin.RawToTValue[string](v.Value, v.Error) return @@ -796,13 +796,13 @@ var setDataFields = map[string]func(r plugin.Resource, v *llx.RawData) bool{ } func SetData(resource plugin.Resource, field string, val *llx.RawData) error { - f, ok := setDataFields[resource.MqlName()+"."+field] + f, ok := setDataFields[resource.MqlName() + "." + field] if !ok { - return errors.New("[slack] cannot set '" + field + "' in resource '" + resource.MqlName() + "', field not found") + return errors.New("[slack] cannot set '"+field+"' in resource '"+resource.MqlName()+"', field not found") } if ok := f(resource, val); !ok { - return errors.New("[slack] cannot set '" + field + "' in resource '" + resource.MqlName() + "', type does not match") + return errors.New("[slack] cannot set '"+field+"' in resource '"+resource.MqlName()+"', type does not match") } return nil } @@ -820,7 +820,7 @@ func SetAllData(resource plugin.Resource, args map[string]*llx.RawData) error { // mqlSlack for the slack resource type mqlSlack struct { MqlRuntime *plugin.Runtime - __id string + __id string // optional: if you define mqlSlackInternal it will be used here AccessLogs plugin.TValue[[]interface{}] UserGroups plugin.TValue[[]interface{}] @@ -838,7 +838,7 @@ func createSlack(runtime *plugin.Runtime, args map[string]*llx.RawData) (plugin. } if res.__id == "" { - res.__id, err = res.id() + res.__id, err = res.id() if err != nil { return nil, err } @@ -898,12 +898,12 @@ func (c *mqlSlack) GetUserGroups() *plugin.TValue[[]interface{}] { // mqlSlackConversations for the slack.conversations resource type mqlSlackConversations struct { MqlRuntime *plugin.Runtime - __id string + __id string // optional: if you define mqlSlackConversationsInternal it will be used here PrivateChannels plugin.TValue[[]interface{}] - PublicChannels plugin.TValue[[]interface{}] - DirectMessages plugin.TValue[[]interface{}] - List plugin.TValue[[]interface{}] + PublicChannels plugin.TValue[[]interface{}] + DirectMessages plugin.TValue[[]interface{}] + List plugin.TValue[[]interface{}] } // createSlackConversations creates a new instance of this resource @@ -918,7 +918,7 @@ func createSlackConversations(runtime *plugin.Runtime, args map[string]*llx.RawD } if res.__id == "" { - res.__id, err = res.id() + res.__id, err = res.id() if err != nil { return nil, err } @@ -1010,11 +1010,11 @@ func (c *mqlSlackConversations) GetList() *plugin.TValue[[]interface{}] { // mqlSlackTeam for the slack.team resource type mqlSlackTeam struct { MqlRuntime *plugin.Runtime - __id string + __id string // optional: if you define mqlSlackTeamInternal it will be used here - Id plugin.TValue[string] - Name plugin.TValue[string] - Domain plugin.TValue[string] + Id plugin.TValue[string] + Name plugin.TValue[string] + Domain plugin.TValue[string] EmailDomain plugin.TValue[string] } @@ -1030,7 +1030,7 @@ func createSlackTeam(runtime *plugin.Runtime, args map[string]*llx.RawData) (plu } if res.__id == "" { - res.__id, err = res.id() + res.__id, err = res.id() if err != nil { return nil, err } @@ -1074,13 +1074,13 @@ func (c *mqlSlackTeam) GetEmailDomain() *plugin.TValue[string] { // mqlSlackUsers for the slack.users resource type mqlSlackUsers struct { MqlRuntime *plugin.Runtime - __id string + __id string // optional: if you define mqlSlackUsersInternal it will be used here - Bots plugin.TValue[[]interface{}] + Bots plugin.TValue[[]interface{}] Members plugin.TValue[[]interface{}] - Admins plugin.TValue[[]interface{}] - Owners plugin.TValue[[]interface{}] - List plugin.TValue[[]interface{}] + Admins plugin.TValue[[]interface{}] + Owners plugin.TValue[[]interface{}] + List plugin.TValue[[]interface{}] } // createSlackUsers creates a new instance of this resource @@ -1095,7 +1095,7 @@ func createSlackUsers(runtime *plugin.Runtime, args map[string]*llx.RawData) (pl } if res.__id == "" { - res.__id, err = res.id() + res.__id, err = res.id() if err != nil { return nil, err } @@ -1203,33 +1203,33 @@ func (c *mqlSlackUsers) GetList() *plugin.TValue[[]interface{}] { // mqlSlackUser for the slack.user resource type mqlSlackUser struct { MqlRuntime *plugin.Runtime - __id string + __id string // optional: if you define mqlSlackUserInternal it will be used here - Id plugin.TValue[string] - Name plugin.TValue[string] - TeamId plugin.TValue[string] - Deleted plugin.TValue[bool] - Color plugin.TValue[string] - RealName plugin.TValue[string] - TimeZone plugin.TValue[string] - TimeZoneLabel plugin.TValue[string] - TimeZoneOffset plugin.TValue[int64] - IsBot plugin.TValue[bool] - IsAdmin plugin.TValue[bool] - IsOwner plugin.TValue[bool] - IsPrimaryOwner plugin.TValue[bool] - IsRestricted plugin.TValue[bool] + Id plugin.TValue[string] + Name plugin.TValue[string] + TeamId plugin.TValue[string] + Deleted plugin.TValue[bool] + Color plugin.TValue[string] + RealName plugin.TValue[string] + TimeZone plugin.TValue[string] + TimeZoneLabel plugin.TValue[string] + TimeZoneOffset plugin.TValue[int64] + IsBot plugin.TValue[bool] + IsAdmin plugin.TValue[bool] + IsOwner plugin.TValue[bool] + IsPrimaryOwner plugin.TValue[bool] + IsRestricted plugin.TValue[bool] IsUltraRestricted plugin.TValue[bool] - IsStranger plugin.TValue[bool] - IsAppUser plugin.TValue[bool] - IsInvitedUser plugin.TValue[bool] - Has2FA plugin.TValue[bool] - TwoFactorType plugin.TValue[string] - HasFiles plugin.TValue[bool] - Presence plugin.TValue[string] - Locale plugin.TValue[string] - Profile plugin.TValue[interface{}] - EnterpriseUser plugin.TValue[*mqlSlackEnterpriseUser] + IsStranger plugin.TValue[bool] + IsAppUser plugin.TValue[bool] + IsInvitedUser plugin.TValue[bool] + Has2FA plugin.TValue[bool] + TwoFactorType plugin.TValue[string] + HasFiles plugin.TValue[bool] + Presence plugin.TValue[string] + Locale plugin.TValue[string] + Profile plugin.TValue[interface{}] + EnterpriseUser plugin.TValue[*mqlSlackEnterpriseUser] } // createSlackUser creates a new instance of this resource @@ -1244,7 +1244,7 @@ func createSlackUser(runtime *plugin.Runtime, args map[string]*llx.RawData) (plu } if res.__id == "" { - res.__id, err = res.id() + res.__id, err = res.id() if err != nil { return nil, err } @@ -1372,13 +1372,13 @@ func (c *mqlSlackUser) GetEnterpriseUser() *plugin.TValue[*mqlSlackEnterpriseUse // mqlSlackEnterpriseUser for the slack.enterpriseUser resource type mqlSlackEnterpriseUser struct { MqlRuntime *plugin.Runtime - __id string + __id string // optional: if you define mqlSlackEnterpriseUserInternal it will be used here - Id plugin.TValue[string] - EnterpriseId plugin.TValue[string] + Id plugin.TValue[string] + EnterpriseId plugin.TValue[string] EnterpriseName plugin.TValue[string] - IsAdmin plugin.TValue[bool] - IsOwner plugin.TValue[bool] + IsAdmin plugin.TValue[bool] + IsOwner plugin.TValue[bool] } // createSlackEnterpriseUser creates a new instance of this resource @@ -1393,7 +1393,7 @@ func createSlackEnterpriseUser(runtime *plugin.Runtime, args map[string]*llx.Raw } if res.__id == "" { - res.__id, err = res.id() + res.__id, err = res.id() if err != nil { return nil, err } @@ -1441,22 +1441,22 @@ func (c *mqlSlackEnterpriseUser) GetIsOwner() *plugin.TValue[bool] { // mqlSlackUserGroup for the slack.userGroup resource type mqlSlackUserGroup struct { MqlRuntime *plugin.Runtime - __id string + __id string // optional: if you define mqlSlackUserGroupInternal it will be used here - Id plugin.TValue[string] - TeamId plugin.TValue[string] - Name plugin.TValue[string] + Id plugin.TValue[string] + TeamId plugin.TValue[string] + Name plugin.TValue[string] Description plugin.TValue[string] - Handle plugin.TValue[string] - IsExternal plugin.TValue[bool] - Created plugin.TValue[*time.Time] - Updated plugin.TValue[*time.Time] - Deleted plugin.TValue[*time.Time] - CreatedBy plugin.TValue[*mqlSlackUser] - UpdatedBy plugin.TValue[*mqlSlackUser] - DeletedBy plugin.TValue[*mqlSlackUser] - UserCount plugin.TValue[int64] - Members plugin.TValue[[]interface{}] + Handle plugin.TValue[string] + IsExternal plugin.TValue[bool] + Created plugin.TValue[*time.Time] + Updated plugin.TValue[*time.Time] + Deleted plugin.TValue[*time.Time] + CreatedBy plugin.TValue[*mqlSlackUser] + UpdatedBy plugin.TValue[*mqlSlackUser] + DeletedBy plugin.TValue[*mqlSlackUser] + UserCount plugin.TValue[int64] + Members plugin.TValue[[]interface{}] } // createSlackUserGroup creates a new instance of this resource @@ -1471,7 +1471,7 @@ func createSlackUserGroup(runtime *plugin.Runtime, args map[string]*llx.RawData) } if res.__id == "" { - res.__id, err = res.id() + res.__id, err = res.id() if err != nil { return nil, err } @@ -1567,18 +1567,18 @@ func (c *mqlSlackUserGroup) GetMembers() *plugin.TValue[[]interface{}] { // mqlSlackLogin for the slack.login resource type mqlSlackLogin struct { MqlRuntime *plugin.Runtime - __id string + __id string // optional: if you define mqlSlackLoginInternal it will be used here - UserID plugin.TValue[string] - Username plugin.TValue[string] - Count plugin.TValue[int64] - Ip plugin.TValue[string] + UserID plugin.TValue[string] + Username plugin.TValue[string] + Count plugin.TValue[int64] + Ip plugin.TValue[string] UserAgent plugin.TValue[string] - Isp plugin.TValue[string] - Country plugin.TValue[string] - Region plugin.TValue[string] + Isp plugin.TValue[string] + Country plugin.TValue[string] + Region plugin.TValue[string] DateFirst plugin.TValue[*time.Time] - DateLast plugin.TValue[*time.Time] + DateLast plugin.TValue[*time.Time] } // createSlackLogin creates a new instance of this resource @@ -1593,7 +1593,7 @@ func createSlackLogin(runtime *plugin.Runtime, args map[string]*llx.RawData) (pl } if res.__id == "" { - res.__id, err = res.id() + res.__id, err = res.id() if err != nil { return nil, err } @@ -1661,28 +1661,28 @@ func (c *mqlSlackLogin) GetDateLast() *plugin.TValue[*time.Time] { // mqlSlackConversation for the slack.conversation resource type mqlSlackConversation struct { MqlRuntime *plugin.Runtime - __id string + __id string // optional: if you define mqlSlackConversationInternal it will be used here - Id plugin.TValue[string] - Name plugin.TValue[string] - Creator plugin.TValue[*mqlSlackUser] - Created plugin.TValue[*time.Time] - Locale plugin.TValue[string] - Topic plugin.TValue[interface{}] - Purpose plugin.TValue[interface{}] - IsArchived plugin.TValue[bool] - IsOpen plugin.TValue[bool] - IsPrivate plugin.TValue[bool] - IsIM plugin.TValue[bool] - IsMpim plugin.TValue[bool] - IsGroup plugin.TValue[bool] - IsChannel plugin.TValue[bool] - IsShared plugin.TValue[bool] - IsExtShared plugin.TValue[bool] + Id plugin.TValue[string] + Name plugin.TValue[string] + Creator plugin.TValue[*mqlSlackUser] + Created plugin.TValue[*time.Time] + Locale plugin.TValue[string] + Topic plugin.TValue[interface{}] + Purpose plugin.TValue[interface{}] + IsArchived plugin.TValue[bool] + IsOpen plugin.TValue[bool] + IsPrivate plugin.TValue[bool] + IsIM plugin.TValue[bool] + IsMpim plugin.TValue[bool] + IsGroup plugin.TValue[bool] + IsChannel plugin.TValue[bool] + IsShared plugin.TValue[bool] + IsExtShared plugin.TValue[bool] IsPendingExtShared plugin.TValue[bool] - IsOrgShared plugin.TValue[bool] - Priority plugin.TValue[float64] - Members plugin.TValue[[]interface{}] + IsOrgShared plugin.TValue[bool] + Priority plugin.TValue[float64] + Members plugin.TValue[[]interface{}] } // createSlackConversation creates a new instance of this resource @@ -1697,7 +1697,7 @@ func createSlackConversation(runtime *plugin.Runtime, args map[string]*llx.RawDa } if res.__id == "" { - res.__id, err = res.id() + res.__id, err = res.id() if err != nil { return nil, err } diff --git a/slow.mql.yaml b/slow.mql.yaml new file mode 100644 index 0000000000..b81cefae98 --- /dev/null +++ b/slow.mql.yaml @@ -0,0 +1,36 @@ +# Copyright (c) Mondoo, Inc. +# SPDX-License-Identifier: BUSL-1.1 + +policies: + - uid: slow-data-collector + name: Slow data collector policy + groups: + - filters: + - asset.family.contains("unix") + checks: + - uid: mondoo-slow-field-1 + title: Slow query 1 + mql: | + slow.field == "field" + - uid: mondoo-slow-field-2 + title: Slow query 2 + mql: | + slow.field2 == "field" + - uid: mondoo-slow-list + title: Slow list + mql: | + slow.list == empty + - uid: mondoo-slow-list-where + title: Slow list with filter + mql: | + slow.list.where( _ == "b").length == 2 + - uid: mondoo-slow-list-all + title: Slow list with all + mql: | + slow.list.where( _ == "b").all(_ == "b") + - uid: mondoo-openssh-installed-version + title: Check ssh package is installed + mql: packages.any(name == /ssh/) + - uid: mondoo-openssh-config + title: Check ssh config + mql: sshd.config.params["UsePAM"] == "yes" \ No newline at end of file