ipmg 3.1.4__tar.gz → 3.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ipmg-3.1.4/src/ipmg.egg-info → ipmg-3.2.0}/PKG-INFO +116 -24
- {ipmg-3.1.4 → ipmg-3.2.0}/README.md +113 -22
- {ipmg-3.1.4 → ipmg-3.2.0}/pyproject.toml +18 -2
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/__init__.py +1 -1
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/cli/commands.py +103 -2
- ipmg-3.2.0/src/ipmg/cli/completion.py +488 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/cli/parser.py +244 -7
- ipmg-3.2.0/src/ipmg/core/cron.py +182 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/core/diff.py +102 -2
- ipmg-3.2.0/src/ipmg/core/engine.py +223 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/core/health.py +20 -3
- ipmg-3.2.0/src/ipmg/core/httpcheck.py +275 -0
- ipmg-3.2.0/src/ipmg/core/neighbours.py +298 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/core/ping.py +27 -7
- ipmg-3.2.0/src/ipmg/core/portscan.py +179 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/core/security.py +9 -4
- ipmg-3.2.0/src/ipmg/core/wake.py +74 -0
- ipmg-3.2.0/src/ipmg/data/oui.tsv.gz +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/infrastructure/database.py +296 -21
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/infrastructure/file_io.py +98 -1
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/infrastructure/incremental.py +27 -15
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/infrastructure/notify.py +85 -1
- ipmg-3.2.0/src/ipmg/infrastructure/retention.py +156 -0
- ipmg-3.2.0/src/ipmg/reporting/frames.py +112 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/reporting/live.py +13 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/reporting/machine.py +6 -4
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/reporting/summary.py +36 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/services/history_service.py +22 -1
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/services/scan_service.py +247 -25
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/utils/helpers.py +103 -5
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/app.py +275 -21
- ipmg-3.2.0/src/ipmg/web/manager.py +288 -0
- ipmg-3.2.0/src/ipmg/web/scheduler.py +180 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/schemas.py +141 -12
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/server.py +3 -1
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/static/css/app.css +11 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/static/index.html +6 -2
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/static/js/api.js +22 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/static/js/app.js +4 -2
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/static/js/demo.js +15 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/static/js/views.js +340 -14
- {ipmg-3.1.4 → ipmg-3.2.0/src/ipmg.egg-info}/PKG-INFO +116 -24
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg.egg-info/SOURCES.txt +16 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg.egg-info/requires.txt +3 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_commands.py +1 -0
- ipmg-3.2.0/tests/test_completion.py +191 -0
- ipmg-3.2.0/tests/test_contrib.py +112 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_database_history.py +23 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_engine.py +51 -0
- ipmg-3.2.0/tests/test_httpcheck.py +375 -0
- ipmg-3.2.0/tests/test_neighbours.py +360 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_notify.py +35 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_ping.py +3 -1
- ipmg-3.2.0/tests/test_ping_command.py +100 -0
- ipmg-3.2.0/tests/test_retention.py +251 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_scan_service.py +127 -42
- ipmg-3.2.0/tests/test_schedules.py +327 -0
- ipmg-3.2.0/tests/test_tcp_probe.py +244 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_utils.py +54 -0
- ipmg-3.2.0/tests/test_wake.py +156 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_web_api.py +264 -0
- ipmg-3.2.0/tests/test_web_manager.py +105 -0
- ipmg-3.1.4/src/ipmg/core/engine.py +0 -140
- ipmg-3.1.4/src/ipmg/core/portscan.py +0 -95
- ipmg-3.1.4/src/ipmg/reporting/frames.py +0 -74
- ipmg-3.1.4/src/ipmg/web/manager.py +0 -139
- ipmg-3.1.4/tests/test_ping_command.py +0 -30
- ipmg-3.1.4/tests/test_web_manager.py +0 -36
- {ipmg-3.1.4 → ipmg-3.2.0}/LICENSE +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/setup.cfg +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/__main__.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/cli/__init__.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/cli/config.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/core/__init__.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/core/discovery.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/exceptions.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/infrastructure/__init__.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/reporting/__init__.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/reporting/diff_report.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/reporting/metrics.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/reporting/ui.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/services/__init__.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/utils/__init__.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/__init__.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/db.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg/web/static/js/charts.js +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg.egg-info/dependency_links.txt +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg.egg-info/entry_points.txt +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/src/ipmg.egg-info/top_level.txt +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_api_contract.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_config.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_diff.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_diff_report.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_discover.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_file_io.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_health.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_history_service.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_incremental.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_ipv6.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_live.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_machine_output.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_metrics.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_parser.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_portscan.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_ui.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_web_db.py +0 -0
- {ipmg-3.1.4 → ipmg-3.2.0}/tests/test_web_server.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ipmg
|
|
3
|
-
Version: 3.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 3.2.0
|
|
4
|
+
Summary: Network discovery and change detection: ping sweeps, scan history, and reports for what changed on your network
|
|
5
5
|
Author: Sameer Alam
|
|
6
6
|
Maintainer-email: Sameer Alam <sameeralam3127@gmail.com>
|
|
7
7
|
License-Expression: MIT
|
|
@@ -48,6 +48,7 @@ Requires-Dist: ruff>=0.4; extra == "dev"
|
|
|
48
48
|
Requires-Dist: pre-commit>=3.5.0; extra == "dev"
|
|
49
49
|
Requires-Dist: python-semantic-release>=10.5.3; extra == "dev"
|
|
50
50
|
Requires-Dist: httpx>=0.27; extra == "dev"
|
|
51
|
+
Requires-Dist: httpx2>=2.0; python_version >= "3.10" and extra == "dev"
|
|
51
52
|
Dynamic: license-file
|
|
52
53
|
|
|
53
54
|
# IPMG — IP Management & Ping Monitoring Tool
|
|
@@ -68,10 +69,10 @@ CIDR blocks, and ranges (IPv4 and IPv6), IPMG Web, a local dashboard that
|
|
|
68
69
|
works offline, and reports in Excel, CSV, JSON, and Markdown.
|
|
69
70
|
|
|
70
71
|
<p align="center">
|
|
71
|
-
<img src="https://raw.githubusercontent.com/sameeralam3127/ipmg/main/docs/assets/ipmg-compare.gif" alt="ipmg scans 13 hosts, a new address is added to the target file
|
|
72
|
+
<img src="https://raw.githubusercontent.com/sameeralam3127/ipmg/main/docs/assets/ipmg-compare.gif" alt="ipmg scans 13 hosts with --stream, printing each one as it answers; a new address is added to the target file; a second scan with --compare reports it as a new host (warning) against the first" width="820">
|
|
72
73
|
</p>
|
|
73
74
|
|
|
74
|
-
[How it compares](#how-it-compares) to
|
|
75
|
+
[How it compares](#how-it-compares) to nmap, fping, and Uptime Kuma.
|
|
75
76
|
|
|
76
77
|
**Website:** [sameeralam3127.github.io/ipmg](https://sameeralam3127.github.io/ipmg/) ·
|
|
77
78
|
**Live demo:** [IPMG Web with sample data](https://sameeralam3127.github.io/ipmg/demo/) ·
|
|
@@ -98,6 +99,7 @@ ipmg --discover --compare # later: scan again and see what changed
|
|
|
98
99
|
[IPMG Web](#ipmg-web) ·
|
|
99
100
|
[What you can scan](#what-you-can-scan) ·
|
|
100
101
|
[Reports](#reports) ·
|
|
102
|
+
[In GitHub Actions](#in-github-actions) ·
|
|
101
103
|
[All options](#all-options) ·
|
|
102
104
|
[Security](#security) ·
|
|
103
105
|
[More help](#more-help) ·
|
|
@@ -107,21 +109,26 @@ ipmg --discover --compare # later: scan again and see what changed
|
|
|
107
109
|
|
|
108
110
|
## How it compares
|
|
109
111
|
|
|
110
|
-
| | IPMG |
|
|
112
|
+
| | IPMG | nmap | fping | Uptime Kuma |
|
|
111
113
|
| --- | --- | --- | --- | --- |
|
|
112
|
-
|
|
|
113
|
-
|
|
|
114
|
-
|
|
|
115
|
-
|
|
|
116
|
-
|
|
|
117
|
-
|
|
|
118
|
-
|
|
|
114
|
+
| Primary purpose | Network discovery, scan history, and what changed | Network discovery and security auditing ([nmap.org](https://nmap.org/)) | Fast ICMP reachability for many hosts at once ([man page](https://fping.org/fping.8.html)) | Self-hosted uptime monitoring of individual services ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
115
|
+
| Ping sweeps of CIDR blocks and ranges | Yes, one system `ping` per host, `--threads` at a time | Yes, `-sn` host discovery ([docs](https://nmap.org/book/man-host-discovery.html)) | Yes, round-robin from one process with `-g`; the fastest here ([man page](https://fping.org/fping.8.html)) | No: one Ping monitor per host ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
116
|
+
| TCP checks | Connect checks on chosen ports, and `--probe tcp` for hosts that block ping | A full port scanner ([docs](https://nmap.org/book/man-port-scanning-techniques.html)) | No ([man page](https://fping.org/fping.8.html)) | A TCP monitor per host and port ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
117
|
+
| HTTP checks | `--http-check`: status, time, redirects, TLS, certificate expiry | Through NSE scripts such as `http-title` ([NSE](https://nmap.org/nsedoc/scripts/http-title.html)) | No ([man page](https://fping.org/fping.8.html)) | HTTP(s), keyword, and JSON query monitors ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
118
|
+
| History and "what changed" | Built in: every scan stored, changes with severities | Save XML, compare two scans with `ndiff` ([ndiff](https://nmap.org/ndiff/)) | No ([man page](https://fping.org/fping.8.html)) | Up/down state and ping charts per monitor ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
119
|
+
| Alerts | Slack, Teams, webhook, email, filtered by severity | No; it writes output files for other tools ([output](https://nmap.org/book/man-output.html)) | No ([man page](https://fping.org/fping.8.html)) | 90+ notification services ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
120
|
+
| Exit codes for cron and CI | `3` with `--fail-on-down`, `2` with `diff --fail-on-change` | No; parse its XML output instead ([output](https://nmap.org/book/man-output.html)) | `1` if any host is unreachable ([man page](https://fping.org/fping.8.html)) | Not a command-line tool ([install](https://github.com/louislam/uptime-kuma#-how-to-install)) |
|
|
121
|
+
| Reports | Excel, CSV, JSON, JSON Lines, Markdown | Normal, XML, grepable ([output](https://nmap.org/book/man-output.html)) | Plain text, with summaries (`-s`, `-C`) ([man page](https://fping.org/fping.8.html)) | Status pages ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
122
|
+
| Browser UI | IPMG Web: local, offline, with scheduled scans | No; Zenmap is a desktop app ([Zenmap](https://nmap.org/zenmap/)) | No ([man page](https://fping.org/fping.8.html)) | It is a web app ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
123
|
+
| Install | `pip`, `uv`, one-line installers, Homebrew, Docker | Packages and installers ([download](https://nmap.org/download.html)) | From source, or Docker ([README](https://github.com/schweikert/fping#installation)) | Docker, or Node.js ([install](https://github.com/louislam/uptime-kuma#-how-to-install)) |
|
|
119
124
|
|
|
120
125
|
Where the others are better: **nmap** is a real port, service, and OS
|
|
121
126
|
scanner, and IPMG does not try to be one. **fping** sends every probe from a
|
|
122
127
|
single process, so on large ranges it is much faster than IPMG, which starts
|
|
123
|
-
one `ping` per host
|
|
124
|
-
|
|
128
|
+
one `ping` per host. **Uptime Kuma** is built for watching a fixed set of
|
|
129
|
+
services around the clock, with status pages to share. [Angry IP
|
|
130
|
+
Scanner](https://angryip.org/) is a point-and-click desktop scanner with a
|
|
131
|
+
plugin system.
|
|
125
132
|
|
|
126
133
|
Reach for IPMG when you look after a network and need to know what moved since
|
|
127
134
|
yesterday, with a report you can hand to someone.
|
|
@@ -151,7 +158,9 @@ That means:
|
|
|
151
158
|
| Linux (iputils or busybox `ping`) | `ping -c COUNT -W SECONDS` | Supported. CI runs the tests and a scan on Ubuntu; see [verified environments](#verified-environments) |
|
|
152
159
|
| macOS | `ping -c COUNT -W MILLISECONDS`; `ping6` for IPv6 | Supported. CI runs the tests and a scan on macOS |
|
|
153
160
|
| Windows | `ping -n COUNT -w MILLISECONDS` | Supported. CI runs the tests and a scan of `127.0.0.1` on `windows-latest`; not yet verified against a real LAN |
|
|
154
|
-
| FreeBSD
|
|
161
|
+
| FreeBSD | `ping -c COUNT -W MILLISECONDS`; `ping6` for IPv6 | Probed in a FreeBSD VM in CI when the ping code changes |
|
|
162
|
+
| OpenBSD | `ping -c COUNT -w SECONDS`; `ping6` for IPv6 | Probed in an OpenBSD VM in CI when the ping code changes |
|
|
163
|
+
| NetBSD | `ping -c COUNT -w DEADLINE`; `ping6 -x MILLISECONDS` for IPv6 | Probed in a NetBSD VM in CI when the ping code changes |
|
|
155
164
|
|
|
156
165
|
`--discover ipv6` reads the neighbour table with `ip -6 neigh` on Linux (the
|
|
157
166
|
`iproute2` package), `ndp -an` on macOS, and `netsh` on Windows.
|
|
@@ -196,10 +205,12 @@ irm https://raw.githubusercontent.com/sameeralam3127/ipmg/main/install.ps1 | iex
|
|
|
196
205
|
|
|
197
206
|
It works in Windows PowerShell 5.1 and PowerShell 7 and needs no
|
|
198
207
|
administrator rights: it installs uv if it is missing, installs IPMG, adds it
|
|
199
|
-
to your user `PATH`, and checks that `ipmg --version` runs. To pin a release
|
|
208
|
+
to your user `PATH`, and checks that `ipmg --version` runs. To pin a release,
|
|
209
|
+
replace `X.Y.Z` with any version listed on
|
|
210
|
+
[PyPI](https://pypi.org/project/ipmg/#history):
|
|
200
211
|
|
|
201
212
|
```powershell
|
|
202
|
-
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/sameeralam3127/ipmg/main/install.ps1))) -Version
|
|
213
|
+
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/sameeralam3127/ipmg/main/install.ps1))) -Version X.Y.Z
|
|
203
214
|
```
|
|
204
215
|
|
|
205
216
|
**Docker (amd64 and arm64):**
|
|
@@ -243,7 +254,7 @@ docker compose run --rm scan --input 10.0.0.0/24 # CLI scans land in th
|
|
|
243
254
|
|
|
244
255
|
Publishing the port more widely (`8080:8080`) exposes IPMG Web on your
|
|
245
256
|
network over plain HTTP; put a reverse proxy with TLS in front first. Images
|
|
246
|
-
are tagged with the release version (`
|
|
257
|
+
are tagged with the release version (`X.Y.Z`), the minor line (`X.Y`), and
|
|
247
258
|
`latest`.
|
|
248
259
|
|
|
249
260
|
### Installing with pip
|
|
@@ -291,6 +302,19 @@ The one-line installers, Homebrew, and the Docker image install it with the
|
|
|
291
302
|
`web` extra already. Run `ipmg web` without it and IPMG tells you the command
|
|
292
303
|
that adds it.
|
|
293
304
|
|
|
305
|
+
### Tab completion
|
|
306
|
+
|
|
307
|
+
`ipmg completion SHELL` prints a completion script for commands, flags, their
|
|
308
|
+
choices, and file names. It is generated from IPMG's own flag definitions, so
|
|
309
|
+
it never falls behind; run it again after an upgrade.
|
|
310
|
+
|
|
311
|
+
| Shell | Add this |
|
|
312
|
+
| --- | --- |
|
|
313
|
+
| bash | `eval "$(ipmg completion bash)"` in `~/.bashrc` (bash 3.2 and later; no bash-completion package needed) |
|
|
314
|
+
| zsh | `eval "$(ipmg completion zsh)"` in `~/.zshrc`, after `compinit`; or save it as `_ipmg` in a directory on your `$fpath` |
|
|
315
|
+
| fish | `ipmg completion fish > ~/.config/fish/completions/ipmg.fish` |
|
|
316
|
+
| PowerShell | `ipmg completion powershell \| Out-String \| Invoke-Expression` in your `$PROFILE` |
|
|
317
|
+
|
|
294
318
|
### The one thing IPMG needs from your system
|
|
295
319
|
|
|
296
320
|
IPMG probes hosts with your operating system's `ping` command, and minimal
|
|
@@ -311,13 +335,17 @@ IPMG runs the same `ping` you would run by hand.
|
|
|
311
335
|
|
|
312
336
|
### Verified environments
|
|
313
337
|
|
|
314
|
-
|
|
338
|
+
The installer is tested in each of these whenever `install.sh` changes, and
|
|
339
|
+
weekly: a fresh install as root with `--with-deps`, then a scan
|
|
340
|
+
([workflow](https://github.com/sameeralam3127/ipmg/actions/workflows/install-sh.yml)).
|
|
341
|
+
macOS and Ubuntu are also tested as a normal user, as are a pinned
|
|
342
|
+
`--version` and an upgrade over an existing install.
|
|
315
343
|
|
|
316
344
|
| Environment | Notes |
|
|
317
345
|
| --- | --- |
|
|
318
346
|
| Ubuntu 22.04 / 24.04 | 24.04 blocks `pip install`; the installer is unaffected |
|
|
319
347
|
| Debian 12 | same PEP 668 situation as Ubuntu |
|
|
320
|
-
| RHEL 8 / RHEL 9 (UBI), Rocky 9 | RHEL 8's system Python is 3.6
|
|
348
|
+
| RHEL 8 / RHEL 9 (UBI), Rocky 9 | RHEL 8's system Python is 3.6; uv supplies its own |
|
|
321
349
|
| Fedora 41 | |
|
|
322
350
|
| openSUSE Leap 15.6 | image has no Python at all; installer supplies everything |
|
|
323
351
|
| Alpine 3.20 | run the installer with `bash`, not `sh` |
|
|
@@ -339,10 +367,11 @@ one of them.
|
|
|
339
367
|
uv tool install ipmg
|
|
340
368
|
```
|
|
341
369
|
|
|
342
|
-
**Pin a specific version
|
|
370
|
+
**Pin a specific version** (any release listed on
|
|
371
|
+
[PyPI](https://pypi.org/project/ipmg/#history)):
|
|
343
372
|
|
|
344
373
|
```bash
|
|
345
|
-
curl -sSL https://raw.githubusercontent.com/sameeralam3127/ipmg/main/install.sh | bash -s -- --version
|
|
374
|
+
curl -sSL https://raw.githubusercontent.com/sameeralam3127/ipmg/main/install.sh | bash -s -- --version X.Y.Z
|
|
346
375
|
```
|
|
347
376
|
|
|
348
377
|
**From source (development):**
|
|
@@ -385,7 +414,7 @@ ipmg --input targets.txt # a file of hosts
|
|
|
385
414
|
Here is what a finished scan looks like:
|
|
386
415
|
|
|
387
416
|
```text
|
|
388
|
-
ipmg
|
|
417
|
+
ipmg X.Y.Z · scan
|
|
389
418
|
ICMP probes only — scan only networks you are authorized to scan.
|
|
390
419
|
|
|
391
420
|
Source targets.txt
|
|
@@ -516,6 +545,7 @@ Or pick a ready-made command:
|
|
|
516
545
|
| See what changed since last time | `ipmg --input targets.txt --compare` |
|
|
517
546
|
| Check which services are listening | `ipmg --input targets.txt --scan-ports` |
|
|
518
547
|
| Keep scanning every 5 minutes | `ipmg --input targets.txt --interval 5` |
|
|
548
|
+
| Keep it running after logout and reboots | the systemd and launchd templates in [docs/SERVICES.md](https://github.com/sameeralam3127/ipmg/blob/main/docs/SERVICES.md) |
|
|
519
549
|
| Look back at earlier scans | `ipmg history` |
|
|
520
550
|
| Compare two specific scans | `ipmg diff 12 14` |
|
|
521
551
|
| Use IPMG Web in your browser instead | `ipmg web` |
|
|
@@ -816,6 +846,66 @@ them — so piping IPMG into a file or a log gives you clean text.
|
|
|
816
846
|
|
|
817
847
|
---
|
|
818
848
|
|
|
849
|
+
## In GitHub Actions
|
|
850
|
+
|
|
851
|
+
This repository is also a GitHub Action: a pipeline step that checks your
|
|
852
|
+
infrastructure is reachable and fails the job when it is not. It installs IPMG
|
|
853
|
+
with uv, scans, writes a summary of the hosts that are down to the job page,
|
|
854
|
+
and uploads the reports as an artifact, even when the step fails.
|
|
855
|
+
|
|
856
|
+
Before a deploy:
|
|
857
|
+
|
|
858
|
+
```yaml
|
|
859
|
+
- name: Check the database and cache hosts are up
|
|
860
|
+
uses: sameeralam3127/ipmg@vX.Y.Z # any IPMG release tag
|
|
861
|
+
with:
|
|
862
|
+
targets: 10.0.4.10 10.0.4.11 10.0.5.0/28
|
|
863
|
+
fail-on-down: true
|
|
864
|
+
args: --probe icmp,tcp --ports 5432,6379
|
|
865
|
+
```
|
|
866
|
+
|
|
867
|
+
On a schedule, with the reports kept and a Slack alert for changes (the
|
|
868
|
+
history lives in the cached database):
|
|
869
|
+
|
|
870
|
+
```yaml
|
|
871
|
+
on:
|
|
872
|
+
schedule: [{ cron: "*/30 * * * *" }]
|
|
873
|
+
jobs:
|
|
874
|
+
reachability:
|
|
875
|
+
runs-on: [self-hosted, office-lan]
|
|
876
|
+
steps:
|
|
877
|
+
- uses: actions/checkout@v7
|
|
878
|
+
- uses: actions/cache@v6
|
|
879
|
+
with: { path: ipmg-history, key: "ipmg-${{ github.run_id }}", restore-keys: ipmg- }
|
|
880
|
+
- uses: sameeralam3127/ipmg@vX.Y.Z
|
|
881
|
+
with:
|
|
882
|
+
targets: targets.txt
|
|
883
|
+
args: --db ipmg-history/history.db --compare --notify-slack
|
|
884
|
+
formats: csv md
|
|
885
|
+
env:
|
|
886
|
+
IPMG_NOTIFY_SLACK: ${{ secrets.SLACK_WEBHOOK }}
|
|
887
|
+
```
|
|
888
|
+
|
|
889
|
+
| Input | Default | Meaning |
|
|
890
|
+
| --- | --- | --- |
|
|
891
|
+
| `targets` | (required) | IPs, CIDR blocks, ranges, or target files, separated by spaces or newlines |
|
|
892
|
+
| `args` | | Extra IPMG flags, split on whitespace |
|
|
893
|
+
| `version` | `latest` | The IPMG release to install, such as `3.2.0` |
|
|
894
|
+
| `fail-on-down` | `false` | Fail the step when any target is not Active |
|
|
895
|
+
| `formats` | `csv json md` | Report formats to write |
|
|
896
|
+
| `upload-artifact` | `true` | Upload the reports as an artifact |
|
|
897
|
+
| `artifact-name` | `ipmg-reports` | The artifact's name |
|
|
898
|
+
|
|
899
|
+
Outputs: `active` and `total` host counts, `report-path`, and `exit-code`.
|
|
900
|
+
|
|
901
|
+
GitHub-hosted runners generally cannot ping hosts outside GitHub's network,
|
|
902
|
+
and cannot reach your private networks at all. For a LAN or a VPC, use a
|
|
903
|
+
[self-hosted runner](https://docs.github.com/en/actions/hosting-your-own-runners)
|
|
904
|
+
inside it; for public hosts that drop ICMP, add `--probe tcp` or `--probe
|
|
905
|
+
icmp,tcp` to `args`, or check the service itself with `--http-check`.
|
|
906
|
+
|
|
907
|
+
---
|
|
908
|
+
|
|
819
909
|
## Default options in a file
|
|
820
910
|
|
|
821
911
|
If every run repeats the same flags, put them in **`ipmg.toml`** next to your
|
|
@@ -991,7 +1081,9 @@ Contributions are welcome.
|
|
|
991
1081
|
[CONTRIBUTING.md](https://github.com/sameeralam3127/ipmg/blob/main/.github/CONTRIBUTING.md)
|
|
992
1082
|
covers setting up a development environment, running the tests, the commit
|
|
993
1083
|
message format that drives automated releases, and how the project website and
|
|
994
|
-
IPMG Web demo are built.
|
|
1084
|
+
IPMG Web demo are built.
|
|
1085
|
+
[docs/ARCHITECTURE.md](https://github.com/sameeralam3127/ipmg/blob/main/docs/ARCHITECTURE.md)
|
|
1086
|
+
explains how the code fits together. Everyone taking part is expected to follow the
|
|
995
1087
|
[Code of Conduct](https://github.com/sameeralam3127/ipmg/blob/main/.github/CODE_OF_CONDUCT.md).
|
|
996
1088
|
|
|
997
1089
|
---
|
|
@@ -16,10 +16,10 @@ CIDR blocks, and ranges (IPv4 and IPv6), IPMG Web, a local dashboard that
|
|
|
16
16
|
works offline, and reports in Excel, CSV, JSON, and Markdown.
|
|
17
17
|
|
|
18
18
|
<p align="center">
|
|
19
|
-
<img src="https://raw.githubusercontent.com/sameeralam3127/ipmg/main/docs/assets/ipmg-compare.gif" alt="ipmg scans 13 hosts, a new address is added to the target file
|
|
19
|
+
<img src="https://raw.githubusercontent.com/sameeralam3127/ipmg/main/docs/assets/ipmg-compare.gif" alt="ipmg scans 13 hosts with --stream, printing each one as it answers; a new address is added to the target file; a second scan with --compare reports it as a new host (warning) against the first" width="820">
|
|
20
20
|
</p>
|
|
21
21
|
|
|
22
|
-
[How it compares](#how-it-compares) to
|
|
22
|
+
[How it compares](#how-it-compares) to nmap, fping, and Uptime Kuma.
|
|
23
23
|
|
|
24
24
|
**Website:** [sameeralam3127.github.io/ipmg](https://sameeralam3127.github.io/ipmg/) ·
|
|
25
25
|
**Live demo:** [IPMG Web with sample data](https://sameeralam3127.github.io/ipmg/demo/) ·
|
|
@@ -46,6 +46,7 @@ ipmg --discover --compare # later: scan again and see what changed
|
|
|
46
46
|
[IPMG Web](#ipmg-web) ·
|
|
47
47
|
[What you can scan](#what-you-can-scan) ·
|
|
48
48
|
[Reports](#reports) ·
|
|
49
|
+
[In GitHub Actions](#in-github-actions) ·
|
|
49
50
|
[All options](#all-options) ·
|
|
50
51
|
[Security](#security) ·
|
|
51
52
|
[More help](#more-help) ·
|
|
@@ -55,21 +56,26 @@ ipmg --discover --compare # later: scan again and see what changed
|
|
|
55
56
|
|
|
56
57
|
## How it compares
|
|
57
58
|
|
|
58
|
-
| | IPMG |
|
|
59
|
+
| | IPMG | nmap | fping | Uptime Kuma |
|
|
59
60
|
| --- | --- | --- | --- | --- |
|
|
60
|
-
|
|
|
61
|
-
|
|
|
62
|
-
|
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
|
|
|
66
|
-
|
|
|
61
|
+
| Primary purpose | Network discovery, scan history, and what changed | Network discovery and security auditing ([nmap.org](https://nmap.org/)) | Fast ICMP reachability for many hosts at once ([man page](https://fping.org/fping.8.html)) | Self-hosted uptime monitoring of individual services ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
62
|
+
| Ping sweeps of CIDR blocks and ranges | Yes, one system `ping` per host, `--threads` at a time | Yes, `-sn` host discovery ([docs](https://nmap.org/book/man-host-discovery.html)) | Yes, round-robin from one process with `-g`; the fastest here ([man page](https://fping.org/fping.8.html)) | No: one Ping monitor per host ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
63
|
+
| TCP checks | Connect checks on chosen ports, and `--probe tcp` for hosts that block ping | A full port scanner ([docs](https://nmap.org/book/man-port-scanning-techniques.html)) | No ([man page](https://fping.org/fping.8.html)) | A TCP monitor per host and port ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
64
|
+
| HTTP checks | `--http-check`: status, time, redirects, TLS, certificate expiry | Through NSE scripts such as `http-title` ([NSE](https://nmap.org/nsedoc/scripts/http-title.html)) | No ([man page](https://fping.org/fping.8.html)) | HTTP(s), keyword, and JSON query monitors ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
65
|
+
| History and "what changed" | Built in: every scan stored, changes with severities | Save XML, compare two scans with `ndiff` ([ndiff](https://nmap.org/ndiff/)) | No ([man page](https://fping.org/fping.8.html)) | Up/down state and ping charts per monitor ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
66
|
+
| Alerts | Slack, Teams, webhook, email, filtered by severity | No; it writes output files for other tools ([output](https://nmap.org/book/man-output.html)) | No ([man page](https://fping.org/fping.8.html)) | 90+ notification services ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
67
|
+
| Exit codes for cron and CI | `3` with `--fail-on-down`, `2` with `diff --fail-on-change` | No; parse its XML output instead ([output](https://nmap.org/book/man-output.html)) | `1` if any host is unreachable ([man page](https://fping.org/fping.8.html)) | Not a command-line tool ([install](https://github.com/louislam/uptime-kuma#-how-to-install)) |
|
|
68
|
+
| Reports | Excel, CSV, JSON, JSON Lines, Markdown | Normal, XML, grepable ([output](https://nmap.org/book/man-output.html)) | Plain text, with summaries (`-s`, `-C`) ([man page](https://fping.org/fping.8.html)) | Status pages ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
69
|
+
| Browser UI | IPMG Web: local, offline, with scheduled scans | No; Zenmap is a desktop app ([Zenmap](https://nmap.org/zenmap/)) | No ([man page](https://fping.org/fping.8.html)) | It is a web app ([features](https://github.com/louislam/uptime-kuma#-features)) |
|
|
70
|
+
| Install | `pip`, `uv`, one-line installers, Homebrew, Docker | Packages and installers ([download](https://nmap.org/download.html)) | From source, or Docker ([README](https://github.com/schweikert/fping#installation)) | Docker, or Node.js ([install](https://github.com/louislam/uptime-kuma#-how-to-install)) |
|
|
67
71
|
|
|
68
72
|
Where the others are better: **nmap** is a real port, service, and OS
|
|
69
73
|
scanner, and IPMG does not try to be one. **fping** sends every probe from a
|
|
70
74
|
single process, so on large ranges it is much faster than IPMG, which starts
|
|
71
|
-
one `ping` per host
|
|
72
|
-
|
|
75
|
+
one `ping` per host. **Uptime Kuma** is built for watching a fixed set of
|
|
76
|
+
services around the clock, with status pages to share. [Angry IP
|
|
77
|
+
Scanner](https://angryip.org/) is a point-and-click desktop scanner with a
|
|
78
|
+
plugin system.
|
|
73
79
|
|
|
74
80
|
Reach for IPMG when you look after a network and need to know what moved since
|
|
75
81
|
yesterday, with a report you can hand to someone.
|
|
@@ -99,7 +105,9 @@ That means:
|
|
|
99
105
|
| Linux (iputils or busybox `ping`) | `ping -c COUNT -W SECONDS` | Supported. CI runs the tests and a scan on Ubuntu; see [verified environments](#verified-environments) |
|
|
100
106
|
| macOS | `ping -c COUNT -W MILLISECONDS`; `ping6` for IPv6 | Supported. CI runs the tests and a scan on macOS |
|
|
101
107
|
| Windows | `ping -n COUNT -w MILLISECONDS` | Supported. CI runs the tests and a scan of `127.0.0.1` on `windows-latest`; not yet verified against a real LAN |
|
|
102
|
-
| FreeBSD
|
|
108
|
+
| FreeBSD | `ping -c COUNT -W MILLISECONDS`; `ping6` for IPv6 | Probed in a FreeBSD VM in CI when the ping code changes |
|
|
109
|
+
| OpenBSD | `ping -c COUNT -w SECONDS`; `ping6` for IPv6 | Probed in an OpenBSD VM in CI when the ping code changes |
|
|
110
|
+
| NetBSD | `ping -c COUNT -w DEADLINE`; `ping6 -x MILLISECONDS` for IPv6 | Probed in a NetBSD VM in CI when the ping code changes |
|
|
103
111
|
|
|
104
112
|
`--discover ipv6` reads the neighbour table with `ip -6 neigh` on Linux (the
|
|
105
113
|
`iproute2` package), `ndp -an` on macOS, and `netsh` on Windows.
|
|
@@ -144,10 +152,12 @@ irm https://raw.githubusercontent.com/sameeralam3127/ipmg/main/install.ps1 | iex
|
|
|
144
152
|
|
|
145
153
|
It works in Windows PowerShell 5.1 and PowerShell 7 and needs no
|
|
146
154
|
administrator rights: it installs uv if it is missing, installs IPMG, adds it
|
|
147
|
-
to your user `PATH`, and checks that `ipmg --version` runs. To pin a release
|
|
155
|
+
to your user `PATH`, and checks that `ipmg --version` runs. To pin a release,
|
|
156
|
+
replace `X.Y.Z` with any version listed on
|
|
157
|
+
[PyPI](https://pypi.org/project/ipmg/#history):
|
|
148
158
|
|
|
149
159
|
```powershell
|
|
150
|
-
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/sameeralam3127/ipmg/main/install.ps1))) -Version
|
|
160
|
+
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/sameeralam3127/ipmg/main/install.ps1))) -Version X.Y.Z
|
|
151
161
|
```
|
|
152
162
|
|
|
153
163
|
**Docker (amd64 and arm64):**
|
|
@@ -191,7 +201,7 @@ docker compose run --rm scan --input 10.0.0.0/24 # CLI scans land in th
|
|
|
191
201
|
|
|
192
202
|
Publishing the port more widely (`8080:8080`) exposes IPMG Web on your
|
|
193
203
|
network over plain HTTP; put a reverse proxy with TLS in front first. Images
|
|
194
|
-
are tagged with the release version (`
|
|
204
|
+
are tagged with the release version (`X.Y.Z`), the minor line (`X.Y`), and
|
|
195
205
|
`latest`.
|
|
196
206
|
|
|
197
207
|
### Installing with pip
|
|
@@ -239,6 +249,19 @@ The one-line installers, Homebrew, and the Docker image install it with the
|
|
|
239
249
|
`web` extra already. Run `ipmg web` without it and IPMG tells you the command
|
|
240
250
|
that adds it.
|
|
241
251
|
|
|
252
|
+
### Tab completion
|
|
253
|
+
|
|
254
|
+
`ipmg completion SHELL` prints a completion script for commands, flags, their
|
|
255
|
+
choices, and file names. It is generated from IPMG's own flag definitions, so
|
|
256
|
+
it never falls behind; run it again after an upgrade.
|
|
257
|
+
|
|
258
|
+
| Shell | Add this |
|
|
259
|
+
| --- | --- |
|
|
260
|
+
| bash | `eval "$(ipmg completion bash)"` in `~/.bashrc` (bash 3.2 and later; no bash-completion package needed) |
|
|
261
|
+
| zsh | `eval "$(ipmg completion zsh)"` in `~/.zshrc`, after `compinit`; or save it as `_ipmg` in a directory on your `$fpath` |
|
|
262
|
+
| fish | `ipmg completion fish > ~/.config/fish/completions/ipmg.fish` |
|
|
263
|
+
| PowerShell | `ipmg completion powershell \| Out-String \| Invoke-Expression` in your `$PROFILE` |
|
|
264
|
+
|
|
242
265
|
### The one thing IPMG needs from your system
|
|
243
266
|
|
|
244
267
|
IPMG probes hosts with your operating system's `ping` command, and minimal
|
|
@@ -259,13 +282,17 @@ IPMG runs the same `ping` you would run by hand.
|
|
|
259
282
|
|
|
260
283
|
### Verified environments
|
|
261
284
|
|
|
262
|
-
|
|
285
|
+
The installer is tested in each of these whenever `install.sh` changes, and
|
|
286
|
+
weekly: a fresh install as root with `--with-deps`, then a scan
|
|
287
|
+
([workflow](https://github.com/sameeralam3127/ipmg/actions/workflows/install-sh.yml)).
|
|
288
|
+
macOS and Ubuntu are also tested as a normal user, as are a pinned
|
|
289
|
+
`--version` and an upgrade over an existing install.
|
|
263
290
|
|
|
264
291
|
| Environment | Notes |
|
|
265
292
|
| --- | --- |
|
|
266
293
|
| Ubuntu 22.04 / 24.04 | 24.04 blocks `pip install`; the installer is unaffected |
|
|
267
294
|
| Debian 12 | same PEP 668 situation as Ubuntu |
|
|
268
|
-
| RHEL 8 / RHEL 9 (UBI), Rocky 9 | RHEL 8's system Python is 3.6
|
|
295
|
+
| RHEL 8 / RHEL 9 (UBI), Rocky 9 | RHEL 8's system Python is 3.6; uv supplies its own |
|
|
269
296
|
| Fedora 41 | |
|
|
270
297
|
| openSUSE Leap 15.6 | image has no Python at all; installer supplies everything |
|
|
271
298
|
| Alpine 3.20 | run the installer with `bash`, not `sh` |
|
|
@@ -287,10 +314,11 @@ one of them.
|
|
|
287
314
|
uv tool install ipmg
|
|
288
315
|
```
|
|
289
316
|
|
|
290
|
-
**Pin a specific version
|
|
317
|
+
**Pin a specific version** (any release listed on
|
|
318
|
+
[PyPI](https://pypi.org/project/ipmg/#history)):
|
|
291
319
|
|
|
292
320
|
```bash
|
|
293
|
-
curl -sSL https://raw.githubusercontent.com/sameeralam3127/ipmg/main/install.sh | bash -s -- --version
|
|
321
|
+
curl -sSL https://raw.githubusercontent.com/sameeralam3127/ipmg/main/install.sh | bash -s -- --version X.Y.Z
|
|
294
322
|
```
|
|
295
323
|
|
|
296
324
|
**From source (development):**
|
|
@@ -333,7 +361,7 @@ ipmg --input targets.txt # a file of hosts
|
|
|
333
361
|
Here is what a finished scan looks like:
|
|
334
362
|
|
|
335
363
|
```text
|
|
336
|
-
ipmg
|
|
364
|
+
ipmg X.Y.Z · scan
|
|
337
365
|
ICMP probes only — scan only networks you are authorized to scan.
|
|
338
366
|
|
|
339
367
|
Source targets.txt
|
|
@@ -464,6 +492,7 @@ Or pick a ready-made command:
|
|
|
464
492
|
| See what changed since last time | `ipmg --input targets.txt --compare` |
|
|
465
493
|
| Check which services are listening | `ipmg --input targets.txt --scan-ports` |
|
|
466
494
|
| Keep scanning every 5 minutes | `ipmg --input targets.txt --interval 5` |
|
|
495
|
+
| Keep it running after logout and reboots | the systemd and launchd templates in [docs/SERVICES.md](https://github.com/sameeralam3127/ipmg/blob/main/docs/SERVICES.md) |
|
|
467
496
|
| Look back at earlier scans | `ipmg history` |
|
|
468
497
|
| Compare two specific scans | `ipmg diff 12 14` |
|
|
469
498
|
| Use IPMG Web in your browser instead | `ipmg web` |
|
|
@@ -764,6 +793,66 @@ them — so piping IPMG into a file or a log gives you clean text.
|
|
|
764
793
|
|
|
765
794
|
---
|
|
766
795
|
|
|
796
|
+
## In GitHub Actions
|
|
797
|
+
|
|
798
|
+
This repository is also a GitHub Action: a pipeline step that checks your
|
|
799
|
+
infrastructure is reachable and fails the job when it is not. It installs IPMG
|
|
800
|
+
with uv, scans, writes a summary of the hosts that are down to the job page,
|
|
801
|
+
and uploads the reports as an artifact, even when the step fails.
|
|
802
|
+
|
|
803
|
+
Before a deploy:
|
|
804
|
+
|
|
805
|
+
```yaml
|
|
806
|
+
- name: Check the database and cache hosts are up
|
|
807
|
+
uses: sameeralam3127/ipmg@vX.Y.Z # any IPMG release tag
|
|
808
|
+
with:
|
|
809
|
+
targets: 10.0.4.10 10.0.4.11 10.0.5.0/28
|
|
810
|
+
fail-on-down: true
|
|
811
|
+
args: --probe icmp,tcp --ports 5432,6379
|
|
812
|
+
```
|
|
813
|
+
|
|
814
|
+
On a schedule, with the reports kept and a Slack alert for changes (the
|
|
815
|
+
history lives in the cached database):
|
|
816
|
+
|
|
817
|
+
```yaml
|
|
818
|
+
on:
|
|
819
|
+
schedule: [{ cron: "*/30 * * * *" }]
|
|
820
|
+
jobs:
|
|
821
|
+
reachability:
|
|
822
|
+
runs-on: [self-hosted, office-lan]
|
|
823
|
+
steps:
|
|
824
|
+
- uses: actions/checkout@v7
|
|
825
|
+
- uses: actions/cache@v6
|
|
826
|
+
with: { path: ipmg-history, key: "ipmg-${{ github.run_id }}", restore-keys: ipmg- }
|
|
827
|
+
- uses: sameeralam3127/ipmg@vX.Y.Z
|
|
828
|
+
with:
|
|
829
|
+
targets: targets.txt
|
|
830
|
+
args: --db ipmg-history/history.db --compare --notify-slack
|
|
831
|
+
formats: csv md
|
|
832
|
+
env:
|
|
833
|
+
IPMG_NOTIFY_SLACK: ${{ secrets.SLACK_WEBHOOK }}
|
|
834
|
+
```
|
|
835
|
+
|
|
836
|
+
| Input | Default | Meaning |
|
|
837
|
+
| --- | --- | --- |
|
|
838
|
+
| `targets` | (required) | IPs, CIDR blocks, ranges, or target files, separated by spaces or newlines |
|
|
839
|
+
| `args` | | Extra IPMG flags, split on whitespace |
|
|
840
|
+
| `version` | `latest` | The IPMG release to install, such as `3.2.0` |
|
|
841
|
+
| `fail-on-down` | `false` | Fail the step when any target is not Active |
|
|
842
|
+
| `formats` | `csv json md` | Report formats to write |
|
|
843
|
+
| `upload-artifact` | `true` | Upload the reports as an artifact |
|
|
844
|
+
| `artifact-name` | `ipmg-reports` | The artifact's name |
|
|
845
|
+
|
|
846
|
+
Outputs: `active` and `total` host counts, `report-path`, and `exit-code`.
|
|
847
|
+
|
|
848
|
+
GitHub-hosted runners generally cannot ping hosts outside GitHub's network,
|
|
849
|
+
and cannot reach your private networks at all. For a LAN or a VPC, use a
|
|
850
|
+
[self-hosted runner](https://docs.github.com/en/actions/hosting-your-own-runners)
|
|
851
|
+
inside it; for public hosts that drop ICMP, add `--probe tcp` or `--probe
|
|
852
|
+
icmp,tcp` to `args`, or check the service itself with `--http-check`.
|
|
853
|
+
|
|
854
|
+
---
|
|
855
|
+
|
|
767
856
|
## Default options in a file
|
|
768
857
|
|
|
769
858
|
If every run repeats the same flags, put them in **`ipmg.toml`** next to your
|
|
@@ -939,7 +1028,9 @@ Contributions are welcome.
|
|
|
939
1028
|
[CONTRIBUTING.md](https://github.com/sameeralam3127/ipmg/blob/main/.github/CONTRIBUTING.md)
|
|
940
1029
|
covers setting up a development environment, running the tests, the commit
|
|
941
1030
|
message format that drives automated releases, and how the project website and
|
|
942
|
-
IPMG Web demo are built.
|
|
1031
|
+
IPMG Web demo are built.
|
|
1032
|
+
[docs/ARCHITECTURE.md](https://github.com/sameeralam3127/ipmg/blob/main/docs/ARCHITECTURE.md)
|
|
1033
|
+
explains how the code fits together. Everyone taking part is expected to follow the
|
|
943
1034
|
[Code of Conduct](https://github.com/sameeralam3127/ipmg/blob/main/.github/CODE_OF_CONDUCT.md).
|
|
944
1035
|
|
|
945
1036
|
---
|
|
@@ -13,8 +13,8 @@ build-backend = "setuptools.build_meta"
|
|
|
13
13
|
|
|
14
14
|
[project]
|
|
15
15
|
name = "ipmg"
|
|
16
|
-
version = "3.
|
|
17
|
-
description = "
|
|
16
|
+
version = "3.2.0" # Managed automatically by semantic-release
|
|
17
|
+
description = "Network discovery and change detection: ping sweeps, scan history, and reports for what changed on your network"
|
|
18
18
|
readme = "README.md"
|
|
19
19
|
requires-python = ">=3.9"
|
|
20
20
|
license = "MIT"
|
|
@@ -83,7 +83,11 @@ dev = [
|
|
|
83
83
|
"ruff>=0.4",
|
|
84
84
|
"pre-commit>=3.5.0",
|
|
85
85
|
"python-semantic-release>=10.5.3",
|
|
86
|
+
# The TestClient's HTTP client. Starlette 1.x wants httpx2 and warns
|
|
87
|
+
# about httpx; the Starlette releases Python 3.9 and the lowest-deps job
|
|
88
|
+
# resolve to predate httpx2 and need httpx.
|
|
86
89
|
"httpx>=0.27",
|
|
90
|
+
"httpx2>=2.0; python_version >= '3.10'",
|
|
87
91
|
]
|
|
88
92
|
|
|
89
93
|
[project.scripts]
|
|
@@ -102,7 +106,11 @@ dev = [
|
|
|
102
106
|
"ruff>=0.4",
|
|
103
107
|
"pre-commit>=3.5.0",
|
|
104
108
|
"python-semantic-release>=10.5.3",
|
|
109
|
+
# The TestClient's HTTP client. Starlette 1.x wants httpx2 and warns
|
|
110
|
+
# about httpx; the Starlette releases Python 3.9 and the lowest-deps job
|
|
111
|
+
# resolve to predate httpx2 and need httpx.
|
|
105
112
|
"httpx>=0.27",
|
|
113
|
+
"httpx2>=2.0; python_version >= '3.10'",
|
|
106
114
|
]
|
|
107
115
|
|
|
108
116
|
|
|
@@ -136,6 +144,7 @@ package-dir = { "" = "src" }
|
|
|
136
144
|
where = ["src"]
|
|
137
145
|
|
|
138
146
|
[tool.setuptools.package-data]
|
|
147
|
+
"ipmg" = ["data/*.tsv.gz"]
|
|
139
148
|
"ipmg.web" = ["static/*.html", "static/css/*.css", "static/js/*.js"]
|
|
140
149
|
|
|
141
150
|
|
|
@@ -146,6 +155,13 @@ where = ["src"]
|
|
|
146
155
|
[tool.pytest.ini_options]
|
|
147
156
|
testpaths = ["tests"]
|
|
148
157
|
pythonpath = ["src"]
|
|
158
|
+
# A deprecated call in IPMG's own code or tests fails the run, so the next
|
|
159
|
+
# one is fixed when it appears instead of scrolling past in the output.
|
|
160
|
+
filterwarnings = [
|
|
161
|
+
"error::DeprecationWarning:ipmg",
|
|
162
|
+
"error::DeprecationWarning:test_",
|
|
163
|
+
"error::PendingDeprecationWarning:ipmg",
|
|
164
|
+
]
|
|
149
165
|
|
|
150
166
|
[tool.coverage.run]
|
|
151
167
|
source = ["ipmg"]
|