You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.8 KiB
90 lines
2.8 KiB
package watchtower |
|
|
|
import ( |
|
"strconv" |
|
"time" |
|
) |
|
|
|
// Conf specifies the watchtower options that can be configured from the command |
|
// line or configuration file. |
|
type Conf struct { |
|
// RawListeners configures the watchtower's listening ports/interfaces. |
|
RawListeners []string `long:"listen" description:"Add interfaces/ports to listen for peer connections"` |
|
|
|
// RawExternalIPs configures the watchtower's external ports/interfaces. |
|
RawExternalIPs []string `long:"externalip" description:"Add interfaces/ports where the watchtower can accept peer connections"` |
|
|
|
// ReadTimeout specifies the duration the tower will wait when trying to |
|
// read a message from a client before hanging up. |
|
ReadTimeout time.Duration `long:"readtimeout" description:"Duration the watchtower server will wait for messages to be received before hanging up on clients"` |
|
|
|
// WriteTimeout specifies the duration the tower will wait when trying |
|
// to write a message from a client before hanging up. |
|
WriteTimeout time.Duration `long:"writetimeout" description:"Duration the watchtower server will wait for messages to be written before hanging up on client connections"` |
|
} |
|
|
|
// Apply completes the passed Config struct by applying any parsed Conf options. |
|
// If the corresponding values parsed by Conf are already set in the Config, |
|
// those fields will be not be modified. |
|
func (c *Conf) Apply(cfg *Config, |
|
normalizer AddressNormalizer) (*Config, error) { |
|
|
|
// Set the Config's listening addresses if they are empty. |
|
if cfg.ListenAddrs == nil { |
|
// Without a network, we will be unable to resolve the listening |
|
// addresses. |
|
if cfg.Net == nil { |
|
return nil, ErrNoNetwork |
|
} |
|
|
|
// If no addresses are specified by the Config, we will resort |
|
// to the default peer port. |
|
if len(c.RawListeners) == 0 { |
|
addr := DefaultListenAddr |
|
c.RawListeners = append(c.RawListeners, addr) |
|
} |
|
|
|
// Normalize the raw listening addresses so that they can be |
|
// used by the brontide listener. |
|
var err error |
|
cfg.ListenAddrs, err = normalizer( |
|
c.RawListeners, strconv.Itoa(DefaultPeerPort), |
|
cfg.Net.ResolveTCPAddr, |
|
) |
|
if err != nil { |
|
return nil, err |
|
} |
|
} |
|
|
|
// Set the Config's external ips if they are empty. |
|
if cfg.ExternalIPs == nil { |
|
// Without a network, we will be unable to resolve the external |
|
// IP addresses. |
|
if cfg.Net == nil { |
|
return nil, ErrNoNetwork |
|
} |
|
|
|
var err error |
|
cfg.ExternalIPs, err = normalizer( |
|
c.RawExternalIPs, strconv.Itoa(DefaultPeerPort), |
|
cfg.Net.ResolveTCPAddr, |
|
) |
|
if err != nil { |
|
return nil, err |
|
} |
|
} |
|
|
|
// If the Config has no read timeout, we will use the parsed Conf |
|
// value. |
|
if cfg.ReadTimeout == 0 && c.ReadTimeout != 0 { |
|
cfg.ReadTimeout = c.ReadTimeout |
|
} |
|
|
|
// If the Config has no write timeout, we will use the parsed Conf |
|
// value. |
|
if cfg.WriteTimeout == 0 && c.WriteTimeout != 0 { |
|
cfg.WriteTimeout = c.WriteTimeout |
|
} |
|
|
|
return cfg, nil |
|
}
|
|
|