Skip to content

Commit 575ae13

Browse files
authored
Merge pull request #6 from Myra-Security-GmbH/addMissingResources
Add missing resources
2 parents 1aecf17 + 3aee67d commit 575ae13

File tree

6 files changed

+386
-11
lines changed

6 files changed

+386
-11
lines changed

docs/myrasec.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
### Use with Myra Security
22

3-
Example using a Myra Security API Key and corresponding Token:
3+
Example using a Myra Security API Key and corresponding API Secret:
44

55
```
6-
export MYRASEC_API_SECRET=[MYRASEC_API_SECRET]
76
export MYRASEC_API_KEY=[MYRASEC_API_KEY]
7+
export MYRASEC_API_SECRET=[MYRASEC_API_SECRET]
88
./terraformer import myrasec --resources=domain
99
```
1010

@@ -26,5 +26,13 @@ List of supported Myra Security services:
2626
* `myrasec_redirect`
2727
* `settings`
2828
* `myrasec_settings`
29+
* `tag`
30+
* `myrasec_tag`
31+
* `tag_cache_setting`
32+
* `myrasec_tag_cache_setting`
33+
* `tag_settings`
34+
* `myrasec_tag_settings`
35+
* `tag_waf_rule`
36+
* `myrasec_tag_waf_rule`
2937
* `waf_rule`
3038
* `myrasec_waf_rule`

providers/myrasec/myrasec_provider.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,19 @@ func (MyrasecProvider) GetResourceConnections() map[string]map[string][]string {
3434
// GetSupportedService
3535
func (p *MyrasecProvider) GetSupportedService() map[string]terraformutils.ServiceGenerator {
3636
return map[string]terraformutils.ServiceGenerator{
37-
"domain": &DomainGenerator{},
38-
"dns_record": &DNSGenerator{},
39-
"cache_setting": &CacheSettingGenerator{},
40-
"redirect": &RedirectGenerator{},
41-
"ip_filter": &IPFilterGenerator{},
42-
"settings": &SettingsGenerator{},
43-
"waf_rule": &WafRuleGenerator{},
44-
"maintenance": &MaintenanceGenerator{},
45-
"error_page": &ErrorPageGenerator{},
37+
"cache_setting": &CacheSettingGenerator{},
38+
"dns_record": &DNSGenerator{},
39+
"domain": &DomainGenerator{},
40+
"error_page": &ErrorPageGenerator{},
41+
"ip_filter": &IPFilterGenerator{},
42+
"maintenance": &MaintenanceGenerator{},
43+
"redirect": &RedirectGenerator{},
44+
"settings": &SettingsGenerator{},
45+
"tag": &TagGenerator{},
46+
"tag_cache_setting": &TagCacheSettingGenerator{},
47+
"tag_setting": &TagSettingGenerator{},
48+
"tag_waf_rule": &TagWafRuleGenerator{},
49+
"waf_rule": &WafRuleGenerator{},
4650
}
4751
}
4852

providers/myrasec/tag.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package myrasec
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"sync"
7+
8+
"github.com/GoogleCloudPlatform/terraformer/terraformutils"
9+
mgo "github.com/Myra-Security-GmbH/myrasec-go/v2"
10+
)
11+
12+
type TagGenerator struct {
13+
MyrasecService
14+
}
15+
16+
func (g *TagGenerator) createTagResource(_ *mgo.API, tag mgo.Tag, wg *sync.WaitGroup) error {
17+
defer wg.Done()
18+
19+
t := terraformutils.NewResource(
20+
strconv.Itoa(tag.ID),
21+
fmt.Sprintf("%s_%d", tag.Name, tag.ID),
22+
"myrasec_tag",
23+
"myrasec",
24+
map[string]string{},
25+
[]string{},
26+
map[string]any{},
27+
)
28+
g.Resources = append(g.Resources, t)
29+
return nil
30+
}
31+
32+
func (g *TagGenerator) InitResources() error {
33+
wg := sync.WaitGroup{}
34+
35+
api, err := g.initializeAPI()
36+
if err != nil {
37+
return err
38+
}
39+
40+
funcs := []func(*mgo.API, mgo.Tag, *sync.WaitGroup) error{
41+
g.createTagResource,
42+
}
43+
44+
err = createResourcesPerTag(api, funcs, &wg, "ALL")
45+
if err != nil {
46+
return err
47+
}
48+
wg.Wait()
49+
50+
return nil
51+
}
52+
53+
func createResourcesPerTag(api *mgo.API, funcs []func(*mgo.API, mgo.Tag, *sync.WaitGroup) error, wg *sync.WaitGroup, tagType string) error {
54+
page := 1
55+
pageSize := 250
56+
params := map[string]string{
57+
"pageSize": strconv.Itoa(pageSize),
58+
"page": strconv.Itoa(page),
59+
}
60+
if tagType != "ALL" {
61+
params["type"] = tagType
62+
}
63+
64+
for {
65+
params["page"] = strconv.Itoa(page)
66+
67+
tags, err := api.ListTags(params)
68+
if err != nil {
69+
return err
70+
}
71+
72+
wg.Add(len(tags) * len(funcs))
73+
for _, t := range tags {
74+
for _, f := range funcs {
75+
err := f(api, t, wg)
76+
if err != nil {
77+
return err
78+
}
79+
}
80+
}
81+
if len(tags) < pageSize {
82+
break
83+
}
84+
page++
85+
}
86+
return nil
87+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package myrasec
2+
3+
import (
4+
"fmt"
5+
"strconv"
6+
"sync"
7+
8+
"github.com/GoogleCloudPlatform/terraformer/terraformutils"
9+
mgo "github.com/Myra-Security-GmbH/myrasec-go/v2"
10+
)
11+
12+
// TagCacheSettingGenerator
13+
type TagCacheSettingGenerator struct {
14+
MyrasecService
15+
}
16+
17+
// createTagCacheSettingResources
18+
func (g *TagCacheSettingGenerator) createTagCacheSettingResources(api *mgo.API, tag mgo.Tag, wg *sync.WaitGroup) error {
19+
defer wg.Done()
20+
21+
page := 1
22+
pageSize := 250
23+
params := map[string]string{
24+
"pageSize": strconv.Itoa(pageSize),
25+
"page": strconv.Itoa(page),
26+
}
27+
28+
for {
29+
params["page"] = strconv.Itoa(page)
30+
31+
settings, err := api.ListTagCacheSettings(tag.ID, params)
32+
33+
if err != nil {
34+
return err
35+
}
36+
37+
for _, s := range settings {
38+
r := terraformutils.NewResource(
39+
strconv.Itoa(s.ID),
40+
fmt.Sprintf("%s_%d", tag.Name, s.ID),
41+
"myrasec_tag_cache_setting",
42+
"myrasec",
43+
map[string]string{
44+
"tag_id": strconv.Itoa(tag.ID),
45+
},
46+
[]string{},
47+
map[string]any{},
48+
)
49+
g.Resources = append(g.Resources, r)
50+
}
51+
if len(settings) < pageSize {
52+
break
53+
}
54+
page++
55+
}
56+
return nil
57+
}
58+
59+
// InitResources
60+
func (g *TagCacheSettingGenerator) InitResources() error {
61+
wg := sync.WaitGroup{}
62+
63+
api, err := g.initializeAPI()
64+
if err != nil {
65+
return err
66+
}
67+
68+
funcs := []func(*mgo.API, mgo.Tag, *sync.WaitGroup) error{
69+
g.createTagCacheSettingResources,
70+
}
71+
err = createResourcesPerTag(api, funcs, &wg, "CACHE")
72+
if err != nil {
73+
return err
74+
}
75+
76+
wg.Wait()
77+
78+
return nil
79+
}

providers/myrasec/tag_setting.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package myrasec
2+
3+
import (
4+
"fmt"
5+
"reflect"
6+
"strconv"
7+
"sync"
8+
9+
"github.com/GoogleCloudPlatform/terraformer/terraformutils"
10+
mgo "github.com/Myra-Security-GmbH/myrasec-go/v2"
11+
)
12+
13+
// TagSettingGenerator
14+
type TagSettingGenerator struct {
15+
MyrasecService
16+
}
17+
18+
// createTagSettingResources
19+
func (g *TagSettingGenerator) createTagSettingResources(api *mgo.API, tag mgo.Tag, wg *sync.WaitGroup) error {
20+
defer wg.Done()
21+
22+
response, err := api.ListTagSettingsMap(tag.ID)
23+
if err != nil {
24+
return err
25+
}
26+
27+
r := terraformutils.NewResource(
28+
strconv.Itoa(tag.ID),
29+
fmt.Sprintf("%s_%d", tag.Name, tag.ID),
30+
"myrasec_tag_settings",
31+
"myrasec",
32+
map[string]string{
33+
"tag_id": strconv.Itoa(tag.ID),
34+
},
35+
[]string{},
36+
map[string]any{},
37+
)
38+
39+
attributes := structToMap(mgo.Settings{})
40+
data := *(response.(*map[string]any))
41+
settings := data["settings"].(map[string]any)
42+
for k := range attributes {
43+
if _, ok := settings[k]; !ok {
44+
r.IgnoreKeys = append(r.IgnoreKeys, k)
45+
}
46+
}
47+
g.Resources = append(g.Resources, r)
48+
return nil
49+
}
50+
51+
// InitResources
52+
func (g *TagSettingGenerator) InitResources() error {
53+
wg := sync.WaitGroup{}
54+
55+
api, err := g.initializeAPI()
56+
if err != nil {
57+
return err
58+
}
59+
60+
funcs := []func(*mgo.API, mgo.Tag, *sync.WaitGroup) error{
61+
g.createTagSettingResources,
62+
}
63+
err = createResourcesPerTag(api, funcs, &wg, "CONFIG")
64+
if err != nil {
65+
return err
66+
}
67+
68+
wg.Wait()
69+
70+
return nil
71+
}
72+
73+
func index(s, substr string) int {
74+
for i := range s {
75+
if s[i:i+len(substr)] == substr {
76+
return i
77+
}
78+
}
79+
return -1
80+
}
81+
82+
func structToMap(s any) map[string]any {
83+
result := make(map[string]any)
84+
val := reflect.ValueOf(s)
85+
typ := reflect.TypeOf(s)
86+
87+
// Make sure it's a struct
88+
if val.Kind() == reflect.Ptr {
89+
val = val.Elem()
90+
typ = typ.Elem()
91+
}
92+
if val.Kind() != reflect.Struct {
93+
return nil
94+
}
95+
96+
for i := 0; i < val.NumField(); i++ {
97+
field := typ.Field(i)
98+
value := val.Field(i)
99+
100+
// get JSON tag
101+
jsonTag := field.Tag.Get("json")
102+
103+
// if no json tag or "-", skip or fallback to field name
104+
if jsonTag == "" || jsonTag == "-" {
105+
jsonTag = field.Name
106+
} else {
107+
if commaIdx := reflect.ValueOf(jsonTag).String(); commaIdx != "" {
108+
if idx := index(jsonTag, ","); idx != -1 {
109+
jsonTag = jsonTag[:idx]
110+
}
111+
}
112+
}
113+
result[jsonTag] = value.Interface()
114+
}
115+
return result
116+
}

0 commit comments

Comments
 (0)