package config import ( "errors" "log/syslog" "github.com/asaskevich/govalidator" "golang.org/x/xerrors" ) // SyslogConf is syslog config type SyslogConf struct { Protocol string `json:"-"` Host string `valid:"host" json:"-"` Port string `valid:"port" json:"-"` Severity string `json:"-"` Facility string `json:"-"` Tag string `json:"-"` Verbose bool `json:"-"` } // Validate validates configuration func (c *SyslogConf) Validate() (errs []error) { if !Conf.ToSyslog { return nil } // If protocol is empty, it will connect to the local syslog server. if len(c.Protocol) > 0 && c.Protocol != "tcp" && c.Protocol != "udp" { errs = append(errs, errors.New(`syslog.protocol must be "tcp" or "udp"`)) } // Default port: 514 if c.Port == "" { c.Port = "514" } if _, err := c.GetSeverity(); err != nil { errs = append(errs, err) } if _, err := c.GetFacility(); err != nil { errs = append(errs, err) } if _, err := govalidator.ValidateStruct(c); err != nil { errs = append(errs, err) } return errs } // GetSeverity gets severity func (c *SyslogConf) GetSeverity() (syslog.Priority, error) { if c.Severity == "" { return syslog.LOG_INFO, nil } switch c.Severity { case "emerg": return syslog.LOG_EMERG, nil case "alert": return syslog.LOG_ALERT, nil case "crit": return syslog.LOG_CRIT, nil case "err": return syslog.LOG_ERR, nil case "warning": return syslog.LOG_WARNING, nil case "notice": return syslog.LOG_NOTICE, nil case "info": return syslog.LOG_INFO, nil case "debug": return syslog.LOG_DEBUG, nil default: return -1, xerrors.Errorf("Invalid severity: %s", c.Severity) } } // GetFacility gets facility func (c *SyslogConf) GetFacility() (syslog.Priority, error) { if c.Facility == "" { return syslog.LOG_AUTH, nil } switch c.Facility { case "kern": return syslog.LOG_KERN, nil case "user": return syslog.LOG_USER, nil case "mail": return syslog.LOG_MAIL, nil case "daemon": return syslog.LOG_DAEMON, nil case "auth": return syslog.LOG_AUTH, nil case "syslog": return syslog.LOG_SYSLOG, nil case "lpr": return syslog.LOG_LPR, nil case "news": return syslog.LOG_NEWS, nil case "uucp": return syslog.LOG_UUCP, nil case "cron": return syslog.LOG_CRON, nil case "authpriv": return syslog.LOG_AUTHPRIV, nil case "ftp": return syslog.LOG_FTP, nil case "local0": return syslog.LOG_LOCAL0, nil case "local1": return syslog.LOG_LOCAL1, nil case "local2": return syslog.LOG_LOCAL2, nil case "local3": return syslog.LOG_LOCAL3, nil case "local4": return syslog.LOG_LOCAL4, nil case "local5": return syslog.LOG_LOCAL5, nil case "local6": return syslog.LOG_LOCAL6, nil case "local7": return syslog.LOG_LOCAL7, nil default: return -1, xerrors.Errorf("Invalid facility: %s", c.Facility) } }