package cmd import ( "context" "encoding/json" "github.com/pablotron/cvez/datadir" "github.com/pablotron/cvez/dbstore" "github.com/spf13/cobra" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "os" "strings" "time" ) // Build query string. func getSearchQuery(args []string) string { r := make([]string, len(args)) for i, v := range(args) { r[i] = "\"" + strings.ReplaceAll(strings.ToLower(v), "\"", "\"\"") + "\"" } return strings.Join(r, " AND ") } // Get database store. func getDb() dbstore.DbStore { // build database path dbPath, err := datadir.Join("cvez.db") if err != nil { log.Error().Err(err).Msg("Join") os.Exit(-1) } // open database db, err := dbstore.Open(dbPath) if err != nil { log.Error().Err(err).Msg("Open") os.Exit(-1) } return db } var searchCmd = &cobra.Command{ Use: "search", Args: cobra.MinimumNArgs(1), Short: "Search CVEs.", Long: `Common Vulnerability Enumeration (CVE) search.`, Run: func(cmd *cobra.Command, args []string) { ctx := context.Background() // set global logging options zerolog.TimeFieldFormat = time.RFC3339 zerolog.SetGlobalLevel(zerolog.InfoLevel) // search for CVEs rows, err := getDb().CveSearch(ctx, getSearchQuery(args)) if err != nil { log.Error().Err(err).Msg("CveSearch") os.Exit(-1) } // search for CVEs, write result e := json.NewEncoder(os.Stdout) if err := e.Encode(rows); err != nil { log.Error().Err(err).Msg("Encode") } }, } func init() { rootCmd.AddCommand(searchCmd) }