150 lines
4.3 KiB
Go
150 lines
4.3 KiB
Go
package db
|
|
|
|
import (
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/future-architect/vuls/pkg/db/boltdb"
|
|
"github.com/future-architect/vuls/pkg/db/rdb"
|
|
"github.com/future-architect/vuls/pkg/db/redis"
|
|
"github.com/future-architect/vuls/pkg/db/types"
|
|
)
|
|
|
|
type options struct {
|
|
}
|
|
|
|
type Option interface {
|
|
apply(*options)
|
|
}
|
|
|
|
type DB struct {
|
|
name string
|
|
driver Driver
|
|
}
|
|
|
|
type Driver interface {
|
|
Close() error
|
|
|
|
PutVulnerability(string, string, types.Vulnerability) error
|
|
PutPackage(string, string, map[string]types.Packages) error
|
|
PutCPEConfiguration(string, string, map[string]types.CPEConfigurations) error
|
|
PutRedHatRepoToCPE(string, string, types.RepositoryToCPE) error
|
|
PutWindowsSupercedence(string, string, types.Supercedence) error
|
|
|
|
GetVulnerability([]string) (map[string]map[string]types.Vulnerability, error)
|
|
GetPackage(string, string, string) (map[string]map[string]map[string]types.Package, error)
|
|
GetCPEConfiguration(string) (map[string]map[string]map[string][]types.CPEConfiguration, error)
|
|
GetSupercedence([]string) (map[string][]string, error)
|
|
GetKBtoProduct(string, []string) ([]string, error)
|
|
}
|
|
|
|
func (db *DB) Name() string {
|
|
return db.name
|
|
}
|
|
|
|
func Open(dbType, dbPath string, debug bool, opts ...Option) (*DB, error) {
|
|
switch dbType {
|
|
case "boltdb":
|
|
d, err := boltdb.Open(dbPath, debug)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "open boltdb")
|
|
}
|
|
return &DB{name: dbType, driver: d}, nil
|
|
case "sqlite3", "mysql", "postgres":
|
|
d, err := rdb.Open(dbType, dbPath, debug)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "open rdb")
|
|
}
|
|
return &DB{name: dbType, driver: d}, nil
|
|
case "redis":
|
|
d, err := redis.Open(dbPath, debug)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "open rdb")
|
|
}
|
|
return &DB{name: dbType, driver: d}, nil
|
|
default:
|
|
return nil, errors.Errorf(`unexpected dbType. accepts: ["boltdb", "sqlite3", "mysql", "postgres", "redis"], received: "%s"`, dbType)
|
|
}
|
|
}
|
|
|
|
func (db *DB) Close() error {
|
|
if err := db.driver.Close(); err != nil {
|
|
return errors.Wrapf(err, "close %s", db.name)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (db *DB) PutVulnerability(src, key string, value types.Vulnerability) error {
|
|
if err := db.driver.PutVulnerability(src, key, value); err != nil {
|
|
return errors.Wrapf(err, "put vulnerability")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (db *DB) PutPackage(src, key string, value map[string]types.Packages) error {
|
|
if err := db.driver.PutPackage(src, key, value); err != nil {
|
|
return errors.Wrapf(err, "put package")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (db *DB) PutCPEConfiguration(src, key string, value map[string]types.CPEConfigurations) error {
|
|
if err := db.driver.PutCPEConfiguration(src, key, value); err != nil {
|
|
return errors.Wrapf(err, "put cpe configuration")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (db *DB) PutRedHatRepoToCPE(src, key string, value types.RepositoryToCPE) error {
|
|
if err := db.driver.PutRedHatRepoToCPE(src, key, value); err != nil {
|
|
return errors.Wrap(err, "put repository to cpe")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (db *DB) PutWindowsSupercedence(src, key string, value types.Supercedence) error {
|
|
if err := db.driver.PutWindowsSupercedence(src, key, value); err != nil {
|
|
return errors.Wrap(err, "put supercedence")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (db *DB) GetVulnerability(ids []string) (map[string]map[string]types.Vulnerability, error) {
|
|
rs, err := db.driver.GetVulnerability(ids)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "get vulnerability")
|
|
}
|
|
return rs, nil
|
|
}
|
|
|
|
func (db *DB) GetPackage(family, release string, name string) (map[string]map[string]map[string]types.Package, error) {
|
|
rs, err := db.driver.GetPackage(family, release, name)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "get package")
|
|
}
|
|
return rs, nil
|
|
}
|
|
|
|
func (db *DB) GetCPEConfiguration(partvendorproduct string) (map[string]map[string]map[string][]types.CPEConfiguration, error) {
|
|
rs, err := db.driver.GetCPEConfiguration(partvendorproduct)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "get cpe configuration")
|
|
}
|
|
return rs, nil
|
|
}
|
|
|
|
func (db *DB) GetSupercedence(kb []string) (map[string][]string, error) {
|
|
rs, err := db.driver.GetSupercedence(kb)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "get supercedence")
|
|
}
|
|
return rs, nil
|
|
}
|
|
|
|
func (db *DB) GetKBtoProduct(release string, kb []string) ([]string, error) {
|
|
rs, err := db.driver.GetKBtoProduct(release, kb)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "get product from kb")
|
|
}
|
|
return rs, nil
|
|
}
|