142 lines
3.0 KiB
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)
|
|
}
|
|
}
|