Files
2024-07-17 01:37:59 -06:00

110 lines
2.3 KiB
Go

package cmd
import (
"context"
"fmt"
"os"
"strconv"
"github.com/activecm/rita/v5/config"
"github.com/activecm/rita/v5/database"
"github.com/charmbracelet/lipgloss"
"github.com/charmbracelet/lipgloss/table"
"github.com/spf13/afero"
"github.com/urfave/cli/v2"
)
var ListCommand = &cli.Command{
Name: "list",
Usage: "list available datasets",
UsageText: "list",
Description: "lists available datasets",
Args: false,
Flags: []cli.Flag{
ConfigFlag(false),
},
Action: func(cCtx *cli.Context) error {
// check if too many arguments were provided
if cCtx.NArg() > 0 {
return ErrTooManyArguments
}
// set up file system interface
afs := afero.NewOsFs()
// load config file
cfg, err := config.ReadFileConfig(afs, cCtx.String("config"))
if err != nil {
return err
}
// run the delete command
if err := runListCmd(cfg); err != nil {
return err
}
// check for updates after running the command
if err := CheckForUpdate(cfg); err != nil {
return err
}
return nil
},
}
func runListCmd(cfg *config.Config) error {
// connect to server
server, err := database.ConnectToServer(context.Background(), cfg)
if err != nil {
return err
}
dbs, err := server.ListImportDatabases()
if err != nil {
return err
}
if len(dbs) == 0 {
fmt.Println("No available datasets.")
}
t := FormatListTable(dbs)
fmt.Println(t)
return nil
}
func FormatListTable(dbs []database.ImportDatabase) *table.Table {
var data [][]string
for _, d := range dbs {
data = append(data, []string{d.Name, strconv.FormatBool(d.Rolling), fmt.Sprintf("%s - %s", d.MinTS.Format("2006-01-02 15:04"), d.MaxTS.Format("2006-01-02 15:04"))})
}
re := lipgloss.NewRenderer(os.Stdout)
baseStyle := re.NewStyle().Padding(0, 1)
headerStyle := baseStyle.Foreground(lipgloss.Color("252")).Bold(true)
headers := []string{"Name", "Rolling", "Time Range (UTC)"}
t := table.New().
Border(lipgloss.NormalBorder()).
BorderStyle(re.NewStyle().Foreground(lipgloss.Color("238"))).
Headers(headers...).
Rows(data...).
StyleFunc(func(row, _ int) lipgloss.Style {
if row == 0 {
return headerStyle
}
even := row%2 == 0
if even {
return baseStyle.Foreground(lipgloss.Color("245"))
}
return baseStyle.Foreground(lipgloss.Color("252"))
})
return t
}