You've already forked dcmerge
Compare commits
61 Commits
v0.3.0
...
b45f8181aa
Author | SHA1 | Date | |
---|---|---|---|
b45f8181aa
|
|||
13301cb367
|
|||
0a68b2d8e7
|
|||
54af4469a4
|
|||
dc15512229
|
|||
5fa0991bc2
|
|||
efb5fba9a9
|
|||
c8894de28c
|
|||
da34769ff3
|
|||
1a9fa39c94
|
|||
554c73bd7b
|
|||
ea0bb14ac4
|
|||
20b4f12dd1
|
|||
f2dc3d5174
|
|||
37de3302c6
|
|||
57dff5ff36
|
|||
f0f5e586d9
|
|||
0cd81642bb
|
|||
e6e3b0d4fc
|
|||
e66b2045f2
|
|||
141779c2a0
|
|||
c2ad246c32
|
|||
e1a7f3b900
|
|||
5417844dcc
|
|||
63030b3523
|
|||
168026c4ac
|
|||
992941abdc
|
|||
e8093e7266
|
|||
a04c5f9606
|
|||
7edd465bc6
|
|||
c62c747551
|
|||
900e5535ed | |||
dc329229e1
|
|||
49b1cfb1fe
|
|||
910172cc94
|
|||
04455e02b4
|
|||
e2c38f76b7
|
|||
4c67cb4198
|
|||
5c3ba383b6
|
|||
bbade1e4f9
|
|||
4085619557
|
|||
a1b8695aae
|
|||
934997b20a
|
|||
702c1ac4b6
|
|||
ea5269027d
|
|||
6ced20b951
|
|||
a6b4fd0afc
|
|||
07288bf752
|
|||
e09eaebfb3
|
|||
6224a9d38f
|
|||
2da0b01a44
|
|||
7628004096 | |||
19f70937e9 | |||
d8e064d873 | |||
7cb4c5634c | |||
86695b62ec | |||
dc861f13b1 | |||
9a3c64e91a | |||
610dd87a4b | |||
165cd6a778 | |||
2f9a7d0dd5 |
48
.drone.yml
48
.drone.yml
@ -11,12 +11,12 @@ platform:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: markdown lint
|
||||
commands:
|
||||
- markdownlint *.md
|
||||
image: git.cryptic.systems/volker.raschek/markdownlint:0.37.0
|
||||
image: git.cryptic.systems/volker.raschek/markdownlint:0.43.0
|
||||
resources:
|
||||
limits:
|
||||
cpu: 150
|
||||
@ -62,12 +62,12 @@ platform:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: unit-test
|
||||
commands:
|
||||
- go test -v ./...
|
||||
image: docker.io/library/golang:1.21.4
|
||||
image: docker.io/library/golang:1.24.0
|
||||
|
||||
trigger:
|
||||
event:
|
||||
@ -87,12 +87,12 @@ platform:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: unit-test
|
||||
commands:
|
||||
- go test -v ./...
|
||||
image: docker.io/library/golang:1.21.4
|
||||
image: docker.io/library/golang:1.24.0
|
||||
|
||||
trigger:
|
||||
event:
|
||||
@ -120,10 +120,10 @@ platform:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: build
|
||||
image: docker.io/plugins/docker:20.17.1
|
||||
image: docker.io/plugins/docker:20.18.7
|
||||
settings:
|
||||
auto_tag: false
|
||||
dockerfile: Dockerfile
|
||||
@ -187,10 +187,10 @@ platform:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: build
|
||||
image: docker.io/plugins/docker:20.17.1
|
||||
image: docker.io/plugins/docker:20.18.7
|
||||
settings:
|
||||
auto_tag: false
|
||||
dockerfile: Dockerfile
|
||||
@ -254,10 +254,10 @@ platform:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: build
|
||||
image: docker.io/plugins/docker:20.17.1
|
||||
image: docker.io/plugins/docker:20.18.7
|
||||
settings:
|
||||
auto_tag: false
|
||||
dockerfile: Dockerfile
|
||||
@ -319,10 +319,10 @@ platform:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: build
|
||||
image: docker.io/plugins/docker:20.17.1
|
||||
image: docker.io/plugins/docker:20.18.7
|
||||
settings:
|
||||
auto_tag: false
|
||||
dockerfile: Dockerfile
|
||||
@ -385,7 +385,7 @@ node_selector:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: build-manifest
|
||||
image: docker.io/plugins/manifest:1.4.0
|
||||
@ -442,7 +442,7 @@ depends_on:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: latest-sync
|
||||
commands:
|
||||
@ -456,7 +456,7 @@ steps:
|
||||
from_secret: container_image_registry_user
|
||||
DEST_CRED_PASSWORD:
|
||||
from_secret: container_image_registry_password
|
||||
image: quay.io/skopeo/stable:v1.13.3
|
||||
image: quay.io/skopeo/stable:v1.17.0
|
||||
|
||||
- name: email-notification
|
||||
environment:
|
||||
@ -503,10 +503,10 @@ platform:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: build
|
||||
image: docker.io/plugins/docker:20.17.1
|
||||
image: docker.io/plugins/docker:20.18.7
|
||||
settings:
|
||||
auto_tag: true
|
||||
auto_tag_suffix: amd64
|
||||
@ -563,10 +563,10 @@ platform:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: build
|
||||
image: docker.io/plugins/docker:20.17.1
|
||||
image: docker.io/plugins/docker:20.18.7
|
||||
settings:
|
||||
auto_tag: true
|
||||
auto_tag_suffix: arm64-v8
|
||||
@ -628,7 +628,7 @@ node_selector:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: build-manifest
|
||||
image: docker.io/plugins/manifest:1.4.0
|
||||
@ -682,7 +682,7 @@ depends_on:
|
||||
|
||||
steps:
|
||||
- name: clone
|
||||
image: git.cryptic.systems/volker.raschek/git:1.3.1
|
||||
image: git.cryptic.systems/volker.raschek/git:1.4.0
|
||||
|
||||
- name: tagged-sync
|
||||
commands:
|
||||
@ -696,7 +696,7 @@ steps:
|
||||
from_secret: container_image_registry_user
|
||||
DEST_CRED_PASSWORD:
|
||||
from_secret: container_image_registry_password
|
||||
image: quay.io/skopeo/stable:v1.13.3
|
||||
image: quay.io/skopeo/stable:v1.17.0
|
||||
|
||||
- name: email-notification
|
||||
environment:
|
||||
|
@ -1,4 +1,4 @@
|
||||
FROM docker.io/library/golang:1.21.4-alpine3.18 AS build
|
||||
FROM docker.io/library/golang:1.23.4-alpine3.19 AS build
|
||||
|
||||
RUN apk add git make
|
||||
|
||||
@ -10,7 +10,7 @@ RUN make install \
|
||||
PREFIX=/usr \
|
||||
VERSION=${VERSION}
|
||||
|
||||
FROM docker.io/library/alpine:3.18.4
|
||||
FROM docker.io/library/alpine:3.21
|
||||
|
||||
COPY --from=build /cache /
|
||||
|
||||
|
6
go.mod
6
go.mod
@ -3,8 +3,8 @@ module git.cryptic.systems/volker.raschek/dcmerge
|
||||
go 1.20
|
||||
|
||||
require (
|
||||
github.com/spf13/cobra v1.8.0
|
||||
github.com/stretchr/testify v1.8.4
|
||||
github.com/spf13/cobra v1.9.1
|
||||
github.com/stretchr/testify v1.10.0
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
)
|
||||
|
||||
@ -12,6 +12,6 @@ require (
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/spf13/pflag v1.0.6 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
14
go.sum
14
go.sum
@ -1,4 +1,4 @@
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||
@ -6,12 +6,12 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
|
||||
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
|
||||
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
|
||||
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
|
||||
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
|
@ -2,6 +2,7 @@ package dockerCompose
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@ -559,7 +560,7 @@ func (s *Service) ExistsLabel(name string) bool {
|
||||
// ExistsPort returns true if the port definition is already present.
|
||||
func (s *Service) ExistsPort(src string, dest string, protocol string) bool {
|
||||
for _, port := range s.Ports {
|
||||
s, d, p := splitStringInPort(port)
|
||||
s, d, p := splitStringInPortMapping(port)
|
||||
if s == src && d == dest && p == protocol {
|
||||
return true
|
||||
}
|
||||
@ -571,7 +572,7 @@ func (s *Service) ExistsPort(src string, dest string, protocol string) bool {
|
||||
// ExistsDestinationPort returns true if the destination port is already used.
|
||||
func (s *Service) ExistsDestinationPort(dest string) bool {
|
||||
for _, port := range s.Ports {
|
||||
_, d, _ := splitStringInPort(port)
|
||||
_, d, _ := splitStringInPortMapping(port)
|
||||
if d == dest {
|
||||
return true
|
||||
}
|
||||
@ -583,7 +584,7 @@ func (s *Service) ExistsDestinationPort(dest string) bool {
|
||||
// ExistsSourcePort returns true if the source port is already used.
|
||||
func (s *Service) ExistsSourcePort(src string) bool {
|
||||
for _, port := range s.Ports {
|
||||
s, _, _ := splitStringInPort(port)
|
||||
s, _, _ := splitStringInPortMapping(port)
|
||||
if s == src {
|
||||
return true
|
||||
}
|
||||
@ -860,7 +861,7 @@ func (s *Service) mergeExistingWinPorts(ports []string) {
|
||||
continue
|
||||
}
|
||||
|
||||
src, dest, protocol := splitStringInPort(port)
|
||||
src, dest, protocol := splitStringInPortMapping(port)
|
||||
if !s.ExistsDestinationPort(dest) {
|
||||
s.SetPort(src, dest, protocol)
|
||||
}
|
||||
@ -1056,7 +1057,7 @@ func (s *Service) mergeLastWinPorts(ports []string) {
|
||||
continue
|
||||
}
|
||||
|
||||
src, dest, protocol := splitStringInPort(port)
|
||||
src, dest, protocol := splitStringInPortMapping(port)
|
||||
s.SetPort(src, dest, protocol)
|
||||
}
|
||||
}
|
||||
@ -1138,7 +1139,7 @@ func (s *Service) RemoveLabel(name string) {
|
||||
func (s *Service) RemovePort(dest string) {
|
||||
ports := make([]string, 0)
|
||||
for _, port := range s.Ports {
|
||||
srcPort, destPort, protocol := splitStringInPort(port)
|
||||
srcPort, destPort, protocol := splitStringInPortMapping(port)
|
||||
|
||||
switch {
|
||||
case destPort == dest && len(protocol) <= 0:
|
||||
@ -1897,7 +1898,7 @@ func (v *Volume) MergeLastWin(volume *Volume) {
|
||||
}
|
||||
}
|
||||
|
||||
func (v *Volume) mergeExistingWinExternal(external bool) {
|
||||
func (v *Volume) mergeExistingWinExternal(_ bool) {
|
||||
if v.External {
|
||||
return
|
||||
}
|
||||
@ -1950,17 +1951,33 @@ func splitStringInKeyValue(s, sep string) (string, string) {
|
||||
return key, value
|
||||
}
|
||||
|
||||
func splitStringInPort(s string) (string, string, string) {
|
||||
parts := strings.Split(s, portDelimiter)
|
||||
src := parts[0]
|
||||
rest := parts[1]
|
||||
// splitStringInPortMapping parses a string and returns the src, dest port including an optional protocol.
|
||||
//
|
||||
// // Example
|
||||
// s, d, p := splitStringInPortMapping("80:80/tcp")
|
||||
// // Output: "80" "80" "tcp"
|
||||
// s, d, p := splitStringInPortMapping("0.0.0.0:80:80/tcp")
|
||||
// // Output: "0.0.0.0:80" "80" "tcp"
|
||||
func splitStringInPortMapping(s string) (string, string, string) {
|
||||
p := port(s)
|
||||
|
||||
parts = strings.Split(rest, portProtocolDelimiter)
|
||||
if len(parts) == 2 {
|
||||
return src, parts[0], parts[1]
|
||||
var src string
|
||||
switch {
|
||||
case p.existsSrcIP() && p.existsSrcPort():
|
||||
src = fmt.Sprintf("%s:%s", p.getSrcIP(), p.getSrcPort())
|
||||
case !p.existsSrcIP():
|
||||
src = p.getSrcPort()
|
||||
}
|
||||
|
||||
return src, parts[0], ""
|
||||
var dst string
|
||||
switch {
|
||||
case p.existsDstIP() && p.existsDstPort():
|
||||
dst = fmt.Sprintf("%s:%s", p.getDstIP(), p.getDstPort())
|
||||
case !p.existsDstIP():
|
||||
dst = p.getDstPort()
|
||||
}
|
||||
|
||||
return src, dst, p.getProtocol()
|
||||
}
|
||||
|
||||
func splitStringInVolume(s string) (string, string, string) {
|
||||
@ -1973,3 +1990,131 @@ func splitStringInVolume(s string) (string, string, string) {
|
||||
}
|
||||
return src, dest, ""
|
||||
}
|
||||
|
||||
var (
|
||||
regExpPort = regexp.MustCompile(`^((?<srcIP>([\d]{1,3}\.){3}[\d]{1,3}):)?(?<srcPort>[\d]{1,5}):((?<dstIP>([\d]{1,3}\.){3}[\d]{1,3}):)?(?<dstPort>[\d]{1,5})(\/(?<protocol>[a-z]*))?$`)
|
||||
)
|
||||
|
||||
type port string
|
||||
|
||||
// existsDstPort returns true, if the port string contains a trailing destination port definition.
|
||||
func (p port) existsDstPort() bool {
|
||||
return len(p.getDstPort()) > 0
|
||||
}
|
||||
|
||||
// existsDstIP returns true, if the port string contains a trailing destination ip definition.
|
||||
func (p port) existsDstIP() bool {
|
||||
return len(p.getDstIP()) > 0
|
||||
}
|
||||
|
||||
// existsProtocol returns true, if the port string contains a protocol definition.
|
||||
func (p port) existsProtocol() bool {
|
||||
return len(p.getProtocol()) > 0
|
||||
}
|
||||
|
||||
// existsSrcIP returns true, if the port string contains a leading src ip definition.
|
||||
func (p port) existsSrcIP() bool {
|
||||
return len(p.getSrcIP()) > 0
|
||||
}
|
||||
|
||||
// existsSrcPort returns true, if the port string contains a leading src port definition.
|
||||
func (p port) existsSrcPort() bool {
|
||||
return len(p.getSrcPort()) > 0
|
||||
}
|
||||
|
||||
// getDst returns the concatenation of the destination ip and port. If the destination ip is empty, only the port will
|
||||
// be returned.
|
||||
func (p port) getDst() string {
|
||||
switch {
|
||||
case p.existsDstIP():
|
||||
return fmt.Sprintf("%s%s%s", p.getDstIP(), portDelimiter, p.getDstPort())
|
||||
default:
|
||||
return p.getDstPort()
|
||||
}
|
||||
}
|
||||
|
||||
// getSrcIP returns the destination ip, if the port string contains a destination ip definition.
|
||||
func (p port) getDstIP() string {
|
||||
matches := regExpPort.FindStringSubmatch(string(p))
|
||||
i := regExpPort.SubexpIndex("dstIP")
|
||||
|
||||
switch {
|
||||
case len(matches) <= 0:
|
||||
return ""
|
||||
case i < 0:
|
||||
return ""
|
||||
}
|
||||
|
||||
return matches[i]
|
||||
}
|
||||
|
||||
// getSrcPort returns the destination port, if the port string contains an destination port definition.
|
||||
func (p port) getDstPort() string {
|
||||
matches := regExpPort.FindStringSubmatch(string(p))
|
||||
i := regExpPort.SubexpIndex("dstPort")
|
||||
|
||||
switch {
|
||||
case len(matches) <= 0:
|
||||
return ""
|
||||
case i < 0:
|
||||
return ""
|
||||
}
|
||||
|
||||
return matches[i]
|
||||
}
|
||||
|
||||
// getProtocol returns the protocol, if the port string contains a protocol definition.
|
||||
func (p port) getProtocol() string {
|
||||
matches := regExpPort.FindStringSubmatch(string(p))
|
||||
i := regExpPort.SubexpIndex("protocol")
|
||||
|
||||
switch {
|
||||
case len(matches) <= 0:
|
||||
return ""
|
||||
case i < 0:
|
||||
return ""
|
||||
}
|
||||
|
||||
return matches[i]
|
||||
}
|
||||
|
||||
// getSrc returns the concatenation of the source ip and port. If the source ip is empty, only the port will be
|
||||
// returned.
|
||||
func (p port) getSrc() string {
|
||||
switch {
|
||||
case p.existsSrcIP():
|
||||
return fmt.Sprintf("%s%s%s", p.getSrcIP(), portDelimiter, p.getSrcPort())
|
||||
default:
|
||||
return p.getSrcPort()
|
||||
}
|
||||
}
|
||||
|
||||
// getSrcIP returns the source ip, if the port string contains an src ip definition.
|
||||
func (p port) getSrcIP() string {
|
||||
matches := regExpPort.FindStringSubmatch(string(p))
|
||||
i := regExpPort.SubexpIndex("srcIP")
|
||||
|
||||
switch {
|
||||
case len(matches) <= 0:
|
||||
return ""
|
||||
case i < 0:
|
||||
return ""
|
||||
}
|
||||
|
||||
return matches[i]
|
||||
}
|
||||
|
||||
// getSrcPort returns the source port, if the port string contains an src port definition.
|
||||
func (p port) getSrcPort() string {
|
||||
matches := regExpPort.FindStringSubmatch(string(p))
|
||||
i := regExpPort.SubexpIndex("srcPort")
|
||||
|
||||
switch {
|
||||
case len(matches) <= 0:
|
||||
return ""
|
||||
case i < 0:
|
||||
return ""
|
||||
}
|
||||
|
||||
return matches[i]
|
||||
}
|
||||
|
418
pkg/domain/dockerCompose/config_intern_test.go
Normal file
418
pkg/domain/dockerCompose/config_intern_test.go
Normal file
@ -0,0 +1,418 @@
|
||||
package dockerCompose
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func Test_splitStringInPortMapping(t *testing.T) {
|
||||
require := require.New(t)
|
||||
|
||||
testCases := []struct {
|
||||
s string
|
||||
expectedSrc string
|
||||
expectedDst string
|
||||
expectedProtocol string
|
||||
}{
|
||||
{
|
||||
s: "53:53",
|
||||
expectedSrc: "53",
|
||||
expectedDst: "53",
|
||||
expectedProtocol: "",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:53",
|
||||
expectedSrc: "0.0.0.0:53",
|
||||
expectedDst: "53",
|
||||
expectedProtocol: "",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:10.11.12.13:53",
|
||||
expectedSrc: "0.0.0.0:53",
|
||||
expectedDst: "10.11.12.13:53",
|
||||
expectedProtocol: "",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:10.11.12.13:53/tcp",
|
||||
expectedSrc: "0.0.0.0:53",
|
||||
expectedDst: "10.11.12.13:53",
|
||||
expectedProtocol: "tcp",
|
||||
},
|
||||
}
|
||||
|
||||
for i, testCase := range testCases {
|
||||
actualSrc, actualDst, actualProtocol := splitStringInPortMapping(testCase.s)
|
||||
require.Equal(testCase.expectedSrc, actualSrc, "TestCase %v", i)
|
||||
require.Equal(testCase.expectedDst, actualDst, "TestCase %v", i)
|
||||
require.Equal(testCase.expectedProtocol, actualProtocol, "TestCase %v", i)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPort_DstIP(t *testing.T) {
|
||||
require := require.New(t)
|
||||
|
||||
testCases := []struct {
|
||||
s string
|
||||
expectedBool bool
|
||||
expectedString string
|
||||
}{
|
||||
{
|
||||
s: "",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:53",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:53/tcp",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:53/udp",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
|
||||
{
|
||||
s: "0.0.0.0:53",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:0.0.0.0:53",
|
||||
expectedBool: true,
|
||||
expectedString: "0.0.0.0",
|
||||
},
|
||||
{
|
||||
s: "53:0.0.0.0:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "0.0.0.0",
|
||||
},
|
||||
{
|
||||
s: "53:0.0.0.0:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "0.0.0.0",
|
||||
},
|
||||
|
||||
{
|
||||
s: "10.11.12.13:53",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:10.11.12.13:53",
|
||||
expectedBool: true,
|
||||
expectedString: "10.11.12.13",
|
||||
},
|
||||
{
|
||||
s: "53:10.11.12.13:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "10.11.12.13",
|
||||
},
|
||||
{
|
||||
s: "53:10.11.12.13:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "10.11.12.13",
|
||||
},
|
||||
}
|
||||
|
||||
for i, testCase := range testCases {
|
||||
p := port(testCase.s)
|
||||
require.Equal(testCase.expectedBool, p.existsDstIP(), "TestCase %v", i)
|
||||
require.Equal(testCase.expectedString, p.getDstIP(), "TestCase %v", i)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPort_DstPort(t *testing.T) {
|
||||
require := require.New(t)
|
||||
|
||||
testCases := []struct {
|
||||
s string
|
||||
expectedBool bool
|
||||
expectedString string
|
||||
}{
|
||||
{
|
||||
s: "",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:53",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "53:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "53:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
|
||||
{
|
||||
s: "53:0.0.0.0:53",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "53:0.0.0.0:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "53:0.0.0.0:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
|
||||
{
|
||||
s: "53:10.11.12.13:53",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "53:10.11.12.13:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "53:10.11.12.13:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
}
|
||||
|
||||
for i, testCase := range testCases {
|
||||
p := port(testCase.s)
|
||||
require.Equal(testCase.expectedBool, p.existsDstPort(), "TestCase %v", i)
|
||||
require.Equal(testCase.expectedString, p.getDstPort(), "TestCase %v", i)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPort_Protocol(t *testing.T) {
|
||||
require := require.New(t)
|
||||
|
||||
testCases := []struct {
|
||||
s string
|
||||
expectedBool bool
|
||||
expectedString string
|
||||
}{
|
||||
{
|
||||
s: "0",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53/tcp",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53/udp",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:53",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "tcp",
|
||||
},
|
||||
{
|
||||
s: "53:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "udp",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "tcp",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "udp",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "tcp",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:11.12.13.14:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "tcp",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:11.12.13.14:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "udp",
|
||||
},
|
||||
}
|
||||
|
||||
for i, testCase := range testCases {
|
||||
p := port(testCase.s)
|
||||
require.Equal(testCase.expectedBool, p.existsProtocol(), "TestCase %v", i)
|
||||
require.Equal(testCase.expectedString, p.getProtocol(), "TestCase %v", i)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPort_SrcIP(t *testing.T) {
|
||||
require := require.New(t)
|
||||
|
||||
testCases := []struct {
|
||||
s string
|
||||
expectedBool bool
|
||||
expectedString string
|
||||
}{
|
||||
{
|
||||
s: "",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:53",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:53/tcp",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:53/udp",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
|
||||
{
|
||||
s: "0.0.0.0:53",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:53",
|
||||
expectedBool: true,
|
||||
expectedString: "0.0.0.0",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "0.0.0.0",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "0.0.0.0",
|
||||
},
|
||||
|
||||
{
|
||||
s: "10.11.12.13:53",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "10.11.12.13:53:53",
|
||||
expectedBool: true,
|
||||
expectedString: "10.11.12.13",
|
||||
},
|
||||
{
|
||||
s: "10.11.12.13:53:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "10.11.12.13",
|
||||
},
|
||||
{
|
||||
s: "10.11.12.13:53:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "10.11.12.13",
|
||||
},
|
||||
}
|
||||
|
||||
for i, testCase := range testCases {
|
||||
p := port(testCase.s)
|
||||
require.Equal(testCase.expectedBool, p.existsSrcIP(), "TestCase %v", i)
|
||||
require.Equal(testCase.expectedString, p.getSrcIP(), "TestCase %v", i)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPort_SrcPort(t *testing.T) {
|
||||
require := require.New(t)
|
||||
|
||||
testCases := []struct {
|
||||
s string
|
||||
expectedBool bool
|
||||
expectedString string
|
||||
}{
|
||||
{
|
||||
s: "",
|
||||
expectedBool: false,
|
||||
expectedString: "",
|
||||
},
|
||||
{
|
||||
s: "53:53",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "53:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "53:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
|
||||
{
|
||||
s: "0.0.0.0:53:53",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "0.0.0.0:53:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
|
||||
{
|
||||
s: "10.11.12.13:53:53",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "10.11.12.13:53:53/tcp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
{
|
||||
s: "10.11.12.13:53:53/udp",
|
||||
expectedBool: true,
|
||||
expectedString: "53",
|
||||
},
|
||||
}
|
||||
|
||||
for i, testCase := range testCases {
|
||||
p := port(testCase.s)
|
||||
require.Equal(testCase.expectedBool, p.existsSrcPort(), "TestCase %v", i)
|
||||
require.Equal(testCase.expectedString, p.getSrcPort(), "TestCase %v", i)
|
||||
}
|
||||
}
|
@ -75,7 +75,7 @@ func getDockerComposeViaHTTP(url string) (*dockerCompose.Config, error) {
|
||||
func readDockerComposeFromFile(name string) (*dockerCompose.Config, error) {
|
||||
fileStat, err := os.Stat(name)
|
||||
switch {
|
||||
case errors.Is(err, os.ErrNotExist):
|
||||
case err != nil:
|
||||
return nil, err
|
||||
case fileStat.IsDir():
|
||||
return nil, fmt.Errorf("%w: %s", ErrorPathIsDir, name)
|
||||
|
@ -1,8 +1,6 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"assignees": [ "volker.raschek" ],
|
||||
"automergeStrategy": "merge-commit",
|
||||
"automergeType": "pr",
|
||||
"labels": [ "renovate" ],
|
||||
"packageRules": [
|
||||
{
|
||||
@ -17,15 +15,19 @@
|
||||
"automerge": true,
|
||||
"matchBaseBranches": [ "master" ],
|
||||
"matchManagers": [ "dockerfile" ],
|
||||
"matchUpdateTypes": [ "patch" ]
|
||||
"matchUpdateTypes": [ "minor", "patch" ]
|
||||
},
|
||||
{
|
||||
"addLabels": [ "renovate/dcmerge", "renovate/automerge" ],
|
||||
"automerge": false,
|
||||
"matchPackageNames": [ "dcmerge" ],
|
||||
"matchManagers": [ "regex" ]
|
||||
"description": "Automatically update minor and patch versions of go modules",
|
||||
"addLabels": [ "renovate/gomod", "renovate/automerge" ],
|
||||
"automerge": true,
|
||||
"matchManagers": [ "gomod" ],
|
||||
"matchUpdateTypes": [ "minor", "patch" ]
|
||||
}
|
||||
],
|
||||
"postUpdateOptions": [
|
||||
"gomodTidy"
|
||||
],
|
||||
"rebaseLabel": "renovate/rebase",
|
||||
"rebaseWhen": "behind-base-branch"
|
||||
}
|
||||
|
Reference in New Issue
Block a user