feat: move config into services

This commit is contained in:
Gabe Kangas 2023-06-15 17:11:44 -07:00
parent 4856397acf
commit 77e2a44713
No known key found for this signature in database
GPG Key ID: 4345B2060657F330
50 changed files with 273 additions and 267 deletions

View File

@ -9,8 +9,8 @@ import (
"github.com/owncast/owncast/activitypub/crypto"
"github.com/owncast/owncast/activitypub/persistence"
"github.com/owncast/owncast/activitypub/requests"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/services/config"
log "github.com/sirupsen/logrus"
)
@ -95,6 +95,7 @@ func NodeInfoV2Controller(w http.ResponseWriter, r *http.Request) {
}
localPostCount, _ := persistence.GetLocalPostCount()
c := config.GetConfig()
res := response{
Version: "2.0",
@ -104,7 +105,7 @@ func NodeInfoV2Controller(w http.ResponseWriter, r *http.Request) {
},
Software: software{
Name: "owncast",
Version: config.VersionNumber,
Version: c.VersionNumber,
},
Usage: usage{
Users: users{
@ -175,6 +176,7 @@ func XNodeInfo2Controller(w http.ResponseWriter, r *http.Request) {
}
localPostCount, _ := persistence.GetLocalPostCount()
c := config.GetConfig()
res := &response{
Organization: Organization{
@ -183,7 +185,7 @@ func XNodeInfo2Controller(w http.ResponseWriter, r *http.Request) {
},
Server: Server{
BaseURL: serverURL,
Version: config.VersionNumber,
Version: c.VersionNumber,
Name: "owncast",
Software: "owncast",
},
@ -192,7 +194,7 @@ func XNodeInfo2Controller(w http.ResponseWriter, r *http.Request) {
Outbound: []string{"activitypub"},
},
Protocols: []string{"activitypub"},
Version: config.VersionNumber,
Version: c.VersionNumber,
Usage: Usage{
Users: Users{
ActiveWeek: 1,
@ -251,13 +253,14 @@ func InstanceV1Controller(w http.ResponseWriter, r *http.Request) {
thumbnail.Path = "/logo/external"
localPostCount, _ := persistence.GetLocalPostCount()
c := config.GetConfig()
res := response{
URI: serverURL,
Title: data.GetServerName(),
ShortDescription: data.GetServerSummary(),
Description: data.GetServerSummary(),
Version: config.GetReleaseString(),
Version: c.GetReleaseString(),
Stats: Stats{
UserCount: 1,
StatusCount: int(localPostCount),

View File

@ -9,7 +9,7 @@ import (
"time"
"github.com/go-fed/httpsig"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
log "github.com/sirupsen/logrus"
)
@ -77,7 +77,9 @@ func CreateSignedRequest(payload []byte, url *url.URL, fromActorIRI *url.URL) (*
req, _ := http.NewRequest("POST", url.String(), bytes.NewBuffer(payload))
ua := fmt.Sprintf("%s; https://owncast.online", config.GetReleaseString())
c := config.GetConfig()
ua := fmt.Sprintf("%s; https://owncast.online", c.GetReleaseString())
req.Header.Set("User-Agent", ua)
req.Header.Set("Content-Type", "application/activity+json")

View File

@ -18,8 +18,8 @@ import (
"github.com/owncast/owncast/activitypub/workerpool"
"github.com/pkg/errors"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus"
"github.com/teris-io/shortid"
@ -77,8 +77,9 @@ func SendLive() error {
if err == nil {
var imageToAttach string
var mediaType string
previewGif := filepath.Join(config.TempDir, "preview.gif")
thumbnailJpg := filepath.Join(config.TempDir, "thumbnail.jpg")
c := config.GetConfig()
previewGif := filepath.Join(c.TempDir, "preview.gif")
thumbnailJpg := filepath.Join(c.TempDir, "thumbnail.jpg")
uniquenessString := shortid.MustGenerate()
if utils.DoesFileExists(previewGif) {
imageToAttach = "preview.gif"

View File

@ -10,7 +10,7 @@ import (
"github.com/go-fed/activity/streams"
"github.com/go-fed/activity/streams/vocab"
"github.com/owncast/owncast/activitypub/crypto"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
log "github.com/sirupsen/logrus"
)
@ -60,8 +60,8 @@ func CreateSignedRequest(payload []byte, url *url.URL, fromActorIRI *url.URL) (*
log.Debugln("Sending", string(payload), "to", url)
req, _ := http.NewRequest(http.MethodPost, url.String(), bytes.NewBuffer(payload))
ua := fmt.Sprintf("%s; https://owncast.online", config.GetReleaseString())
c := config.GetConfig()
ua := fmt.Sprintf("%s; https://owncast.online", c.GetReleaseString())
req.Header.Set("User-Agent", ua)
req.Header.Set("Content-Type", "application/activity+json")

View File

@ -1,70 +0,0 @@
package config
import (
"fmt"
"time"
)
// These are runtime-set values used for configuration.
// DatabaseFilePath is the path to the file ot be used as the global database for this run of the application.
var DatabaseFilePath = "data/owncast.db"
// LogDirectory is the path to various log files.
var LogDirectory = "./data/logs"
// TempDir is where we store temporary files.
var TempDir = "./data/tmp"
// EnableDebugFeatures will print additional data to help in debugging.
var EnableDebugFeatures = false
// VersionNumber is the current version string.
var VersionNumber = StaticVersionNumber
// WebServerPort is the port for Owncast's webserver that is used for this execution of the service.
var WebServerPort = 8080
// WebServerIP is the IP address to bind the web server to. All interfaces by default.
var WebServerIP = "0.0.0.0"
// InternalHLSListenerPort is the port for HLS writes that is used for this execution of the service.
var InternalHLSListenerPort = "8927"
// GitCommit is an optional commit this build was made from.
var GitCommit = ""
// BuildPlatform is the optional platform this release was built for.
var BuildPlatform = "dev"
// EnableAutoUpdate will explicitly enable in-place auto-updates via the admin.
var EnableAutoUpdate = false
// A temporary stream key that can be set via the command line.
var TemporaryStreamKey = ""
// GetCommit will return an identifier used for identifying the point in time this build took place.
func GetCommit() string {
if GitCommit == "" {
GitCommit = time.Now().Format("20060102")
}
return GitCommit
}
// DefaultForbiddenUsernames are a list of usernames forbidden from being used in chat.
var DefaultForbiddenUsernames = []string{
"owncast", "operator", "admin", "system",
}
// MaxSocketPayloadSize is the maximum payload we will allow to to be received via the chat socket.
const MaxSocketPayloadSize = 2048
// GetReleaseString gets the version string.
func GetReleaseString() string {
versionNumber := VersionNumber
buildPlatform := BuildPlatform
gitCommit := GetCommit()
return fmt.Sprintf("Owncast v%s-%s (%s)", versionNumber, buildPlatform, gitCommit)
}

View File

@ -1 +0,0 @@
package config

View File

@ -1,8 +0,0 @@
//go:build enable_updates
// +build enable_updates
package config
func init() {
EnableAutoUpdate = true
}

View File

@ -1,66 +0,0 @@
package config
import (
"errors"
"fmt"
"os"
"os/exec"
"strings"
log "github.com/sirupsen/logrus"
"golang.org/x/mod/semver"
)
// VerifyFFMpegPath verifies that the path exists, is a file, and is executable.
func VerifyFFMpegPath(path string) error {
stat, err := os.Stat(path)
if os.IsNotExist(err) {
return errors.New("ffmpeg path does not exist")
}
if err != nil {
return fmt.Errorf("error while verifying the ffmpeg path: %s", err.Error())
}
if stat.IsDir() {
return errors.New("ffmpeg path can not be a folder")
}
mode := stat.Mode()
// source: https://stackoverflow.com/a/60128480
if mode&0o111 == 0 {
return errors.New("ffmpeg path is not executable")
}
cmd := exec.Command(path)
out, _ := cmd.CombinedOutput()
response := string(out)
if response == "" {
return fmt.Errorf("unable to determine the version of your ffmpeg installation at %s you may experience issues with video", path)
}
responseComponents := strings.Split(response, " ")
if len(responseComponents) < 3 {
log.Debugf("unable to determine the version of your ffmpeg installation at %s you may experience issues with video", path)
return nil
}
fullVersionString := responseComponents[2]
versionString := "v" + strings.Split(fullVersionString, "-")[0]
// Some builds of ffmpeg have weird build numbers that we can't parse
if !semver.IsValid(versionString) {
log.Debugf("unable to determine if ffmpeg version %s is recent enough. if you experience issues with video you may want to look into updating", fullVersionString)
return nil
}
if semver.Compare(versionString, FfmpegSuggestedVersion) == -1 {
return fmt.Errorf("your %s version of ffmpeg at %s may be older than the suggested version of %s you may experience issues with video", versionString, path, FfmpegSuggestedVersion)
}
return nil
}

View File

@ -5,10 +5,10 @@ import (
"net/http"
"sort"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
log "github.com/sirupsen/logrus"
@ -29,12 +29,13 @@ func Start(getStatusFunc func() models.Status) error {
go _server.Run()
log.Traceln("Chat server started with max connection count of", _server.maxSocketConnectionLimit)
c := config.GetConfig()
chatMessagesSentCounter = promauto.NewGauge(prometheus.GaugeOpts{
Name: "total_chat_message_count",
Help: "The number of chat messages incremented over time.",
ConstLabels: map[string]string{
"version": config.VersionNumber,
"version": c.VersionNumber,
"host": data.GetServerURL(),
},
})

View File

@ -11,9 +11,9 @@ import (
"golang.org/x/time/rate"
"github.com/gorilla/websocket"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/services/geoip"
)

View File

@ -6,9 +6,9 @@ import (
"strings"
"time"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/services/webhooks"
"github.com/owncast/owncast/storage"
"github.com/owncast/owncast/utils"

View File

@ -11,10 +11,10 @@ import (
"github.com/gorilla/websocket"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/services/geoip"
"github.com/owncast/owncast/services/webhooks"
"github.com/owncast/owncast/storage"

View File

@ -7,11 +7,11 @@ import (
log "github.com/sirupsen/logrus"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/auth"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/services/notifications"
"github.com/owncast/owncast/services/webhooks"
"github.com/owncast/owncast/services/yp"
@ -113,7 +113,8 @@ func transitionToOfflineVideoStreamContent() {
// Copy the logo to be the thumbnail
logo := data.GetLogoPath()
dst := filepath.Join(config.TempDir, "thumbnail.jpg")
c := config.GetConfig()
dst := filepath.Join(c.TempDir, "thumbnail.jpg")
if err = utils.Copy(filepath.Join("data", logo), dst); err != nil {
log.Warnln(err)
}
@ -126,7 +127,8 @@ func resetDirectories() {
log.Trace("Resetting file directories to a clean slate.")
// Wipe hls data directory
utils.CleanupDirectory(config.HLSStoragePath)
c := config.GetConfig()
utils.CleanupDirectory(c.HLSStoragePath)
// Remove the previous thumbnail
logo := data.GetLogoPath()

View File

@ -7,8 +7,8 @@ import (
"strings"
"time"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/static"
"github.com/owncast/owncast/utils"
"github.com/pkg/errors"
@ -596,7 +596,8 @@ func GetVideoCodec() string {
// VerifySettings will perform a sanity check for specific settings values.
func VerifySettings() error {
if len(GetStreamKeys()) == 0 && config.TemporaryStreamKey == "" {
c := config.GetConfig()
if len(GetStreamKeys()) == 0 && c.TemporaryStreamKey == "" {
log.Errorln("No stream key set. Streaming is disabled. Please set one via the admin or command line arguments")
}

View File

@ -11,7 +11,7 @@ import (
"path/filepath"
"time"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus"
)
@ -118,7 +118,8 @@ func SetupPersistence(file string) error {
dbBackupTicker := time.NewTicker(1 * time.Hour)
go func() {
backupFile := filepath.Join(config.BackupDirectory, "owncastdb.bak")
c := config.GetConfig()
backupFile := filepath.Join(c.BackupDirectory, "owncastdb.bak")
for range dbBackupTicker.C {
utils.Backup(_db, backupFile)
}

View File

@ -1,8 +1,8 @@
package data
import (
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
)
// HasPopulatedDefaults will determine if the defaults have been inserted into the database.

View File

@ -9,8 +9,8 @@ import (
"sync"
"time"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/static"
"github.com/owncast/owncast/utils"
"github.com/pkg/errors"
@ -102,11 +102,13 @@ func SetupEmojiDirectory() (err error) {
isDir bool
}
if utils.DoesFileExists(config.CustomEmojiPath) {
c := config.GetConfig()
if utils.DoesFileExists(c.CustomEmojiPath) {
return nil
}
if err = os.MkdirAll(config.CustomEmojiPath, 0o750); err != nil {
if err = os.MkdirAll(c.CustomEmojiPath, 0o750); err != nil {
return fmt.Errorf("unable to create custom emoji directory: %w", err)
}
@ -137,7 +139,7 @@ func SetupEmojiDirectory() (err error) {
// Now copy all built-in emojis to the custom emoji directory
for _, path := range files {
emojiPath := filepath.Join(config.CustomEmojiPath, path.path)
emojiPath := filepath.Join(c.CustomEmojiPath, path.path)
if path.isDir {
if err := os.Mkdir(emojiPath, 0o700); err != nil {

View File

@ -6,15 +6,17 @@ import (
"path/filepath"
"time"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus"
"github.com/teris-io/shortid"
)
func migrateDatabaseSchema(db *sql.DB, from, to int) error {
c := config.GetConfig()
log.Printf("Migrating database from version %d to %d", from, to)
dbBackupFile := filepath.Join(config.BackupDirectory, fmt.Sprintf("owncast-v%d.bak", from))
dbBackupFile := filepath.Join(c.BackupDirectory, fmt.Sprintf("owncast-v%d.bak", from))
utils.Backup(db, dbBackupFile)
for v := from; v < to; v++ {
log.Tracef("Migration step from %d to %d\n", v, v+1)

View File

@ -9,8 +9,8 @@ import (
// sqlite requires a blank import.
_ "github.com/mattn/go-sqlite3"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/db"
"github.com/owncast/owncast/services/config"
log "github.com/sirupsen/logrus"
)

View File

@ -6,7 +6,7 @@ import (
"path/filepath"
"github.com/grafov/m3u8"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/static"
"github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus"
@ -19,8 +19,9 @@ func appendOfflineToVariantPlaylist(index int, playlistFilePath string) {
return
}
c := config.GetConfig()
tmpFileName := fmt.Sprintf("tmp-stream-%d.m3u8", index)
atomicWriteTmpPlaylistFile, err := os.CreateTemp(config.TempDir, tmpFileName)
atomicWriteTmpPlaylistFile, err := os.CreateTemp(c.TempDir, tmpFileName)
if err != nil {
log.Errorln("error creating tmp playlist file to write to", playlistFilePath, err)
return
@ -49,8 +50,9 @@ func appendOfflineToVariantPlaylist(index int, playlistFilePath string) {
}
func makeVariantIndexOffline(index int, offlineFilePath string, offlineFilename string) {
playlistFilePath := fmt.Sprintf(filepath.Join(config.HLSStoragePath, "%d/stream.m3u8"), index)
segmentFilePath := fmt.Sprintf(filepath.Join(config.HLSStoragePath, "%d/%s"), index, offlineFilename)
c := config.GetConfig()
playlistFilePath := fmt.Sprintf(filepath.Join(c.HLSStoragePath, "%d/stream.m3u8"), index)
segmentFilePath := fmt.Sprintf(filepath.Join(c.HLSStoragePath, "%d/%s"), index, offlineFilename)
if err := utils.Copy(offlineFilePath, segmentFilePath); err != nil {
log.Warnln(err)
@ -94,7 +96,8 @@ func createEmptyOfflinePlaylist(playlistFilePath string, offlineFilename string)
func saveOfflineClipToDisk(offlineFilename string) (string, error) {
offlineFileData := static.GetOfflineSegment()
offlineTmpFile, err := os.CreateTemp(config.TempDir, offlineFilename)
c := config.GetConfig()
offlineTmpFile, err := os.CreateTemp(c.TempDir, offlineFilename)
if err != nil {
log.Errorln("unable to create temp file for offline video segment", err)
}

View File

@ -1,9 +1,9 @@
package core
import (
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
)
// GetStatus gets the status of the system.
@ -17,6 +17,8 @@ func GetStatus() models.Status {
viewerCount = len(_stats.Viewers)
}
c := config.GetConfig()
return models.Status{
Online: IsStreamConnected(),
ViewerCount: viewerCount,
@ -24,7 +26,7 @@ func GetStatus() models.Status {
SessionMaxViewerCount: _stats.SessionMaxViewerCount,
LastDisconnectTime: _stats.LastDisconnectTime,
LastConnectTime: _stats.LastConnectTime,
VersionNumber: config.VersionNumber,
VersionNumber: c.VersionNumber,
StreamTitle: data.GetStreamTitle(),
}
}

View File

@ -8,10 +8,10 @@ import (
log "github.com/sirupsen/logrus"
"github.com/owncast/owncast/activitypub"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/services/notifications"
"github.com/owncast/owncast/services/webhooks"
"github.com/owncast/owncast/utils"
@ -51,7 +51,8 @@ func setStreamAsConnected(rtmpOut *io.PipeReader) {
go _yp.Start()
}
segmentPath := config.HLSStoragePath
c := config.GetConfig()
segmentPath := c.HLSStoragePath
if err := setupStorage(); err != nil {
log.Fatalln("failed to setup the storage", err)

View File

@ -3,14 +3,16 @@ package logging
import (
"path/filepath"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
)
// GetTranscoderLogFilePath returns the logging path for the transcoder log output.
func GetTranscoderLogFilePath() string {
return filepath.Join(config.LogDirectory, "transcoder.log")
c := config.GetConfig()
return filepath.Join(c.LogDirectory, "transcoder.log")
}
func getLogFilePath() string {
return filepath.Join(config.LogDirectory, "owncast.log")
c := config.GetConfig()
return filepath.Join(c.LogDirectory, "owncast.log")
}

View File

@ -9,10 +9,11 @@ import (
"github.com/owncast/owncast/webserver"
log "github.com/sirupsen/logrus"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core"
"github.com/owncast/owncast/core/data"
configservice "github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/services/metrics"
"github.com/owncast/owncast/utils"
)
@ -28,12 +29,15 @@ var (
webServerPortOverride = flag.String("webserverport", "", "Force the web server to listen on a specific port")
webServerIPOverride = flag.String("webserverip", "", "Force web server to listen on this IP address")
rtmpPortOverride = flag.Int("rtmpport", 0, "Set listen port for the RTMP server")
config *configservice.Config
)
// nolint:cyclop
func main() {
flag.Parse()
config = configservice.NewConfig()
if *logDirectory != "" {
config.LogDirectory = *logDirectory
}

106
services/config/config.go Normal file
View File

@ -0,0 +1,106 @@
package config
import (
"fmt"
"path/filepath"
"time"
)
// These are runtime-set values used for configuration.
type Config struct {
// DatabaseFilePath is the path to the file ot be used as the global database for this run of the application.
DatabaseFilePath string
// LogDirectory is the path to various log files.
LogDirectory string
// TempDir is where we store temporary files.
TempDir string
// EnableDebugFeatures will print additional data to help in debugging.
EnableDebugFeatures bool
// VersionNumber is the current version string.
VersionNumber string
// WebServerPort is the port for Owncast's webserver that is used for this execution of the service.
WebServerPort int
// WebServerIP is the IP address to bind the web server to. All interfaces by default.
WebServerIP string
// InternalHLSListenerPort is the port for HLS writes that is used for this execution of the service.
InternalHLSListenerPort string
// GitCommit is an optional commit this build was made from.
GitCommit string
// BuildPlatform is the optional platform this release was built for.
BuildPlatform string
// EnableAutoUpdate will explicitly enable in-place auto-updates via the admin.
EnableAutoUpdate bool
// A temporary stream key that can be set via the command line.
TemporaryStreamKey string
// BackupDirectory is the directory we write backup files to.
BackupDirectory string
// HLSStoragePath is the directory HLS video is written to.
HLSStoragePath string
// CustomEmojiPath is the emoji directory.
CustomEmojiPath string
// PublicFilesPath is the optional directory for hosting public files.
PublicFilesPath string
}
// NewFediAuth creates a new FediAuth instance.
func NewConfig() *Config {
// Default config values.
c := &Config{
DatabaseFilePath: "data/owncast.db",
LogDirectory: "./data/logs",
TempDir: "./data/tmp",
EnableDebugFeatures: false,
VersionNumber: StaticVersionNumber,
WebServerPort: 8080,
WebServerIP: "0.0.0.0",
InternalHLSListenerPort: "8927",
GitCommit: "",
BuildPlatform: "dev",
EnableAutoUpdate: false,
TemporaryStreamKey: "",
BackupDirectory: filepath.Join(DataDirectory, "backup"),
HLSStoragePath: filepath.Join(DataDirectory, "hls"),
CustomEmojiPath: filepath.Join(DataDirectory, "emoji"),
PublicFilesPath: filepath.Join(DataDirectory, "public"),
}
return c
}
var temporaryGlobalInstance *Config
// GetConfig returns the temporary global instance.
// Remove this after dependency injection is implemented.
func GetConfig() *Config {
if temporaryGlobalInstance == nil {
temporaryGlobalInstance = NewConfig()
}
return temporaryGlobalInstance
}
// GetCommit will return an identifier used for identifying the point in time this build took place.
func (c *Config) GetCommit() string {
if c.GitCommit == "" {
c.GitCommit = time.Now().Format("20060102")
}
return c.GitCommit
}
// DefaultForbiddenUsernames are a list of usernames forbidden from being used in chat.
var DefaultForbiddenUsernames = []string{
"owncast", "operator", "admin", "system",
}
// MaxSocketPayloadSize is the maximum payload we will allow to to be received via the chat socket.
const MaxSocketPayloadSize = 2048
// GetReleaseString gets the version string.
func (c *Config) GetReleaseString() string {
versionNumber := c.VersionNumber
buildPlatform := c.BuildPlatform
gitCommit := c.GetCommit()
return fmt.Sprintf("Owncast v%s-%s (%s)", versionNumber, buildPlatform, gitCommit)
}

View File

@ -1,7 +1,5 @@
package config
import "path/filepath"
const (
// StaticVersionNumber is the version of Owncast that is used when it's not overwritten via build-time settings.
StaticVersionNumber = "0.1.3" // Shown when you build from develop
@ -17,17 +15,3 @@ const (
// MaxChatDisplayNameLength is the maximum length of a chat display name.
MaxChatDisplayNameLength = 30
)
var (
// BackupDirectory is the directory we write backup files to.
BackupDirectory = filepath.Join(DataDirectory, "backup")
// HLSStoragePath is the directory HLS video is written to.
HLSStoragePath = filepath.Join(DataDirectory, "hls")
// CustomEmojiPath is the emoji directory.
CustomEmojiPath = filepath.Join(DataDirectory, "emoji")
// PublicFilesPath is the optional directory for hosting public files.
PublicFilesPath = filepath.Join(DataDirectory, "public")
)

View File

@ -4,9 +4,9 @@ import (
"sync"
"time"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
)
// How often we poll for updates.
@ -61,8 +61,11 @@ func Start(getStatus func() models.Status) {
if host == "" {
host = "unknown"
}
c := config.GetConfig()
labels = map[string]string{
"version": config.VersionNumber,
"version": c.VersionNumber,
"host": host,
}

View File

@ -3,9 +3,9 @@ package notifications
import (
"fmt"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/services/notifications/browser"
"github.com/owncast/owncast/services/notifications/discord"
"github.com/pkg/errors"

View File

@ -8,9 +8,9 @@ import (
"net/url"
"time"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
log "github.com/sirupsen/logrus"
)

View File

@ -8,10 +8,10 @@ import (
"strings"
"time"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/db"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
"github.com/pkg/errors"
"github.com/teris-io/shortid"

View File

@ -11,9 +11,9 @@ import (
log "github.com/sirupsen/logrus"
"github.com/nareix/joy5/format/rtmp"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
)
var _hasInboundRTMPConnection = false
@ -81,9 +81,11 @@ func HandleConn(c *rtmp.Conn, nc net.Conn) {
accessGranted := false
validStreamingKeys := data.GetStreamKeys()
configservice := config.GetConfig()
// If a stream key override was specified then use that instead.
if config.TemporaryStreamKey != "" {
validStreamingKeys = []models.StreamKey{{Key: config.TemporaryStreamKey}}
if configservice.TemporaryStreamKey != "" {
validStreamingKeys = []models.StreamKey{{Key: configservice.TemporaryStreamKey}}
}
for _, key := range validStreamingKeys {

View File

@ -8,8 +8,8 @@ import (
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/services/config"
)
// LocalStorage represents an instance of the local storage provider for HLS video.
@ -66,7 +66,8 @@ func (s *LocalStorage) Cleanup() error {
// Determine how many files we should keep on disk
maxNumber := data.GetStreamLatencyLevel().SegmentCount
buffer := 10
baseDirectory := config.HLSStoragePath
c := config.GetConfig()
baseDirectory := c.HLSStoragePath
files, err := getAllFilesRecursive(baseDirectory)
if err != nil {

View File

@ -6,7 +6,7 @@ import (
"path/filepath"
"github.com/grafov/m3u8"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
playlist "github.com/owncast/owncast/video/playlists"
log "github.com/sirupsen/logrus"
@ -34,8 +34,8 @@ func rewritePlaylistLocations(localFilePath, remoteServingEndpoint, pathPrefix s
}
item.URI = remoteServingEndpoint + filepath.Join(finalPath, item.URI)
}
publicPath := filepath.Join(config.HLSStoragePath, filepath.Base(localFilePath))
c := config.GetConfig()
publicPath := filepath.Join(c.HLSStoragePath, filepath.Base(localFilePath))
newPlaylist := p.String()

View File

@ -22,7 +22,7 @@ import (
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
)
// S3Storage is the s3 implementation of a storage provider.
@ -158,8 +158,10 @@ func (s *S3Storage) Save(filePath string, retryCount int) (string, error) {
}
defer file.Close()
c := config.GetConfig()
// Convert the local path to the variant/file path by stripping the local storage location.
normalizedPath := strings.TrimPrefix(filePath, config.HLSStoragePath)
normalizedPath := strings.TrimPrefix(filePath, c.HLSStoragePath)
// Build the remote path by adding the "hls" path prefix.
remotePath := strings.Join([]string{"hls", normalizedPath}, "")

View File

@ -8,7 +8,7 @@ import (
"path/filepath"
"strings"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus"
)
@ -42,8 +42,9 @@ func (s *FileWriterReceiverService) SetupFileWriterReceiverService(callbacks Fil
log.Fatalln("Unable to start internal video writing service", err)
}
c := config.GetConfig()
listenerPort := strings.Split(listener.Addr().String(), ":")[1]
config.InternalHLSListenerPort = listenerPort
c.InternalHLSListenerPort = listenerPort
log.Traceln("Transcoder response service listening on: " + listenerPort)
go func() {
//nolint: gosec
@ -59,8 +60,9 @@ func (s *FileWriterReceiverService) uploadHandler(w http.ResponseWriter, r *http
return
}
c := config.GetConfig()
path := r.URL.Path
writePath := filepath.Join(config.HLSStoragePath, path)
writePath := filepath.Join(c.HLSStoragePath, path)
f, err := os.Create(writePath) //nolint: gosec
if err != nil {
returnError(err, w)

View File

@ -10,8 +10,8 @@ import (
log "github.com/sirupsen/logrus"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
)
@ -52,9 +52,11 @@ func StartThumbnailGenerator(chunkPath string, variantIndex int, isVideoPassthro
}
func fireThumbnailGenerator(segmentPath string, variantIndex int) error {
c := config.GetConfig()
// JPG takes less time to encode than PNG
outputFile := path.Join(config.TempDir, "thumbnail.jpg")
previewGifFile := path.Join(config.TempDir, "preview.gif")
outputFile := path.Join(c.TempDir, "thumbnail.jpg")
previewGifFile := path.Join(c.TempDir, "preview.gif")
framePath := path.Join(segmentPath, strconv.Itoa(variantIndex))
files, err := os.ReadDir(framePath)
@ -91,7 +93,7 @@ func fireThumbnailGenerator(segmentPath string, variantIndex int) error {
mostRecentFile := path.Join(framePath, names[0])
ffmpegPath := utils.ValidatedFfmpegPath(data.GetFfMpegPath())
outputFileTemp := path.Join(config.TempDir, "tempthumbnail.jpg")
outputFileTemp := path.Join(c.TempDir, "tempthumbnail.jpg")
thumbnailCmdFlags := []string{
ffmpegPath,
@ -120,8 +122,9 @@ func fireThumbnailGenerator(segmentPath string, variantIndex int) error {
}
func makeAnimatedGifPreview(sourceFile string, outputFile string) {
c := config.GetConfig()
ffmpegPath := utils.ValidatedFfmpegPath(data.GetFfMpegPath())
outputFileTemp := path.Join(config.TempDir, "temppreview.gif")
outputFileTemp := path.Join(c.TempDir, "temppreview.gif")
// Filter is pulled from https://engineering.giphy.com/how-to-make-gifs-with-ffmpeg/
animatedGifFlags := []string{

View File

@ -11,10 +11,10 @@ import (
log "github.com/sirupsen/logrus"
"github.com/teris-io/shortid"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/logging"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
)
@ -120,7 +120,9 @@ func (t *Transcoder) Start(shouldLog bool) {
}
createVariantDirectories()
if config.EnableDebugFeatures {
c := config.GetConfig()
if c.EnableDebugFeatures {
log.Println(command)
}
@ -274,16 +276,17 @@ func getVariantFromConfigQuality(quality models.StreamOutputVariant, index int)
// NewTranscoder will return a new Transcoder, populated by the config.
func NewTranscoder() *Transcoder {
ffmpegPath := utils.ValidatedFfmpegPath(data.GetFfMpegPath())
c := config.GetConfig()
transcoder := new(Transcoder)
transcoder.ffmpegPath = ffmpegPath
transcoder.internalListenerPort = config.InternalHLSListenerPort
transcoder.internalListenerPort = c.InternalHLSListenerPort
transcoder.currentStreamOutputSettings = data.GetStreamOutputVariants()
transcoder.currentLatencyLevel = data.GetStreamLatencyLevel()
transcoder.codec = getCodec(data.GetVideoCodec())
transcoder.segmentOutputPath = config.HLSStoragePath
transcoder.playlistOutputPath = config.HLSStoragePath
transcoder.segmentOutputPath = c.HLSStoragePath
transcoder.playlistOutputPath = c.HLSStoragePath
transcoder.input = "pipe:0" // stdin

View File

@ -7,8 +7,8 @@ import (
"strings"
"sync"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus"
)
@ -97,17 +97,19 @@ func handleTranscoderMessage(message string) {
}
func createVariantDirectories() {
c := config.GetConfig()
// Create private hls data dirs
utils.CleanupDirectory(config.HLSStoragePath)
utils.CleanupDirectory(c.HLSStoragePath)
if len(data.GetStreamOutputVariants()) != 0 {
for index := range data.GetStreamOutputVariants() {
if err := os.MkdirAll(path.Join(config.HLSStoragePath, strconv.Itoa(index)), 0o750); err != nil {
if err := os.MkdirAll(path.Join(c.HLSStoragePath, strconv.Itoa(index)), 0o750); err != nil {
log.Fatalln(err)
}
}
} else {
dir := path.Join(config.HLSStoragePath, strconv.Itoa(0))
dir := path.Join(c.HLSStoragePath, strconv.Itoa(0))
log.Traceln("Creating", dir)
if err := os.MkdirAll(dir, 0o750); err != nil {
log.Fatalln(err)

View File

@ -7,7 +7,7 @@ import (
"os"
"path/filepath"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
"github.com/owncast/owncast/webserver/requests"
"github.com/owncast/owncast/webserver/responses"
@ -38,10 +38,11 @@ func (h *Handlers) UploadCustomEmoji(w http.ResponseWriter, r *http.Request) {
}
// Prevent path traversal attacks
c := config.GetConfig()
emojiFileName := filepath.Base(emoji.Name)
targetPath := filepath.Join(config.CustomEmojiPath, emojiFileName)
targetPath := filepath.Join(c.CustomEmojiPath, emojiFileName)
err = os.MkdirAll(config.CustomEmojiPath, 0o700)
err = os.MkdirAll(c.CustomEmojiPath, 0o700)
if err != nil {
responses.WriteSimpleResponse(w, false, err.Error())
return
@ -77,8 +78,8 @@ func (h *Handlers) DeleteCustomEmoji(w http.ResponseWriter, r *http.Request) {
return
}
// var emojiFileName = filepath.Base(emoji.Name)
targetPath := filepath.Join(config.CustomEmojiPath, emoji.Name)
c := config.GetConfig()
targetPath := filepath.Join(c.CustomEmojiPath, emoji.Name)
if err := os.Remove(targetPath); err != nil {
if os.IsNotExist(err) {

View File

@ -6,8 +6,9 @@ import (
"net/http"
"time"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/user"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/storage"
"github.com/owncast/owncast/utils"
"github.com/owncast/owncast/webserver/responses"
)

View File

@ -4,9 +4,9 @@ import (
"encoding/json"
"net/http"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
"github.com/owncast/owncast/video/transcoder"
"github.com/owncast/owncast/webserver/middleware"
@ -18,6 +18,7 @@ func (h *Handlers) GetServerConfig(w http.ResponseWriter, r *http.Request) {
ffmpeg := utils.ValidatedFfmpegPath(data.GetFfMpegPath())
usernameBlocklist := data.GetForbiddenUsernameList()
usernameSuggestions := data.GetSuggestedUsernamesList()
c := config.GetConfig()
videoQualityVariants := make([]models.StreamOutputVariant, 0)
for _, variant := range data.GetStreamOutputVariants() {
@ -52,9 +53,9 @@ func (h *Handlers) GetServerConfig(w http.ResponseWriter, r *http.Request) {
FFmpegPath: ffmpeg,
AdminPassword: data.GetAdminPassword(),
StreamKeys: data.GetStreamKeys(),
StreamKeyOverridden: config.TemporaryStreamKey != "",
WebServerPort: config.WebServerPort,
WebServerIP: config.WebServerIP,
StreamKeyOverridden: c.TemporaryStreamKey != "",
WebServerPort: c.WebServerPort,
WebServerIP: c.WebServerIP,
RTMPServerPort: data.GetRTMPPortNumber(),
ChatDisabled: data.GetChatDisabled(),
ChatJoinMessagesEnabled: data.GetChatJoinPartMessagesEnabled(),

View File

@ -9,7 +9,7 @@ import (
"strconv"
"strings"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/webserver/responses"
log "github.com/sirupsen/logrus"
)
@ -44,9 +44,11 @@ func (h *Handlers) AutoUpdateOptions(w http.ResponseWriter, r *http.Request) {
CanRestart: false,
}
c := config.GetConfig()
// Nothing is supported when running under "dev" or the feature is
// explicitly disabled.
if config.BuildPlatform == "dev" || !config.EnableAutoUpdate {
if c.BuildPlatform == "dev" || !c.EnableAutoUpdate {
responses.WriteResponse(w, updateOptions)
return
}

View File

@ -5,9 +5,10 @@ import (
"errors"
"net/http"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat"
"github.com/owncast/owncast/core/user"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/storage"
"github.com/owncast/owncast/utils"
"github.com/owncast/owncast/webserver/middleware"
"github.com/owncast/owncast/webserver/responses"

View File

@ -7,9 +7,9 @@ import (
"net/url"
"github.com/owncast/owncast/activitypub"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
"github.com/owncast/owncast/webserver/middleware"
"github.com/owncast/owncast/webserver/responses"
@ -118,13 +118,15 @@ func getConfigResponse() webConfigResponse {
IndieAuthEnabled: data.GetServerURL() != "",
}
c := config.GetConfig()
return webConfigResponse{
Name: data.GetServerName(),
Summary: serverSummary,
OfflineMessage: offlineMessage,
Logo: "/logo",
Tags: data.GetServerMetadataTags(),
Version: config.GetReleaseString(),
Version: c.GetReleaseString(),
NSFW: data.GetNSFW(),
SocketHostOverride: data.GetWebsocketOverrideHost(),
ExtraPageContent: pageContent,

View File

@ -6,9 +6,9 @@ import (
"os"
"strings"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/router/middleware"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/webserver/responses"
)
@ -27,7 +27,9 @@ func (h *Handlers) GetCustomEmojiImage(w http.ResponseWriter, r *http.Request) {
path := strings.TrimPrefix(r.URL.Path, "/img/emoji/")
r.URL.Path = path
emojiFS := os.DirFS(config.CustomEmojiPath)
c := config.GetConfig()
emojiFS := os.DirFS(c.CustomEmojiPath)
middleware.SetCachingHeaders(w, r)
http.FileServer(http.FS(emojiFS)).ServeHTTP(w, r)
}

View File

@ -7,10 +7,10 @@ import (
"strconv"
"strings"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
"github.com/owncast/owncast/webserver/middleware"
)
@ -23,9 +23,11 @@ func (h *Handlers) HandleHLSRequest(w http.ResponseWriter, r *http.Request) {
return
}
c := config.GetConfig()
requestedPath := r.URL.Path
relativePath := strings.Replace(requestedPath, "/hls/", "", 1)
fullPath := filepath.Join(config.HLSStoragePath, relativePath)
fullPath := filepath.Join(c.HLSStoragePath, relativePath)
// If using external storage then only allow requests for the
// master playlist at stream.m3u8, no variants or segments.

View File

@ -4,7 +4,7 @@ import (
"net/http"
"path/filepath"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/utils"
"github.com/owncast/owncast/webserver/responses"
)
@ -16,8 +16,9 @@ const (
// GetThumbnail will return the thumbnail image as a response.
func (h *Handlers) GetThumbnail(w http.ResponseWriter, r *http.Request) {
c := config.GetConfig()
imageFilename := "thumbnail.jpg"
imagePath := filepath.Join(config.TempDir, imageFilename)
imagePath := filepath.Join(c.TempDir, imageFilename)
var imageBytes []byte
var err error
@ -40,8 +41,9 @@ func (h *Handlers) GetThumbnail(w http.ResponseWriter, r *http.Request) {
// GetPreview will return the preview gif as a response.
func (h *Handlers) GetPreview(w http.ResponseWriter, r *http.Request) {
c := config.GetConfig()
imageFilename := "preview.gif"
imagePath := filepath.Join(config.TempDir, imageFilename)
imagePath := filepath.Join(c.TempDir, imageFilename)
var imageBytes []byte
var err error

View File

@ -5,8 +5,8 @@ import (
"os"
"path/filepath"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/static"
"github.com/owncast/owncast/utils"
"github.com/owncast/owncast/webserver/responses"

View File

@ -4,10 +4,10 @@ import (
"net/http"
"github.com/owncast/owncast/activitypub"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/core/user"
"github.com/owncast/owncast/services/config"
"github.com/owncast/owncast/storage"
"github.com/owncast/owncast/utils"
fediverseauth "github.com/owncast/owncast/webserver/handlers/auth/fediverse"
"github.com/owncast/owncast/webserver/handlers/auth/indieauth"
@ -49,6 +49,8 @@ func (s *webServer) setupRoutes() {
}
func (s *webServer) setupWebAssetRoutes() {
c := config.GetConfig()
// The admin web app.
s.router.HandleFunc("/admin/", middleware.RequireAdminAuth(s.handlers.IndexHandler))
@ -72,7 +74,7 @@ func (s *webServer) setupWebAssetRoutes() {
s.router.HandleFunc("/robots.txt", s.handlers.GetRobotsDotTxt)
// Optional public static files
s.router.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir(config.PublicFilesPath))))
s.router.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir(c.PublicFilesPath))))
}
func (s *webServer) setupInternalAPIRoutes() {