{"id":18718651,"url":"https://github.com/agalue/gominion","last_synced_at":"2025-09-09T05:44:45.269Z","repository":{"id":44884396,"uuid":"283501891","full_name":"agalue/gominion","owner":"agalue","description":"An implementation of the OpenNMS Minion in Go using gRPC","archived":false,"fork":false,"pushed_at":"2024-07-09T21:44:04.000Z","size":11542,"stargazers_count":3,"open_issues_count":2,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-07T19:41:36.313Z","etag":null,"topics":["golang","grpc","hacktoberfest","kafka","opennms","opennms-minion"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/agalue.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-07-29T13:08:24.000Z","updated_at":"2024-05-20T22:03:49.000Z","dependencies_parsed_at":"2025-04-12T14:17:32.291Z","dependency_job_id":null,"html_url":"https://github.com/agalue/gominion","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/agalue/gominion","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agalue%2Fgominion","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agalue%2Fgominion/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agalue%2Fgominion/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agalue%2Fgominion/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/agalue","download_url":"https://codeload.github.com/agalue/gominion/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/agalue%2Fgominion/sbom","scorecard":{"id":170135,"data":{"date":"2025-08-11","repo":{"name":"github.com/agalue/gominion","commit":"cae96107a400bd72635e63f2a0e71d7ded0e02c0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 1/28 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/agalue/gominion/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/agalue/gominion/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/agalue/gominion/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/agalue/gominion/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/agalue/gominion/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/agalue/gominion/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/agalue/gominion/release.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1","Warn: containerImage not pinned by hash: Dockerfile:11: pin your Docker image by updating alpine:3.19 to alpine:3.19@sha256:3be987e6cde1d07e873c012bf6cfe941e6e85d16ca5fc5b8bedc675451d2de67","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU Affero General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.1.12 not signed: https://api.github.com/repos/agalue/gominion/releases/156590735","Warn: release artifact v0.1.11 not signed: https://api.github.com/repos/agalue/gominion/releases/146573294","Warn: release artifact v0.1.10 not signed: https://api.github.com/repos/agalue/gominion/releases/91356963","Warn: release artifact v0.1.9 not signed: https://api.github.com/repos/agalue/gominion/releases/52091363","Warn: release artifact v0.1.8 not signed: https://api.github.com/repos/agalue/gominion/releases/52053001","Warn: release artifact v0.1.12 does not have provenance: https://api.github.com/repos/agalue/gominion/releases/156590735","Warn: release artifact v0.1.11 does not have provenance: https://api.github.com/repos/agalue/gominion/releases/146573294","Warn: release artifact v0.1.10 does not have provenance: https://api.github.com/repos/agalue/gominion/releases/91356963","Warn: release artifact v0.1.9 does not have provenance: https://api.github.com/repos/agalue/gominion/releases/52091363","Warn: release artifact v0.1.8 does not have provenance: https://api.github.com/repos/agalue/gominion/releases/52053001"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 8 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2024-2978 / GHSA-xr7q-jx4m-x55m"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T16:12:49.297Z","repository_id":44884396,"created_at":"2025-08-16T16:12:49.297Z","updated_at":"2025-08-16T16:12:49.297Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274250508,"owners_count":25249396,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-09T02:00:10.223Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["golang","grpc","hacktoberfest","kafka","opennms","opennms-minion"],"created_at":"2024-11-07T13:22:30.684Z","updated_at":"2025-09-09T05:44:45.246Z","avatar_url":"https://github.com/agalue.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gominion [![Go Report Card](https://goreportcard.com/badge/github.com/agalue/gominion)](https://goreportcard.com/report/github.com/agalue/gominion)\n\nAn implementation of the OpenNMS Minion in Go.\n\nThis project started as a proof of concept to understand how hard it would be to reimplement the OpenNMS Minion in Go. Using low-powered devices like a Raspberry Pi as the Minion server could be a possibility. Still, the current Minion is very resource-demanding in typical production environments.\n\nThe Java-based one has many features that the GO version is currently missing but hopefully will be added soon.\n\nKafka must be the broker technology used for the OpenNMS IPC API (both RPC and Sink), with the `single-topic` feature for RPC must be enabled.\n\nFor the gRPC server, you could use:\n\n* The one [embedded](https://docs.opennms.org/opennms/releases/27.1.1/guide-install/guide-install.html#_configure_opennms_horizon_2) in OpenNMS.\n* The standalone one implemented in [Java](https://github.com/OpenNMS/grpc-server).\n* The standalone one implemented in [Go](https://github.com/agalue/onms-grpc-server).\n\nAlternatively, you can use Kafka directly. Although, you'd need Horizon 26 (or Merdian 2020) or newer to use this implementation.\n\n## RPC Modules\n\n* Echo\n* DNS\n* SNMP\n* Ping\n* Detect\n* Collect\n* Poller\n\n## Sink Modules\n\n* Heartbeat\n* SNMP Traps (SNMPv1 and SNMPv2)\n* Syslog (TCP and UDP)\n* Cisco NX-OS Streaming Telemetry via gRPC\n* Netflow5, Netflow9, IPFIX, SFlow\n* Graphite\n\n\u003e SFlow receiver is enabled, but the parser for Sink API has not been implemented.\n\n\u003e OpenNMS TWIN API is not supported.\n\n## Detectors\n\n* ICMP (`IcmpDetector`)\n* SNMP (`SnmpDetector`)\n* TCP (`TcpDetector`)\n* HTTP (`HttpDetector`, `HttpsDetector`, `WebDetector`)\n\n## Monitors\n\n* ICMP (`IcmpMonitor`)\n* SNMP (`SnmpMonitor`)\n* TCP (`TcpMonitor`)\n* HTTP (`HttpMonitor`, `HttpsMonitor`, `WebMonitor`)\n\n## Collectors\n\n* HTTP (`HttpCollector`)\n* XML (`XmlCollector`)\n\n\u003e It is important to notice that the SNMP Collector work is handled via the SNMP RPC Module, not by a collector implementation like the rest of them.\n\n## Development\n\nThere are skeletons to implement new detectors, monitors and collectors.\n\nEach module folder contains a file called `empty.go` that can be used as a reference.\n\n## Compilation\n\nWe use the [Confluent Go](https://github.com/confluentinc/confluent-kafka-go) client for the Kafka Implementation. This library relies on [librdkafka](https://github.com/edenhill/librdkafka), and you must have it installed on the machine you plan to compile `gominion`.\n\nAlternatively, you can build the tool using Docker with the specified `Dockerfile`.\n\nThe following build and publish a Docker Image for x86_64 and ARM (to use Apple Silicon or Raspberry Pi).\n\n```bash\ndocker buildx create --name local\ndocker buildx use local\ndocker buildx build --platform linux/amd64,linux/arm64 -t agalue/gominion --push .\n```\n\n## Usage\n\nThe command configuration can be passed via:\n\n* Environment Variables (using `GOMINION_` as a prefix)\n* CLI parameters\n* YAML configuration file (defaults to `~/.gominion.yaml`, or can be passed via CLI parameters)\n\nExample YAML configuration:\n\n```yaml\nid: go-minion1\nlocation: Apex\nbrokerUrl: grpc-server:8990\nbrokerType: grpc\ntrapPort: 1162\nsyslogPort: 1514\nlisteners:\n- name: Netflow-5\n  port: 8877\n  parser: Netflow5UdpParser\n- name: Netflow-9\n  port: 4729\n  parser: Netflow9UdpParser\n- name: IPFIX\n  port: 4730\n  parser: IpfixUdpParser\n- name: Graphite\n  port: 2003\n  parser: ForwardParser\n- name: NXOS\n  port: 50000\n  parser: NxosGrpcParser\n- name: SFlow # For reference purposes. Not fully implemented.\n  port: 6343\n  parser: SFlowUdpParser\n```\n\nOn the above example, `grpc-server` can be a standalone one, or the one embedded with OpenNMS.\n\nFor TLS:\n\n```yaml\nbrokerUrl: grpc-server:8990\nbrokerType: grpc\nbrokerProperties:\n  tls-enabled: \"true\"\n  ca-cert-path: \"/etc/server.crt\"\n  client-cert-path: \"/etc/client.crt\"\n  client-key-path: \"/etc/client.key\"\n```\n\nMutual TLS is enabled when adding `client-cert-path` and `client-key-path` besides `ca-cert-path`. The latter could be the certificate of the CA that signed the server certificate and the client one.\n\nTo use Kafka instead of GRPC:\n\n```yaml\nbrokerUrl: kafka-server:9092\nbrokerType: kafka\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagalue%2Fgominion","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fagalue%2Fgominion","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fagalue%2Fgominion/lists"}