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")
 | |
| }
 |