diff options
author | Abdelmalek Ihdene <52615297+AbdelmalekIhdene@users.noreply.github.com> | 2019-12-15 14:58:01 -0500 |
---|---|---|
committer | Matt Holt <mholt@users.noreply.github.com> | 2019-12-15 12:58:01 -0700 |
commit | c3bcd967bd3be85c41ac5f630d496f0dc0d18115 (patch) | |
tree | 8bb555badd890eb1713dcc20d99ab81a3e98367f /modules/logging | |
parent | 6ea121ddf8c5be6de892971782d6f0fe2938ebbf (diff) |
logging: Implement net writer (#2884)
* Implement UDP writer
* Implement Net Writer
* Utilize Caddy's address parsing functions
* A couple little fixes (see #2884)
Diffstat (limited to 'modules/logging')
-rw-r--r-- | modules/logging/netwriter.go | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/modules/logging/netwriter.go b/modules/logging/netwriter.go new file mode 100644 index 0000000..1df80b6 --- /dev/null +++ b/modules/logging/netwriter.go @@ -0,0 +1,82 @@ +// Copyright 2015 Matthew Holt and The Caddy Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package logging + +import ( + "fmt" + "io" + "net" + + "github.com/caddyserver/caddy/v2" +) + +func init() { + caddy.RegisterModule(NetWriter{}) +} + +// NetWriter implements a log writer that outputs to a network socket. +type NetWriter struct { + Address string `json:"address,omitempty"` + + addr caddy.ParsedAddress +} + +// CaddyModule returns the Caddy module information. +func (NetWriter) CaddyModule() caddy.ModuleInfo { + return caddy.ModuleInfo{ + ID: "caddy.logging.writers.net", + New: func() caddy.Module { return new(NetWriter) }, + } +} + +// Provision sets up the module. +func (nw *NetWriter) Provision(ctx caddy.Context) error { + repl := caddy.NewReplacer() + address, err := repl.ReplaceOrErr(nw.Address, true, true) + if err != nil { + return fmt.Errorf("invalid host in address: %v", err) + } + + nw.addr, err = caddy.ParseNetworkAddress(address) + if err != nil { + return fmt.Errorf("parsing network address '%s': %v", address, err) + } + + if nw.addr.PortRangeSize() != 1 { + return fmt.Errorf("multiple ports not supported") + } + + return nil +} + +func (nw NetWriter) String() string { + return nw.addr.String() +} + +// WriterKey returns a unique key representing this nw. +func (nw NetWriter) WriterKey() string { + return nw.addr.String() +} + +// OpenWriter opens a new network connection. +func (nw NetWriter) OpenWriter() (io.WriteCloser, error) { + return net.Dial(nw.addr.Network, nw.addr.JoinHostPort(0)) +} + +// Interface guards +var ( + _ caddy.Provisioner = (*NetWriter)(nil) + _ caddy.WriterOpener = (*NetWriter)(nil) +) |