mirror of https://github.com/Xhofe/alist
				
				
				
			
		
			
				
	
	
		
			164 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
/*
 | 
						|
Copyright © 2023 NAME HERE <EMAIL ADDRESS>
 | 
						|
*/
 | 
						|
package cmd
 | 
						|
 | 
						|
import (
 | 
						|
	"os"
 | 
						|
	"strconv"
 | 
						|
 | 
						|
	"github.com/alist-org/alist/v3/internal/db"
 | 
						|
	"github.com/alist-org/alist/v3/pkg/utils"
 | 
						|
	"github.com/charmbracelet/bubbles/table"
 | 
						|
	tea "github.com/charmbracelet/bubbletea"
 | 
						|
	"github.com/charmbracelet/lipgloss"
 | 
						|
	"github.com/spf13/cobra"
 | 
						|
)
 | 
						|
 | 
						|
// storageCmd represents the storage command
 | 
						|
var storageCmd = &cobra.Command{
 | 
						|
	Use:   "storage",
 | 
						|
	Short: "Manage storage",
 | 
						|
}
 | 
						|
 | 
						|
var disableStorageCmd = &cobra.Command{
 | 
						|
	Use:   "disable",
 | 
						|
	Short: "Disable a storage",
 | 
						|
	Run: func(cmd *cobra.Command, args []string) {
 | 
						|
		if len(args) < 1 {
 | 
						|
			utils.Log.Errorf("mount path is required")
 | 
						|
			return
 | 
						|
		}
 | 
						|
		mountPath := args[0]
 | 
						|
		Init()
 | 
						|
		defer Release()
 | 
						|
		storage, err := db.GetStorageByMountPath(mountPath)
 | 
						|
		if err != nil {
 | 
						|
			utils.Log.Errorf("failed to query storage: %+v", err)
 | 
						|
		} else {
 | 
						|
			storage.Disabled = true
 | 
						|
			err = db.UpdateStorage(storage)
 | 
						|
			if err != nil {
 | 
						|
				utils.Log.Errorf("failed to update storage: %+v", err)
 | 
						|
			} else {
 | 
						|
				utils.Log.Infof("Storage with mount path [%s] have been disabled", mountPath)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	},
 | 
						|
}
 | 
						|
 | 
						|
var baseStyle = lipgloss.NewStyle().
 | 
						|
	BorderStyle(lipgloss.NormalBorder()).
 | 
						|
	BorderForeground(lipgloss.Color("240"))
 | 
						|
 | 
						|
type model struct {
 | 
						|
	table table.Model
 | 
						|
}
 | 
						|
 | 
						|
func (m model) Init() tea.Cmd { return nil }
 | 
						|
 | 
						|
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 | 
						|
	var cmd tea.Cmd
 | 
						|
	switch msg := msg.(type) {
 | 
						|
	case tea.KeyMsg:
 | 
						|
		switch msg.String() {
 | 
						|
		case "esc":
 | 
						|
			if m.table.Focused() {
 | 
						|
				m.table.Blur()
 | 
						|
			} else {
 | 
						|
				m.table.Focus()
 | 
						|
			}
 | 
						|
		case "q", "ctrl+c":
 | 
						|
			return m, tea.Quit
 | 
						|
			//case "enter":
 | 
						|
			//	return m, tea.Batch(
 | 
						|
			//		tea.Printf("Let's go to %s!", m.table.SelectedRow()[1]),
 | 
						|
			//	)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	m.table, cmd = m.table.Update(msg)
 | 
						|
	return m, cmd
 | 
						|
}
 | 
						|
 | 
						|
func (m model) View() string {
 | 
						|
	return baseStyle.Render(m.table.View()) + "\n"
 | 
						|
}
 | 
						|
 | 
						|
var storageTableHeight int
 | 
						|
var listStorageCmd = &cobra.Command{
 | 
						|
	Use:   "list",
 | 
						|
	Short: "List all storages",
 | 
						|
	Run: func(cmd *cobra.Command, args []string) {
 | 
						|
		Init()
 | 
						|
		defer Release()
 | 
						|
		storages, _, err := db.GetStorages(1, -1)
 | 
						|
		if err != nil {
 | 
						|
			utils.Log.Errorf("failed to query storages: %+v", err)
 | 
						|
		} else {
 | 
						|
			utils.Log.Infof("Found %d storages", len(storages))
 | 
						|
			columns := []table.Column{
 | 
						|
				{Title: "ID", Width: 4},
 | 
						|
				{Title: "Driver", Width: 16},
 | 
						|
				{Title: "Mount Path", Width: 30},
 | 
						|
				{Title: "Enabled", Width: 7},
 | 
						|
			}
 | 
						|
 | 
						|
			var rows []table.Row
 | 
						|
			for i := range storages {
 | 
						|
				storage := storages[i]
 | 
						|
				enabled := "true"
 | 
						|
				if storage.Disabled {
 | 
						|
					enabled = "false"
 | 
						|
				}
 | 
						|
				rows = append(rows, table.Row{
 | 
						|
					strconv.Itoa(int(storage.ID)),
 | 
						|
					storage.Driver,
 | 
						|
					storage.MountPath,
 | 
						|
					enabled,
 | 
						|
				})
 | 
						|
			}
 | 
						|
			t := table.New(
 | 
						|
				table.WithColumns(columns),
 | 
						|
				table.WithRows(rows),
 | 
						|
				table.WithFocused(true),
 | 
						|
				table.WithHeight(storageTableHeight),
 | 
						|
			)
 | 
						|
 | 
						|
			s := table.DefaultStyles()
 | 
						|
			s.Header = s.Header.
 | 
						|
				BorderStyle(lipgloss.NormalBorder()).
 | 
						|
				BorderForeground(lipgloss.Color("240")).
 | 
						|
				BorderBottom(true).
 | 
						|
				Bold(false)
 | 
						|
			s.Selected = s.Selected.
 | 
						|
				Foreground(lipgloss.Color("229")).
 | 
						|
				Background(lipgloss.Color("57")).
 | 
						|
				Bold(false)
 | 
						|
			t.SetStyles(s)
 | 
						|
 | 
						|
			m := model{t}
 | 
						|
			if _, err := tea.NewProgram(m).Run(); err != nil {
 | 
						|
				utils.Log.Errorf("failed to run program: %+v", err)
 | 
						|
				os.Exit(1)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	},
 | 
						|
}
 | 
						|
 | 
						|
func init() {
 | 
						|
 | 
						|
	RootCmd.AddCommand(storageCmd)
 | 
						|
	storageCmd.AddCommand(disableStorageCmd)
 | 
						|
	storageCmd.AddCommand(listStorageCmd)
 | 
						|
	storageCmd.PersistentFlags().IntVarP(&storageTableHeight, "height", "H", 10, "Table height")
 | 
						|
	// Here you will define your flags and configuration settings.
 | 
						|
 | 
						|
	// Cobra supports Persistent Flags which will work for this command
 | 
						|
	// and all subcommands, e.g.:
 | 
						|
	// storageCmd.PersistentFlags().String("foo", "", "A help for foo")
 | 
						|
 | 
						|
	// Cobra supports local flags which will only run when this command
 | 
						|
	// is called directly, e.g.:
 | 
						|
	// storageCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
 | 
						|
}
 |