...
1 package opts
2
3 import (
4 "sort"
5 "strings"
6 )
7
8 const (
9
10 AllCapabilities = "ALL"
11
12
13
14 ResetCapabilities = "RESET"
15 )
16
17
18
19
20
21
22
23
24 func NormalizeCapability(capability string) string {
25 capability = strings.ToUpper(strings.TrimSpace(capability))
26 if capability == AllCapabilities || capability == ResetCapabilities {
27 return capability
28 }
29 if !strings.HasPrefix(capability, "CAP_") {
30 capability = "CAP_" + capability
31 }
32 return capability
33 }
34
35
36 func CapabilitiesMap(caps []string) map[string]bool {
37 normalized := make(map[string]bool)
38 for _, c := range caps {
39 normalized[NormalizeCapability(c)] = true
40 }
41 return normalized
42 }
43
44
45
46
47
48
49
50
51
52
53
54
55 func EffectiveCapAddCapDrop(add, drop []string) (capAdd, capDrop []string) {
56 var (
57 addCaps = CapabilitiesMap(add)
58 dropCaps = CapabilitiesMap(drop)
59 )
60
61 if addCaps[AllCapabilities] {
62
63 addCaps = map[string]bool{AllCapabilities: true}
64 }
65 if dropCaps[AllCapabilities] {
66
67 dropCaps = map[string]bool{AllCapabilities: true}
68 }
69 for c := range dropCaps {
70 if addCaps[c] {
71
72 continue
73 }
74 if c != ResetCapabilities {
75 capDrop = append(capDrop, c)
76 }
77 }
78
79 for c := range addCaps {
80 if c != ResetCapabilities {
81 capAdd = append(capAdd, c)
82 }
83 }
84
85 sort.Strings(capAdd)
86 sort.Strings(capDrop)
87
88 return capAdd, capDrop
89 }
90
View as plain text