|
@@ -5,6 +5,7 @@ import (
|
|
"mime"
|
|
"mime"
|
|
"path/filepath"
|
|
"path/filepath"
|
|
"sort"
|
|
"sort"
|
|
|
|
+ "strconv"
|
|
"strings"
|
|
"strings"
|
|
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
"github.com/Sirupsen/logrus"
|
|
@@ -37,22 +38,17 @@ func (r byPrivatePort) Less(i, j int) bool { return r[i].PrivatePort < r[j].Priv
|
|
// e.g. "0.0.0.0:80->9090/tcp, 9988/tcp"
|
|
// e.g. "0.0.0.0:80->9090/tcp, 9988/tcp"
|
|
// it's used by command 'docker ps'
|
|
// it's used by command 'docker ps'
|
|
func DisplayablePorts(ports []types.Port) string {
|
|
func DisplayablePorts(ports []types.Port) string {
|
|
- var (
|
|
|
|
- result = []string{}
|
|
|
|
- hostMappings = []string{}
|
|
|
|
- firstInGroupMap map[string]int
|
|
|
|
- lastInGroupMap map[string]int
|
|
|
|
- )
|
|
|
|
- firstInGroupMap = make(map[string]int)
|
|
|
|
- lastInGroupMap = make(map[string]int)
|
|
|
|
|
|
+ type portGroup struct {
|
|
|
|
+ first int
|
|
|
|
+ last int
|
|
|
|
+ }
|
|
|
|
+ groupMap := make(map[string]*portGroup)
|
|
|
|
+ var result []string
|
|
|
|
+ var hostMappings []string
|
|
sort.Sort(byPrivatePort(ports))
|
|
sort.Sort(byPrivatePort(ports))
|
|
for _, port := range ports {
|
|
for _, port := range ports {
|
|
- var (
|
|
|
|
- current = port.PrivatePort
|
|
|
|
- portKey = port.Type
|
|
|
|
- firstInGroup int
|
|
|
|
- lastInGroup int
|
|
|
|
- )
|
|
|
|
|
|
+ current := port.PrivatePort
|
|
|
|
+ portKey := port.Type
|
|
if port.IP != "" {
|
|
if port.IP != "" {
|
|
if port.PublicPort != current {
|
|
if port.PublicPort != current {
|
|
hostMappings = append(hostMappings, fmt.Sprintf("%s:%d->%d/%s", port.IP, port.PublicPort, port.PrivatePort, port.Type))
|
|
hostMappings = append(hostMappings, fmt.Sprintf("%s:%d->%d/%s", port.IP, port.PublicPort, port.PrivatePort, port.Type))
|
|
@@ -60,45 +56,38 @@ func DisplayablePorts(ports []types.Port) string {
|
|
}
|
|
}
|
|
portKey = fmt.Sprintf("%s/%s", port.IP, port.Type)
|
|
portKey = fmt.Sprintf("%s/%s", port.IP, port.Type)
|
|
}
|
|
}
|
|
- firstInGroup = firstInGroupMap[portKey]
|
|
|
|
- lastInGroup = lastInGroupMap[portKey]
|
|
|
|
|
|
+ group := groupMap[portKey]
|
|
|
|
|
|
- if firstInGroup == 0 {
|
|
|
|
- firstInGroupMap[portKey] = current
|
|
|
|
- lastInGroupMap[portKey] = current
|
|
|
|
|
|
+ if group == nil {
|
|
|
|
+ groupMap[portKey] = &portGroup{first: current, last: current}
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
-
|
|
|
|
- if current == (lastInGroup + 1) {
|
|
|
|
- lastInGroupMap[portKey] = current
|
|
|
|
|
|
+ if current == (group.last + 1) {
|
|
|
|
+ group.last = current
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
- result = append(result, formGroup(portKey, firstInGroup, lastInGroup))
|
|
|
|
- firstInGroupMap[portKey] = current
|
|
|
|
- lastInGroupMap[portKey] = current
|
|
|
|
|
|
+
|
|
|
|
+ result = append(result, formGroup(portKey, group.first, group.last))
|
|
|
|
+ groupMap[portKey] = &portGroup{first: current, last: current}
|
|
}
|
|
}
|
|
- for portKey, firstInGroup := range firstInGroupMap {
|
|
|
|
- result = append(result, formGroup(portKey, firstInGroup, lastInGroupMap[portKey]))
|
|
|
|
|
|
+ for portKey, g := range groupMap {
|
|
|
|
+ result = append(result, formGroup(portKey, g.first, g.last))
|
|
}
|
|
}
|
|
result = append(result, hostMappings...)
|
|
result = append(result, hostMappings...)
|
|
return strings.Join(result, ", ")
|
|
return strings.Join(result, ", ")
|
|
}
|
|
}
|
|
|
|
|
|
func formGroup(key string, start, last int) string {
|
|
func formGroup(key string, start, last int) string {
|
|
- var (
|
|
|
|
- group string
|
|
|
|
- parts = strings.Split(key, "/")
|
|
|
|
- groupType = parts[0]
|
|
|
|
- ip = ""
|
|
|
|
- )
|
|
|
|
|
|
+ parts := strings.Split(key, "/")
|
|
|
|
+ groupType := parts[0]
|
|
|
|
+ var ip string
|
|
if len(parts) > 1 {
|
|
if len(parts) > 1 {
|
|
ip = parts[0]
|
|
ip = parts[0]
|
|
groupType = parts[1]
|
|
groupType = parts[1]
|
|
}
|
|
}
|
|
- if start == last {
|
|
|
|
- group = fmt.Sprintf("%d", start)
|
|
|
|
- } else {
|
|
|
|
- group = fmt.Sprintf("%d-%d", start, last)
|
|
|
|
|
|
+ group := strconv.Itoa(start)
|
|
|
|
+ if start != last {
|
|
|
|
+ group = fmt.Sprintf("%s-%d", group, last)
|
|
}
|
|
}
|
|
if ip != "" {
|
|
if ip != "" {
|
|
group = fmt.Sprintf("%s:%s->%s", ip, group, group)
|
|
group = fmt.Sprintf("%s:%s->%s", ip, group, group)
|