dev/import-beats/main.go (102 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License;
// you may not use this file except in compliance with the Elastic License.
package main
import (
"flag"
"log"
"net/url"
"os"
"strings"
"github.com/pkg/errors"
)
type importerOptions struct {
// Beats repository directory
beatsDir string
// Kibana host and port
kibanaHostPort string
// Kibana username
kibanaUsername string
// Kibana password
kibanaPassword string
// Kibana repository directory
kibanaDir string
// Skip storing Kibana objects
skipKibana bool
// Elastic UI Framework directory
euiDir string
// Elastic Common Schema directory
ecsDir string
// Packages selected for the import (comma-delimited list)
packages string
// Target public directory where the generated packages should end up in
outputDir string
}
func (o *importerOptions) validate() error {
_, err := os.Stat(o.beatsDir)
if err != nil {
return errors.Wrapf(err, "stat file failed (path: %s)", o.beatsDir)
}
_, err = url.Parse(o.kibanaHostPort)
if err != nil {
return errors.Wrapf(err, "parsing Kibana's host:port failed (hostPort: %s)", o.kibanaHostPort)
}
_, err = os.Stat(o.kibanaDir)
if err != nil {
return errors.Wrapf(err, "stat file failed (path: %s)", o.kibanaDir)
}
_, err = os.Stat(o.euiDir)
if err != nil {
return errors.Wrapf(err, "stat file failed (path: %s)", o.euiDir)
}
_, err = os.Stat(o.outputDir)
if err != nil {
return errors.Wrapf(err, "stat file failed (path: %s)", o.outputDir)
}
return nil
}
func (o *importerOptions) selectedPackages() []string {
var selected []string
p := strings.TrimSpace(o.packages)
if len(p) > 0 {
selected = strings.Split(p, ",")
}
return selected
}
func main() {
log.Println("Deprecated: https://github.com/elastic/integrations/blob/main/dev/import-beats/README.md")
var options importerOptions
flag.StringVar(&options.beatsDir, "beatsDir", "../beats", "Path to the beats repository")
flag.StringVar(&options.kibanaDir, "kibanaDir", "../kibana", "Path to the kibana repository")
flag.StringVar(&options.kibanaHostPort, "kibanaHostPort", "http://localhost:5601", "Kibana host and port")
flag.StringVar(&options.kibanaUsername, "kibanaUsername", "elastic", "Kibana username")
flag.StringVar(&options.kibanaPassword, "kibanaPassword", "changeme", "Kibana password")
flag.BoolVar(&options.skipKibana, "skipKibana", false, "Skip storing Kibana objects")
flag.StringVar(&options.euiDir, "euiDir", "../eui", "Path to the Elastic UI framework repository")
flag.StringVar(&options.ecsDir, "ecsDir", "../ecs", "Path to the Elastic Common Schema repository")
flag.StringVar(&options.packages, "packages", "", "Packages selected for the import")
flag.StringVar(&options.outputDir, "outputDir", "packages", "Path to the output directory")
flag.Parse()
err := options.validate()
if err != nil {
log.Fatal(err)
}
if err := build(options); err != nil {
log.Fatal(err)
}
}
// build method visits all beats in beatsDir to collect configuration data for modules.
// The package-registry groups integrations per target product not per module type. It's opposite to the beats project,
// where logs and metrics are distributed with different beats (oriented either on logs or metrics - metricbeat,
// filebeat, etc.).
func build(options importerOptions) error {
iconRepository, err := newIconRepository(options.euiDir, options.kibanaDir)
if err != nil {
return errors.Wrap(err, "creating icon repository failed")
}
kibanaMigrator := newKibanaMigrator(options.kibanaHostPort,
options.kibanaUsername,
options.kibanaPassword,
options.skipKibana)
ecsFields, err := loadEcsFields(options.ecsDir)
if err != nil {
return errors.Wrap(err, "loading ECS fields failed")
}
repository := newPackageRepository(iconRepository, kibanaMigrator, ecsFields, options.selectedPackages())
for _, beatName := range logSources {
err := repository.createPackagesFromSource(options.beatsDir, beatName, "logs")
if err != nil {
return errors.Wrap(err, "creating from logs source failed")
}
}
for _, beatName := range metricSources {
err := repository.createPackagesFromSource(options.beatsDir, beatName, "metrics")
if err != nil {
return errors.Wrap(err, "creating from metrics source failed")
}
}
return repository.save(options.outputDir)
}