aboutsummaryrefslogtreecommitdiff
path: root/haminer.go
diff options
context:
space:
mode:
Diffstat (limited to 'haminer.go')
-rw-r--r--haminer.go48
1 files changed, 43 insertions, 5 deletions
diff --git a/haminer.go b/haminer.go
index eeec52b..fca1458 100644
--- a/haminer.go
+++ b/haminer.go
@@ -11,6 +11,7 @@ import (
"time"
"git.sr.ht/~shulhan/pakakeh.go/lib/memfs"
+ "git.sr.ht/~shulhan/pakakeh.go/lib/mlog"
)
const (
@@ -29,8 +30,11 @@ var memfsDatabase *memfs.MemFS
// Haminer define the log consumer and producer.
type Haminer struct {
- cfg *Config
- udpConn *net.UDPConn
+ cfg *Config
+ udpConn *net.UDPConn
+
+ httpd *httpServer
+
httpLogq chan *HTTPLog
ff []Forwarder
isRunning bool
@@ -65,6 +69,13 @@ func NewHaminer(cfg *Config) (h *Haminer, err error) {
initHostname()
+ if len(cfg.WuiAddress) != 0 {
+ h.httpd, err = newHTTPServer(cfg)
+ if err != nil {
+ return nil, fmt.Errorf(`%s: %w`, logp, err)
+ }
+ }
+
err = h.createForwarder()
if err != nil {
return nil, fmt.Errorf(`%s: %w`, logp, err)
@@ -131,14 +142,20 @@ func (h *Haminer) createForwarder() (err error) {
// Start will listen for UDP packet and start consuming log, parse, and
// publish it to analytic server.
func (h *Haminer) Start() (err error) {
- udpAddr := &net.UDPAddr{
+ var logp = `Start`
+
+ var udpAddr = &net.UDPAddr{
IP: net.ParseIP(h.cfg.listenAddr),
Port: h.cfg.listenPort,
}
h.udpConn, err = net.ListenUDP("udp", udpAddr)
if err != nil {
- return
+ return fmt.Errorf(`%s: %w`, logp, err)
+ }
+
+ if h.httpd != nil {
+ h.httpd.start()
}
h.isRunning = true
@@ -182,6 +199,14 @@ func (h *Haminer) consume() {
continue
}
+ if h.httpd != nil {
+ select {
+ case h.httpd.rawlogq <- string(packet[:n]):
+ default:
+ // Log queue is full.
+ }
+ }
+
halog = ParseUDPPacket(packet[:n], h.cfg.RequestHeaders)
if halog == nil {
continue
@@ -229,10 +254,23 @@ func (h *Haminer) produce() {
// Stop will close UDP server and clear all resources.
func (h *Haminer) Stop() {
+ var (
+ logp = `Stop`
+
+ err error
+ )
+
+ if h.httpd != nil {
+ err = h.httpd.Stop(1 * time.Second)
+ if err != nil {
+ mlog.Errf(`%s: %s`, logp, err)
+ }
+ }
+
h.isRunning = false
if h.udpConn != nil {
- err := h.udpConn.Close()
+ err = h.udpConn.Close()
if err != nil {
log.Println(err)
}