diff --git a/src/syslog/syslog.go b/src/syslog/syslog.go index 16b59df..49283bb 100644 --- a/src/syslog/syslog.go +++ b/src/syslog/syslog.go @@ -1,29 +1,66 @@ package syslog import ( + "fmt" "log" + "time" + "git.openpdu.org/OpenPDU/openpdu/events" "github.com/RackSec/srslog" + "github.com/spf13/viper" ) var logger *srslog.Writer +var Connected bool + +var defaults = map[string]interface{}{ + "Syslog.Host": "localhost", + "Syslog.Port": 514, + "Syslog.Protocol": "udp", +} func init() { - var err error + for k, v := range defaults { + viper.SetDefault(k, v) + } + Connected = false + events.AddListener("config_changed", Reconfigure) + go Connect() +} - logger, err = srslog.Dial("", "", srslog.LOG_ERR, "openpdu") - - // w, err := syslog.Dial("udp", "192.168.0.50:514", syslog.LOG_ERR, "openpdu") - - if err != nil { - log.Fatal("failed to connect to syslog:", err) +func Reconfigure() { + if logger != nil { + logger.Close() } + Notice("Syslog disconnected") + events.FireEvent("syslog_disconnected") + Connected = false + + go Connect() +} + +func Connect() { + var err error + + hostname := viper.GetString("Syslog.Host") + port := viper.GetInt("Syslog.Port") + protocol := viper.GetString("Syslog.Protocol") + conn := fmt.Sprintf("%s:%d", hostname, port) + logger, err = srslog.Dial(protocol, conn, srslog.LOG_WARNING|srslog.LOG_DAEMON, "openpdu") + + if err != nil { + Err(fmt.Sprintf("failed to connect to syslog: %s", err.Error())) + time.Sleep(1 * time.Second) + go Connect() + } + + Connected = true } func Alert(msg string) { if logger == nil { - log.Printf(msg) + log.Print(msg) } else { logger.Alert(msg) } @@ -31,7 +68,7 @@ func Alert(msg string) { func Crit(msg string) { if logger == nil { - log.Printf(msg) + log.Print(msg) } else { logger.Crit(msg) } @@ -39,7 +76,7 @@ func Crit(msg string) { func Err(msg string) { if logger == nil { - log.Printf(msg) + log.Print(msg) } else { logger.Err(msg) } @@ -47,7 +84,7 @@ func Err(msg string) { func Warning(msg string) { if logger == nil { - log.Printf(msg) + log.Print(msg) } else { logger.Warning(msg) } @@ -55,7 +92,7 @@ func Warning(msg string) { func Notice(msg string) { if logger == nil { - log.Printf(msg) + log.Print(msg) } else { logger.Notice(msg) } @@ -63,7 +100,7 @@ func Notice(msg string) { func Info(msg string) { if logger == nil { - log.Printf(msg) + log.Print(msg) } else { logger.Info(msg) } @@ -71,7 +108,8 @@ func Info(msg string) { func Debug(msg string) { if logger == nil { - log.Printf(msg) + log.Print(msg) + } else { + logger.Debug(msg) } - logger.Debug(msg) } diff --git a/src/webui/syslog_ui.go b/src/webui/syslog_ui.go index 7fbe574..f6db880 100644 --- a/src/webui/syslog_ui.go +++ b/src/webui/syslog_ui.go @@ -1,7 +1,39 @@ package webui -import "gopkg.in/macaron.v1" +import ( + "strings" + + "git.openpdu.org/OpenPDU/openpdu/syslog" + "github.com/spf13/viper" + "gopkg.in/macaron.v1" +) func syslogPage(ctx *macaron.Context) { + ctx.Data["host"] = viper.GetString("Syslog.Host") + ctx.Data["port"] = viper.GetInt("Syslog.Port") + ctx.Data["protocol"] = viper.GetString("Syslog.Protocol") + + if syslog.Connected { + ctx.Data["status"] = "Connected" + } else { + ctx.Data["status"] = "Disconnected" + } + ctx.HTML(200, "syslog") } + +type SyslogPostForm struct { + Host string `form:"host" binding:"Required"` + Port int `form:"port" binding:"Required"` + Protocol string `form:"protocol" binding:"Required"` +} + +func syslogPost(ctx *macaron.Context, f SyslogPostForm) { + // TODO: check protocol, it should be 'udp' or 'tcp' + viper.Set("Syslog.Host", strings.ToLower(strings.TrimSpace(f.Host))) + viper.Set("Syslog.Port", f.Port) + viper.Set("Syslog.Protocol", strings.TrimSpace(f.Protocol)) + viper.WriteConfig() + + syslogPage(ctx) +} diff --git a/src/webui/webui.go b/src/webui/webui.go index ec53879..822cca8 100644 --- a/src/webui/webui.go +++ b/src/webui/webui.go @@ -32,6 +32,7 @@ func StartServer() { m.Get("/ups", upsPage) m.Post("/ups", binding.Bind(UPSPostForm{}), upsPost) m.Get("/syslog", syslogPage) + m.Post("/syslog", binding.Bind(SyslogPostForm{}), syslogPost) m.Get("/backup", backupPage) m.Post("/backup", backupDownload) m.Get("/json/status", jsonStatus) diff --git a/templates/syslog.html b/templates/syslog.html index 7cbdf03..4303c61 100644 --- a/templates/syslog.html +++ b/templates/syslog.html @@ -2,47 +2,90 @@ - {% include "common/common-head.html" %} + {% include "common/common-head.html" %} -
+
- {% include "common/page-header.html" %} {% with pageselected="syslog" %} {% include "common/sidebar-menu.html" %} {% endwith %} + {% include "common/page-header.html" %} {% with pageselected="syslog" %} {% include "common/sidebar-menu.html" %} + {% endwith %} - -
+ +
- -
+ +
-
-
+
+
-
-
-

Syslog configuration

-
- - -
+
+
+

Syslog configuration

+
+ + +
+
+
+ +
+
- +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
- -
- + + + + +
+ +
+
- - - {% include "common/footer.html" %} + + +
- + - {% include "common/common-js.html" %} + {% include "common/footer.html" %} + + + + + {% include "common/common-js.html" %}