filebrowser/backend/cmd/root.go

173 lines
5.2 KiB
Go
Raw Normal View History

package cmd
import (
2023-09-03 22:03:00 +00:00
"flag"
2024-07-30 17:45:27 +00:00
"fmt"
"log"
"os"
2024-10-07 22:44:53 +00:00
"strings"
2024-08-04 17:50:35 +00:00
2024-12-17 00:01:55 +00:00
"github.com/gtsteffaniak/filebrowser/backend/diskcache"
"github.com/gtsteffaniak/filebrowser/backend/files"
fbhttp "github.com/gtsteffaniak/filebrowser/backend/http"
"github.com/gtsteffaniak/filebrowser/backend/img"
"github.com/gtsteffaniak/filebrowser/backend/settings"
"github.com/gtsteffaniak/filebrowser/backend/storage"
"github.com/gtsteffaniak/filebrowser/backend/swagger/docs"
2024-11-21 00:15:30 +00:00
"github.com/swaggo/swag"
2024-12-17 00:01:55 +00:00
"github.com/gtsteffaniak/filebrowser/backend/users"
"github.com/gtsteffaniak/filebrowser/backend/version"
)
2024-10-07 22:44:53 +00:00
func getStore(config string) (*storage.Storage, bool) {
// Use the config file (global flag)
settings.Initialize(config)
store, hasDB, err := storage.InitializeDb(settings.Config.Server.Database)
if err != nil {
log.Fatal("could not load db info: ", err)
}
return store, hasDB
}
2024-10-07 22:44:53 +00:00
func generalUsage() {
2025-01-05 19:05:33 +00:00
fmt.Printf(`usage: ./filebrowser <command> [options]
2024-10-07 22:44:53 +00:00
commands:
2025-01-05 19:05:33 +00:00
-v Print the version
-c Print the default config file
set -u Username and password for the new user
set -a Create user as admin
set -s Specify a user scope
set -h Print this help message
2024-10-07 22:44:53 +00:00
` + "\n")
}
2024-08-24 22:02:33 +00:00
2024-10-07 22:44:53 +00:00
func StartFilebrowser() {
// Global flags
var configPath string
var help bool
// Override the default usage output to use generalUsage()
flag.Usage = generalUsage
2024-12-17 00:01:55 +00:00
flag.StringVar(&configPath, "c", "config.yaml", "Path to the config file, default: config.yaml")
2024-10-07 22:44:53 +00:00
flag.BoolVar(&help, "h", false, "Get help about commands")
// Parse global flags (before subcommands)
flag.Parse() // print generalUsage on error
// Show help if requested
if help {
generalUsage()
return
}
2024-08-24 22:02:33 +00:00
2024-10-07 22:44:53 +00:00
// Create a new FlagSet for the 'set' subcommand
setCmd := flag.NewFlagSet("set", flag.ExitOnError)
var user, scope, dbConfig string
var asAdmin bool
setCmd.StringVar(&user, "u", "", "Comma-separated username and password: \"set -u <username>,<password>\"")
setCmd.BoolVar(&asAdmin, "a", false, "Create user as admin user, used in combination with -u")
setCmd.StringVar(&scope, "s", "", "Specify a user scope, otherwise default user config scope is used")
2024-12-17 00:01:55 +00:00
setCmd.StringVar(&dbConfig, "c", "config.yaml", "Path to the config file, default: config.yaml")
2024-10-07 22:44:53 +00:00
// Parse subcommand flags only if a subcommand is specified
if len(os.Args) > 1 {
switch os.Args[1] {
case "set":
err := setCmd.Parse(os.Args)
2024-08-24 22:02:33 +00:00
if err != nil {
2024-10-07 22:44:53 +00:00
setCmd.PrintDefaults()
os.Exit(1)
2020-07-27 17:01:02 +00:00
}
2024-10-07 22:44:53 +00:00
userInfo := strings.Split(user, ",")
if len(userInfo) < 2 {
fmt.Println("not enough info to create user: \"set -u username,password\"")
setCmd.PrintDefaults()
os.Exit(1)
2024-08-04 17:50:35 +00:00
}
2024-10-07 22:44:53 +00:00
username := userInfo[0]
password := userInfo[1]
getStore(dbConfig)
// Create the user logic
if asAdmin {
log.Printf("Creating user as admin: %s\n", username)
} else {
log.Printf("Creating user: %s\n", username)
2024-08-04 17:50:35 +00:00
}
2024-10-07 22:44:53 +00:00
newUser := users.User{
Username: username,
Password: password,
2024-08-04 17:50:35 +00:00
}
2024-10-07 22:44:53 +00:00
if scope != "" {
newUser.Scope = scope
}
err = storage.CreateUser(newUser, asAdmin)
if err != nil {
log.Fatal("Could not create user: ", err)
}
return
case "version":
fmt.Println("FileBrowser Quantum - A modern web-based file manager")
fmt.Printf("Version : %v\n", version.Version)
fmt.Printf("Commit : %v\n", version.CommitSHA)
fmt.Printf("Release Info : https://github.com/gtsteffaniak/filebrowser/releases/tag/%v\n", version.Version)
return
}
2024-10-07 22:44:53 +00:00
}
store, dbExists := getStore(configPath)
database := fmt.Sprintf("Using existing database : %v", settings.Config.Server.Database)
if !dbExists {
database = fmt.Sprintf("Creating new database : %v", settings.Config.Server.Database)
}
log.Printf("Initializing FileBrowser Quantum (%v)\n", version.Version)
2024-11-21 00:15:30 +00:00
log.Printf("Using Config file : %v", configPath)
log.Println("Embeded frontend :", os.Getenv("FILEBROWSER_NO_EMBEDED") != "true")
2024-10-07 22:44:53 +00:00
log.Println(database)
2025-01-05 19:05:33 +00:00
sources := []string{}
for _, v := range settings.Config.Server.Sources {
sources = append(sources, v.Name+": "+v.Path)
}
log.Println("Sources :", sources)
2024-10-07 22:44:53 +00:00
serverConfig := settings.Config.Server
2024-11-21 00:15:30 +00:00
swagInfo := docs.SwaggerInfo
swagInfo.BasePath = serverConfig.BaseURL
swag.Register(docs.SwaggerInfo.InstanceName(), swagInfo)
2024-10-07 22:44:53 +00:00
// initialize indexing and schedule indexing ever n minutes (default 5)
2025-01-05 19:05:33 +00:00
sourceConfigs := settings.Config.Server.Sources
if len(sourceConfigs) == 0 {
log.Fatal("No sources configured, exiting...")
}
for _, source := range sourceConfigs {
go files.Initialize(source)
}
2024-10-07 22:44:53 +00:00
if err := rootCMD(store, &serverConfig); err != nil {
2024-07-30 17:45:27 +00:00
log.Fatal("Error starting filebrowser:", err)
2023-09-02 16:05:40 +00:00
}
}
2024-10-07 22:44:53 +00:00
func rootCMD(store *storage.Storage, serverConfig *settings.Server) error {
if serverConfig.NumImageProcessors < 1 {
log.Fatal("Image resize workers count could not be < 1")
}
imgSvc := img.New(serverConfig.NumImageProcessors)
cacheDir := "/tmp"
var fileCache diskcache.Interface
// Use file cache if cacheDir is specified
if cacheDir != "" {
var err error
fileCache, err = diskcache.NewFileCache(cacheDir)
if err != nil {
log.Fatalf("failed to create file cache: %v", err)
}
2023-09-02 00:22:38 +00:00
} else {
2024-10-07 22:44:53 +00:00
// No-op cache if no cacheDir is specified
fileCache = diskcache.NewNoOp()
}
2024-11-21 00:15:30 +00:00
fbhttp.StartHttp(imgSvc, store, fileCache)
2024-10-07 22:44:53 +00:00
return nil
}