2015-05-01 21:49:19 +08:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
2015-05-04 00:02:28 +08:00
|
|
|
"fmt"
|
2015-05-04 01:42:21 +08:00
|
|
|
"net"
|
2015-05-02 15:56:09 +08:00
|
|
|
"path/filepath"
|
2015-05-01 21:49:19 +08:00
|
|
|
"strings"
|
2015-05-04 00:02:28 +08:00
|
|
|
|
|
|
|
"github.com/bsiegert/ranges"
|
2015-05-01 21:49:19 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
// ParseVars returns parsed and validated slice of strings with
|
|
|
|
// variables names that will be used for monitoring.
|
2015-05-02 01:12:23 +08:00
|
|
|
func ParseVars(vars string) ([]VarName, error) {
|
|
|
|
if vars == "" {
|
2015-05-01 21:49:19 +08:00
|
|
|
return nil, errors.New("no vars specified")
|
|
|
|
}
|
|
|
|
|
2015-05-02 01:12:23 +08:00
|
|
|
ss := strings.FieldsFunc(vars, func(r rune) bool { return r == ',' })
|
2015-05-01 23:48:34 +08:00
|
|
|
var ret []VarName
|
2015-05-02 01:12:23 +08:00
|
|
|
for _, s := range ss {
|
|
|
|
ret = append(ret, VarName(s))
|
|
|
|
}
|
2015-05-01 21:49:19 +08:00
|
|
|
return ret, nil
|
|
|
|
}
|
2015-05-02 15:56:09 +08:00
|
|
|
|
|
|
|
// BaseCommand returns cleaned command name from Cmdline array.
|
|
|
|
//
|
|
|
|
// I.e. "./some.service/binary.name -arg 1 -arg" will be "binary.name".
|
|
|
|
func BaseCommand(cmdline []string) string {
|
|
|
|
if len(cmdline) == 0 {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
return filepath.Base(cmdline[0])
|
|
|
|
}
|
2015-05-02 15:56:55 +08:00
|
|
|
|
|
|
|
// ParsePorts converts comma-separated ports into strings slice
|
|
|
|
func ParsePorts(s string) ([]string, error) {
|
2015-05-04 01:42:21 +08:00
|
|
|
var (
|
|
|
|
ports []string
|
|
|
|
err error
|
|
|
|
)
|
|
|
|
// Try simple mode, ports only ("1234-1235,80")
|
|
|
|
ports, err = parseRange(s)
|
|
|
|
if err == nil {
|
|
|
|
return ports, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
var ErrParsePorts = fmt.Errorf("cannot parse ports argument")
|
|
|
|
|
|
|
|
// else, try host:ports notation ("localhost:1234-1235,remote:2000,2345")
|
|
|
|
fields := strings.FieldsFunc(s, func(r rune) bool { return r == ',' })
|
|
|
|
for _, field := range fields {
|
|
|
|
// split host:ports
|
|
|
|
var host, portsRange string
|
|
|
|
parts := strings.FieldsFunc(field, func(r rune) bool { return r == ':' })
|
|
|
|
if len(parts) == 1 {
|
|
|
|
host = "localhost"
|
|
|
|
} else if len(parts) == 2 {
|
|
|
|
host, portsRange = parts[0], parts[1]
|
|
|
|
} else {
|
|
|
|
return nil, ErrParsePorts
|
|
|
|
}
|
|
|
|
|
|
|
|
pp, err := parseRange(portsRange)
|
|
|
|
if err != nil {
|
|
|
|
return nil, ErrParsePorts
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, p := range pp {
|
|
|
|
addr := net.JoinHostPort(host, p)
|
|
|
|
ports = append(ports, addr)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ports, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func parseRange(s string) ([]string, error) {
|
2015-05-04 00:02:28 +08:00
|
|
|
portsInt, err := ranges.Parse(s)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
2015-05-02 15:56:55 +08:00
|
|
|
}
|
|
|
|
|
2015-05-04 00:02:28 +08:00
|
|
|
var ports []string
|
|
|
|
for _, port := range portsInt {
|
|
|
|
ports = append(ports, fmt.Sprintf("%d", port))
|
|
|
|
}
|
2015-05-02 15:56:55 +08:00
|
|
|
return ports, nil
|
|
|
|
}
|