1
0
mirror of https://github.com/hrfee/jfa-go.git synced 2024-12-22 09:00:10 +00:00

refactor; move logger to module

This commit is contained in:
Harvey Tindall 2021-05-01 00:13:57 +01:00
parent 570e3a1e54
commit 9944cc2db9
Signed by: hrfee
GPG Key ID: BBC65952848FB1A2
7 changed files with 143 additions and 117 deletions

69
api.go
View File

@ -1468,37 +1468,38 @@ func (app *appContext) SetEmail(gc *gin.Context) {
respondBool(400, false, gc) respondBool(400, false, gc)
return return
} }
if id == "UserCreated" { switch id {
case "UserCreated":
app.storage.customEmails.UserCreated.Content = req.Content app.storage.customEmails.UserCreated.Content = req.Content
app.storage.customEmails.UserCreated.Enabled = true app.storage.customEmails.UserCreated.Enabled = true
} else if id == "InviteExpiry" { case "InviteExpiry":
app.storage.customEmails.InviteExpiry.Content = req.Content app.storage.customEmails.InviteExpiry.Content = req.Content
app.storage.customEmails.InviteExpiry.Enabled = true app.storage.customEmails.InviteExpiry.Enabled = true
} else if id == "PasswordReset" { case "PasswordReset":
app.storage.customEmails.PasswordReset.Content = req.Content app.storage.customEmails.PasswordReset.Content = req.Content
app.storage.customEmails.PasswordReset.Enabled = true app.storage.customEmails.PasswordReset.Enabled = true
} else if id == "UserDeleted" { case "UserDeleted":
app.storage.customEmails.UserDeleted.Content = req.Content app.storage.customEmails.UserDeleted.Content = req.Content
app.storage.customEmails.UserDeleted.Enabled = true app.storage.customEmails.UserDeleted.Enabled = true
} else if id == "UserDisabled" { case "UserDisabled":
app.storage.customEmails.UserDisabled.Content = req.Content app.storage.customEmails.UserDisabled.Content = req.Content
app.storage.customEmails.UserDisabled.Enabled = true app.storage.customEmails.UserDisabled.Enabled = true
} else if id == "UserEnabled" { case "UserEnabled":
app.storage.customEmails.UserEnabled.Content = req.Content app.storage.customEmails.UserEnabled.Content = req.Content
app.storage.customEmails.UserEnabled.Enabled = true app.storage.customEmails.UserEnabled.Enabled = true
} else if id == "InviteEmail" { case "InviteEmail":
app.storage.customEmails.InviteEmail.Content = req.Content app.storage.customEmails.InviteEmail.Content = req.Content
app.storage.customEmails.InviteEmail.Enabled = true app.storage.customEmails.InviteEmail.Enabled = true
} else if id == "WelcomeEmail" { case "WelcomeEmail":
app.storage.customEmails.WelcomeEmail.Content = req.Content app.storage.customEmails.WelcomeEmail.Content = req.Content
app.storage.customEmails.WelcomeEmail.Enabled = true app.storage.customEmails.WelcomeEmail.Enabled = true
} else if id == "EmailConfirmation" { case "EmailConfirmation":
app.storage.customEmails.EmailConfirmation.Content = req.Content app.storage.customEmails.EmailConfirmation.Content = req.Content
app.storage.customEmails.EmailConfirmation.Enabled = true app.storage.customEmails.EmailConfirmation.Enabled = true
} else if id == "UserExpired" { case "UserExpired":
app.storage.customEmails.UserExpired.Content = req.Content app.storage.customEmails.UserExpired.Content = req.Content
app.storage.customEmails.UserExpired.Enabled = true app.storage.customEmails.UserExpired.Enabled = true
} else { default:
respondBool(400, false, gc) respondBool(400, false, gc)
return return
} }
@ -1525,27 +1526,28 @@ func (app *appContext) SetEmailState(gc *gin.Context) {
} else if s != "disable" { } else if s != "disable" {
respondBool(400, false, gc) respondBool(400, false, gc)
} }
if id == "UserCreated" { switch id {
case "UserCreated":
app.storage.customEmails.UserCreated.Enabled = enabled app.storage.customEmails.UserCreated.Enabled = enabled
} else if id == "InviteExpiry" { case "InviteExpiry":
app.storage.customEmails.InviteExpiry.Enabled = enabled app.storage.customEmails.InviteExpiry.Enabled = enabled
} else if id == "PasswordReset" { case "PasswordReset":
app.storage.customEmails.PasswordReset.Enabled = enabled app.storage.customEmails.PasswordReset.Enabled = enabled
} else if id == "UserDeleted" { case "UserDeleted":
app.storage.customEmails.UserDeleted.Enabled = enabled app.storage.customEmails.UserDeleted.Enabled = enabled
} else if id == "UserDisabled" { case "UserDisabled":
app.storage.customEmails.UserDisabled.Enabled = enabled app.storage.customEmails.UserDisabled.Enabled = enabled
} else if id == "UserEnabled" { case "UserEnabled":
app.storage.customEmails.UserEnabled.Enabled = enabled app.storage.customEmails.UserEnabled.Enabled = enabled
} else if id == "InviteEmail" { case "InviteEmail":
app.storage.customEmails.InviteEmail.Enabled = enabled app.storage.customEmails.InviteEmail.Enabled = enabled
} else if id == "WelcomeEmail" { case "WelcomeEmail":
app.storage.customEmails.WelcomeEmail.Enabled = enabled app.storage.customEmails.WelcomeEmail.Enabled = enabled
} else if id == "EmailConfirmation" { case "EmailConfirmation":
app.storage.customEmails.EmailConfirmation.Enabled = enabled app.storage.customEmails.EmailConfirmation.Enabled = enabled
} else if id == "UserExpired" { case "UserExpired":
app.storage.customEmails.UserExpired.Enabled = enabled app.storage.customEmails.UserExpired.Enabled = enabled
} else { default:
respondBool(400, false, gc) respondBool(400, false, gc)
return return
} }
@ -1576,7 +1578,8 @@ func (app *appContext) GetEmail(gc *gin.Context) {
newEmail := false newEmail := false
username := app.storage.lang.Email[lang].Strings.get("username") username := app.storage.lang.Email[lang].Strings.get("username")
emailAddress := app.storage.lang.Email[lang].Strings.get("emailAddress") emailAddress := app.storage.lang.Email[lang].Strings.get("emailAddress")
if id == "UserCreated" { switch id {
case "UserCreated":
content = app.storage.customEmails.UserCreated.Content content = app.storage.customEmails.UserCreated.Content
if content == "" { if content == "" {
newEmail = true newEmail = true
@ -1588,7 +1591,7 @@ func (app *appContext) GetEmail(gc *gin.Context) {
writeVars = func(variables []string) { app.storage.customEmails.UserCreated.Variables = variables } writeVars = func(variables []string) { app.storage.customEmails.UserCreated.Variables = variables }
values = app.email.createdValues("xxxxxx", username, emailAddress, Invite{}, app, false) values = app.email.createdValues("xxxxxx", username, emailAddress, Invite{}, app, false)
// app.storage.customEmails.UserCreated = content // app.storage.customEmails.UserCreated = content
} else if id == "InviteExpiry" { case "InviteExpiry":
content = app.storage.customEmails.InviteExpiry.Content content = app.storage.customEmails.InviteExpiry.Content
if content == "" { if content == "" {
newEmail = true newEmail = true
@ -1600,7 +1603,7 @@ func (app *appContext) GetEmail(gc *gin.Context) {
writeVars = func(variables []string) { app.storage.customEmails.InviteExpiry.Variables = variables } writeVars = func(variables []string) { app.storage.customEmails.InviteExpiry.Variables = variables }
values = app.email.expiryValues("xxxxxx", Invite{}, app, false) values = app.email.expiryValues("xxxxxx", Invite{}, app, false)
// app.storage.customEmails.InviteExpiry = content // app.storage.customEmails.InviteExpiry = content
} else if id == "PasswordReset" { case "PasswordReset":
content = app.storage.customEmails.PasswordReset.Content content = app.storage.customEmails.PasswordReset.Content
if content == "" { if content == "" {
newEmail = true newEmail = true
@ -1612,7 +1615,7 @@ func (app *appContext) GetEmail(gc *gin.Context) {
writeVars = func(variables []string) { app.storage.customEmails.PasswordReset.Variables = variables } writeVars = func(variables []string) { app.storage.customEmails.PasswordReset.Variables = variables }
values = app.email.resetValues(PasswordReset{Pin: "12-34-56", Username: username}, app, false) values = app.email.resetValues(PasswordReset{Pin: "12-34-56", Username: username}, app, false)
// app.storage.customEmails.PasswordReset = content // app.storage.customEmails.PasswordReset = content
} else if id == "UserDeleted" { case "UserDeleted":
content = app.storage.customEmails.UserDeleted.Content content = app.storage.customEmails.UserDeleted.Content
if content == "" { if content == "" {
newEmail = true newEmail = true
@ -1624,7 +1627,7 @@ func (app *appContext) GetEmail(gc *gin.Context) {
writeVars = func(variables []string) { app.storage.customEmails.UserDeleted.Variables = variables } writeVars = func(variables []string) { app.storage.customEmails.UserDeleted.Variables = variables }
values = app.email.deletedValues(app.storage.lang.Email[lang].Strings.get("reason"), app, false) values = app.email.deletedValues(app.storage.lang.Email[lang].Strings.get("reason"), app, false)
// app.storage.customEmails.UserDeleted = content // app.storage.customEmails.UserDeleted = content
} else if id == "UserDisabled" { case "UserDisabled":
content = app.storage.customEmails.UserDisabled.Content content = app.storage.customEmails.UserDisabled.Content
if content == "" { if content == "" {
newEmail = true newEmail = true
@ -1636,7 +1639,7 @@ func (app *appContext) GetEmail(gc *gin.Context) {
writeVars = func(variables []string) { app.storage.customEmails.UserDisabled.Variables = variables } writeVars = func(variables []string) { app.storage.customEmails.UserDisabled.Variables = variables }
values = app.email.deletedValues(app.storage.lang.Email[lang].Strings.get("reason"), app, false) values = app.email.deletedValues(app.storage.lang.Email[lang].Strings.get("reason"), app, false)
// app.storage.customEmails.UserDeleted = content // app.storage.customEmails.UserDeleted = content
} else if id == "UserEnabled" { case "UserEnabled":
content = app.storage.customEmails.UserEnabled.Content content = app.storage.customEmails.UserEnabled.Content
if content == "" { if content == "" {
newEmail = true newEmail = true
@ -1648,7 +1651,7 @@ func (app *appContext) GetEmail(gc *gin.Context) {
writeVars = func(variables []string) { app.storage.customEmails.UserEnabled.Variables = variables } writeVars = func(variables []string) { app.storage.customEmails.UserEnabled.Variables = variables }
values = app.email.deletedValues(app.storage.lang.Email[lang].Strings.get("reason"), app, false) values = app.email.deletedValues(app.storage.lang.Email[lang].Strings.get("reason"), app, false)
// app.storage.customEmails.UserEnabled = content // app.storage.customEmails.UserEnabled = content
} else if id == "InviteEmail" { case "InviteEmail":
content = app.storage.customEmails.InviteEmail.Content content = app.storage.customEmails.InviteEmail.Content
if content == "" { if content == "" {
newEmail = true newEmail = true
@ -1660,7 +1663,7 @@ func (app *appContext) GetEmail(gc *gin.Context) {
writeVars = func(variables []string) { app.storage.customEmails.InviteEmail.Variables = variables } writeVars = func(variables []string) { app.storage.customEmails.InviteEmail.Variables = variables }
values = app.email.inviteValues("xxxxxx", Invite{}, app, false) values = app.email.inviteValues("xxxxxx", Invite{}, app, false)
// app.storage.customEmails.InviteEmail = content // app.storage.customEmails.InviteEmail = content
} else if id == "WelcomeEmail" { case "WelcomeEmail":
content = app.storage.customEmails.WelcomeEmail.Content content = app.storage.customEmails.WelcomeEmail.Content
conditionals = []string{"{yourAccountWillExpire}"} conditionals = []string{"{yourAccountWillExpire}"}
app.storage.customEmails.WelcomeEmail.Conditionals = conditionals app.storage.customEmails.WelcomeEmail.Conditionals = conditionals
@ -1676,7 +1679,7 @@ func (app *appContext) GetEmail(gc *gin.Context) {
} }
// app.storage.customEmails.WelcomeEmail = content // app.storage.customEmails.WelcomeEmail = content
values = app.email.welcomeValues(username, time.Now(), app, false, true) values = app.email.welcomeValues(username, time.Now(), app, false, true)
} else if id == "EmailConfirmation" { case "EmailConfirmation":
content = app.storage.customEmails.EmailConfirmation.Content content = app.storage.customEmails.EmailConfirmation.Content
if content == "" { if content == "" {
newEmail = true newEmail = true
@ -1688,7 +1691,7 @@ func (app *appContext) GetEmail(gc *gin.Context) {
writeVars = func(variables []string) { app.storage.customEmails.EmailConfirmation.Variables = variables } writeVars = func(variables []string) { app.storage.customEmails.EmailConfirmation.Variables = variables }
values = app.email.confirmationValues("xxxxxx", username, "xxxxxx", app, false) values = app.email.confirmationValues("xxxxxx", username, "xxxxxx", app, false)
// app.storage.customEmails.EmailConfirmation = content // app.storage.customEmails.EmailConfirmation = content
} else if id == "UserExpired" { case "UserExpired":
content = app.storage.customEmails.UserExpired.Content content = app.storage.customEmails.UserExpired.Content
if content == "" { if content == "" {
newEmail = true newEmail = true
@ -1699,7 +1702,7 @@ func (app *appContext) GetEmail(gc *gin.Context) {
} }
writeVars = func(variables []string) { app.storage.customEmails.UserExpired.Variables = variables } writeVars = func(variables []string) { app.storage.customEmails.UserExpired.Variables = variables }
values = app.email.userExpiredValues(app, false) values = app.email.userExpiredValues(app, false)
} else { default:
respondBool(400, false, gc) respondBool(400, false, gc)
return return
} }

View File

@ -6,9 +6,75 @@ import (
"flag" "flag"
"fmt" "fmt"
"os" "os"
"path/filepath"
"strings" "strings"
) )
func (app *appContext) loadArgs(firstCall bool) {
if firstCall {
flag.Usage = helpFunc
help := flag.Bool("help", false, "prints this message.")
flag.BoolVar(help, "h", false, "SHORTHAND")
DATA = flag.String("data", app.dataPath, "alternate path to data directory.")
flag.StringVar(DATA, "d", app.dataPath, "SHORTHAND")
CONFIG = flag.String("config", app.configPath, "alternate path to config file.")
flag.StringVar(CONFIG, "c", app.configPath, "SHORTHAND")
HOST = flag.String("host", "", "alternate address to host web ui on.")
PORT = flag.Int("port", 0, "alternate port to host web ui on.")
flag.IntVar(PORT, "p", 0, "SHORTHAND")
DEBUG = flag.Bool("debug", false, "Enables debug logging.")
PPROF = flag.Bool("pprof", false, "Exposes pprof profiler on /debug/pprof.")
SWAGGER = flag.Bool("swagger", false, "Enable swagger at /swagger/index.html")
flag.Parse()
if *help {
flag.Usage()
os.Exit(0)
}
if *SWAGGER {
os.Setenv("SWAGGER", "1")
}
if *DEBUG {
os.Setenv("DEBUG", "1")
}
if *PPROF {
os.Setenv("PPROF", "1")
}
}
if os.Getenv("SWAGGER") == "1" {
*SWAGGER = true
}
if os.Getenv("DEBUG") == "1" {
*DEBUG = true
}
if os.Getenv("PPROF") == "1" {
*PPROF = true
}
// attempt to apply command line flags correctly
if app.configPath == *CONFIG && app.dataPath != *DATA {
app.dataPath = *DATA
app.configPath = filepath.Join(app.dataPath, "config.ini")
} else if app.configPath != *CONFIG && app.dataPath == *DATA {
app.configPath = *CONFIG
} else {
app.configPath = *CONFIG
app.dataPath = *DATA
}
// Previously used for self-restarts but leaving them here as they might be useful.
if v := os.Getenv("JFA_CONFIGPATH"); v != "" {
app.configPath = v
}
if v := os.Getenv("JFA_DATAPATH"); v != "" {
app.dataPath = v
}
os.Setenv("JFA_CONFIGPATH", app.configPath)
os.Setenv("JFA_DATAPATH", app.dataPath)
}
/* Adds start/stop/systemd to help message, and /* Adds start/stop/systemd to help message, and
also gets rid of usage for shorthand flags, and merge them with the full-length one. also gets rid of usage for shorthand flags, and merge them with the full-length one.
implementation is 🤢, will clean this up eventually. implementation is 🤢, will clean this up eventually.

3
go.mod
View File

@ -8,6 +8,8 @@ replace github.com/hrfee/jfa-go/common => ./common
replace github.com/hrfee/jfa-go/ombi => ./ombi replace github.com/hrfee/jfa-go/ombi => ./ombi
replace github.com/hrfee/jfa-go/logger => ./logger
require ( require (
github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/fatih/color v1.10.0 github.com/fatih/color v1.10.0
@ -24,6 +26,7 @@ require (
github.com/google/uuid v1.1.2 // indirect github.com/google/uuid v1.1.2 // indirect
github.com/hrfee/jfa-go/common v0.0.0-20210105184019-fdc97b4e86cc github.com/hrfee/jfa-go/common v0.0.0-20210105184019-fdc97b4e86cc
github.com/hrfee/jfa-go/docs v0.0.0-20201112212552-b6f3cd7c1f71 github.com/hrfee/jfa-go/docs v0.0.0-20201112212552-b6f3cd7c1f71
github.com/hrfee/jfa-go/logger v0.0.0-00010101000000-000000000000 // indirect
github.com/hrfee/jfa-go/ombi v0.0.0-20201112212552-b6f3cd7c1f71 github.com/hrfee/jfa-go/ombi v0.0.0-20201112212552-b6f3cd7c1f71
github.com/hrfee/mediabrowser v0.3.3 github.com/hrfee/mediabrowser v0.3.3
github.com/itchyny/timefmt-go v0.1.2 github.com/itchyny/timefmt-go v0.1.2

5
logger/go.mod Normal file
View File

@ -0,0 +1,5 @@
module github.com/hrfee/jfa-go/logger
go 1.16
require github.com/fatih/color v1.10.0

9
logger/go.sum Normal file
View File

@ -0,0 +1,9 @@
github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

View File

@ -1,4 +1,5 @@
package main // Package logger provides a wrapper around log that adds color support with github.com/fatih/color.
package logger
import ( import (
"io" "io"
@ -99,10 +100,10 @@ func (l logger) Fatalf(format string, v ...interface{}) {
l.logger.Fatal(out) l.logger.Fatal(out)
} }
type emptyLogger bool type EmptyLogger bool
func (l emptyLogger) Printf(format string, v ...interface{}) {} func (l EmptyLogger) Printf(format string, v ...interface{}) {}
func (l emptyLogger) Print(v ...interface{}) {} func (l EmptyLogger) Print(v ...interface{}) {}
func (l emptyLogger) Println(v ...interface{}) {} func (l EmptyLogger) Println(v ...interface{}) {}
func (l emptyLogger) Fatal(v ...interface{}) {} func (l EmptyLogger) Fatal(v ...interface{}) {}
func (l emptyLogger) Fatalf(format string, v ...interface{}) {} func (l EmptyLogger) Fatalf(format string, v ...interface{}) {}

93
main.go
View File

@ -5,7 +5,6 @@ import (
"crypto/rand" "crypto/rand"
"encoding/base64" "encoding/base64"
"encoding/json" "encoding/json"
"flag"
"fmt" "fmt"
"io/fs" "io/fs"
"log" "log"
@ -24,6 +23,7 @@ import (
"github.com/fatih/color" "github.com/fatih/color"
"github.com/hrfee/jfa-go/common" "github.com/hrfee/jfa-go/common"
_ "github.com/hrfee/jfa-go/docs" _ "github.com/hrfee/jfa-go/docs"
"github.com/hrfee/jfa-go/logger"
"github.com/hrfee/jfa-go/ombi" "github.com/hrfee/jfa-go/ombi"
"github.com/hrfee/mediabrowser" "github.com/hrfee/mediabrowser"
"github.com/lithammer/shortuuid/v3" "github.com/lithammer/shortuuid/v3"
@ -93,7 +93,7 @@ type appContext struct {
storage Storage storage Storage
validator Validator validator Validator
email *Emailer email *Emailer
info, debug, err Logger info, debug, err logger.Logger
host string host string
port int port int
version string version string
@ -165,71 +165,10 @@ func start(asDaemon, firstCall bool) {
fs: localFS, fs: localFS,
} }
app.info = NewLogger(os.Stdout, "[INFO] ", log.Ltime, color.FgHiWhite) app.info = logger.NewLogger(os.Stdout, "[INFO] ", log.Ltime, color.FgHiWhite)
app.err = NewLogger(os.Stdout, "[ERROR] ", log.Ltime, color.FgRed) app.err = logger.NewLogger(os.Stdout, "[ERROR] ", log.Ltime|log.Lshortfile, color.FgRed)
if firstCall { app.loadArgs(firstCall)
flag.Usage = helpFunc
help := flag.Bool("help", false, "prints this message.")
flag.BoolVar(help, "h", false, "SHORTHAND")
DATA = flag.String("data", app.dataPath, "alternate path to data directory.")
flag.StringVar(DATA, "d", app.dataPath, "SHORTHAND")
CONFIG = flag.String("config", app.configPath, "alternate path to config file.")
flag.StringVar(CONFIG, "c", app.configPath, "SHORTHAND")
HOST = flag.String("host", "", "alternate address to host web ui on.")
PORT = flag.Int("port", 0, "alternate port to host web ui on.")
flag.IntVar(PORT, "p", 0, "SHORTHAND")
DEBUG = flag.Bool("debug", false, "Enables debug logging.")
PPROF = flag.Bool("pprof", false, "Exposes pprof profiler on /debug/pprof.")
SWAGGER = flag.Bool("swagger", false, "Enable swagger at /swagger/index.html")
flag.Parse()
if *help {
flag.Usage()
os.Exit(0)
}
if *SWAGGER {
os.Setenv("SWAGGER", "1")
}
if *DEBUG {
os.Setenv("DEBUG", "1")
}
if *PPROF {
os.Setenv("PPROF", "1")
}
}
if os.Getenv("SWAGGER") == "1" {
*SWAGGER = true
}
if os.Getenv("DEBUG") == "1" {
*DEBUG = true
}
if os.Getenv("PPROF") == "1" {
*PPROF = true
}
// attempt to apply command line flags correctly
if app.configPath == *CONFIG && app.dataPath != *DATA {
app.dataPath = *DATA
app.configPath = filepath.Join(app.dataPath, "config.ini")
} else if app.configPath != *CONFIG && app.dataPath == *DATA {
app.configPath = *CONFIG
} else {
app.configPath = *CONFIG
app.dataPath = *DATA
}
// Previously used for self-restarts but leaving them here as they might be useful.
if v := os.Getenv("JFA_CONFIGPATH"); v != "" {
app.configPath = v
}
if v := os.Getenv("JFA_DATAPATH"); v != "" {
app.dataPath = v
}
os.Setenv("JFA_CONFIGPATH", app.configPath)
os.Setenv("JFA_DATAPATH", app.dataPath)
var firstRun bool var firstRun bool
if _, err := os.Stat(app.dataPath); os.IsNotExist(err) { if _, err := os.Stat(app.dataPath); os.IsNotExist(err) {
@ -256,8 +195,8 @@ func start(asDaemon, firstCall bool) {
var debugMode bool var debugMode bool
var address string var address string
if app.loadConfig() != nil { if err := app.loadConfig(); err != nil {
app.err.Fatalf("Failed to load config file \"%s\"", app.configPath) app.err.Fatalf("Failed to load config file \"%s\": %v", app.configPath, err)
} }
app.version = app.config.Section("jellyfin").Key("version").String() app.version = app.config.Section("jellyfin").Key("version").String()
// read from config... // read from config...
@ -267,9 +206,9 @@ func start(asDaemon, firstCall bool) {
debugMode = true debugMode = true
} }
if debugMode { if debugMode {
app.debug = NewLogger(os.Stdout, "[DEBUG] ", log.Ltime|log.Lshortfile, color.FgYellow) app.debug = logger.NewLogger(os.Stdout, "[DEBUG] ", log.Ltime|log.Lshortfile, color.FgYellow)
} else { } else {
app.debug = emptyLogger(false) app.debug = logger.EmptyLogger(false)
} }
if *PPROF { if *PPROF {
app.info.Print(warning("\n\nWARNING: Don't use pprof in production.\n\n")) app.info.Print(warning("\n\nWARNING: Don't use pprof in production.\n\n"))
@ -278,9 +217,8 @@ func start(asDaemon, firstCall bool) {
// Starts listener to receive commands over a unix socket. Use with 'jfa-go start/stop' // Starts listener to receive commands over a unix socket. Use with 'jfa-go start/stop'
if asDaemon { if asDaemon {
go func() { go func() {
socket := SOCK os.Remove(SOCK)
os.Remove(socket) listener, err := net.Listen("unix", SOCK)
listener, err := net.Listen("unix", socket)
if err != nil { if err != nil {
app.err.Fatalf("Couldn't establish socket connection at %s\n", SOCK) app.err.Fatalf("Couldn't establish socket connection at %s\n", SOCK)
} }
@ -288,7 +226,7 @@ func start(asDaemon, firstCall bool) {
signal.Notify(c, os.Interrupt) signal.Notify(c, os.Interrupt)
go func() { go func() {
<-c <-c
os.Remove(socket) os.Remove(SOCK)
os.Exit(1) os.Exit(1)
}() }()
defer func() { defer func() {
@ -298,13 +236,13 @@ func start(asDaemon, firstCall bool) {
for { for {
con, err := listener.Accept() con, err := listener.Accept()
if err != nil { if err != nil {
app.err.Printf("Couldn't read message on %s: %s", socket, err) app.err.Printf("Couldn't read message on %s: %s", SOCK, err)
continue continue
} }
buf := make([]byte, 512) buf := make([]byte, 512)
nr, err := con.Read(buf) nr, err := con.Read(buf)
if err != nil { if err != nil {
app.err.Printf("Couldn't read message on %s: %s", socket, err) app.err.Printf("Couldn't read message on %s: %s", SOCK, err)
continue continue
} }
command := string(buf[0:nr]) command := string(buf[0:nr])
@ -390,6 +328,7 @@ func start(asDaemon, firstCall bool) {
app.storage.profiles_path = app.config.Section("files").Key("user_profiles").String() app.storage.profiles_path = app.config.Section("files").Key("user_profiles").String()
app.storage.loadProfiles() app.storage.loadProfiles()
// Migrate from pre-0.2.0 user templates to profiles
if !(app.storage.policy.BlockedTags == nil && app.storage.configuration.GroupedFolders == nil && len(app.storage.displayprefs) == 0) { if !(app.storage.policy.BlockedTags == nil && app.storage.configuration.GroupedFolders == nil && len(app.storage.displayprefs) == 0) {
app.info.Println("Migrating user template files to new profile format") app.info.Println("Migrating user template files to new profile format")
app.storage.migrateToProfile() app.storage.migrateToProfile()
@ -428,7 +367,7 @@ func start(asDaemon, firstCall bool) {
"Jellyfin (Dark)": "dark-theme", "Jellyfin (Dark)": "dark-theme",
"Default (Light)": "light-theme", "Default (Light)": "light-theme",
} }
// For move from Bootstrap to a17t // For move from Bootstrap to a17t (0.2.5)
if app.config.Section("ui").Key("theme").String() == "Bootstrap (Light)" { if app.config.Section("ui").Key("theme").String() == "Bootstrap (Light)" {
app.config.Section("ui").Key("theme").SetValue("Default (Light)") app.config.Section("ui").Key("theme").SetValue("Default (Light)")
} }