{"record":{"id":"b67363a67c0b35a6","repo":"crowdsecurity/crowdsec","slug":"binary-for-plugin-s-not-found","errorCode":null,"errorMessage":"binary for plugin %s not found","messagePattern":"binary for plugin (.+?) not found","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/csplugin/broker.go","lineNumber":271,"sourceCode":"\tfor _, profileCfg := range pb.profileConfigs {\n\t\tfor _, pluginName := range profileCfg.Notifications {\n\t\t\tif _, ok := pb.pluginConfigByName[pluginName]; !ok {\n\t\t\t\treturn fmt.Errorf(\"config file for plugin %s not found\", pluginName)\n\t\t\t}\n\n\t\t\tpb.pluginsTypesToDispatch[pb.pluginConfigByName[pluginName].Type] = struct{}{}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// check whether each plugin in profile has its own binary\nfunc (pb *PluginBroker) verifyPluginBinaryWithProfile() error {\n\tfor _, profileCfg := range pb.profileConfigs {\n\t\tfor _, pluginName := range profileCfg.Notifications {\n\t\t\tif _, ok := pb.notificationPluginByName[pluginName]; !ok {\n\t\t\t\treturn fmt.Errorf(\"binary for plugin %s not found\", pluginName)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (pb *PluginBroker) loadPlugins(ctx context.Context, path string) error {\n\tbinaryPaths, err := listFilesAtPath(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, binaryPath := range binaryPaths {\n\t\tif err := pluginIsValid(binaryPath); err != nil {\n\t\t\treturn err\n\t\t}\n","sourceCodeStart":253,"sourceCodeEnd":289,"githubUrl":"https://github.com/crowdsecurity/crowdsec/blob/909b5157986a2b2c2163300fdaef5ed01289f7d2/pkg/csplugin/broker.go#L253-L289","documentation":"verifyPluginBinaryWithProfile checks that every notification referenced in profiles has a running plugin client (binary spawned over gRPC) in notificationPluginByName. Config exists, but the binary itself was not found/registered, so loadPlugins aborts. It catches the case where notification configs exist but the executable plugin is missing or failed to launch.","triggerScenarios":"PluginBroker.Init -> loadPlugins after spawning plugin binaries: profile lists a plugin whose binary is absent from plugin_dir, not executable, or whose load/Configure step failed earlier leaving no client registered.","commonSituations":"Notification config installed from hub but the plugin binary package (e.g. crowdsec-plugin-slack) not installed; plugin_dir points to wrong path; binary lacks +x; plugin binary version mismatched with crowdsec.","solutions":["Verify the plugin binary exists in plugin_dir with matching name (name in yaml must match binary filename) and is executable.","Install the plugin binary package for the notification you configured.","Check the earlier log line for the configure/startup failure of that plugin.","Fix plugin_dir in crowdsec.yaml to point to the directory containing the binaries."],"exampleFix":"// before\nnotification_dir: /etc/crowdsec/notifications/\nplugin_dir: /wrong/path/\n// after\nplugin_dir: /usr/local/lib/crowdsec/plugins/","handlingStrategy":"validation","validationCode":"// before starting crowdsec\nfor _, n := range profileNotifications {\n    if _, err := os.Stat(filepath.Join(pluginDir, n)); err != nil {\n        log.Warnf(\"plugin binary for %s not found\", n)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err := broker.Init(ctx, cfg); err != nil {\n    if strings.Contains(err.Error(), \"binary for plugin\") {\n        // extract name, install the matching plugin binary package\n    }\n    return err\n}","preventionTips":["Install both the notification config and its binary package together (cscli hub install notification-X).","Verify binary filename matches the plugin `name:` in yaml.","Check exec bit after manual copying of plugin binaries."],"tags":["plugins","notifications","binary","profiles"],"backgroundTag":"command-not-found","analyzedSha":"909b5157986a2b2c2163300fdaef5ed01289f7d2","analyzedAt":"2026-09-06T12:27:26.012Z","contentChangedAt":"2026-09-06T12:27:26.012Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}