// Begin handling load, unload, and inventory func (p *pluginControl) Start() error { // Start pluginManager when pluginControl starts p.Started = true controlLogger.WithFields(log.Fields{ "_block": "start", }).Info("control started") //Autodiscover if p.Config.AutoDiscoverPath != "" { controlLogger.WithFields(log.Fields{ "_block": "start", }).Info("auto discover path is enabled") paths := filepath.SplitList(p.Config.AutoDiscoverPath) p.SetAutodiscoverPaths(paths) for _, pa := range paths { fullPath, err := filepath.Abs(pa) if err != nil { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, }).Fatal(err) } controlLogger.WithFields(log.Fields{ "_block": "start", }).Info("autoloading plugins from: ", fullPath) files, err := ioutil.ReadDir(fullPath) if err != nil { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, }).Fatal(err) } for _, file := range files { if file.IsDir() { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, }).Warning("Ignoring subdirectory: ", file.Name()) continue } // Ignore tasks files (JSON and YAML) fname := strings.ToLower(file.Name()) if strings.HasSuffix(fname, ".json") || strings.HasSuffix(fname, ".yaml") || strings.HasSuffix(fname, ".yml") { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, }).Warning("Ignoring JSON/Yaml file: ", file.Name()) continue } // if the file is a plugin package (which would have a suffix of '.aci') or if the file // is not a plugin signing file (which would have a suffix of '.asc'), then attempt to // automatically load the file as a plugin if strings.HasSuffix(file.Name(), ".aci") || !(strings.HasSuffix(file.Name(), ".asc")) { // check to makd sure the file is executable by someone (even if it isn't you); if no one // can execute this file then skip it (and include a warning in the log output) if (file.Mode() & 0111) == 0 { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, "plugin": file, }).Warn("Auto-loading of plugin '", file.Name(), "' skipped (plugin not executable)") continue } rp, err := core.NewRequestedPlugin(path.Join(fullPath, file.Name())) if err != nil { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, "plugin": file, }).Error(err) } signatureFile := file.Name() + ".asc" if _, err := os.Stat(path.Join(fullPath, signatureFile)); err == nil { err = rp.ReadSignatureFile(path.Join(fullPath, signatureFile)) if err != nil { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, "plugin": file.Name() + ".asc", }).Error(err) } } pl, err := p.Load(rp) if err != nil { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": fullPath, "plugin": file, }).Error(err) } else { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": fullPath, "plugin-file-name": file.Name(), "plugin-name": pl.Name(), "plugin-version": pl.Version(), "plugin-type": pl.TypeName(), }).Info("Loading plugin") } } } } } else { controlLogger.WithFields(log.Fields{ "_block": "start", }).Info("auto discover path is disabled") } lis, err := net.Listen("tcp", fmt.Sprintf("%v:%v", p.Config.ListenAddr, p.Config.ListenPort)) if err != nil { controlLogger.WithField("error", err.Error()).Error("Failed to start control grpc listener") return err } opts := []grpc.ServerOption{} p.closingChan = make(chan bool, 1) p.grpcServer = grpc.NewServer(opts...) rpc.RegisterMetricManagerServer(p.grpcServer, &ControlGRPCServer{p}) p.wg.Add(1) go func() { defer p.wg.Done() err := p.grpcServer.Serve(lis) if err != nil { select { case <-p.closingChan: // If we called Stop() then there will be a value in p.closingChan, so // we'll get here and we can exit without showing the error. default: controlLogger.Fatal(err) } } }() return nil }
// Begin handling load, unload, and inventory func (p *pluginControl) Start() error { // Start pluginManager when pluginControl starts p.Started = true controlLogger.WithFields(log.Fields{ "_block": "start", }).Info("control started") //Autodiscover if p.Config.AutoDiscoverPath != "" { controlLogger.WithFields(log.Fields{ "_block": "start", }).Info("auto discover path is enabled") paths := filepath.SplitList(p.Config.AutoDiscoverPath) p.SetAutodiscoverPaths(paths) for _, pa := range paths { fullPath, err := filepath.Abs(pa) if err != nil { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, }).Fatal(err) } controlLogger.WithFields(log.Fields{ "_block": "start", }).Info("autoloading plugins from: ", fullPath) files, err := ioutil.ReadDir(fullPath) if err != nil { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, }).Fatal(err) } for _, file := range files { if file.IsDir() { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, }).Warning("Ignoring subdirectory: ", file.Name()) continue } // Ignore tasks files (JSON and YAML) fname := strings.ToLower(file.Name()) if strings.HasSuffix(fname, ".json") || strings.HasSuffix(fname, ".yaml") || strings.HasSuffix(fname, ".yml") { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, }).Warning("Ignoring JSON/Yaml file: ", file.Name()) continue } if strings.HasSuffix(file.Name(), ".aci") || !(strings.HasSuffix(file.Name(), ".asc")) { rp, err := core.NewRequestedPlugin(path.Join(fullPath, file.Name())) if err != nil { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, "plugin": file, }).Error(err) } signatureFile := file.Name() + ".asc" if _, err := os.Stat(path.Join(fullPath, signatureFile)); err == nil { err = rp.ReadSignatureFile(path.Join(fullPath, signatureFile)) if err != nil { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": pa, "plugin": file.Name() + ".asc", }).Error(err) } } pl, err := p.Load(rp) if err != nil { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": fullPath, "plugin": file, }).Error(err) } else { controlLogger.WithFields(log.Fields{ "_block": "start", "autodiscoverpath": fullPath, "plugin-file-name": file.Name(), "plugin-name": pl.Name(), "plugin-version": pl.Version(), "plugin-type": pl.TypeName(), }).Info("Loading plugin") } } } } } else { controlLogger.WithFields(log.Fields{ "_block": "start", }).Info("auto discover path is disabled") } lis, err := net.Listen("tcp", fmt.Sprintf("%v:%v", p.Config.ListenAddr, p.Config.ListenPort)) if err != nil { controlLogger.WithField("error", err.Error()).Error("Failed to start control grpc listener") return err } opts := []grpc.ServerOption{} grpcServer := grpc.NewServer(opts...) rpc.RegisterMetricManagerServer(grpcServer, &ControlGRPCServer{p}) go func() { err := grpcServer.Serve(lis) if err != nil { controlLogger.Fatal(err) } }() return nil }