Files
filebrowser/cmd/config_import.go
T

123 lines
2.8 KiB
Go
Raw Normal View History

2019-01-08 08:57:24 +00:00
package cmd
import (
"encoding/json"
"errors"
2019-01-08 14:07:55 +00:00
"path/filepath"
2019-01-08 08:57:24 +00:00
"reflect"
2020-06-01 01:12:36 +02:00
"github.com/spf13/cobra"
2019-01-08 08:57:24 +00:00
"github.com/filebrowser/filebrowser/v2/auth"
"github.com/filebrowser/filebrowser/v2/settings"
)
func init() {
configCmd.AddCommand(configImportCmd)
}
type settingsFile struct {
Settings *settings.Settings `json:"settings"`
2019-01-08 14:07:55 +00:00
Server *settings.Server `json:"server"`
2019-01-08 08:57:24 +00:00
Auther interface{} `json:"auther"`
}
var configImportCmd = &cobra.Command{
2019-01-08 16:37:02 +00:00
Use: "import <path>",
2019-01-08 16:09:25 +00:00
Short: "Import a configuration file",
Long: `Import a configuration file. This will replace all the existing
2019-01-08 08:57:24 +00:00
configuration. Can be used with or without unexisting databases.
2019-01-08 16:37:02 +00:00
2019-01-08 08:57:24 +00:00
If used with a nonexisting database, a key will be generated
automatically. Otherwise the key will be kept the same as in the
2019-01-08 16:37:02 +00:00
database.
The path must be for a json or yaml file.`,
2019-01-08 08:57:24 +00:00
Args: jsonYamlArg,
RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error {
2019-01-08 08:57:24 +00:00
var key []byte
var err error
2019-01-08 08:57:24 +00:00
if d.hadDB {
settings, settingErr := d.store.Settings.Get()
if settingErr != nil {
return settingErr
}
2019-01-08 08:57:24 +00:00
key = settings.Key
} else {
2019-01-11 20:25:39 +00:00
key = generateKey()
2019-01-08 08:57:24 +00:00
}
file := settingsFile{}
err = unmarshal(args[0], &file)
if err != nil {
return err
}
2019-01-08 08:57:24 +00:00
file.Settings.Key = key
err = d.store.Settings.Save(file.Settings)
if err != nil {
return err
}
2019-01-08 08:57:24 +00:00
2019-01-08 14:07:55 +00:00
err = d.store.Settings.SaveServer(file.Server)
if err != nil {
return err
}
2019-01-08 14:07:55 +00:00
var rawAuther interface{}
2025-06-26 21:18:20 +03:00
if filepath.Ext(args[0]) != ".json" {
2019-01-08 14:07:55 +00:00
rawAuther = cleanUpInterfaceMap(file.Auther.(map[interface{}]interface{}))
} else {
rawAuther = file.Auther
}
2019-01-08 08:57:24 +00:00
var auther auth.Auther
var autherErr error
2019-01-08 08:57:24 +00:00
switch file.Settings.AuthMethod {
case auth.MethodJSONAuth:
var a interface{}
a, autherErr = getAuther(auth.JSONAuth{}, rawAuther)
auther = a.(*auth.JSONAuth)
2019-01-08 08:57:24 +00:00
case auth.MethodNoAuth:
var a interface{}
a, autherErr = getAuther(auth.NoAuth{}, rawAuther)
auther = a.(*auth.NoAuth)
2019-01-08 08:57:24 +00:00
case auth.MethodProxyAuth:
var a interface{}
a, autherErr = getAuther(auth.ProxyAuth{}, rawAuther)
auther = a.(*auth.ProxyAuth)
2021-09-13 13:47:06 +00:00
case auth.MethodHookAuth:
var a interface{}
a, autherErr = getAuther(&auth.HookAuth{}, rawAuther)
auther = a.(*auth.HookAuth)
2019-01-08 08:57:24 +00:00
default:
return errors.New("invalid auth method")
}
if autherErr != nil {
return autherErr
2019-01-08 08:57:24 +00:00
}
err = d.store.Auth.Save(auther)
if err != nil {
return err
}
2019-01-08 14:07:55 +00:00
return printSettings(file.Server, file.Settings, auther)
2019-01-08 08:57:24 +00:00
}, pythonConfig{allowNoDB: true}),
}
func getAuther(sample auth.Auther, data interface{}) (interface{}, error) {
2019-01-08 08:57:24 +00:00
authType := reflect.TypeOf(sample)
auther := reflect.New(authType).Interface()
bytes, err := json.Marshal(data)
if err != nil {
return nil, err
}
2019-01-08 08:57:24 +00:00
err = json.Unmarshal(bytes, &auther)
if err != nil {
return nil, err
}
return auther, nil
2019-01-08 08:57:24 +00:00
}