123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- package op
- import (
- "reflect"
- "strings"
- "github.com/IceWhaleTech/CasaOS/internal/conf"
- "github.com/IceWhaleTech/CasaOS/internal/driver"
- "github.com/pkg/errors"
- )
- type New func() driver.Driver
- var driverNewMap = map[string]New{}
- var driverInfoMap = map[string][]driver.Item{} //driver.Info{}
- func RegisterDriver(driver New) {
- // log.Infof("register driver: [%s]", config.Name)
- tempDriver := driver()
- tempConfig := tempDriver.Config()
- registerDriverItems(tempConfig, tempDriver.GetAddition())
- driverNewMap[tempConfig.Name] = driver
- }
- func GetDriverNew(name string) (New, error) {
- n, ok := driverNewMap[name]
- if !ok {
- return nil, errors.Errorf("no driver named: %s", name)
- }
- return n, nil
- }
- func GetDriverNames() []string {
- var driverNames []string
- for k := range driverInfoMap {
- driverNames = append(driverNames, k)
- }
- return driverNames
- }
- // func GetDriverInfoMap() map[string]driver.Info {
- // return driverInfoMap
- // }
- func GetDriverInfoMap() map[string][]driver.Item {
- return driverInfoMap
- }
- func registerDriverItems(config driver.Config, addition driver.Additional) {
- // log.Debugf("addition of %s: %+v", config.Name, addition)
- tAddition := reflect.TypeOf(addition)
- for tAddition.Kind() == reflect.Pointer {
- tAddition = tAddition.Elem()
- }
- //mainItems := getMainItems(config)
- additionalItems := getAdditionalItems(tAddition, config.DefaultRoot)
- driverInfoMap[config.Name] = additionalItems
- // driver.Info{
- // Common: mainItems,
- // Additional: additionalItems,
- // Config: config,
- // }
- }
- func getMainItems(config driver.Config) []driver.Item {
- items := []driver.Item{{
- Name: "mount_path",
- Type: conf.TypeString,
- Required: true,
- Help: "",
- }, {
- Name: "order",
- Type: conf.TypeNumber,
- Help: "use to sort",
- }, {
- Name: "remark",
- Type: conf.TypeText,
- }}
- if !config.NoCache {
- items = append(items, driver.Item{
- Name: "cache_expiration",
- Type: conf.TypeNumber,
- Default: "30",
- Required: true,
- Help: "The cache expiration time for this storage",
- })
- }
- if !config.OnlyProxy && !config.OnlyLocal {
- items = append(items, []driver.Item{{
- Name: "web_proxy",
- Type: conf.TypeBool,
- }, {
- Name: "webdav_policy",
- Type: conf.TypeSelect,
- Options: "302_redirect,use_proxy_url,native_proxy",
- Default: "302_redirect",
- Required: true,
- },
- }...)
- } else {
- items = append(items, driver.Item{
- Name: "webdav_policy",
- Type: conf.TypeSelect,
- Default: "native_proxy",
- Options: "use_proxy_url,native_proxy",
- Required: true,
- })
- }
- items = append(items, driver.Item{
- Name: "down_proxy_url",
- Type: conf.TypeText,
- })
- if config.LocalSort {
- items = append(items, []driver.Item{{
- Name: "order_by",
- Type: conf.TypeSelect,
- Options: "name,size,modified",
- }, {
- Name: "order_direction",
- Type: conf.TypeSelect,
- Options: "asc,desc",
- }}...)
- }
- items = append(items, driver.Item{
- Name: "extract_folder",
- Type: conf.TypeSelect,
- Options: "front,back",
- })
- return items
- }
- func getAdditionalItems(t reflect.Type, defaultRoot string) []driver.Item {
- var items []driver.Item
- for i := 0; i < t.NumField(); i++ {
- field := t.Field(i)
- if field.Type.Kind() == reflect.Struct {
- items = append(items, getAdditionalItems(field.Type, defaultRoot)...)
- continue
- }
- tag := field.Tag
- ignore, ok1 := tag.Lookup("ignore")
- name, ok2 := tag.Lookup("json")
- if (ok1 && ignore == "true") || !ok2 {
- continue
- }
- if tag.Get("omit") == "true" {
- continue
- }
- item := driver.Item{
- Name: name,
- Type: strings.ToLower(field.Type.Name()),
- Default: tag.Get("default"),
- Options: tag.Get("options"),
- Required: tag.Get("required") == "true",
- Help: tag.Get("help"),
- }
- if tag.Get("type") != "" {
- item.Type = tag.Get("type")
- }
- if item.Name == "root_folder_id" || item.Name == "root_folder_path" {
- if item.Default == "" {
- item.Default = defaultRoot
- }
- item.Required = item.Default != ""
- }
- // set default type to string
- if item.Type == "" {
- item.Type = "string"
- }
- items = append(items, item)
- }
- return items
- }
|