utils.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package execdriver
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/docker/libcontainer/security/capabilities"
  6. "github.com/dotcloud/docker/utils"
  7. )
  8. func TweakCapabilities(basics, adds, drops []string) ([]string, error) {
  9. var (
  10. newCaps []string
  11. allCaps = capabilities.GetAllCapabilities()
  12. )
  13. // look for invalid cap in the drop list
  14. for _, cap := range drops {
  15. if strings.ToLower(cap) == "all" {
  16. continue
  17. }
  18. if !utils.StringsContainsNoCase(allCaps, cap) {
  19. return nil, fmt.Errorf("Unknown capability: %s", cap)
  20. }
  21. }
  22. // handle --cap-add=all
  23. if utils.StringsContainsNoCase(adds, "all") {
  24. basics = capabilities.GetAllCapabilities()
  25. }
  26. if !utils.StringsContainsNoCase(drops, "all") {
  27. for _, cap := range basics {
  28. // skip `all` aready handled above
  29. if strings.ToLower(cap) == "all" {
  30. continue
  31. }
  32. // if we don't drop `all`, add back all the non-dropped caps
  33. if !utils.StringsContainsNoCase(drops, cap) {
  34. newCaps = append(newCaps, cap)
  35. }
  36. }
  37. }
  38. for _, cap := range adds {
  39. // skip `all` aready handled above
  40. if strings.ToLower(cap) == "all" {
  41. continue
  42. }
  43. // look for invalid cap in the drop list
  44. if !utils.StringsContainsNoCase(allCaps, cap) {
  45. return nil, fmt.Errorf("Unknown capability: %s", cap)
  46. }
  47. // add cap if not already in the list
  48. if !utils.StringsContainsNoCase(newCaps, cap) {
  49. newCaps = append(newCaps, cap)
  50. }
  51. }
  52. return newCaps, nil
  53. }