https://github.com/agalue/onmsctl
A CLI tool for OpenNMS
https://github.com/agalue/onmsctl
cli golang opennms
Last synced: 7 months ago
JSON representation
A CLI tool for OpenNMS
- Host: GitHub
- URL: https://github.com/agalue/onmsctl
- Owner: agalue
- License: agpl-3.0
- Created: 2019-07-09T21:13:44.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2024-10-14T13:22:42.000Z (over 1 year ago)
- Last Synced: 2025-04-19T18:12:02.225Z (about 1 year ago)
- Topics: cli, golang, opennms
- Language: Go
- Size: 218 KB
- Stars: 11
- Watchers: 5
- Forks: 4
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# onmsctl [](https://goreportcard.com/report/github.com/OpenNMS/onmsctl)
A CLI tool for OpenNMS.
The following features have been implemented:
* Manage multiple OpenNMS servers
* Verify installed OpenNMS Version
* Manage provisioning requisitions (replacing `provision.pl`)
* Manage SNMP configuration (replacing `provision.pl`)
* Manage Foreign Source definitions
* Send events to OpenNMS (replacing `send-event.pl`)
* Reload configuration of OpenNMS daemons
* Enumerate collected resources and metrics (replacing `resourcecli`)
* Manually manage the inventory (bypassing the provisioning system), useful when it is not possible to use Provisioning or Auto-Discover.
* Support for searching entities using [FIQL](https://fiql-parser.readthedocs.io/en/stable/usage.html) (work in progress)
The reason for implementing a CLI in `Go` is that the generated binaries are self-contained, and for the first time, Windows users will be able to control OpenNMS from the command line. For example, `provision.pl` or `send-events.pl` rely on having Perl installed with some additional dependencies, which can be complicated in the environment where this is either hard or impossible to have.
## Compilation
Make sure to have [GoLang](https://golang.org/dl/) installed on your system. Recommended version: 1.16 or newer.
To compile the source code for your desired operating system:
For Linux:
```bash
GOOS=linux GOARCH=amd64 go build -o onmsctl onmsctl.go
```
For Mac:
```bash
GOOS=darwin GOARCH=amd64 go build -o onmsctl onmsctl.go
```
For Windows:
```bash
GOOS=windows GOARCH=amd64 go build -o onmsctl.exe onmsctl.go
```
There is no need to specify parameters for your own operating system, as `go build` will be sufficient. You can also build targets for any operating system from any operating system, and the generated binary will work on itself; there is no need to install anything on the target device besides copying the generated binary file.
Alternatively, in case you don't want to install `Go` on your system, but you have [Docker](https://www.docker.com) installed, you can use it to compile it:
```bash
➜ docker run -it --rm -e GO111MODULE=on -e GOOS=windows -e GOARCH=amd64 -v $(pwd):/app golang bash
root@3854e5d2d67c:/go# cd /app
root@3854e5d2d67c:/app# go build -o onmsctl.exe
root@3854e5d2d67c:/app# exit
```
## Usage
The binary contains help for all commands and subcommands by using `-h` or `--help`. Everything should be self-explanatory.
The following outlines several examples.
0. Deploy OpenNMS
There are several ways to do that, and I'm going to use Kind and Helm:
```bash
kind create cluster --name onms
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add opennms https://opennms.github.io/helm-charts
helm install onms-db bitnami/postgresql --version 15.5.38 \
--set global.postgresql.auth.postgresPassword=P0stgr3s
kubectl rollout status sts/onms-db-postgresql
helm install onms opennms/horizon \
--set domain=test.local \
--set dependencies.postgresql.hostname=onms-db-postgresql.default.svc \
--set dependencies.postgresql.sslmode=disable
kubectl rollout status sts/onms-core
kubectl port-forward svc/onms-core 8980
```
> That will take a few minutes to be ready.
Your OpenNMS server would be reachable at `http://localhost:8980/opennms`.
Once you're done, use `ctrl+c` to stop the port forward and then remove the cluster:
```bash
kind delete cluster -n onms
```
1. Configure OpenNMS servers
To configure the tool, or to avoid specifying the URL, username, and password for your OpenNMS server with each request, you can create a file with the following content on `$HOME/.onms/config.yaml` or add the file on any location and create an environment variable called `ONMSCONFIG` with the location of the file.
To manipulate the content of the configuration file, please use the `onmsctl config` subcommand.
For instance, to add a new configuration entry and make it the default:
```bash
➜ onmsctl config set --name M2021 --url http://192.168.205.200:8980/opennms --user admin --passwd admin
➜ onmsctl config default M2021
➜ onmsctl config list
Default Name User URL
* M2021 admin http://192.168.205.200:8980/opennms
local admin http://localhost:8980/opennms
➜ onmsctl info
displayVersion: 2021.1.1
version: 2021.1.1
packageName: meridian
packageDescription: OpenNMS Meridian
datetimeFormat:
zoneId: America/New_York
format: yyyy-MM-dd'T'HH:mm:ssxxx
```
> Make sure to protect the file, as the credentials are on plain text.
2. Verify the installed version of OpenNMS
```bash
onmsctl info
```
The output would be something like this:
```
displayVersion: 26.2.2
version: 26.2.2
packageName: opennms
packageDescription: OpenNMS
datetimeFormat:
zoneId: America/New_York
format: yyyy-MM-dd'T'HH:mm:ssxxx
```
3. Build a requisition like you would do it with `provision.pl`:
```bash
➜ onmsctl inv req add Local
➜ onmsctl inv node add Local srv01
➜ onmsctl inv intf add Local srv01 10.0.0.1
➜ onmsctl inv svc add Local srv01 10.0.0.1 ICMP
➜ onmsctl inv cat add Local srv01 Servers
➜ onmsctl inv asset set Local srv01 address1 home
```
To visualize the content of the requisition:
```bash
➜ onmsctl inv node get Local srv01
nodeLabel: srv01
foreignID: srv01
interfaces:
- ipAddress: 10.0.0.1
snmpPrimary: "N"
status: 1
services:
- name: ICMP
categories:
- name: Servers
assets:
- name: address1
value: home
```
To import the requisition:
```bash
➜ onmsctl inv req import Local
```
4. Build requisitions in `YAML` and apply it (similar to `kubernetes` workload with `kubectl`):
```bash
➜ cat < Note that an FQDN was used instead of an IP Address (more on this below).
To get the actual content of the node:
```bash
➜ onmsctl inv node get Local www.opennms.com
nodeLabel: www.opennms.com
foreignID: www.opennms.com
interfaces:
- ipAddress: 141.193.213.20
snmpPrimary: "N"
status: 1
categories:
- name: WebSites
```
As you can see, it is possible to specify FQDN instead of IP addresses, and they will be translated into IPs before sending the JSON payload to the ReST end-point for requisitions.
Additionally, for convenience, if the `node-label` is not specified, the `foreign-id` will be used.
5. Configure SNMP credentials
Obtain the current credentials for a given IP address:
```bash
➜ onmsctl snmp get 12.0.0.1
```
> For nodes behind Minions, you can specify the location as a command option.
The output would be:
```
version: v2c
port: 161
retries: 1
timeout: 1800
community: public
maxRequestSize: 65535
maxRepetitions: 2
maxVarsPerPdu: 10
```
Change the credentials for a given IP address:
```
➜ onmsctl snmp set -v v2c -r 3 -t 2000 -c c0mpl1x 12.0.0.1
```
> For nodes behind Minions, you can specify the location as a command option.
## Upcoming features
* Visualize tabular data with pagination (nodes, events, alarms, outages, notifications).
* Configure scheduled outages.