mirror of
https://github.com/harivansh-afk/betterNAS.git
synced 2026-04-15 03:00:44 +00:00
88 lines
2.2 KiB
Go
88 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
port := env("PORT", "8081")
|
|
app, err := newAppFromEnv(time.Now())
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
server := &http.Server{
|
|
Addr: ":" + port,
|
|
Handler: app.handler(),
|
|
ReadHeaderTimeout: 5 * time.Second,
|
|
}
|
|
|
|
log.Printf("betterNAS control plane listening on :%s", port)
|
|
log.Fatal(server.ListenAndServe())
|
|
}
|
|
|
|
func newAppFromEnv(startedAt time.Time) (*app, error) {
|
|
var sessionTTL time.Duration
|
|
rawSessionTTL := strings.TrimSpace(env("BETTERNAS_SESSION_TTL", "720h"))
|
|
if rawSessionTTL != "" {
|
|
parsedSessionTTL, err := time.ParseDuration(rawSessionTTL)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
sessionTTL = parsedSessionTTL
|
|
}
|
|
|
|
nodeOfflineThreshold := defaultNodeOfflineThreshold
|
|
rawNodeOfflineThreshold := strings.TrimSpace(env("BETTERNAS_NODE_OFFLINE_THRESHOLD", "2m"))
|
|
if rawNodeOfflineThreshold != "" {
|
|
parsedNodeOfflineThreshold, err := time.ParseDuration(rawNodeOfflineThreshold)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
nodeOfflineThreshold = parsedNodeOfflineThreshold
|
|
}
|
|
|
|
app, err := newApp(
|
|
appConfig{
|
|
version: env("BETTERNAS_VERSION", "0.1.0-dev"),
|
|
nextcloudBaseURL: env("NEXTCLOUD_BASE_URL", ""),
|
|
statePath: env("BETTERNAS_CONTROL_PLANE_STATE_PATH", ".state/control-plane/state.json"),
|
|
dbPath: env("BETTERNAS_CONTROL_PLANE_DB_PATH", ".state/control-plane/betternas.db"),
|
|
sessionTTL: sessionTTL,
|
|
nodeOfflineThreshold: nodeOfflineThreshold,
|
|
registrationEnabled: env("BETTERNAS_REGISTRATION_ENABLED", "true") == "true",
|
|
corsOrigin: env("BETTERNAS_CORS_ORIGIN", ""),
|
|
},
|
|
startedAt,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err := seedDefaultUserFromEnv(app); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return app, nil
|
|
}
|
|
|
|
func seedDefaultUserFromEnv(app *app) error {
|
|
username := strings.TrimSpace(env("BETTERNAS_USERNAME", ""))
|
|
password := env("BETTERNAS_PASSWORD", "")
|
|
if username == "" || password == "" {
|
|
return nil
|
|
}
|
|
|
|
if _, err := app.store.createUser(username, password); err != nil {
|
|
if errors.Is(err, errUsernameTaken) {
|
|
_, authErr := app.store.authenticateUser(username, password)
|
|
return authErr
|
|
}
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|