1
0
Fork 0
telegraf/plugins/secretstores/os/os.go

102 lines
2 KiB
Go
Raw Normal View History

//go:build darwin || linux || windows
//go:generate ../../../tools/readme_config_includer/generator
package os
import (
_ "embed"
"errors"
"fmt"
"github.com/99designs/keyring"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/plugins/secretstores"
)
//go:embed sample.conf
var sampleConfig string
type OS struct {
ID string `toml:"id"`
Keyring string `toml:"keyring"`
Collection string `toml:"collection"`
Dynamic bool `toml:"dynamic"`
Password config.Secret `toml:"password"`
ring keyring.Keyring
}
func (*OS) SampleConfig() string {
return sampleConfig
}
// Init initializes all internals of the secret-store
func (o *OS) Init() error {
defer o.Password.Destroy()
if o.ID == "" {
return errors.New("id missing")
}
// Set defaults
if o.Keyring == "" {
o.Keyring = "telegraf"
}
// Setup the actual keyring
cfg, err := o.createKeyringConfig()
if err != nil {
return fmt.Errorf("getting keyring config failed: %w", err)
}
kr, err := keyring.Open(cfg)
if err != nil {
return fmt.Errorf("opening keyring failed: %w", err)
}
o.ring = kr
return nil
}
// Get searches for the given key and return the secret
func (o *OS) Get(key string) ([]byte, error) {
item, err := o.ring.Get(key)
if err != nil {
return nil, err
}
return item.Data, nil
}
// Set sets the given secret for the given key
func (o *OS) Set(key, value string) error {
item := keyring.Item{
Key: key,
Data: []byte(value),
}
return o.ring.Set(item)
}
// List lists all known secret keys
func (o *OS) List() ([]string, error) {
return o.ring.Keys()
}
// GetResolver returns a function to resolve the given key.
func (o *OS) GetResolver(key string) (telegraf.ResolveFunc, error) {
resolver := func() ([]byte, bool, error) {
s, err := o.Get(key)
return s, o.Dynamic, err
}
return resolver, nil
}
// Register the secret-store on load.
func init() {
secretstores.Add("os", func(id string) telegraf.SecretStore {
return &OS{ID: id}
})
}