ipmg 3.1.3__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.
Files changed (107) hide show
  1. {ipmg-3.1.3/src/ipmg.egg-info → ipmg-3.2.0}/PKG-INFO +116 -24
  2. {ipmg-3.1.3 → ipmg-3.2.0}/README.md +113 -22
  3. {ipmg-3.1.3 → ipmg-3.2.0}/pyproject.toml +18 -2
  4. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/__init__.py +1 -1
  5. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/cli/commands.py +103 -2
  6. ipmg-3.2.0/src/ipmg/cli/completion.py +488 -0
  7. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/cli/parser.py +244 -7
  8. ipmg-3.2.0/src/ipmg/core/cron.py +182 -0
  9. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/core/diff.py +102 -2
  10. ipmg-3.2.0/src/ipmg/core/engine.py +223 -0
  11. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/core/health.py +20 -3
  12. ipmg-3.2.0/src/ipmg/core/httpcheck.py +275 -0
  13. ipmg-3.2.0/src/ipmg/core/neighbours.py +298 -0
  14. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/core/ping.py +27 -7
  15. ipmg-3.2.0/src/ipmg/core/portscan.py +179 -0
  16. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/core/security.py +9 -4
  17. ipmg-3.2.0/src/ipmg/core/wake.py +74 -0
  18. ipmg-3.2.0/src/ipmg/data/oui.tsv.gz +0 -0
  19. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/infrastructure/database.py +296 -21
  20. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/infrastructure/file_io.py +111 -8
  21. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/infrastructure/incremental.py +27 -15
  22. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/infrastructure/notify.py +85 -1
  23. ipmg-3.2.0/src/ipmg/infrastructure/retention.py +156 -0
  24. ipmg-3.2.0/src/ipmg/reporting/frames.py +112 -0
  25. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/reporting/live.py +13 -0
  26. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/reporting/machine.py +6 -4
  27. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/reporting/summary.py +36 -0
  28. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/services/history_service.py +22 -1
  29. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/services/scan_service.py +247 -25
  30. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/utils/helpers.py +103 -5
  31. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/app.py +275 -21
  32. ipmg-3.2.0/src/ipmg/web/manager.py +288 -0
  33. ipmg-3.2.0/src/ipmg/web/scheduler.py +180 -0
  34. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/schemas.py +141 -12
  35. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/server.py +3 -1
  36. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/static/css/app.css +11 -0
  37. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/static/index.html +6 -2
  38. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/static/js/api.js +22 -0
  39. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/static/js/app.js +4 -2
  40. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/static/js/demo.js +15 -0
  41. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/static/js/views.js +340 -14
  42. {ipmg-3.1.3 → ipmg-3.2.0/src/ipmg.egg-info}/PKG-INFO +116 -24
  43. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg.egg-info/SOURCES.txt +16 -0
  44. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg.egg-info/requires.txt +3 -0
  45. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_commands.py +1 -0
  46. ipmg-3.2.0/tests/test_completion.py +191 -0
  47. ipmg-3.2.0/tests/test_contrib.py +112 -0
  48. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_database_history.py +23 -0
  49. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_engine.py +51 -0
  50. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_file_io.py +32 -0
  51. ipmg-3.2.0/tests/test_httpcheck.py +375 -0
  52. ipmg-3.2.0/tests/test_neighbours.py +360 -0
  53. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_notify.py +35 -0
  54. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_ping.py +3 -1
  55. ipmg-3.2.0/tests/test_ping_command.py +100 -0
  56. ipmg-3.2.0/tests/test_retention.py +251 -0
  57. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_scan_service.py +127 -42
  58. ipmg-3.2.0/tests/test_schedules.py +327 -0
  59. ipmg-3.2.0/tests/test_tcp_probe.py +244 -0
  60. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_utils.py +54 -0
  61. ipmg-3.2.0/tests/test_wake.py +156 -0
  62. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_web_api.py +264 -0
  63. ipmg-3.2.0/tests/test_web_manager.py +105 -0
  64. ipmg-3.1.3/src/ipmg/core/engine.py +0 -140
  65. ipmg-3.1.3/src/ipmg/core/portscan.py +0 -95
  66. ipmg-3.1.3/src/ipmg/reporting/frames.py +0 -74
  67. ipmg-3.1.3/src/ipmg/web/manager.py +0 -139
  68. ipmg-3.1.3/tests/test_ping_command.py +0 -30
  69. ipmg-3.1.3/tests/test_web_manager.py +0 -36
  70. {ipmg-3.1.3 → ipmg-3.2.0}/LICENSE +0 -0
  71. {ipmg-3.1.3 → ipmg-3.2.0}/setup.cfg +0 -0
  72. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/__main__.py +0 -0
  73. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/cli/__init__.py +0 -0
  74. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/cli/config.py +0 -0
  75. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/core/__init__.py +0 -0
  76. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/core/discovery.py +0 -0
  77. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/exceptions.py +0 -0
  78. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/infrastructure/__init__.py +0 -0
  79. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/reporting/__init__.py +0 -0
  80. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/reporting/diff_report.py +0 -0
  81. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/reporting/metrics.py +0 -0
  82. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/reporting/ui.py +0 -0
  83. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/services/__init__.py +0 -0
  84. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/utils/__init__.py +0 -0
  85. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/__init__.py +0 -0
  86. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/db.py +0 -0
  87. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg/web/static/js/charts.js +0 -0
  88. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg.egg-info/dependency_links.txt +0 -0
  89. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg.egg-info/entry_points.txt +0 -0
  90. {ipmg-3.1.3 → ipmg-3.2.0}/src/ipmg.egg-info/top_level.txt +0 -0
  91. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_api_contract.py +0 -0
  92. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_config.py +0 -0
  93. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_diff.py +0 -0
  94. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_diff_report.py +0 -0
  95. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_discover.py +0 -0
  96. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_health.py +0 -0
  97. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_history_service.py +0 -0
  98. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_incremental.py +0 -0
  99. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_ipv6.py +0 -0
  100. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_live.py +0 -0
  101. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_machine_output.py +0 -0
  102. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_metrics.py +0 -0
  103. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_parser.py +0 -0
  104. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_portscan.py +0 -0
  105. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_ui.py +0 -0
  106. {ipmg-3.1.3 → ipmg-3.2.0}/tests/test_web_db.py +0 -0
  107. {ipmg-3.1.3 → 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.1.3
4
- Summary: IP Management & Ping Monitoring CLI Tool
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, and a second scan with --compare reports a new host (warning) and a latency change (info) against the first" width="820">
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 `nmap -sn`, `fping`, and Angry IP Scanner.
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 | `nmap -sn` | `fping` | Angry IP Scanner |
112
+ | | IPMG | nmap | fping | Uptime Kuma |
111
113
  | --- | --- | --- | --- | --- |
112
- | Parallel ping sweep | Yes, one system `ping` per host | Yes | Yes, fastest of the four | Yes |
113
- | Scan history and "what changed" | Built in | Save XML, compare with `ndiff` | No | No |
114
- | Change severities and alerts | critical / warning / info; Slack, Teams, webhook, email | No | No | No |
115
- | Exit codes for cron and CI | `3` with `--fail-on-down`, `2` with `diff --fail-on-change` | No | Non-zero if any host is unreachable | No (GUI first) |
116
- | Reports | Excel, CSV, JSON, Markdown | XML, grepable text | Plain text | CSV, TXT, XML |
117
- | Browser UI | IPMG Web, local, works offline | No (Zenmap is a desktop app) | No | Desktop app (Java) |
118
- | Port checks | Common TCP ports (connect only) | Full port, service, and OS scanner | No | Via fetchers |
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 (`--threads` at a time). Angry IP Scanner is a
124
- point-and-click desktop app with a plugin system.
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, OpenBSD, NetBSD | the macOS flags | Untested. The code treats them like macOS, and their `ping` options may differ |
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 2.3.0
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 (`2.4.0`), the minor line (`2.4`), and
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
- Each of these was installed from scratch and run against a live target:
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 — uv supplies its own |
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 1.13.0
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 1.13.0 · scan
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. Everyone taking part is expected to follow the
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, and a second scan with --compare reports a new host (warning) and a latency change (info) against the first" width="820">
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 `nmap -sn`, `fping`, and Angry IP Scanner.
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 | `nmap -sn` | `fping` | Angry IP Scanner |
59
+ | | IPMG | nmap | fping | Uptime Kuma |
59
60
  | --- | --- | --- | --- | --- |
60
- | Parallel ping sweep | Yes, one system `ping` per host | Yes | Yes, fastest of the four | Yes |
61
- | Scan history and "what changed" | Built in | Save XML, compare with `ndiff` | No | No |
62
- | Change severities and alerts | critical / warning / info; Slack, Teams, webhook, email | No | No | No |
63
- | Exit codes for cron and CI | `3` with `--fail-on-down`, `2` with `diff --fail-on-change` | No | Non-zero if any host is unreachable | No (GUI first) |
64
- | Reports | Excel, CSV, JSON, Markdown | XML, grepable text | Plain text | CSV, TXT, XML |
65
- | Browser UI | IPMG Web, local, works offline | No (Zenmap is a desktop app) | No | Desktop app (Java) |
66
- | Port checks | Common TCP ports (connect only) | Full port, service, and OS scanner | No | Via fetchers |
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 (`--threads` at a time). Angry IP Scanner is a
72
- point-and-click desktop app with a plugin system.
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, OpenBSD, NetBSD | the macOS flags | Untested. The code treats them like macOS, and their `ping` options may differ |
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 2.3.0
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 (`2.4.0`), the minor line (`2.4`), and
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
- Each of these was installed from scratch and run against a live target:
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 — uv supplies its own |
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 1.13.0
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 1.13.0 · scan
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. Everyone taking part is expected to follow the
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.1.3" # Managed automatically by semantic-release
17
- description = "IP Management & Ping Monitoring CLI Tool"
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"]
@@ -2,4 +2,4 @@
2
2
  ipmg - IP Management & Ping Monitoring Tool
3
3
  """
4
4
 
5
- __version__ = "3.1.3"
5
+ __version__ = "3.2.0"