|
@@ -4,9 +4,9 @@
|
|
|
package syslog
|
|
|
|
|
|
import (
|
|
|
+ "crypto/tls"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
- "log/syslog"
|
|
|
"net"
|
|
|
"net/url"
|
|
|
"os"
|
|
@@ -14,13 +14,19 @@ import (
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
|
|
|
+ syslog "github.com/RackSec/srslog"
|
|
|
+
|
|
|
"github.com/Sirupsen/logrus"
|
|
|
"github.com/docker/docker/daemon/logger"
|
|
|
"github.com/docker/docker/daemon/logger/loggerutils"
|
|
|
"github.com/docker/docker/pkg/urlutil"
|
|
|
+ "github.com/docker/go-connections/tlsconfig"
|
|
|
)
|
|
|
|
|
|
-const name = "syslog"
|
|
|
+const (
|
|
|
+ name = "syslog"
|
|
|
+ secureProto = "tcp+tls"
|
|
|
+)
|
|
|
|
|
|
var facilities = map[string]syslog.Priority{
|
|
|
"kern": syslog.LOG_KERN,
|
|
@@ -77,12 +83,19 @@ func New(ctx logger.Context) (logger.Logger, error) {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
- log, err := syslog.Dial(
|
|
|
- proto,
|
|
|
- address,
|
|
|
- facility,
|
|
|
- path.Base(os.Args[0])+"/"+tag,
|
|
|
- )
|
|
|
+ logTag := path.Base(os.Args[0]) + "/" + tag
|
|
|
+
|
|
|
+ var log *syslog.Writer
|
|
|
+ if proto == secureProto {
|
|
|
+ tlsConfig, tlsErr := parseTLSConfig(ctx.Config)
|
|
|
+ if tlsErr != nil {
|
|
|
+ return nil, tlsErr
|
|
|
+ }
|
|
|
+ log, err = syslog.DialWithTLSConfig(proto, address, facility, logTag, tlsConfig)
|
|
|
+ } else {
|
|
|
+ log, err = syslog.Dial(proto, address, facility, logTag)
|
|
|
+ }
|
|
|
+
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
@@ -147,6 +160,10 @@ func ValidateLogOpt(cfg map[string]string) error {
|
|
|
case "syslog-address":
|
|
|
case "syslog-facility":
|
|
|
case "syslog-tag":
|
|
|
+ case "syslog-tls-ca-cert":
|
|
|
+ case "syslog-tls-cert":
|
|
|
+ case "syslog-tls-key":
|
|
|
+ case "syslog-tls-skip-verify":
|
|
|
case "tag":
|
|
|
default:
|
|
|
return fmt.Errorf("unknown log opt '%s' for syslog log driver", key)
|
|
@@ -177,3 +194,16 @@ func parseFacility(facility string) (syslog.Priority, error) {
|
|
|
|
|
|
return syslog.Priority(0), errors.New("invalid syslog facility")
|
|
|
}
|
|
|
+
|
|
|
+func parseTLSConfig(cfg map[string]string) (*tls.Config, error) {
|
|
|
+ _, skipVerify := cfg["syslog-tls-skip-verify"]
|
|
|
+
|
|
|
+ opts := tlsconfig.Options{
|
|
|
+ CAFile: cfg["syslog-tls-ca-cert"],
|
|
|
+ CertFile: cfg["syslog-tls-cert"],
|
|
|
+ KeyFile: cfg["syslog-tls-key"],
|
|
|
+ InsecureSkipVerify: skipVerify,
|
|
|
+ }
|
|
|
+
|
|
|
+ return tlsconfig.Client(opts)
|
|
|
+}
|