Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/cmd/storage.go
1541 views
1
/*
2
Copyright © 2023 NAME HERE <EMAIL ADDRESS>
3
*/
4
package cmd
5
6
import (
7
"os"
8
"strconv"
9
10
"github.com/alist-org/alist/v3/internal/db"
11
"github.com/alist-org/alist/v3/pkg/utils"
12
"github.com/charmbracelet/bubbles/table"
13
tea "github.com/charmbracelet/bubbletea"
14
"github.com/charmbracelet/lipgloss"
15
"github.com/spf13/cobra"
16
)
17
18
// storageCmd represents the storage command
19
var storageCmd = &cobra.Command{
20
Use: "storage",
21
Short: "Manage storage",
22
}
23
24
var disableStorageCmd = &cobra.Command{
25
Use: "disable",
26
Short: "Disable a storage",
27
Run: func(cmd *cobra.Command, args []string) {
28
if len(args) < 1 {
29
utils.Log.Errorf("mount path is required")
30
return
31
}
32
mountPath := args[0]
33
Init()
34
defer Release()
35
storage, err := db.GetStorageByMountPath(mountPath)
36
if err != nil {
37
utils.Log.Errorf("failed to query storage: %+v", err)
38
} else {
39
storage.Disabled = true
40
err = db.UpdateStorage(storage)
41
if err != nil {
42
utils.Log.Errorf("failed to update storage: %+v", err)
43
} else {
44
utils.Log.Infof("Storage with mount path [%s] have been disabled", mountPath)
45
}
46
}
47
},
48
}
49
50
var baseStyle = lipgloss.NewStyle().
51
BorderStyle(lipgloss.NormalBorder()).
52
BorderForeground(lipgloss.Color("240"))
53
54
type model struct {
55
table table.Model
56
}
57
58
func (m model) Init() tea.Cmd { return nil }
59
60
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
61
var cmd tea.Cmd
62
switch msg := msg.(type) {
63
case tea.KeyMsg:
64
switch msg.String() {
65
case "esc":
66
if m.table.Focused() {
67
m.table.Blur()
68
} else {
69
m.table.Focus()
70
}
71
case "q", "ctrl+c":
72
return m, tea.Quit
73
//case "enter":
74
// return m, tea.Batch(
75
// tea.Printf("Let's go to %s!", m.table.SelectedRow()[1]),
76
// )
77
}
78
}
79
m.table, cmd = m.table.Update(msg)
80
return m, cmd
81
}
82
83
func (m model) View() string {
84
return baseStyle.Render(m.table.View()) + "\n"
85
}
86
87
var storageTableHeight int
88
var listStorageCmd = &cobra.Command{
89
Use: "list",
90
Short: "List all storages",
91
Run: func(cmd *cobra.Command, args []string) {
92
Init()
93
defer Release()
94
storages, _, err := db.GetStorages(1, -1)
95
if err != nil {
96
utils.Log.Errorf("failed to query storages: %+v", err)
97
} else {
98
utils.Log.Infof("Found %d storages", len(storages))
99
columns := []table.Column{
100
{Title: "ID", Width: 4},
101
{Title: "Driver", Width: 16},
102
{Title: "Mount Path", Width: 30},
103
{Title: "Enabled", Width: 7},
104
}
105
106
var rows []table.Row
107
for i := range storages {
108
storage := storages[i]
109
enabled := "true"
110
if storage.Disabled {
111
enabled = "false"
112
}
113
rows = append(rows, table.Row{
114
strconv.Itoa(int(storage.ID)),
115
storage.Driver,
116
storage.MountPath,
117
enabled,
118
})
119
}
120
t := table.New(
121
table.WithColumns(columns),
122
table.WithRows(rows),
123
table.WithFocused(true),
124
table.WithHeight(storageTableHeight),
125
)
126
127
s := table.DefaultStyles()
128
s.Header = s.Header.
129
BorderStyle(lipgloss.NormalBorder()).
130
BorderForeground(lipgloss.Color("240")).
131
BorderBottom(true).
132
Bold(false)
133
s.Selected = s.Selected.
134
Foreground(lipgloss.Color("229")).
135
Background(lipgloss.Color("57")).
136
Bold(false)
137
t.SetStyles(s)
138
139
m := model{t}
140
if _, err := tea.NewProgram(m).Run(); err != nil {
141
utils.Log.Errorf("failed to run program: %+v", err)
142
os.Exit(1)
143
}
144
}
145
},
146
}
147
148
func init() {
149
150
RootCmd.AddCommand(storageCmd)
151
storageCmd.AddCommand(disableStorageCmd)
152
storageCmd.AddCommand(listStorageCmd)
153
storageCmd.PersistentFlags().IntVarP(&storageTableHeight, "height", "H", 10, "Table height")
154
// Here you will define your flags and configuration settings.
155
156
// Cobra supports Persistent Flags which will work for this command
157
// and all subcommands, e.g.:
158
// storageCmd.PersistentFlags().String("foo", "", "A help for foo")
159
160
// Cobra supports local flags which will only run when this command
161
// is called directly, e.g.:
162
// storageCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
163
}
164
165