mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-05-27 12:52:27 +02:00
feat: capitalize all log messages for better readability
Capitalize the first letter of all log messages throughout the codebase to improve readability and consistency in logging output. Key improvements: - All log messages now start with capital letters - Consistent formatting across all logging statements - Improved readability for debugging and monitoring - Enhanced user experience with better formatted messages Files updated: - CLI commands and service management - Internal client information discovery - Network operations and configuration - DNS resolver and proxy operations - Platform-specific implementations This completes the final phase of the logging improvement project, ensuring all log messages follow consistent capitalization standards for better readability and professional appearance.
This commit is contained in:
committed by
Cuong Manh Le
parent
166b7f38fc
commit
d3b01dc7e8
@@ -196,14 +196,14 @@ func (t *Table) initSelfDiscover() {
|
||||
func (t *Table) init() {
|
||||
// Custom client ID presents, use it as the only source.
|
||||
if _, clientID := controld.ParseRawUID(t.cdUID); clientID != "" {
|
||||
t.logger.Debug().Msg("start self discovery with custom client id")
|
||||
t.logger.Debug().Msg("Start self discovery with custom client id")
|
||||
t.initSelfDiscover()
|
||||
return
|
||||
}
|
||||
|
||||
// If we are running on platforms that should only do self discover, use it as the only source, too.
|
||||
if ctrld.SelfDiscover() {
|
||||
t.logger.Debug().Msg("start self discovery on desktop platforms")
|
||||
t.logger.Debug().Msg("Start self discovery on desktop platforms")
|
||||
t.initSelfDiscover()
|
||||
return
|
||||
}
|
||||
@@ -211,9 +211,9 @@ func (t *Table) init() {
|
||||
// Hosts file mapping.
|
||||
if t.discoverHosts() {
|
||||
t.hf = &hostsFile{logger: t.logger}
|
||||
t.logger.Debug().Msg("start hosts file discovery")
|
||||
t.logger.Debug().Msg("Start hosts file discovery")
|
||||
if err := t.hf.init(); err != nil {
|
||||
t.logger.Error().Err(err).Msg("could not init hosts file discover")
|
||||
t.logger.Error().Err(err).Msg("Could not init hosts file discover")
|
||||
} else {
|
||||
t.hostnameResolvers = append(t.hostnameResolvers, t.hf)
|
||||
t.refreshers = append(t.refreshers, t.hf)
|
||||
@@ -223,9 +223,9 @@ func (t *Table) init() {
|
||||
// DHCP lease files.
|
||||
if t.discoverDHCP() {
|
||||
t.dhcp = &dhcp{selfIP: t.selfIP, logger: t.logger}
|
||||
t.logger.Debug().Msg("start dhcp discovery")
|
||||
t.logger.Debug().Msg("Start dhcp discovery")
|
||||
if err := t.dhcp.init(); err != nil {
|
||||
t.logger.Error().Err(err).Msg("could not init DHCP discover")
|
||||
t.logger.Error().Err(err).Msg("Could not init dhcp discover")
|
||||
} else {
|
||||
t.ipResolvers = append(t.ipResolvers, t.dhcp)
|
||||
t.macResolvers = append(t.macResolvers, t.dhcp)
|
||||
@@ -237,7 +237,7 @@ func (t *Table) init() {
|
||||
if t.discoverARP() {
|
||||
t.arp = &arpDiscover{}
|
||||
t.ndp = &ndpDiscover{logger: t.logger}
|
||||
t.logger.Debug().Msg("start arp discovery")
|
||||
t.logger.Debug().Msg("Start arp discovery")
|
||||
discovers := map[string]interface {
|
||||
refresher
|
||||
IpResolver
|
||||
@@ -249,7 +249,7 @@ func (t *Table) init() {
|
||||
|
||||
for protocol, discover := range discovers {
|
||||
if err := discover.refresh(); err != nil {
|
||||
t.logger.Error().Err(err).Msgf("could not init %s discover", protocol)
|
||||
t.logger.Error().Err(err).Msgf("Could not init %s discover", protocol)
|
||||
} else {
|
||||
t.ipResolvers = append(t.ipResolvers, discover)
|
||||
t.macResolvers = append(t.macResolvers, discover)
|
||||
@@ -282,18 +282,18 @@ func (t *Table) init() {
|
||||
if _, portErr := strconv.Atoi(port); portErr == nil && port != "0" && net.ParseIP(host) != nil {
|
||||
nss = append(nss, net.JoinHostPort(host, port))
|
||||
} else {
|
||||
t.logger.Warn().Msgf("ignoring invalid nameserver for ptr discover: %q", ns)
|
||||
t.logger.Warn().Msgf("Ignoring invalid nameserver for ptr discover: %q", ns)
|
||||
}
|
||||
}
|
||||
if len(nss) > 0 {
|
||||
t.ptr.resolver = ctrld.NewResolverWithNameserver(nss)
|
||||
t.logger.Debug().Msgf("using nameservers %v for ptr discovery", nss)
|
||||
t.logger.Debug().Msgf("Using nameservers %v for ptr discovery", nss)
|
||||
}
|
||||
|
||||
}
|
||||
t.logger.Debug().Msg("start ptr discovery")
|
||||
t.logger.Debug().Msg("Start ptr discovery")
|
||||
if err := t.ptr.refresh(); err != nil {
|
||||
t.logger.Error().Err(err).Msg("could not init PTR discover")
|
||||
t.logger.Error().Err(err).Msg("Could not init ptr discover")
|
||||
} else {
|
||||
t.hostnameResolvers = append(t.hostnameResolvers, t.ptr)
|
||||
t.refreshers = append(t.refreshers, t.ptr)
|
||||
@@ -302,9 +302,9 @@ func (t *Table) init() {
|
||||
// mdns.
|
||||
if t.discoverMDNS() {
|
||||
t.mdns = &mdns{logger: t.logger}
|
||||
t.logger.Debug().Msg("start mdns discovery")
|
||||
t.logger.Debug().Msg("Start mdns discovery")
|
||||
if err := t.mdns.init(t.quitCh); err != nil {
|
||||
t.logger.Error().Err(err).Msg("could not init mDNS discover")
|
||||
t.logger.Error().Err(err).Msg("Could not init mdns discover")
|
||||
} else {
|
||||
t.hostnameResolvers = append(t.hostnameResolvers, t.mdns)
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ func (d *dhcp) watchChanges() {
|
||||
if event.Has(fsnotify.Create) {
|
||||
if format, ok := clientInfoFiles[event.Name]; ok {
|
||||
if err := d.addLeaseFile(event.Name, format); err != nil {
|
||||
d.logger.Err(err).Str("file", event.Name).Msg("could not add lease file")
|
||||
d.logger.Err(err).Str("file", event.Name).Msg("Could not add lease file")
|
||||
}
|
||||
}
|
||||
continue
|
||||
@@ -63,14 +63,14 @@ func (d *dhcp) watchChanges() {
|
||||
if event.Has(fsnotify.Write) || event.Has(fsnotify.Rename) || event.Has(fsnotify.Chmod) || event.Has(fsnotify.Remove) {
|
||||
format := clientInfoFiles[event.Name]
|
||||
if err := d.readLeaseFile(event.Name, format); err != nil && !os.IsNotExist(err) {
|
||||
d.logger.Err(err).Str("file", event.Name).Msg("leases file changed but failed to update client info")
|
||||
d.logger.Err(err).Str("file", event.Name).Msg("Leases file changed but failed to update client info")
|
||||
}
|
||||
}
|
||||
case err, ok := <-d.watcher.Errors:
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
d.logger.Err(err).Msg("could not watch client info file")
|
||||
d.logger.Err(err).Msg("Could not watch client info file")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -216,7 +216,7 @@ func (d *dhcp) dnsmasqReadClientInfoReader(reader io.Reader) error {
|
||||
}
|
||||
ip := normalizeIP(string(fields[2]))
|
||||
if net.ParseIP(ip) == nil {
|
||||
d.logger.Warn().Msgf("invalid ip address entry: %q", ip)
|
||||
d.logger.Warn().Msgf("Invalid ip address entry: %q", ip)
|
||||
ip = ""
|
||||
}
|
||||
|
||||
@@ -271,7 +271,7 @@ func (d *dhcp) iscDHCPReadClientInfoReader(reader io.Reader) error {
|
||||
// DHCP lease files may contain mixed-case IP addresses
|
||||
ip = normalizeIP(strings.ToLower(fields[1]))
|
||||
if net.ParseIP(ip) == nil {
|
||||
d.logger.Warn().Msgf("invalid ip address entry: %q", ip)
|
||||
d.logger.Warn().Msgf("Invalid ip address entry: %q", ip)
|
||||
ip = ""
|
||||
}
|
||||
case "hardware":
|
||||
@@ -328,7 +328,7 @@ func (d *dhcp) keaDhcp4ReadClientInfoReader(r io.Reader) error {
|
||||
}
|
||||
ip := normalizeIP(record[0])
|
||||
if net.ParseIP(ip) == nil {
|
||||
d.logger.Warn().Msgf("invalid ip address entry: %q", ip)
|
||||
d.logger.Warn().Msgf("Invalid ip address entry: %q", ip)
|
||||
ip = ""
|
||||
}
|
||||
|
||||
@@ -350,7 +350,7 @@ func (d *dhcp) keaDhcp4ReadClientInfoReader(r io.Reader) error {
|
||||
func (d *dhcp) addSelf() {
|
||||
hostname, err := os.Hostname()
|
||||
if err != nil {
|
||||
d.logger.Err(err).Msg("could not get hostname")
|
||||
d.logger.Err(err).Msg("Could not get hostname")
|
||||
return
|
||||
}
|
||||
hostname = normalizeHostname(hostname)
|
||||
|
||||
@@ -56,7 +56,7 @@ func (hf *hostsFile) refresh() error {
|
||||
// override hosts file with host_entries.conf content if present.
|
||||
hem, err := parseHostEntriesConf(hostEntriesConfPath)
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
hf.logger.Debug().Err(err).Msg("could not read host_entries.conf file")
|
||||
hf.logger.Debug().Err(err).Msg("Could not read host_entries.conf file")
|
||||
}
|
||||
for k, v := range hem {
|
||||
hf.m[k] = v
|
||||
@@ -78,14 +78,14 @@ func (hf *hostsFile) watchChanges() {
|
||||
}
|
||||
if event.Has(fsnotify.Write) || event.Has(fsnotify.Rename) || event.Has(fsnotify.Chmod) || event.Has(fsnotify.Remove) {
|
||||
if err := hf.refresh(); err != nil && !os.IsNotExist(err) {
|
||||
hf.logger.Err(err).Msg("hosts file changed but failed to update client info")
|
||||
hf.logger.Err(err).Msg("Hosts file changed but Failed to update client info")
|
||||
}
|
||||
}
|
||||
case err, ok := <-hf.watcher.Errors:
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
hf.logger.Err(err).Msg("could not watch client info file")
|
||||
hf.logger.Err(err).Msg("Could not watch client info file")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-10
@@ -94,9 +94,9 @@ func (m *mdns) init(quitCh chan struct{}) error {
|
||||
}
|
||||
|
||||
// Check if IPv6 is available once and use the result for the rest of the function.
|
||||
m.logger.Debug().Msgf("checking for IPv6 availability in mdns init")
|
||||
m.logger.Debug().Msgf("Checking for ipv6 availability in mdns init")
|
||||
ipv6 := ctrldnet.IPv6Available(context.Background())
|
||||
m.logger.Debug().Msgf("IPv6 is %v in mdns init", ipv6)
|
||||
m.logger.Debug().Msgf("ipv6 is %v in mdns init", ipv6)
|
||||
|
||||
v4ConnList := make([]*net.UDPConn, 0, len(ifaces))
|
||||
v6ConnList := make([]*net.UDPConn, 0, len(ifaces))
|
||||
@@ -130,11 +130,11 @@ func (m *mdns) probeLoop(conns []*net.UDPConn, remoteAddr net.Addr, quitCh chan
|
||||
for {
|
||||
err := m.probe(conns, remoteAddr)
|
||||
if shouldStopProbing(err) {
|
||||
m.logger.Warn().Msgf("stop probing %q: %v", remoteAddr, err)
|
||||
m.logger.Warn().Msgf("Stop probing %q: %v", remoteAddr, err)
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
m.logger.Warn().Err(err).Msg("error while probing mdns")
|
||||
m.logger.Warn().Err(err).Msg("Error while probing mdns")
|
||||
bo.BackOff(context.Background(), errors.New("mdns probe backoff"))
|
||||
continue
|
||||
}
|
||||
@@ -162,7 +162,7 @@ func (m *mdns) readLoop(conn *net.UDPConn) {
|
||||
if errors.Is(err, net.ErrClosed) {
|
||||
return
|
||||
}
|
||||
m.logger.Debug().Err(err).Msg("mdns readLoop error")
|
||||
m.logger.Debug().Err(err).Msg("Mdns readLoop error")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -185,11 +185,11 @@ func (m *mdns) readLoop(conn *net.UDPConn) {
|
||||
if ip != "" && name != "" {
|
||||
name = normalizeHostname(name)
|
||||
if val, loaded := m.name.LoadOrStore(ip, name); !loaded {
|
||||
m.logger.Debug().Msgf("found hostname: %q, ip: %q via mdns", name, ip)
|
||||
m.logger.Debug().Msgf("Found hostname: %q, ip: %q via mdns", name, ip)
|
||||
} else {
|
||||
old := val.(string)
|
||||
if old != name {
|
||||
m.logger.Debug().Msgf("update hostname: %q, ip: %q, old: %q via mdns", name, ip, old)
|
||||
m.logger.Debug().Msgf("Update hostname: %q, ip: %q, old: %q via mdns", name, ip, old)
|
||||
m.name.Store(ip, name)
|
||||
}
|
||||
}
|
||||
@@ -230,7 +230,7 @@ func (m *mdns) probe(conns []*net.UDPConn, remoteAddr net.Addr) error {
|
||||
// getDataFromAvahiDaemonCache reads entries from avahi-daemon cache to update mdns data.
|
||||
func (m *mdns) getDataFromAvahiDaemonCache() {
|
||||
if _, err := exec.LookPath("avahi-browse"); err != nil {
|
||||
m.logger.Debug().Err(err).Msg("could not find avahi-browse binary, skipping.")
|
||||
m.logger.Debug().Err(err).Msg("Could not find avahi-browse binary, skipping.")
|
||||
return
|
||||
}
|
||||
// Run avahi-browse to discover services from cache:
|
||||
@@ -240,7 +240,7 @@ func (m *mdns) getDataFromAvahiDaemonCache() {
|
||||
// - "-c" -> read from cache.
|
||||
out, err := exec.Command("avahi-browse", "-a", "-r", "-p", "-c").Output()
|
||||
if err != nil {
|
||||
m.logger.Debug().Err(err).Msg("could not browse services from avahi cache")
|
||||
m.logger.Debug().Err(err).Msg("Could not browse services from avahi cache")
|
||||
return
|
||||
}
|
||||
m.storeDataFromAvahiBrowseOutput(bytes.NewReader(out))
|
||||
@@ -260,7 +260,7 @@ func (m *mdns) storeDataFromAvahiBrowseOutput(r io.Reader) {
|
||||
name := normalizeHostname(fields[6])
|
||||
// Only using cache value if we don't have existed one.
|
||||
if _, loaded := m.name.LoadOrStore(ip, name); !loaded {
|
||||
m.logger.Debug().Msgf("found hostname: %q, ip: %q via avahi cache", name, ip)
|
||||
m.logger.Debug().Msgf("Found hostname: %q, ip: %q via avahi cache", name, ip)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ func (nd *ndpDiscover) saveInfo(ip, mac string) {
|
||||
func (nd *ndpDiscover) listen(ctx context.Context) {
|
||||
ifis, err := allInterfacesWithV6LinkLocal()
|
||||
if err != nil {
|
||||
nd.logger.Debug().Err(err).Msg("failed to find valid ipv6 interfaces")
|
||||
nd.logger.Debug().Err(err).Msg("Failed to find valid ipv6 interfaces")
|
||||
return
|
||||
}
|
||||
for _, ifi := range ifis {
|
||||
@@ -111,11 +111,11 @@ func (nd *ndpDiscover) listen(ctx context.Context) {
|
||||
func (nd *ndpDiscover) listenOnInterface(ctx context.Context, ifi *net.Interface) {
|
||||
c, ip, err := ndp.Listen(ifi, ndp.Unspecified)
|
||||
if err != nil {
|
||||
nd.logger.Debug().Err(err).Msg("ndp listen failed")
|
||||
nd.logger.Debug().Err(err).Msg("Ndp listen failed")
|
||||
return
|
||||
}
|
||||
defer c.Close()
|
||||
nd.logger.Debug().Msgf("listening ndp on: %s", ip.String())
|
||||
nd.logger.Debug().Msgf("Listening ndp on: %s", ip.String())
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
@@ -129,7 +129,7 @@ func (nd *ndpDiscover) listenOnInterface(ctx context.Context, ifi *net.Interface
|
||||
if errors.As(readErr, &opErr) && (opErr.Timeout() || opErr.Temporary()) {
|
||||
continue
|
||||
}
|
||||
nd.logger.Debug().Err(readErr).Msg("ndp read loop error")
|
||||
nd.logger.Debug().Err(readErr).Msg("Ndp read loop error")
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
func (nd *ndpDiscover) scan() {
|
||||
neighs, err := netlink.NeighList(0, netlink.FAMILY_V6)
|
||||
if err != nil {
|
||||
nd.logger.Warn().Err(err).Msg("could not get neigh list")
|
||||
nd.logger.Warn().Err(err).Msg("Could not get neighbor list")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ func (nd *ndpDiscover) subscribe(ctx context.Context) {
|
||||
done := make(chan struct{})
|
||||
defer close(done)
|
||||
if err := netlink.NeighSubscribe(ch, done); err != nil {
|
||||
nd.logger.Err(err).Msg("could not perform neighbor subscribing")
|
||||
nd.logger.Err(err).Msg("Could not perform neighbor subscribing")
|
||||
return
|
||||
}
|
||||
for {
|
||||
@@ -45,7 +45,7 @@ func (nd *ndpDiscover) subscribe(ctx context.Context) {
|
||||
}
|
||||
ip := normalizeIP(nu.IP.String())
|
||||
if nu.Type == unix.RTM_DELNEIGH {
|
||||
nd.logger.Debug().Msgf("removing NDP neighbor: %s", ip)
|
||||
nd.logger.Debug().Msgf("Removing ndp neighbor: %s", ip)
|
||||
nd.mac.Delete(ip)
|
||||
continue
|
||||
}
|
||||
@@ -54,7 +54,7 @@ func (nd *ndpDiscover) subscribe(ctx context.Context) {
|
||||
case netlink.NUD_REACHABLE:
|
||||
nd.saveInfo(ip, mac)
|
||||
case netlink.NUD_FAILED:
|
||||
nd.logger.Debug().Msgf("removing NDP neighbor with failed state: %s", ip)
|
||||
nd.logger.Debug().Msgf("Removing ndp neighbor with failed state: %s", ip)
|
||||
nd.mac.Delete(ip)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,14 +15,14 @@ func (nd *ndpDiscover) scan() {
|
||||
case "windows":
|
||||
data, err := exec.Command("netsh", "interface", "ipv6", "show", "neighbors").Output()
|
||||
if err != nil {
|
||||
nd.logger.Warn().Err(err).Msg("could not query ndp table")
|
||||
nd.logger.Warn().Err(err).Msg("Could not query ndp table")
|
||||
return
|
||||
}
|
||||
nd.scanWindows(bytes.NewReader(data))
|
||||
default:
|
||||
data, err := exec.Command("ndp", "-an").Output()
|
||||
if err != nil {
|
||||
nd.logger.Warn().Err(err).Msg("could not query ndp table")
|
||||
nd.logger.Warn().Err(err).Msg("Could not query ndp table")
|
||||
return
|
||||
}
|
||||
nd.scanUnix(bytes.NewReader(data))
|
||||
|
||||
@@ -74,14 +74,14 @@ func (p *ptrDiscover) lookupHostname(ip string) string {
|
||||
msg := new(dns.Msg)
|
||||
addr, err := dns.ReverseAddr(ip)
|
||||
if err != nil {
|
||||
p.logger.Info().Str("discovery", "ptr").Err(err).Msg("invalid ip address")
|
||||
p.logger.Info().Str("discovery", "ptr").Err(err).Msg("Invalid ip address")
|
||||
return ""
|
||||
}
|
||||
msg.SetQuestion(addr, dns.TypePTR)
|
||||
ans, err := p.resolver.Resolve(ctx, msg)
|
||||
if err != nil {
|
||||
if p.serverDown.CompareAndSwap(false, true) {
|
||||
p.logger.Info().Str("discovery", "ptr").Err(err).Msg("could not perform PTR lookup")
|
||||
p.logger.Info().Str("discovery", "ptr").Err(err).Msg("Could not perform ptr lookup")
|
||||
go p.checkServer()
|
||||
}
|
||||
return ""
|
||||
|
||||
@@ -287,7 +287,7 @@ func apiTransport(loggerCtx context.Context, cdDev bool) *http.Transport {
|
||||
ips := ctrld.LookupIP(loggerCtx, apiDomain)
|
||||
if len(ips) == 0 {
|
||||
logger := ctrld.LoggerFromCtx(loggerCtx)
|
||||
logger.Warn().Msgf("No IPs found for %s, use direct IPs: %v", apiDomain, apiIPs)
|
||||
logger.Warn().Msgf("No ips found for %s, use direct ips: %v", apiDomain, apiIPs)
|
||||
ips = apiIPs
|
||||
}
|
||||
|
||||
@@ -348,7 +348,7 @@ func doWithFallback(ctx context.Context, client *http.Client, req *http.Request,
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
logger := ctrld.LoggerFromCtx(ctx)
|
||||
logger.Warn().Err(err).Msgf("failed to send request, fallback to direct IP: %s", apiIp)
|
||||
logger.Warn().Err(err).Msgf("Failed to send request, fallback to direct ip: %s", apiIp)
|
||||
ipReq := req.Clone(req.Context())
|
||||
ipReq.Host = apiIp
|
||||
ipReq.URL.Host = apiIp
|
||||
|
||||
+4
-4
@@ -180,16 +180,16 @@ func (d *ParallelDialer) DialContext(ctx context.Context, network string, addrs
|
||||
for _, addr := range addrs {
|
||||
go func(addr string) {
|
||||
defer wg.Done()
|
||||
logger.Debug("dialing to", zap.String("address", addr))
|
||||
logger.Debug("Dialing to", zap.String("address", addr))
|
||||
conn, err := d.Dialer.DialContext(ctx, network, addr)
|
||||
if err != nil {
|
||||
logger.Debug("failed to dial", zap.String("address", addr), zap.Error(err))
|
||||
logger.Debug("Failed to dial", zap.String("address", addr), zap.Error(err))
|
||||
}
|
||||
select {
|
||||
case ch <- ¶llelDialerResult{conn: conn, err: err}:
|
||||
case <-done:
|
||||
if conn != nil {
|
||||
logger.Debug("connection closed", zap.String("remote_address", conn.RemoteAddr().String()))
|
||||
logger.Debug("Connection closed", zap.String("remote_address", conn.RemoteAddr().String()))
|
||||
conn.Close()
|
||||
}
|
||||
}
|
||||
@@ -200,7 +200,7 @@ func (d *ParallelDialer) DialContext(ctx context.Context, network string, addrs
|
||||
for res := range ch {
|
||||
if res.err == nil {
|
||||
cancel()
|
||||
logger.Debug("connected to", zap.String("remote_address", res.conn.RemoteAddr().String()))
|
||||
logger.Debug("Connected to", zap.String("remote_address", res.conn.RemoteAddr().String()))
|
||||
return res.conn, res.err
|
||||
}
|
||||
errs = append(errs, res.err)
|
||||
|
||||
Reference in New Issue
Block a user