fix(config): improve container detection (#420)

fix(config): detect container
This commit is contained in:
ze0s 2022-08-21 18:21:43 +02:00 committed by GitHub
parent 8457222b28
commit 765215270a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 80 additions and 42 deletions

View file

@ -13,5 +13,14 @@ bin
config config
test test
web/* web/*
!web/public
!web/src
!web/build* !web/build*
#!web/build.go !web/package.json
!web/yarn.lock
!web/.yarnrc.yml
!web/.yarn/releases
!web/.eslintrc.js
!web/postcss.config.js
!web/tailwind.config.js
!web/tsconfig.json

View file

@ -43,7 +43,7 @@ func (s *service) List(ctx context.Context) ([]domain.APIKey, error) {
} }
func (s *service) Store(ctx context.Context, key *domain.APIKey) error { func (s *service) Store(ctx context.Context, key *domain.APIKey) error {
key.Key = generateSecureToken(16) key.Key = GenerateSecureToken(16)
if err := s.repo.Store(ctx, key); err != nil { if err := s.repo.Store(ctx, key); err != nil {
return err return err
@ -82,7 +82,7 @@ func (s *service) ValidateAPIKey(ctx context.Context, key string) bool {
return false return false
} }
func generateSecureToken(length int) string { func GenerateSecureToken(length int) string {
b := make([]byte, length) b := make([]byte, length)
if _, err := rand.Read(b); err != nil { if _, err := rand.Read(b); err != nil {
return "" return ""

View file

@ -1,60 +1,31 @@
package config package config
import ( import (
"errors" "bytes"
"log" "log"
"os" "os"
"path" "path"
"path/filepath" "path/filepath"
"strings" "strings"
"sync" "sync"
"text/template"
"github.com/autobrr/autobrr/internal/api"
"github.com/autobrr/autobrr/internal/domain" "github.com/autobrr/autobrr/internal/domain"
"github.com/autobrr/autobrr/internal/logger" "github.com/autobrr/autobrr/internal/logger"
"github.com/autobrr/autobrr/pkg/errors"
"github.com/fsnotify/fsnotify" "github.com/fsnotify/fsnotify"
"github.com/spf13/viper" "github.com/spf13/viper"
) )
func writeConfig(configPath string, configFile string) error { var configTemplate = `# config.toml
path := filepath.Join(configPath, configFile)
// check if configPath exists, if not create it
if _, err := os.Stat(configPath); errors.Is(err, os.ErrNotExist) {
err := os.MkdirAll(configPath, os.ModePerm)
if err != nil {
log.Println(err)
return err
}
}
// check if config exists, if not create it
if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) {
f, err := os.Create(path)
if err != nil { // perm 0666
// handle failed create
log.Printf("error creating file: %q", err)
return err
}
host := "127.0.0.1"
if pd, _ := os.Open("/proc/1/cgroup"); pd != nil {
defer pd.Close()
b := make([]byte, 4096, 4096)
pd.Read(b)
if strings.Contains(string(b), "/docker") || strings.Contains(string(b), "/lxc") {
host = "0.0.0.0"
}
}
defer f.Close()
_, err = f.WriteString(`# config.toml
# Hostname / IP # Hostname / IP
# #
# Default: "localhost" # Default: "localhost"
# #
host = "` + host + `" host = "{{ .host }}"
# Port # Port
# #
@ -87,15 +58,74 @@ logLevel = "DEBUG"
# Session secret # Session secret
# #
sessionSecret = "secret-session-key"`) sessionSecret = "{{ .sessionSecret }}"
`
func writeConfig(configPath string, configFile string) error {
cfgPath := filepath.Join(configPath, configFile)
// check if configPath exists, if not create it
if _, err := os.Stat(configPath); errors.Is(err, os.ErrNotExist) {
err := os.MkdirAll(configPath, os.ModePerm)
if err != nil { if err != nil {
log.Println(err)
return err
}
}
// check if config exists, if not create it
if _, err := os.Stat(cfgPath); errors.Is(err, os.ErrNotExist) {
// set default host
host := "127.0.0.1"
if _, err := os.Stat("/.dockerenv"); err == nil {
// docker creates a .dockerenv file at the root
// of the directory tree inside the container.
// if this file exists then the viewer is running
// from inside a container so return true
host = "0.0.0.0"
} else if pd, _ := os.Open("/proc/1/cgroup"); pd != nil {
defer pd.Close()
b := make([]byte, 4096, 4096)
pd.Read(b)
if strings.Contains(string(b), "/docker") || strings.Contains(string(b), "/lxc") {
host = "0.0.0.0"
}
}
f, err := os.Create(cfgPath)
if err != nil { // perm 0666
// handle failed create
log.Printf("error creating file: %q", err)
return err
}
defer f.Close()
// generate default sessionSecret
sessionSecret := api.GenerateSecureToken(16)
// setup text template to inject variables into
tmpl, err := template.New("config").Parse(configTemplate)
if err != nil {
return errors.Wrap(err, "could not create config template")
}
tmplVars := map[string]string{
"host": host,
"sessionSecret": sessionSecret,
}
var buffer bytes.Buffer
if err = tmpl.Execute(&buffer, &tmplVars); err != nil {
return errors.Wrap(err, "could not write torrent url template output")
}
if _, err = f.WriteString(buffer.String()); err != nil {
log.Printf("error writing contents to file: %v %q", configPath, err) log.Printf("error writing contents to file: %v %q", configPath, err)
return err return err
} }
return f.Sync() return f.Sync()
} }
return nil return nil
@ -157,8 +187,7 @@ func (c *AppConfig) load(configPath string) {
// check if path and file exists // check if path and file exists
// if not, create path and file // if not, create path and file
err := writeConfig(configPath, "config.toml") if err := writeConfig(configPath, "config.toml"); err != nil {
if err != nil {
log.Printf("write error: %q", err) log.Printf("write error: %q", err)
} }