rsslair/main.go

142 lines
3.0 KiB
Go

package main
import (
"context"
"fmt"
"io"
"os"
"os/exec"
"os/signal"
"strings"
"syscall"
"time"
runtime "github.com/banzaicloud/logrus-runtime-formatter"
"github.com/sirupsen/logrus"
)
var logger = logrus.New()
var appConfig AppConfig
// TODO: This function needs to be refactored
func setLogLevel() {
level := os.Getenv("LOG_LEVEL")
verbosity := os.Getenv("VERBOSE")
if verbosity == "1" {
formatter := runtime.Formatter{ChildFormatter: &logrus.TextFormatter{
FullTimestamp: true,
}}
formatter.Line = true
logger.SetFormatter(&formatter)
}
//TODO: This should be in its own function
logFile, err := os.OpenFile("rsslair.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
logger.Fatal(err)
}
mw := io.MultiWriter(os.Stdout, logFile)
logger.SetOutput(mw)
switch strings.ToLower(level) {
case "debug":
logger.SetLevel(logrus.DebugLevel)
case "info":
logger.SetLevel(logrus.InfoLevel)
case "warn":
logger.SetLevel(logrus.WarnLevel)
case "error":
logger.SetLevel(logrus.ErrorLevel)
case "trace":
logger.SetLevel(logrus.TraceLevel)
default:
logger.SetLevel(logrus.InfoLevel)
}
}
func main() {
setLogLevel()
loadAppConfig()
lua := InitLua()
defer CloseDb()
defer lua.Close()
// Create a channel to listen for signals
// Listen for SIGINT and SIGTERM
sig_channel := make(chan os.Signal, 1)
signal.Notify(sig_channel, os.Interrupt, syscall.SIGTERM)
address := "0.0.0.0"
port := "8080"
server := start_server(address, port, lua)
// TODO: Make this look nice
// Create channel to listen for input
go func() {
// disable input buffering
exec.Command("stty", "-F", "/dev/tty", "cbreak", "min", "1").Run()
// do not display entered characters on the screen
exec.Command("stty", "-F", "/dev/tty", "-echo").Run()
// restore the echoing state when exiting
defer exec.Command("stty", "-F", "/dev/tty", "echo").Run()
var b = make([]byte, 1)
for {
os.Stdin.Read(b)
switch char := string(b); char {
case "r":
fmt.Println("Reloading scripts")
routes = make(map[string]string)
LoadScripts(lua)
case "s":
fmt.Println("Executing lua scripts")
execute_all_routes(lua)
case "d":
fmt.Println("Dumping response data")
for k, v := range responses {
leng := len(v)
if leng > 30 {
leng = 30
} else if leng == 0 {
fmt.Println(k, "No response data")
continue
}
msg := v[:leng]
fmt.Println(k, msg)
}
}
}
}()
execute_all_routes(lua)
// TODO: Make this look nice in an actual function
hasRun := false
luaExecutionTimer := time.NewTicker(30 * time.Second)
go func() {
for {
select {
case <-luaExecutionTimer.C:
now := time.Now()
if now.Minute() == 55 && !hasRun {
hasRun = true
execute_all_routes(lua)
break
}
hasRun = false
}
}
}()
<-sig_channel // Block until SIGINT or SIGTERM is received
logger.Info("Shutting down now")
if err := server.Shutdown(context.TODO()); err != nil {
logger.Fatal("Error shutting down server: ", err)
}
}