78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
//go:generate ../../../tools/readme_config_includer/generator
|
|
//go:build windows
|
|
|
|
package win_wmi
|
|
|
|
import (
|
|
_ "embed"
|
|
"fmt"
|
|
"sync"
|
|
|
|
"github.com/influxdata/telegraf"
|
|
"github.com/influxdata/telegraf/config"
|
|
"github.com/influxdata/telegraf/plugins/inputs"
|
|
)
|
|
|
|
//go:embed sample.conf
|
|
var sampleConfig string
|
|
|
|
// S_FALSE is returned by CoInitializeEx if it was already called on this thread.
|
|
const sFalse = 0x00000001
|
|
|
|
type Wmi struct {
|
|
Host string `toml:"host"`
|
|
Username config.Secret `toml:"username"`
|
|
Password config.Secret `toml:"password"`
|
|
Queries []query `toml:"query"`
|
|
Methods []method `toml:"method"`
|
|
Log telegraf.Logger `toml:"-"`
|
|
}
|
|
|
|
func (*Wmi) SampleConfig() string {
|
|
return sampleConfig
|
|
}
|
|
|
|
func (w *Wmi) Init() error {
|
|
for i := range w.Queries {
|
|
q := &w.Queries[i]
|
|
if err := q.prepare(w.Host, w.Username, w.Password); err != nil {
|
|
return fmt.Errorf("preparing query %q failed: %w", q.ClassName, err)
|
|
}
|
|
}
|
|
|
|
for i := range w.Methods {
|
|
m := &w.Methods[i]
|
|
if err := m.prepare(w.Host, w.Username, w.Password); err != nil {
|
|
return fmt.Errorf("preparing method %q failed: %w", m.Method, err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (w *Wmi) Gather(acc telegraf.Accumulator) error {
|
|
var wg sync.WaitGroup
|
|
for _, q := range w.Queries {
|
|
wg.Add(1)
|
|
go func(q query) {
|
|
defer wg.Done()
|
|
acc.AddError(q.execute(acc))
|
|
}(q)
|
|
}
|
|
|
|
for _, m := range w.Methods {
|
|
wg.Add(1)
|
|
go func(m method) {
|
|
defer wg.Done()
|
|
acc.AddError(m.execute(acc))
|
|
}(m)
|
|
}
|
|
|
|
wg.Wait()
|
|
|
|
return nil
|
|
}
|
|
|
|
func init() {
|
|
inputs.Add("win_wmi", func() telegraf.Input { return &Wmi{} })
|
|
}
|